Урок 0021 · Capabilities и skill-based архитектуры

Новейший тренд 2025–2026: вместо жёстких графов (LangGraph) — композируемые capabilities и skill-пакеты (SKILL.md), которые агент подгружает сам по описанию. Разбираем на Pydantic AI и Anthropic Agent Skills.

Цель урока Объяснить два новых паттерна (capabilities и skills), сравнить с графами LangGraph и сказать, когда что выбирать. Это «свежая кровь» для собеседования — большинство кандидатов это не знает.

1. Проблема, которую решают оба подхода

Классический агент: все тулы и инструкции в одном конструкторе, контекст раздувается сотнями определений, поведение зашито в код (граф) или в один гигантский промпт.

Два симптома:

Ответ индустрии — прогрессивное раскрытие: показывай агенту только описания, грузи детали когда понадобились. Отсюда два паттерна.

2. Pydantic AI Capabilities — композируемые единицы поведения

Capability — переиспользуемая, композируемая единица поведения агента. Вместо того чтобы пихать всё в конструктор (instructions здесь, tools там, model settings отдельно), ты упаковываешь связанное поведение в одну capability и передаёшь через параметр `capabilities`.[111]

Capability может давать любую комбинацию:[111]

Ключевое: «Whether you're building a memory system, a guardrail, a cost tracker, or an approval workflow, a capability is the right abstraction».[111]

Capabilities бывают always-on или loaded on demand — модель сама решает, когда подгрузить (например, capability «refunds» загружается только когда разговор про возвраты).[111]

Пример из доков — банковский support-агент: capability `customer-context` (имя + баланс из БД) всегда, capability `refunds` (статус возврата) — on-demand, defer_loading=True.[78]

Готовые capability-наборы: Memory, Subagents, Guardrails, Spend Limits, Tool Search, Compaction, Web Search, MCP, FileSystem, Shell — из pydantic-ai core и pydantic-ai-harness.[111][116]

Tool Search — решение «сотни тулов»

Отдельная capability в core: вместо того чтобы тащить сотни определений тулов в каждый промпт — загружай определения по требованию.[111] Это прямой ответ на проблему «агент теряется в куче тулов» из урока 0004.

3. Anthropic Agent Skills — SKILL.md как стандарт

Agent Skills — организованные папки инструкций, скриптов и ресурсов, которые агент обнаруживает и загружает динамически. Anthropic запустила в октябре 2025, в декабре 2025 — как открытый стандарт (agentskills.io), через 4 месяца репозиторий набрал 62k+ GitHub-звёзд, скиллы делают Atlassian, Figma, Canva, Stripe, Notion.[112][115]

Формат: директория с `SKILL.md` (YAML frontmatter: name, description) + опционально scripts/, references/, assets/.[113][114]

Метафора Anthropic: «собрать скилл — как написать онбординг-гайд для новичка».[112]

Прогрессивное раскрытие — 3 уровня

УровеньКогда грузитсяСтоимостьЧто
L1: metadataВсегда (при старте)~100 токенов на скиллname + description из frontmatter
L2: instructionsКогда скилл триггернулся< 5k токеновТело SKILL.md
L3: resources/scriptsПо мере надобности0 пока не accessedСправочники; скрипты выполняются, в контекст идёт только вывод[113]

Скрипты — важная деталь: код скрипта НИКОГДА не входит в контекст, только его вывод. Это детерминированность без налога на токены.[113]

Как это работает технически (deep dive)

Skill — это не исполняемый код и не обычный тул. Это meta-tool с именем `Skill`, который при вызове расширяется в промпт-инструкции и модифицирует контекст.[114]

Разница с тулами:[114]

АспектТрадиционные тулыSkills
Execution modelСинхронный вызов, возвращает результатPrompt expansion: подготавливает агента
ВозвратНемедленный результатИзменение контекста разговора
ПримерRead, Write, Bashpdf, skill-creator
ConcurrencyОбычно безопасноНе concurrency-safe

Выбор скилла — чистое LLM-рассуждение: нет алгоритмического роутинга, эмбеддингов или классификатора. Модель читает список «name: description» в системном промпте и сама решает, какой подходит.[114]

Отсюда правило: description — главный сигнал для выбора. Она должна говорить и ЧТО делает скилл, и КОГДА его использовать («Use when working with PDF files or when the user mentions PDFs, forms, or document extraction»).[113]

Как модель «узнаёт» о скиллах — по шагам

Скиллы не «скрыты» — модель знает о всех с первой секунды. Разница в том, что она видит только описания (L1), а полное содержимое — только выбранного.[113][114]

  1. Старт: в системный промпт форматируется список всех скиллов: "pdf": Extract text from PDF documents - When user wants to extract or process text from PDF files. Это ~100 токенов на скилл.
  2. Запрос юзера: «извлеки текст из отчёта.pdf».
  3. Рассуждение модели: юзер хочет PDF-обработку → в списке есть скилл с description «Extract text from PDF documents» → подходит. Решение внутри LLM, не в коде: нет роутера, regex или векторного поиска.
  4. Вызов: модель возвращает tool_use meta-тула Skill с command: "pdf".
  5. Загрузка: система читает pdf/SKILL.md с диска (bash) и инжектит его содержимое в контекст разговора — только теперь модель видит полные инструкции.
  6. Дальше по надобности: если инструкции ссылаются на forms.md — модель читает и его; скрипты запускаются, в контекст идёт только вывод.

