Function Calling Tool Use
Function Calling — основа агентов. Модель не выполняет функции, она лишь решает «какую функцию вызвать и с какими аргументами». Выполнение — в вашем коде, результат вы возвращаете обратно, и модель формирует финальный ответ. Поддерживается во всех провайдерах, но формат полей у каждого свой.
Общий цикл
- Определяете инструменты: имя, описание и JSON Schema параметров — отправляете вместе с запросом.
- Модель возвращает вызов: имя функции + аргументы (если решила, что вызов нужен).
- Вы исполняете функцию у себя и получаете результат.
- Возвращаете результат модели тем же запросом (с историей) — она даёт финальный ответ.
OpenAI-совместимый формат
Инструменты — массив tools, стратегия — tool_choice
(auto / required / none / конкретная функция).
"strict": true заставляет модель строго следовать JSON Schema.
import json from openai import OpenAI client = OpenAI(api_key="sk-nexus-...", base_url="https://megaapi.ru/v1") tools = [{ "type": "function", "function": { "name": "get_weather", "description": "Текущая погода в городе", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"], }, "strict": True, }, }] messages = [{"role": "user", "content": "Какая погода в Москве?"}] r1 = client.chat.completions.create(model="gpt-5.4", messages=messages, tools=tools) tool_call = r1.choices[0].message.tool_calls[0] args = json.loads(tool_call.function.arguments) # arguments — JSON-СТРОКА weather = {"temp": 12, "sky": "облачно"} # ваша реальная функция messages.append(r1.choices[0].message) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(weather, ensure_ascii=False), }) r2 = client.chat.completions.create(model="gpt-5.4", messages=messages, tools=tools) print(r2.choices[0].message.content)
- Параллельные вызовы: модель может вернуть несколько элементов в
tool_calls— исполните все и верните по одному сообщениюrole:"tool"на каждыйtool_call_id. - Стриминг: аргументы приходят кусками в
delta.tool_calls[].function.arguments— их нужно склеивать.
chat/completions vs Responses API
У эндпоинта /v1/responses формат FC другой — смешивать нельзя:
/v1/chat/completions | /v1/responses | |
|---|---|---|
| Определение | вложенно: {"type":"function","function":{...}} | плоско: {"type":"function","name":...,"parameters":...} |
| Вызов | message.tool_calls[] (с id) | item {"type":"function_call","call_id",...} |
| Возврат | {"role":"tool","tool_call_id":...} | {"type":"function_call_output","call_id":...} |
function: {...} из Chat Completions в /v1/responses
(или наоборот) — самая частая причина ошибки «неверные параметры». Используйте формат под свой эндпоинт.
Claude (нативный формат)
В нативном /v1/messages инструменты — массив tools с input_schema,
вызов приходит блоком tool_use, результат возвращается блоком tool_result
в сообщении пользователя. Подробнее — на странице Claude.
"tools": [{
"name": "get_weather",
"description": "Текущая погода в городе",
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}
}]
Gemini (нативный формат)
В generateContent инструменты задаются через function_declarations,
стратегия — tool_config…mode (AUTO/ANY/NONE).
Важно: function_call.args приходит готовым объектом (не JSON-строкой),
а у Gemini 3 при многоходовом FC нужно возвращать thought signature. Детали — на странице
Gemini.
| OpenAI | Claude | Gemini | |
|---|---|---|---|
| Определение | tools[].function | tools[].input_schema | function_declarations |
| Аргументы | JSON-строка | объект | объект |
| Стратегия | tool_choice | tool_choice | mode |