Вызов инструментов
Описание функций, выполнение вызовов и возврат результата
Модель возвращает имя функции и аргументы Ваше приложение проверяет аргументы, выполняет разрешённое действие и передаёт результат модели API не выполняет пользовательскую функцию самостоятельно
1. Опишите функцию
curl https://api.getapi.ru/v1/chat/completions \
-H "Authorization: Bearer $GETAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4.1-mini",
"messages": [{"role": "user", "content": "Какая погода в Москве?"}],
"max_tokens": 256,
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Получить текущую погоду в городе",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
"additionalProperties": false
}
}
}],
"tool_choice": "auto"
}'2. Обработайте вызов
Фрагмент ответа
{
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_example",
"type": "function",
"function": {"name": "get_weather", "arguments": "{\"city\":\"Москва\"}"}
}]
}function.arguments является строкой JSON, сначала разберите её и проверьте по схеме
Используйте разрешённый список функций
Не исполняйте аргументы как код или команду оболочки
Действия с побочными эффектами должны проходить проверки доступа вашего приложения
3. Передайте результат
Сохраните сообщение assistant целиком и добавьте сообщение tool для каждого вызова
Значение tool_call_id берётся из tool_calls[].id
{
"model": "gpt-4.1-mini",
"messages": [
{"role": "user", "content": "Какая погода в Москве?"},
{
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_example",
"type": "function",
"function": {"name": "get_weather", "arguments": "{\"city\":\"Москва\"}"}
}]
},
{
"role": "tool",
"tool_call_id": "call_example",
"content": "{\"city\":\"Москва\",\"temperature_c\":18}"
}
],
"max_tokens": 256
}Модель использует результат для следующего ответа Для многошагового сценария продолжайте передавать описание доступных функций и ограничьте число итераций в приложении
tool_choice
| Значение | Назначение |
|---|---|
auto | Модель выбирает текст или функцию |
none | Запрет вызова |
required | Требуется вызов инструмента, если модель поддерживает режим |
{"type":"function","function":{"name":"get_weather"}} | Выбор конкретной функции |
Поддержка режимов зависит от модели
Наличие вызова определяйте по tool_calls, значение finish_reason не является единственным признаком
Несколько вызовов
Один ответ может содержать несколько элементов tool_calls
Верните результат для каждого идентификатора
Не считайте вызовы независимыми только потому, что они находятся в одном ответе
Порядок выполнения и разрешённую параллельность определяет приложение
Поток
В SSE аргументы приходят частями в delta.tool_calls
Собирайте каждый вызов по index, сохраняйте id, имя и фрагменты arguments
JSON разбирайте после завершения сборки, не на каждом фрагменте
Формат Messages
Вместо function.parameters используется input_schema
Модель возвращает блок tool_use с объектом input
Результат передаётся блоком tool_result в сообщении user
Подробности и пример содержатся в Messages
Стоимость и надёжность
Описание функций, аргументы и результаты входят в контекст и расход токенов Перед повтором запроса проверьте, не было ли действие уже выполнено Для оплаты, отправки сообщений и других внешних изменений используйте собственные идентификаторы операций и защиту от повторного выполнения