AI Agent · Function Calling

Что такое Function Calling в 2026: как OpenAI, Gemini и Claude вызывают API через JSON

2026.08.18 · ~12 мин чтения

Водораздел не в том, какая модель умнее, а в том, кто выдаёт JSON, а кто исполняет побочные эффекты. Протокол, три формата, границы runtime, матрица и план из 7 шагов.

JSON-редактор и инструменты на столе разработчика — Function Calling к внешним API

Function Calling (вызов инструментов) в 2026 — протокол по умолчанию для агентов: модели больше не изображают вызов API прозой. Они отдают JSON по согласованной схеме, а ваш код реально запрашивает погоду, БД, правит файлы или гоняет тесты. Разница не в том, кто лучше болтает, а в том, проверяется ли схема, аудитится ли исполнение и изолированы ли побочные эффекты.

Обновлено 18 августа 2026. Имена полей в SDK плывут; цикл нет: запрос → исполнение → возврат. Инструмент, который меняет диск, идёт в паре с песочницей файловой системы агента. Предпочтения между сессиями — в слое Memory, не в следующем arguments.

3
JSON-диалекта
1
Общий цикл
MCP
Discovery и транспорт

Почему свободный текст недостаточен (Why)

Раньше писали «вызови get_weather(city=Beijing)» и вырезали regex. Демо проходит; прод ломается в трёх местах:

  1. Нестабильный разбор — вежливость, переставленные аргументы, кавычки; JSON.parse падает.
  2. Нет типов — enum становится свободным текстом; обязательные поля пропадают; параллельные вызовы не сопоставить.
  3. Побочные эффекты в чате — модель утверждает удаление, которого не было, или вы выполнили, а результат не вернули.

Function Calling оставляет выбор модели, а исполнение — runtime. HTTP, SQL и shell не происходят в процессе модели. Как в CI: один job — один workspace; граница раньше «умности».

Три слоя (What)

«Подключили OpenAI tools» — не архитектура. Минимум три слоя:

СлойЗадачаНосительВладелец
L1 SchemaИмена, JSON Schema, описания, requiredOpenAI tools[].function, Gemini functionDeclarations, Claude input_schemaПродукт
L2 RuntimeВалидация, секреты, timeout, retry, аудитСвой цикл, LangGraph, Claude CodeБэкенд / локальный агент
L3 TransportОбнаружение и соединение процессов инструментовHTTP, MCP stdio/SSE, внутренний RPCИнфраструктура

Асимметричный вывод: API вендоров стандартизируют JSON-конверт L1. Авторизацию L2 и изоляцию процессов L3 делаете вы. MCP — discovery и сессия, не автоматическая безопасность.

Цикл: модель не хранит ваши ключи; секреты только в runtime.

┌──────────────┐     JSON tool request      ┌──────────────────┐
│  LLM API     │  ────────────────────────► │  Your runtime    │
│  (OpenAI /   │     name + arguments       │  (Agent loop)    │
│   Gemini /   │                            │                  │
│   Claude)    │  ◄──────────────────────── │  execute tool    │
└──────────────┘     tool result JSON       │  • HTTP APIs     │
                                            │  • DB / search   │
                                            │  • shell / MCP   │
                                            └────────┬─────────┘
                                                     │
                                                     ▼
                                            ┌──────────────────┐
                                            │ Policy + secrets │
                                            │ allowlist, audit │
                                            │ Cloud Mac / VPC  │
                                            └──────────────────┘

Сравнение: OpenAI vs Gemini vs Claude

ПоверхностьВходИсполнениеКонтекстКому
OpenAI toolsChat Completions / ResponsesВыполняете вы; arguments часто JSON-строкаПараллельные tool_calls[]; optional strictУже есть OpenAI SDK или совместимый шлюз
Gemini functionDeclarationsGemini API / VertexВыполняете вы; toolConfig.mode заставляет или запрещаетТипы часто OBJECT/STRING в верхнем регистреGCP; продукты с переключателем mode
Claude tool_useMessages API / Claude CodeВыполняете вы; input уже объектБлоки: tool_use / tool_resultAnthropic, IDE-агенты, MCP
MCP-инструментыКлиент ↔ MCP-серверВ процессе сервера; модель только JSONКаталог обнаруживается в runtimeГорячая замена каталогов

В 2026 водораздел не «поддерживается ли» (все трое поддерживают), а строка vs объект, выравнивание параллели и запись ошибок назад. Шлюзы нормализуют в ToolCall{name, id, args} и один L2 runtime.

Как выглядит JSON (How)

Тот же get_weather. В проде в description пишите границы («только публичная погода, не личная геолокация»).

OpenAI: tools + tool_calls

Инструменты в запросе. При вызове в сообщении ассистента — tool_calls. argumentsстроковый JSON: parse, затем validate.

{
  "model": "gpt-4.1",
  "messages": [{"role": "user", "content": "What's the weather in Beijing?"}],
  "tools": [{
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "Current weather for a city",
      "parameters": {
        "type": "object",
        "properties": {
          "city": {"type": "string", "description": "City name"},
          "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
        },
        "required": ["city"]
      }
    }
  }]
}
{
  "role": "assistant",
  "tool_calls": [{
    "id": "call_abc123",
    "type": "function",
    "function": {
      "name": "get_weather",
      "arguments": "{\"city\":\"Beijing\",\"unit\":\"celsius\"}"
    }
  }]
}

После исполнения — role: tool (или эквивалент Responses) с тем же tool_call_id и строковым content.

Gemini: functionDeclarations + toolConfig

