Туториал

Что такое AI Agent? Руководство 2026: как работает агент, tool calling, function calling и JSON

Окно чата только отвечает. Агент выбирает инструмент, заполняет arguments, читает результат и решает следующий шаг. Ось — не магия, а JSON: определения, arguments, результаты.

В 2026 «AI Agent» звучит в релизах, вакансиях и архитектурных ревью — и редко значит одно и то же. Чат с плагинами, расписанный workflow, IDE-помощник на MCP: одна этикетка. Статья сжимает инженерное определение: агент — runtime на модели, который умеет крутить инструменты и передавать состояние структурированными данными (почти всегда JSON). Это не более разговорчивая модель. Это модель + runtime инструментов + контракт. Разделяем, что делают tool calling, function calling и JSON, и ссылаемся на Structured Output, MCP Schema и A2A.

Что такое AI Agent — чат и workflow

Минимум — три вещи: цель (что пользователь хочет закончить), восприятие (контекст и квитанции инструментов), действие (какой инструмент и какие arguments, или финальный ответ). Модель выбирает действие на каждом шаге; runtime исполняет и пишет наблюдение обратно. Нет цикла, нет инструментов, нет проверяемой формы arguments — это просто чат.

Отличие от чат-бота — условие остановки, не бренд. Чат может закончиться после одного хода. Агент не должен объявлять задачу выполненной до результатов инструментов — он может найти счета, сжать, спросить подтверждение. Отличие от классического workflow — кто рисует рёбра: hops n8n / Temporal проводит человек; следующий hop агента выбирает модель по текущему JSON-наблюдению. Workflow предсказуем и воспроизводим; агент гибче и делает «неверные arguments» аварией первого класса.

Формы 2026: coding-агенты (файлы, тесты, патчи), поддержка и ops (заказы, тикеты), оркестрация нескольких агентов (планировщик отдаёт специалистам). Контракт один: границы в JSON Schema; arguments и result — parseable JSON. Apple может отдать одну функцию App Intents и инструментам модели — см. Apple AI Agent и JSON.

Как это работает в 2026: наблюдать → решать → вызывать → наблюдать

Снимите демо-видео: типичный цикл — пять шагов.

  1. Цель пользователя попадает в контекст (естественный язык + опциональные системные ограничения).
  2. Runtime вставляет список инструментов: name, description, JSON Schema (parameters / inputSchema).
  3. Модель возвращает tool_calls (функция + arguments) или финальный текст / Structured Output.
  4. Runtime делает JSON.parse arguments, вызывает локальную функцию, HTTP или MCP tools/call и пишет result JSON в сообщения.
  5. Модель читает результат и выбирает следующий инструмент или стоп. maxSteps, отмена пользователя или провал Schema тоже останавливают.

Форму цикла можно держать конфигом, не магией фреймворка. JSON ниже описывает только hops и стопы — бизнес-поля живут на Schema каждого инструмента.

{
  "loop": "agent",
  "maxSteps": 8,
  "stopWhen": ["final_answer", "max_steps", "user_cancel", "schema_fail"],
  "hops": [
    { "kind": "model", "emits": "tool_calls | text" },
    { "kind": "runtime", "emits": "tool_result JSON" },
    { "kind": "model", "emits": "next_tool | final JSON" }
  ]
}

Сбои копятся на шагах 3→4: arguments — строка, но её читают как объект; числа строками; нет required; имя инструмента уехало от кэша. «Умнее модель» не чинит дрейф контракта. Stateless MCP вешает метаданные протокола на каждый запрос; форма всё равно зависит от Schema, которую вы дали модели.

Tool calling и function calling: два имени, один механизм

Инженерно это одно: модель не трогает базу; она шлёт структурированную просьбу «вызовите эту функцию с этими arguments», runtime исполняет. Продуктовые имена 2023–2026:

Понятие Function calling Tool calling
Откуда OpenAI с 2023: function_call / functions[] Зонтичный термин 2024–2026 по API вендоров и MCP
Что шлёт модель function.name + arguments (часто JSON-строка) OpenAI tools[], Anthropic tool_use, Gemini functionCall
Где живёт Schema function.parameters tools[].function.parameters или MCP inputSchema
Vs Structured Output Не управляет финальным ответом — только входами этого hop То же разделение: hop инструмента и hop ответа — разные файлы

Позже OpenAI сложил functions в tools и добавил strict. Anthropic — tool_use / input_schema. Gemini — function declarations. MCP — JSON-RPC tools/call. Имена разные; arguments всё ещё JSON-объект. «Function calling устарел» обычно плохая причина миграции — состарились имена полей, не механизм.

Тот же поиск счетов как OpenAI strict tool. Под strict каждое property должно быть в required, иначе модель законно опустит поле, которое вы считали default:

{
  "type": "function",
  "function": {
    "name": "searchInvoices",
    "description": "Search invoices by date range and status",
    "strict": true,
    "parameters": {
      "type": "object",
      "properties": {
        "startDate": { "type": "string", "format": "date" },
        "endDate": { "type": "string", "format": "date" },
        "status": {
          "type": "string",
          "enum": ["draft", "sent", "paid", "void"]
        }
      },
      "required": ["startDate", "endDate", "status"],
      "additionalProperties": false
    }
  }
}

Когда модель вызывает, типичный tool_calls выглядит так. arguments всё ещё строка: сначала parse, потом проверка. Упавший JSON.parse — не автоматически «модель сломалась»: отделите синтаксис от Schema. Таксономия: гид ошибок JSON ИИ.

