Туториал

Почему 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. Собирать ли ящик — текст выбора.