Skip to main content
Вызов функций (он же tool use) — это когда модель не отвечает текстом, а возвращает структурированный запрос на вызов вашей функции: её имя и аргументы. Сам код функции выполняете вы, на своей стороне, а результат отдаёте модели обратно. Дальше она уже формулирует человеческий ответ. Звучит просто, но именно на этом механизме держатся все агенты: модель не умеет ходить в базу, считать погоду или дёргать чужой API — зато умеет попросить вас это сделать и разобраться с тем, что вы вернули. Схема всегда одна и та же:
  1. Вы описываете доступные функции (схему) и шлёте обычный запрос с tools=.
  2. Модель отвечает не текстом, а массивом tool_calls — что и с какими аргументами вызвать.
  3. Вы выполняете функцию у себя и шлёте второй запрос, дописав в историю ответ модели и результат вызова.
  4. Модель возвращает финальный текст.

Полный пример на Python

Возьмём классику — функцию get_weather(city). В реальности она бы дёргала какой-нибудь сервис погоды; здесь для наглядности возвращаем заглушку.
Tool use поддерживают не все модели — уверенно с ним работают семейства Claude и GPT. Старые и облегчённые модели могут игнорировать tools=. Какие модели что умеют — смотрите по бейджам возможностей на странице «Цены» на www.ruapi.ai.

Подводные камни

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

Что дальше