Function Calling Tool Use

Function Calling — основа агентов. Модель не выполняет функции, она лишь решает «какую функцию вызвать и с какими аргументами». Выполнение — в вашем коде, результат вы возвращаете обратно, и модель формирует финальный ответ. Поддерживается во всех провайдерах, но формат полей у каждого свой.

Общий цикл

  1. Определяете инструменты: имя, описание и JSON Schema параметров — отправляете вместе с запросом.
  2. Модель возвращает вызов: имя функции + аргументы (если решила, что вызов нужен).
  3. Вы исполняете функцию у себя и получаете результат.
  4. Возвращаете результат модели тем же запросом (с историей) — она даёт финальный ответ.

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)

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.

OpenAIClaudeGemini
Определениеtools[].functiontools[].input_schemafunction_declarations
АргументыJSON-строкаобъектобъект
Стратегияtool_choicetool_choicemode
Для большинства задач достаточно OpenAI-совместимого формата — он один работает со всеми моделями (GPT, Claude, Gemini, DeepSeek, Qwen…). Нативные форматы нужны, когда требуются их специфические возможности (кэширование Claude, thought signatures Gemini).

Справочник параметров Сценарий: AI-агенты