Вызов функций

Как описать функции в запросе, провести цикл вызова с возвратом результата и принять вызовы в потоковом ответе. Пример на Python.

Обновлено: 3 мин чтения

Опишите функции в запросе

Функции передаются массивом tools. У каждой есть имя, описание для модели и схема аргументов в формате JSON Schema. Имя состоит из латинских букв, цифр, знаков подчёркивания и дефиса, до 64 знаков, и в одном запросе не повторяется.

"tools": [{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "Возвращает текущую погоду в городе",
    "parameters": {
      "type": "object",
      "properties": {"city": {"type": "string", "description": "Название города"}},
      "required": ["city"]
    }
  }
}]

Сами функции выполняет ваша программа. epicai не вызывает их и не обращается к внешним службам, он только передаёт описание модели и возвращает её просьбу о вызове.

Проведите цикл вызова

  1. Отправьте запрос с tools. Если модели нужна функция, в ответе будет finish_reason со значением tool_calls и массив message.tool_calls.
  2. Выполните каждый вызов у себя. Имя функции лежит в function.name, аргументы в function.arguments. Аргументы приходят строкой JSON, и модель порой присылает невалидный JSON, поэтому разбирайте их с обработкой ошибок.
  3. Добавьте в messages сообщение модели с вызовами, затем по одному сообщению tool на каждый вызов. В нём обязательны tool_call_id из просьбы модели и content с результатом.
  4. Отправьте запрос ещё раз с тем же 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, поэтому по нему не отличить модели, которые хорошо работают с функциями. Проверьте нужную модель на своей задаче.

Не нашли ответ?

Посмотрите частые вопросы или напишите в поддержку.

Войти или создать аккаунт

20 000 токенов в подарок новым пользователям. Без карты и без VPN.

или через сервис

Продолжая, вы получаете сервисные письма.

Для защиты от роботов используется Yandex SmartCaptcha. Условия обработки данных.