Вызов функций
Как описать функции в запросе, провести цикл вызова с возвратом результата и принять вызовы в потоковом ответе. Пример на Python.
Опишите функции в запросе
Функции передаются массивом tools. У каждой есть имя, описание для модели и схема аргументов в формате JSON Schema. Имя состоит из латинских букв, цифр, знаков подчёркивания и дефиса, до 64 знаков, и в одном запросе не повторяется.
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Возвращает текущую погоду в городе",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "Название города"}},
"required": ["city"]
}
}
}]
Сами функции выполняет ваша программа. epicai не вызывает их и не обращается к внешним службам, он только передаёт описание модели и возвращает её просьбу о вызове.
Проведите цикл вызова
- Отправьте запрос с
tools. Если модели нужна функция, в ответе будетfinish_reasonсо значениемtool_callsи массивmessage.tool_calls. - Выполните каждый вызов у себя. Имя функции лежит в
function.name, аргументы вfunction.arguments. Аргументы приходят строкой JSON, и модель порой присылает невалидный JSON, поэтому разбирайте их с обработкой ошибок. - Добавьте в
messagesсообщение модели с вызовами, затем по одному сообщениюtoolна каждый вызов. В нём обязательныtool_call_idиз просьбы модели иcontentс результатом. - Отправьте запрос ещё раз с тем же
tools. Повторяйте шаги, пока ответ не придёт безtool_calls.
import json
import os
from openai import OpenAI
client = OpenAI(
base_url="https://epicai.ru/v1",
api_key=os.environ["EPICAI_API_KEY"],
)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Возвращает текущую погоду в городе",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "Название города"}},
"required": ["city"],
},
},
}]
def get_weather(city):
return {"city": city, "temp_c": 7, "sky": "облачно"}
messages = [{"role": "user", "content": "Какая сейчас погода в Казани?"}]
# 1. Модель решает, что нужна функция
first = client.chat.completions.create(
model="gpt-6-luna", messages=messages, tools=tools, max_tokens=300,
)
message = first.choices[0].message
messages.append(message)
# 2. Программа выполняет вызовы и возвращает результаты
for call in message.tool_calls or []:
args = json.loads(call.function.arguments)
result = get_weather(**args)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False),
})
# 3. Модель отвечает с учётом результата
final = client.chat.completions.create(
model="gpt-6-luna", messages=messages, tools=tools, max_tokens=300,
)
print(final.choices[0].message.content)
Описания функций и все сообщения tool входят в запрос и оплачиваются как входные токены модели при каждом круге цикла.
Управляйте выбором функции
Поле tool_choice принимает "auto" (модель решает сама), "none" (функции не вызываются) и "required" (вызвать любую функцию). Чтобы заставить вызвать конкретную, передайте объект {"type": "function", "function": {"name": "get_weather"}}. Без tool_choice работает auto.
Параметр parallel_tool_calls со значением false разрешает модели не более одного вызова за ответ. По умолчанию решает вендор модели.
Вызовы в потоковом режиме
В потоке вызов приходит частями в delta.tool_calls. Первый кадр вызова содержит index, id, type и function.name при пустых аргументах, следующие кадры с тем же index дописывают function.arguments кусками строки. Собирайте аргументы по index и разбирайте JSON после кадра с finish_reason.
Ограничения
В одном запросе допускается до 128 функций, а их описания вместе не должны превышать 256 КБ. Поддерживаются только инструменты типа function. Инструменты вендоров (поиск, код, файлы) дают 400 unsupported_tool, устаревшие functions и function_call дают 400 unsupported_parameter.
Признак capabilities.tools у всех моделей списка равен true, поэтому по нему не отличить модели, которые хорошо работают с функциями. Проверьте нужную модель на своей задаче.
Не нашли ответ?
Посмотрите частые вопросы или напишите в поддержку.