Туториал
Что такое 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: наблюдать → решать → вызывать → наблюдать
Снимите демо-видео: типичный цикл — пять шагов.
- Цель пользователя попадает в контекст (естественный язык + опциональные системные ограничения).
- Runtime вставляет список инструментов: name, description, JSON Schema (parameters / inputSchema).
- Модель возвращает tool_calls (функция + arguments) или финальный текст / Structured Output.
- Runtime делает JSON.parse arguments, вызывает локальную функцию, HTTP или MCP tools/call и пишет result JSON в сообщения.
- Модель читает результат и выбирает следующий инструмент или стоп. 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:
- Определение инструмента: name / description / parameters (или MCP inputSchema).
- arguments модели: выбранные ключи, часто строкой внутри tool_calls.
- Результат инструмента: 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 → бизнес-правила. Умная модель эти три шага не заменяет.
- Строка arguments: JSON.parse; при провале записать raw + tool_call id и вернуть retryable конверт.
- Проверить по parameters / inputSchema (Draft 2020-12); выдать path и keyword.
- Бизнес-ворота: диапазон дат, 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.