Туториал
Почему AI-агенты уходят от Tool Calling к Skills + Plugins: смена архитектуры 2026 и поток JSON
Tool Calling не устарел. Устарело запихивать все схемы инструментов и весь справочник в один запрос.
Уже написано, что такое цикл агента, как этот hop MCP проверяет arguments и как выбирать Skills / MCP / Plugin. Сегодня эти три текста не пересказываем. На ревью звучит другая фраза: «У нас уже есть Tool Calling — зачем Skills и Plugins?» Это вопрос архитектуры, не заполнения полей. Причины конкретны. Много инструментов — полная таблица схем съедает окно. Длинный процесс — SOP в системном промпте обрезают. Сменили клиент — инструкция и рука расходятся. Agent Skills сжимает открытие до name + description через постепенное раскрытие. Agent Plugins 1.0.0 задаёт ящик, не вызов. Google тоже говорит: один навык, один MCP, один клиент ящик не обязаны. Этот текст кладёт старый запрос рядом с новым следом как JSON.
Держит не вызов, а поверхность открытия
Tool Calling по-прежнему hop, где модель выбирает имя функции и arguments. В 2026 его никто не снял с вооружения. Сняли привычку упаковки: на старте вылить пятьдесят inputSchema в tools[], потом вставить «сначала проект, потом billing, недельный отчёт как у финансов» в system. Десять инструментов терпят. Третья предметная область — и сам запрос становится гигантским JSON, который никто не diffит. Неверный инструмент выглядит как галлюцинация. Обычно корень — слишком широкая поверхность и обрезанная инструкция. Hop вызова не сломан. Вы заставили его ещё и открывать.
Окно — только первый рез. Второй — изменение. Финансы меняют порядок разделов, и вы правите системный промпт, внутреннюю wiki и три вставки в IDE. Без diffабельного SKILL.md изменение не попадает в PR. Третий рез — между клиентами: диалект MCP у Cursor, каталог навыков у Claude Code, раскладка плагина у Antigravity — три обёртки. Инструменты те же; ящики расходятся первыми. Боль не в конверте tools/call. Она снаружи: когда брать и с чем ехать.
Значит, «к Skills + Plugins» — не смена лозунга. Открытие и упаковку вынимают из запроса вызова. Hop вызова остаётся — см. MCP и JSON Schema. Цикл агента остаётся — см. текст определения. Сегодня только то, как течёт JSON после разделения. Что клиент держит после установки — манифест Plugin на практике, пять прыжков. Этот текст — почему эти пять прыжков появились.
| Этот слой | Старая привычка | Привычка 2026 |
|---|---|---|
| Когда брать процесс | Длинный абзац в системном промпте | description навыка (~100 токенов) |
| Какие руки есть | Полный tools[] в запросе | tools/list после установки Plugin или соединения MCP |
| Сам вызов | Arguments модели → рантайм | Без перемен: всё ещё parse + Schema |
Не замена: слой вызова остаётся, сверху садится ещё один
Назвать Skills «следующим Tool Calling» — и в логах вы отладите не тот слой. У Skill нет tools/call. Это инструкция. На старте впрыскивают только метаданные. Модель попала в триггер — тогда читает тело и scripts/. MCP — рука. Plugin — каталог. Трое сидят над вызовом; hop arguments они не заменяют. Честный след всё ещё показывает один законный tools/call. Нет его — открытие заблокировало модель, слой вызова не удалили.
Постепенное раскрытие — ядро спецификации Agent Skills, не рекламное прилагательное. name до 64, description до 1024, третье лицо, что делает и когда брать. Внутренний код или слоган от первого лица обнуляют поверхность — инструменты есть, модель их не выбирает. Тело по требованию, чтобы runbook и пятьдесят схем не дрались за одно окно. Скрипты по-прежнему argv, не первоклассные инструменты из tools/list. Стабильный JSON на входе — снова MCP.
Plugin тоньше. Он не встраивает список инструментов и не кладёт SOP на верх plugin.json. Ящик отвечает, есть ли эта инструкция и эта рука. Вызов отвечает, законны ли arguments этого hop. Два JSON, две работы. Четыре вопроса — в тексте выбора; пять прыжков после установки — в тексте про манифест. Сегодня только рисуем, как поток стал из плоского толстым.
Старый поток: один огромный массив tools
Старый запрос похож на меню плюс правила дома. У каждого пункта tools полный inputSchema. В system лежит процесс. Одна фраза пользователя — и модель заказывает со всего меню. Короткое меню быстро. Когда меню — счета + расходы + IAM + деплой + поиск доков, сначала ломается заказ: похожие инструменты конкурируют, SOP обрывается на «не коммитьте секреты…». В тикете пишут, что модель сбрендила. Diff говорит: сначала сбрендил тело запроса.
У этого JSON скрытая цена: его собрал рантайм, в репозиторий он часто не попадает. Кто-то добавляет send_slack, и ни один PR не показывает, насколько выросли схемы. Ревью сидит на гигантском теле в логах. Нет бюджета — нет сигнала вынести открытие. Плоская архитектура не моральный провал. Это рост без счётчика.
Ниже сплющенная старая фикстура. Прод длиннее. Сначала parse, затем бюджет CI на tools.length и байты запроса. Превысить бюджет — не «ещё строка промпта». Это вынести SOP и полные схемы из стартового запроса.
{
"era": "flat-tool-calling",
"system": "Always check the billing project first. Never commit secrets. Write the weekly invoice summary the finance team actually reads.",
"tools": [
{
"name": "query_invoices",
"inputSchema": {
"type": "object",
"required": ["week"],
"properties": {
"week": { "type": "string", "pattern": "^[0-9]{4}-W[0-9]{2}$" },
"status": { "type": "string", "enum": ["open", "paid", "overdue"] }
}
}
},
{
"name": "export_csv",
"inputSchema": {
"type": "object",
"required": ["week"],
"properties": { "week": { "type": "string" } }
}
},
{
"name": "send_slack",
"inputSchema": {
"type": "object",
"required": ["channel", "text"],
"properties": {
"channel": { "type": "string" },
"text": { "type": "string" }
}
}
}
]
}
Новый поток: метаданные → тело → контракт инструмента
Новый след толстеет по требованию. Старт: в контексте только метаданные навыка (плюс личность плагина, если ящик установлен). Совпадение: тогда читать тело SKILL.md. Нужна рука: тогда положить inputSchema этого раунда из tools/list в окно. Вызов: arguments по-прежнему проходят ту же проверку схемы. Что сидит в окне сразу, меняется с «полное меню + полные правила» на «индекс + открытая книга». Токены уходят со стартового счёта на счёт совпадения.
tools[] не исчез. Он сдвинулся позже. Цена сдвига — ещё одно рукопожатие и ещё один способ провалить совпадение. Слабый description — модель не доходит до третьего hop, пользователи говорят «поставили Plugin, всё равно не умеет». Баг открытия, не возврат Tool Calling. Обратное — в следе уже есть inputSchema, а runbook всё равно льют в system — новая архитектура катится назад. Счёт за окно возвращается.
Ниже новая фикстура той же задачи. Это не файл спецификации. Это след для ревью. Diff со старым запросом: SOP уехала из system в skills[].description, схемы — со старта в afterMatch.tools. Контракт query_invoices на слое вызова остаётся одной канонической схемой. Не изобретайте второй набор полей «под новую архитектуру».
{
"era": "skills-plus-plugins",
"startup": {
"plugin": "invoice-ops",
"skills": [
{
"name": "write-weekly-summary",
"description": "Turn invoice query results into the weekly summary finance reads. Use when the user asks for a week-end report.",
"loaded": "metadata"
}
]
},
"afterMatch": {
"skillBodyLoaded": true,
"tools": [
{
"name": "query_invoices",
"source": "mcp:invoice-tools",
"inputSchema": {
"type": "object",
"required": ["week"],
"properties": {
"week": { "type": "string", "pattern": "^[0-9]{4}-W[0-9]{2}$" },
"status": { "type": "string", "enum": ["open", "paid", "overdue"] }
}
}
}
]
}
}
Зачем ещё Plugin: инструкция и рука должны ехать вместе
Сложить SOP в Skill, API в MCP — запрос уже худеет. Второй клиент — и раскладка плюс диалект MCP снова расходятся. Plugin окупается, когда инструкция и рука должны ехать вместе. Google Cloud Developer Plugin пакует навык-ограничитель gcloud с Developer Knowledge MCP именно поэтому, не потому что Tool Calling был слаб. Ящик не исполняет ни один инструмент. Он не даёт пути открытия разъехаться между Antigravity, Claude Code и Cursor.
Один клиент, один сервер: оставляйте родную конфигурацию MCP. Выпустить Plugin «чтобы быть современными» — ещё один манифест. Третий и четвёртый вопросы текста выбора держатся. Сдвиг архитектуры — не «все на Plugin». Это «слой вызова стабилен; открытие и упаковка — там, где болит». Нет второго клиента, инструкция не зависит от руки: остановиться на Skill или родном MCP — правильная архитектура 2026.
Линию A2A ещё раз. Как находят другого агента — Agent Card, не запихивание того агента в tools[]. Другой взрыв плоского Tool Calling: считать удалённого агента одной функцией. Это рвёт форму arguments. Горизонтальное делегирование не сегодняшний поток. Сегодня только то, как этот агент несёт меньше меню и больше индекса.
| Симптом | Этот слой первым | Не делать |
|---|---|---|
Запрос 200 КБ, 40 записей в tools | Открытие: метаданные навыка + схемы по требованию | Ещё удлинять системный промпт |
| После смены IDE инструкция и рука не сходятся | Упаковка: каталог Plugin | Копировать ещё один диалект клиента |
| Инструмент верный, недельный отчёт всё равно кривой | Инструкция: тело SKILL.md | Добавить пустой инструмент format_report |
Две фикстуры рядом в diff
Минимум три фикстуры ревью: старый запрос выше, новый след, один настоящий объект arguments для query_invoices. Первые две отвечают, «какой слой отдал раздутость». Третья доказывает, что слой вызова не переписан — inputSchema всё ещё канонический. Кто скопировал name плагина в arguments инструмента или inputSchema в plugin.json, виден в diff сразу.
Два отрицательных: новый след с пустыми skills, который всё равно пишет era = skills-plus-plugins; старый запрос сверх бюджета по tools.length без записи о разделении. Первый ловит смену лозунга без смены открытия. Второй ловит «просто удлиним промпт». Секретов в закоммиченных фикстурах быть не должно.
В браузере хватит:Форматирование JSON, чтобы распарсить старый запрос и новый след;Проверка JSON Schema, чтобы проверить inputSchema и arguments;JSON Diff, чтобы положить старые system / tools рядом с новыми skills / afterMatch. Данные с машины не уходят. Дальше:MCP и JSON Schema, текст выбора и пять прыжков манифеста.
Связанное: Что такое AI Agent, MCP и JSON Schema, Skills vs MCP vs Plugins, Манифест Plugin на практике.
Частые вопросы
Удалять Tool Calling?
Нет. Модель по-прежнему выбирает имя функции и arguments; рантайм по-прежнему шлёт tools/call. Удаляете полное меню на старте, не hop вызова. В следе нет законного вызова — сначала открытие, потом рантайм.
Только Skill, без Plugin — это уже новая архитектура?
Это слой открытия. SOP ушла из системного промпта и грузится по требованию; запрос худеет. Это не слой упаковки. Одного клиента хватает — стойте. Появился второй, инструкция должна ехать с рукой — тогда Plugin.
Оставить все схемы в стартовом запросе не быстрее?
Короткое меню, стабильные инструменты, один клиент — да, и проще. За бюджетом, по числу или байтам, неверный выбор инструмента съедает сэкономленную задержку. Бюджет раньше чувства.
Это конфликтует с Programmatic Tool Calling?
Нет. Programmatic Tool Calling — структура на слое вызова: модель сознательно цепочкой вызывает инструменты. Skills + Plugins — открытие и упаковка: какую инструкцию читать, какую руку соединять. Сначала индекс, потом цепочка.
Выводы и дальше
В 2026 «от Tool Calling к Skills + Plugins» сжимается в одну строку: hop вызова остаётся; открытие и упаковка выходят из гигантского запроса. Модель по-прежнему заказывает. Всё меню больше не на столе в момент посадки.
Выпускать так: бюджет на tools.length и байты старого запроса; сложить SOP в description; полные схемы — после совпадения; plugin.json, когда появится второй клиент. Старый запрос и новый след рядом в JSONVue. Цикл — текст про Agent. Arguments — текст про MCP. Собирать ли ящик — текст выбора.