Перейти к основному содержанию
Вызов функций — способ поручить модели выполнить код вашей стороны. Вы описываете доступные инструменты в tools[], модель вместо ответа возвращает список вызовов, вы их выполняете и возвращаете результат обратно. Это каноническая страница по теме: полный цикл, выбор инструмента, потоковая передача вызовов и пример агентного цикла.

Как выглядит цикл

Один вызов — один запрос. Цикл повторяется, пока модель возвращает tool_calls.
В примерах ниже $TEXT_MODEL — переменная окружения с идентификатором модели из GET /api/v1/models. Идентификаторы не зашивают в код: состав каталога меняется. Разбор — в разделе Модели и цены.

Объявление инструмента

Каждый элемент tools[] — объект с type: "function" и вложенным function:
Модель не знает вашего кода и не может его посмотреть. Всё, что влияет на решение вызвать инструмент, — это description и name. Описание вроде «полезная функция» работает хуже, чем отсутствие описания вовсе.

Выбор инструмента: tool_choice

Иногда нужен синоним any для required — его принимают не все клиенты; каноническое значение — "required".
Принудительный выбор и параллельные вызовы поддерживаются не всеми моделями. Там, где поддержки нет, параметр молча игнорируется, и модель ведёт себя по-разному с auto. Проверяйте поведение на конкретной модели, а не полагайтесь на то, что запрос принят.

Параллельные вызовы

По умолчанию модель может вернуть несколько вызовов в одном ответе — например, погоду в трёх городах сразу. Это выигрыш в задержке: три независимых HTTP-вызова идут конкурентно.
cURL
Ответ содержит массив вызовов, и finish_reason равен "tool_calls":
parallel_tool_calls: false запрещает больше одного вызова за раз. Это полезно, когда инструменты меняют состояние и должны идти строго по очереди.
На каждый tool_call нужны отдельный вызов вашего кода и отдельное сообщение с ролью tool. Один результат на все три вызова модель не примет.

Возврат результата

Аргументы приходят строкой — её нужно распарсить. Выполните функцию и отправьте результат сообщением с ролью tool, tool_call_id из вызова и content — строкой:
Повторный запрос вернёт финальный текстовый ответ с finish_reason: "stop".
Нарушение любого из трёх правил ломает диалог: у tool-сообщения должен быть tool_call_id, соответствующий вызову; порядок сообщений должен совпадать с порядком вызовов; у сообщения с tool_calls content равен null, а не пустая строка. Нарушенный контракт модель игнорирует или отвечает ошибкой — в зависимости от модели.

Валидация аргументов

parameters — это схема, а не принуждение. Модель может вернуть аргументы, которые схеме не соответствуют, особенно при strict: false и свободном тексте описаний. Всегда валидируйте на своей стороне.
Python

Ошибки инструментов

Инструмент может упасть. Модели полезно знать, что именно произошло, — тогда она попробует другой путь, а не выдаст пользователю пустой ответ. Не бросайте исключение наружу: верните ошибку в content сообщения tool.
Python
Пропуск или подмена tool_call_id ломает сопоставление: модель не поймёт, к какому вызову относится ошибка, и либо зациклится, либо проигнорирует результат. Возвращайте его всегда — даже когда результат пустой или неуспешный.

Вызовы в потоке

При stream: true вызовы приходят в delta.tool_calls[], и аргументы разбиты на куски. Каждый элемент несёт index — позицию вызова в массиве — и кусок function.arguments. Кусок не образует валидный JSON, пока не накоплен целиком.
Накапливать нужно по index, а не по порядку прихода:
Python
Полный разбор SSE — на странице Потоковая передача.

Цикл агента

Рабочий пример: модель получает вопрос, сама решает, какие инструменты вызвать, выполняет их и возвращает ответ.
Python
Ограничение числа шагов обязательно. Модель может зациклиться: увидев ошибку инструмента, она вызовет его снова с теми же аргументами. Без MAX_STEPS такой цикл съедает деньги и держит соединение до 15 минут.

Поддержка по моделям

Возможности неодинаковы и проверяются только пробным запросом:
Молчаливое игнорирование — норма: неверная настройка выглядит как «модель не поняла задачу», а не как ошибка конфигурации. Держите тест на каждый инструмент и логируйте tool_calls из ответа.

Что дальше

Запрос чату

Сводка полей запроса и формат ответа

Структурированный вывод

JSON Schema и валидация результата

Потоковая передача

Разбор SSE, в том числе вызовов

Поиск в интернете

Инструменты, которые выполняет сама платформа