tools[], модель вместо ответа возвращает список вызовов, вы их выполняете и возвращаете результат обратно. Это каноническая страница по теме: полный цикл, выбор инструмента, потоковая передача вызовов и пример агентного цикла.
Как выглядит цикл
tool_calls.
В примерах ниже
$TEXT_MODEL — переменная окружения с идентификатором модели из GET /api/v1/models. Идентификаторы не зашивают в код: состав каталога меняется. Разбор — в разделе Модели и цены.Объявление инструмента
Каждый элементtools[] — объект с type: "function" и вложенным function:
Модель не знает вашего кода и не может его посмотреть. Всё, что влияет на решение вызвать инструмент, — это
description и name. Описание вроде «полезная функция» работает хуже, чем отсутствие описания вовсе.Выбор инструмента: tool_choice
any для required — его принимают не все клиенты; каноническое значение — "required".
Параллельные вызовы
По умолчанию модель может вернуть несколько вызовов в одном ответе — например, погоду в трёх городах сразу. Это выигрыш в задержке: три независимых HTTP-вызова идут конкурентно.cURL
finish_reason равен "tool_calls":
parallel_tool_calls: false запрещает больше одного вызова за раз. Это полезно, когда инструменты меняют состояние и должны идти строго по очереди.
На каждый
tool_call нужны отдельный вызов вашего кода и отдельное сообщение с ролью tool. Один результат на все три вызова модель не примет.Возврат результата
Аргументы приходят строкой — её нужно распарсить. Выполните функцию и отправьте результат сообщением с рольюtool, tool_call_id из вызова и content — строкой:
finish_reason: "stop".
Валидация аргументов
parameters — это схема, а не принуждение. Модель может вернуть аргументы, которые схеме не соответствуют, особенно при strict: false и свободном тексте описаний. Всегда валидируйте на своей стороне.
Python
Ошибки инструментов
Инструмент может упасть. Модели полезно знать, что именно произошло, — тогда она попробует другой путь, а не выдаст пользователю пустой ответ. Не бросайте исключение наружу: верните ошибку вcontent сообщения tool.
Python
Пропуск или подмена
tool_call_id ломает сопоставление: модель не поймёт, к какому вызову относится ошибка, и либо зациклится, либо проигнорирует результат. Возвращайте его всегда — даже когда результат пустой или неуспешный.Вызовы в потоке
Приstream: true вызовы приходят в delta.tool_calls[], и аргументы разбиты на куски. Каждый элемент несёт index — позицию вызова в массиве — и кусок function.arguments. Кусок не образует валидный JSON, пока не накоплен целиком.
index, а не по порядку прихода:
Python
Цикл агента
Рабочий пример: модель получает вопрос, сама решает, какие инструменты вызвать, выполняет их и возвращает ответ.Python
Поддержка по моделям
Возможности неодинаковы и проверяются только пробным запросом:Что дальше
Запрос чату
Сводка полей запроса и формат ответа
Структурированный вывод
JSON Schema и валидация результата
Потоковая передача
Разбор SSE, в том числе вызовов
Поиск в интернете
Инструменты, которые выполняет сама платформа