Объявления в tools[].functionDeclarations. mode: AUTO, ANY, NONE — продуктовый переключатель, не песочница.

{
  "contents": [{"role": "user", "parts": [{"text": "What's the weather in Beijing?"}]}],
  "tools": [{
    "functionDeclarations": [{
      "name": "get_weather",
      "description": "Current weather for a city",
      "parameters": {
        "type": "OBJECT",
        "properties": {
          "city": {"type": "STRING"},
          "unit": {"type": "STRING", "enum": ["celsius", "fahrenheit"]}
        },
        "required": ["city"]
      }
    }]
  }],
  "toolConfig": {"functionCallingConfig": {"mode": "AUTO"}}
}

Модель отдаёт part functionCall; вы — functionResponse. Не считайте имена полей как у OpenAI.

Claude: tools + tool_use / tool_result

input_schema. Ответ — массив content-блоков. input уже объект; валидация всё равно нужна.

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 1024,
  "tools": [{
    "name": "get_weather",
    "description": "Current weather for a city",
    "input_schema": {
      "type": "object",
      "properties": {
        "city": {"type": "string"},
        "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
      },
      "required": ["city"]
    }
  }],
  "messages": [{"role": "user", "content": "What's the weather in Beijing?"}]
}
{
  "role": "assistant",
  "content": [{
    "type": "tool_use",
    "id": "toolu_01XYZ",
    "name": "get_weather",
    "input": {"city": "Beijing", "unit": "celsius"}
  }]
}
{
  "role": "user",
  "content": [{
    "type": "tool_result",
    "tool_use_id": "toolu_01XYZ",
    "content": "{\"temp_c\": 28, \"condition\": \"clear\"}"
  }]
}

Claude Code и Cursor добавляют MCP. Модель по-прежнему видит каталог JSON Schema. Транспорт меняется, цикл нет.

Матрица выбора

Если вы…БеритеПочему
уже на шлюзе, совместимом с OpenAIдиалект OpenAI toolsсамая большая экосистема; адаптеры один раз
в основном GCP / VertexGemini + modeменьше перевода; «этот ход обязан искать»
сначала Claude CodeClaude tools + MCPсовпадает с каталогом IDE
маршрутизируете три моделивнутренний ToolCall + адаптерыне размазывать vendor if-else по бизнесу
правите файлы или командыудалённый Mac + allowlist путейкрасивый JSON не остановит ошибочный rm
только read-only SaaS APIserverless + секрет-менеджерне нужна вся машина; параметры всё равно в allowlist

A — соло, полдня: одна модель, 1–3 read-only инструмента, JSON Schema без additionalProperties, секреты в env, в логах только хеши.

B — небольшая команда: внутренний ToolCall, таймауты и лимиты на инструмент, записи на сессиях Cloud Mac, Memory отдельно. Та же дисциплина уничтожения, что у автоматизации удалённого Mac.

C — enterprise: ревью каталога, схема через PR, MCP в VPC, никакого безграничного bash. Добавьте глобальный выключатель деструктивных инструментов (аналог Gemini NONE) без редеплоя модели и храните audit JSONL вне volume рабочего пространства, чтобы destroy сессии не стирал след.

Ошибки

  1. Думать, что модель аутентифицирует — ключи в runtime.
  2. Считать OpenAI arguments объектом — сначала parse.
  3. Описания «сделай всё» — лишние вызовы.
  4. Игнорировать параллельные tool_calls — записи сериализовать.
  5. Глотать ошибки — возвращать структурированный error.
  6. MCP = безопасность — root в домашнем каталоге это весь диск.

Внедрение: 7 шагов

  1. Инвентарь (класс эффекта, timeout, резидентность).
  2. JSON Schema (required, enum, без additionalProperties).
  3. Минимальный цикл, один инструмент.
  4. Валидация, изоляция секретов, аудит.
  5. Второй vendor-адаптер как доказательство внутренней модели.
  6. Песочница для пишущих инструментов.
  7. 7 дней наблюдений, сузить схемы с частыми промахами.

FAQ

Чем отличается от JSON mode?

JSON mode задаёт форму финального ответа. Function Calling задаёт промежуточные запросы инструментов и обычно идёт несколько ходов после исполнения.

Может ли модель ходить в БД напрямую?

Нет, если runtime не выставил произвольный SQL без авторизации. По умолчанию модель только предлагает параметры по схеме.

Одна схема на трёх вендоров?

Ядро JSON Schema общее, конверты разные. Регрессионно проверяйте enum и required; strict ведёт себя не одинаково.

Инструменты Claude Code — это Function Calling?

Тот же цикл; каталог динамически даёт IDE/MCP, а не рукописный массив tools в каждом HTTP-запросе.

Класть результаты инструментов в долгую память?

Сырые payload большие и эфемерные. Суммируйте в Memory. См. справку.

Итог

Function Calling в 2026 — это RPC с JSON Schema. Три диалекта, одна грамматика. Безопасность — в L2 и изолированных хостах. Если не можете сказать, на какую машину и в какой каталог сейчас уйдёт write_file, не подключайте пишущие инструменты. Read-only API можно сегодня; правки кода и тесты — на уничтожаемом Cloud Mac; сначала цены.

Дальше по теме

Запускайте инструменты на изолированных Cloud Mac

Погоду можно спросить из serverless; правки репозитория, тесты и внутренние API требуют уничтожаемого хоста. Удалённый Mac изолирует workspace на сессию.

Заказать · Цены

Function Calling

Запускайте инструменты на изолированных Cloud Mac

M4 · Cloud Mac · isolated tool runtime

Заказать