{
  "id": "call_8f3a",
  "type": "function",
  "function": {
    "name": "searchInvoices",
    "arguments": "{\"startDate\":\"2026-01-01\",\"endDate\":\"2026-01-31\",\"status\":\"paid\"}"
  }
}

Почему JSON — язык контракта агента

В пайплайне агента минимум три JSON, которые должны идти из одной канонической Schema:

  1. Определение инструмента: name / description / parameters (или MCP inputSchema).
  2. arguments модели: выбранные ключи, часто строкой внутри tool_calls.
  3. Результат инструмента: ok / result или конверт ошибки, чтобы модель выбрала следующий hop.

Четвёртый необязателен: Structured Output финального ответа. Этот файл описывает ответ пользователю или вниз по потоку — не то, что нужно searchInvoices. Один синтаксис, другая семантика; файлы и версии раздельно. См. туториал Structured Output.

После успешного вызова верните стабильный конверт, а не сырой downstream HTTP модели. result ниже отдаёт только нужные бизнесу поля; сырьё — в логи. Стабильная форма делает ретраи и сводки предсказуемыми:

{
  "toolCallId": "call_8f3a",
  "name": "searchInvoices",
  "ok": true,
  "result": {
    "count": 2,
    "items": [
      { "id": "INV-1042", "total": 1280.5, "currency": "USD" },
      { "id": "INV-1048", "total": 640.0, "currency": "USD" }
    ]
  }
}

Стеки 2026: OpenAI, Anthropic, Gemini, MCP

Универсальной Schema нет, но структуры tool calling сходятся: arguments — JSON-объект; контракт — подмножество JSON Schema.

Стек / протокол Как объявляют инструменты Как шлют вызов
OpenAI Chat / Responses tools[].function.parameters, опциональный strict строка tool_calls[].function.arguments
Anthropic Messages tools[].input_schema объект input в блоке tool_use
Gemini function_declarations.parameters functionCall.args; финальный JSON через responseSchema
MCP 2026-07-28 Tool.inputSchema (протокол за вас не проверяет) params.arguments в JSON-RPC tools/call

MCP — обнаружение и транспорт, не система типов. inputSchema объявляет форму; сервер всё равно парсит и проверяет Schema. Соответствие полей и одна Schema на трёх поверхностях: MCP и JSON Schema. Передачи между агентами идут через A2A message/send; у skills тоже висит Schema — агент к агенту, не модель к инструменту. Сравнение A2A vs MCP.

Stateless MCP лучше масштабируется, когда сессии ушли из протокола; arguments сами не чинятся. Протухший кэш tools/list пишет неверную форму. Детали: гид Stateless MCP.

Проверка на земле и JSONVue

Каждый hop: parse → Schema → бизнес-правила. Умная модель эти три шага не заменяет.

  1. Строка arguments: JSON.parse; при провале записать raw + tool_call id и вернуть retryable конверт.
  2. Проверить по parameters / inputSchema (Draft 2020-12); выдать path и keyword.
  3. Бизнес-ворота: диапазон дат, enum vs права, внешние ключи. Только потом downstream API.

Поставьте рядом три JSON: arguments модели, body в MCP или HTTP, объект, который сервер реально использовал. Расхождение почти всегда в адаптере. В браузере: форматтер JSON для parse; Валидатор JSON Schema для arguments vs файла Schema; JSON Diff для arguments модели vs downstream body. Фикстуры valid / missing-field / wrong-enum — общие для CI и ручной отладки.

Дальше: MCP и JSON Schema, Structured Output, ошибки JSON ИИ, A2A vs MCP.

FAQ

Агент и RAG — одно и то же?

Нет. RAG кладёт найденные документы в контекст, чтобы модель ответила; это может быть один инструмент (searchDocs) внутри агента. Без цикла инструментов RAG — всё ещё усиленный Q&A.

Function calling устарел — говорить только tool calling?

Заголовки доков и SDK сдвинулись; механизм нет. OpenAI всё ещё использует tools с type: function; у Anthropic, Gemini и MCP свои поля. Держите одну каноническую Schema и генерируйте оболочки вендоров. Не переписывайте бизнес из-за заголовка.

Включили Structured Output — arguments всё равно проверять?

Да. Structured Output держит финальный ответ; arguments — другой hop. Типичный инцидент: «Schema ответа прошла, в tools/call нет ключей». Файлы раздельно; parse + проверка на каждом hop.

Можно ли сделать агента без MCP?

Да. MCP — один протокол обнаружения и удалённых вызовов, не определение агента. Локальные функции, OpenAPI и свой HTTP годятся, если arguments и result — проверяемый JSON. Ценность MCP — стандартный каталог и транспорт, особенно удалённо и с несколькими клиентами.

Итог и следующие шаги

AI-агент 2026: модель выбирает действия в цикле, runtime исполняет инструменты, JSON Schema описывает каждый hop. Tool calling и function calling — продуктовые имена одного механизма. MCP, A2A и Structured Output правят разными hops — один файл не должен покрывать всё.

Дальше: перечислите три JSON в системе (определение, arguments, result) и проверьте общую Schema; прогоните valid / нет поля / неверный enum в JSONVue. Протокол — в статье MCP; форма ответа — в Structured Output; слои сбоев — в гиде ошибок JSON.