Аналогия: новичку в банке дают табличку отделов («Отдел карт — блокировки, лимиты»). Он знает, что отделы существуют. Пришёл клиент с вопросом про блокировку — он идёт в отдел карт и читает их внутреннюю инструкцию. Табличка = L1, инструкция = L2, справочники = L3.

То же для тулов (function calling): каждому тулу передаётся JSON-schema (name, description, parameters) в запросе API. Модель видит все схемы и сама выбирает, какой тул вызвать и с какими аргументами. Код тула выполняется снаружи, возвращается только результат.

Следствие: качество description = качество выбора. Смутное описание → модель не вызовет скилл или вызовет не тот. Поэтому description пишется как «что делает + когда использовать», и это тестируется на golden set, как промпт.

На чём реально экономим: скилл vs тул

Частый вопрос: «У тула JSON-схема всё равно в контексте, код и раньше выполнялся снаружи — где экономия?»

Тул сам по себе контекст НЕ экономит. Схемы всех тулов (name, description, parameters) всегда в каждом запросе — это осознанный трейд-офф: компактная структура (~300 токенов на тул) за то, что модель точно знает сигнатуру и может вызвать любой. Код тула был снаружи и до скиллов.

Реальная экономия тулов — отдельная фича Tool Search / on-demand tools: в контексте только каталог имён и коротких описаний (~50 токенов на тул), полная JSON-схема подгружается для выбранного тула. Это та же progressive disclosure, применённая к тулам.

Скилл экономит инструкции — то, что иначе жило бы в системном промпте как текст. Сравни: 50 инструкций по 1000 токенов в промпте = 50k токенов в КАЖДОМ запросе. Со скиллами: 50 × ~100 токенов описаний = 5k всегда + полный текст только выбранного. Политика банка на 50 страниц не грузится, пока клиент не спросил про неё.

ТулСкилл
Что этоОперация: выполнить и вернуть результатЗнание: подготовить агента (инструкции)
В контекстеJSON-схема (всегда)Описания (всегда) + тело (по требованию)
Что экономитНичего из контекста — кроме Tool SearchИнструкции и справочники, иначе жившие в промпте

Скилл может содержать и то и другое: SKILL.md учит «как работать с PDF», а fill_form.py внутри — детерминированный скрипт, то есть «тул» внутри скилла. Поэтому они не конкуренты: тул выполняет, скилл учит.

Тулы за скиллом: экономия через on-demand загрузку

Паттерн: тяжёлый тул прячется за скиллом — его JSON-схема попадает в контекст только после того, как модель загрузила скилл.

  1. Базовый набор — только «горячие» тулы (3–5), их схемы всегда в контексте.
  2. Тяжёлые тулы — за скиллом. В контексте только описание: "refunds": Refund eligibility and refund status.
  3. Модель рассуждает: «разговор про возврат → загружаю скилл refunds».
  4. Скилл грузится → вместе с ним в ран попадают его тулы (refund_status со схемой).
  5. Модель вызывает тул как обычно.

Это реализовано в Pydantic AI как capability с defer_loading=True (банковский пример с refunds[111]) и в Anthropic Skills через скрипты в скилле (код не в контексте, только вывод[113]).

Токен-математика: схема тула ~300 токенов. В базе — платишь в каждом запросе, даже когда тул не нужен. За скиллом — 0 токенов, пока не понадобился; +~100 токенов описания скилла всегда.

Подводные камни:

Это развитие правила из урока 0004 («3–5 горячих тулов в контексте, остальные за router»): теперь за router'ом скилл, а не код.

4. Графы (LangGraph) vs capabilities/skills

КритерийLangGraph (граф)Capabilities / Skills
Control flowВ коде: nodes + edges, явные веткиВ модели: агент сам решает по описаниям
Новый сценарийПравка графа, ретестНовый SKILL.md/capability, без правки кода
ПредсказуемостьВысокая — путь фиксированНиже — модель может выбрать иначе
КонтекстВсе тулы в промптеТолько описания, детали по требованию
ОтладкаГраф виден, можно шагатьТрейс решений модели
КогдаВетки известны, нужна строгость (банк, деньги)Много сценариев, быстрое расширение

Фраза для собеседования: «Граф — когда путь предсказуем и важна строгость: router → RAG → тул → человек. Skills/capabilities — когда сценариев много и они растут: новый скилл — это новый SKILL.md, а не правка графа. Это не либо-либо: в каре я бы держал жёсткий граф для action-путей с деньгами, а FAQ-знания и процедурные инструкции вынес бы в скиллы, чтобы контекст не раздувался».

5. Что это значит для раунда Plata

Проверь себя

Прогрессивное раскрытие — это?

Выбор скилла делает?

Код скрипта скилла?

Видео и статьи

Первоисточник урока Anthropic Agent Skills (стандарт) + Pydantic AI Capabilities (реализация).

Sources: