- Вы описываете доступные функции (схему) и шлёте обычный запрос с
tools=. - Модель отвечает не текстом, а массивом
tool_calls— что и с какими аргументами вызвать. - Вы выполняете функцию у себя и шлёте второй запрос, дописав в историю ответ модели и результат вызова.
- Модель возвращает финальный текст.
Полный пример на Python
Возьмём классику — функциюget_weather(city). В реальности она бы дёргала какой-нибудь сервис погоды; здесь для наглядности возвращаем заглушку.
Подводные камни
Модель может попросить несколько вызовов сразу
Модель может попросить несколько вызовов сразу
В одном ответе
message.tool_calls бывает массивом из нескольких вызовов —
например, погода сразу в двух городах. Обходите его циклом и на каждый
tool_call добавляйте отдельное сообщение role="tool" со своим tool_call_id.
Если хоть один вызов оставить без ответа — следующий запрос упадёт с ошибкой.Сначала ответ модели, потом результат функции
Сначала ответ модели, потом результат функции
Порядок в
messages строгий: сперва дописываете сам ответ ассистента (объект
message с tool_calls), и только после него — сообщения role="tool" с
результатами. Если отправить результат без предшествующего ответа ассистента,
API вернёт ошибку о несогласованной истории.Аргументы приходят строкой, а не объектом
Аргументы приходят строкой, а не объектом
tool_call.function.arguments — это строка с JSON, а не готовый словарь.
Перед использованием её обязательно нужно распарсить: json.loads(...).
Прямое обращение по ключу к строке выдаст ошибку.Что дальше
- Быстрый старт — регистрация, ключ и первый запрос
- Ошибки и коды ответов — что делать, если запрос упал