Л6. AI-агенты: архитектура, протоколы и будущее разработки
На прошлой лекции мы разобрали, что может пойти не так с AI-инструментами: уязвимости в сгенерированном коде, prompt injection, техдолг, приватность. Сегодня --- другой угол: как агенты устроены внутри, какие протоколы их связывают и куда это всё движется.
Начнём с того, что вскроем конкретный кодинг-агент до атомов --- Claude Code, чей исходный код утёк в марте 2026. Потом --- мультиагентные системы, SDK для построения своих агентов, протоколы коммуникации (MCP, A2A), и наконец --- реальные внедрения в Stripe, Block и Shopify.
Блок 1. Как устроен Claude Code изнутри
Зачем именно Claude Code?
31 марта 2026 года Anthropic случайно включила 59.8 МБ source map (cli.js.map) в npm-пакет @anthropic-ai/claude-code v2.1.88. Source map позволил восстановить оригинальный TypeScript --- 1 884 файла, 64 464 строки. Сообщество детально разобрало архитектуру, и теперь мы можем учиться на реальном коде, а не на маркетинговых описаниях.
"The entire source code of Claude Code --- 1,884 TypeScript files, 64,464 lines --- sitting in plain sight in the npm package. Bun generates source maps by default. Nobody turned it off." --- Engineer's Codex
Master Loop "nO"
Внутри Claude Code нет сложного state machine или мультиагентного роя. Ядро --- single-threaded master loop под кодовым именем nO. Работает на плоской истории сообщений:
while (tool_call) → execute tool → feed results → repeat
Цикл завершается, когда модель генерирует текстовый ответ без вызова инструментов. Это реализация ReAct (Thought → Action → Observation) в чистом виде --- и удивительно, насколько это просто.
# Концептуальный agentic loop (упрощённо)
messages = [{"role": "system", "content": build_system_prompt()}]
messages.append({"role": "user", "content": user_input})
while True:
response = await model.generate(messages)
messages.append(response)
if not response.tool_calls:
break # текстовый ответ — конец
for call in response.tool_calls:
result = await execute_tool(call)
messages.append({"role": "tool", "content": result})
h2A --- dual-buffer queue, работающая в паре с nO. Позволяет пользователю прервать или перенаправить агента прямо во время выполнения, без перезапуска всей сессии. Если вы видите, что Claude Code идёт не туда --- можно вмешаться на лету.
"Pause/resume support and ability to incorporate user interjections mid-task without requiring a full restart." --- PromptLayer: Master Agent Loop
Специализация ReAct в Claude Code --- Gather-Act-Verify: сначала собрать контекст (grep, чтение файлов), затем внести изменения, затем верифицировать (тесты, линтер). Агент не предполагает успех --- он проверяет.
graph LR
U["User input"] --> SP["System prompt<br/>assembly"]
SP --> M["Model call<br/>(nO loop)"]
M --> TC{"Tool call?"}
TC -->|"да"| T["Execute tool"]
T --> H["h2A queue<br/>(user steering)"]
H --> M
TC -->|"нет"| R["Text response"]
Проекты с тестами работают с агентами радикально лучше --- у агента есть объективный сигнал на фазе Verify. Без тестов он гадает.
System Prompt: 110+ условных блоков
Утечка показала, что system prompt Claude Code --- не статическая строка. Это 110+ отдельных инструкций, собираемых на лету в зависимости от конфигурации.
"It's 110+ separate instructions, conditionally assembled based on your configuration." --- dbreunig.com: How Claude Code Builds a System Prompt
Структура сборки:
- Identity & security --- базовые правила поведения
- Task execution --- как подходить к задачам
- Tool definitions --- описания 40+ инструментов
- CLAUDE.md injection --- файлы считываются от корня FS до CWD, каждый уровень добавляет контекст
- Git snapshot --- текущая ветка, статус, последние коммиты
- Условные блоки --- Auto mode, Plan mode, наличие MCP-серверов, OS-специфика
Для оптимизации стоимости и prompt caching промпт разделён маркером __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__. Всё до маркера --- статичный globally-cacheable контент (identity, tools). Всё после --- динамический session context (OS, git, CWD).
Итоговый размер: 2 300--3 600 токенов. На первый взгляд немного, но это только system prompt. CLAUDE.md файлы, tool results и история разговора добавляют остальное.
Context Management и Compaction
Контекстное окно --- 200K (Sonnet) или 1M (Opus) токенов. Но рано или поздно оно заканчивается. Для этого есть Compaction (кодовое имя wU2).
Compactor
wU2"automatically triggers at approximately 92% context utilization". --- dev.to: What Actually Happens When Compacting
wU2 не просто обрезает старые сообщения. Он делает отдельный LLM-вызов, который суммаризирует историю в <summary> теги. Важная информация переносится в долгосрочное хранилище (Markdown-файлы), а рабочая память очищается без потери ключевого контекста.
Tool Architecture и Permission Model
Из утечки: Claude Code содержит ~40 built-in tools. Каждый следует строгому JSON-RPC паттерну: JSON tool calls → sandboxed execution → результат как plain text.
Агент явно промптится предпочитать специализированные инструменты (Read, Edit, Glob, Grep) вместо raw shell-команд --- это делает действия структурированными, наблюдаемыми и верифицируемыми.
Permission model --- 5-step gauntlet. Каждый tool call проходит через:
- Внутренние проверки инструмента
- Sandbox policy
- Активный permission mode пользователя
- Settings allowlist/denylist (glob matching:
Bash(npm:*),Read(~/project/**)) - Explicit allow/deny для опасных команд
MCP tools живут в namespace mcp__{server}__{tool}. Sandbox использует OS primitives: bubblewrap на Linux, Seatbelt на macOS. Результат: 84% сокращение permission prompts благодаря sandbox.
"Glob patterns like
Bash(npm:*)orRead(~/project/**)." --- dev.to: Claude Code Architecture
Скрытые системы
Утечка обнажила несколько скрытых компонентов:
- KAIROS --- экспериментальная "always-on" система памяти. В отличие от стандартного Claude Code, который реагирует на промпты, KAIROS работает в фоне с периодическим heartbeat: "anything worth doing right now?". Ночной процесс autoDream --- субагент, который консолидирует дневные логи, дедуплицирует и удаляет противоречия из памяти.
- undercover.ts --- 90-строчный модуль, который при использовании сотрудниками Anthropic в open-source проектах автоматически удаляет следы AI-авторства из коммитов (Co-Authored-By, имена моделей). Промпт буквально говорит модели: "Do not blow your cover". Модуль не имеет off-switch.
- 32 build-time feature flags, 120+ env vars, 26 скрытых slash-команд
4 паттерна Anthropic
В декабре 2024 Anthropic опубликовала "Building Effective Agents" --- четыре паттерна для построения агентных систем:
| Паттерн | Суть | Когда использовать | Пример из Claude Code |
|---|---|---|---|
| Routing | Классификация → специализированный обработчик | Чёткие категории задач | Permission routing по типу tool call |
| Parallelization | Секционирование или голосование | Независимые подзадачи | Agent Teams: параллельные sub-agents |
| Orchestrator-Workers | Динамическая декомпозиция и делегирование | Подзадачи нельзя предсказать | Team Lead → spawned workers |
| Evaluator-Optimizer | Генерация + критика в цикле | Есть критерии оценки | Gather-Act-Verify cycle |
Эти паттерны не взаимоисключающие. Production-агенты вкладывают одни в другие: Orchestrator-Workers для координации + Evaluator-Optimizer для проверки каждого шага.
Блок 2. Мультиагентные системы
Зачем multi-agent?
Один агент ограничен контекстным окном и single planning loop. Решение: специализация + параллелизм. Но есть цена: Google Research показала, что ошибки в decentralized мультиагентных системах усиливаются до 17x vs 4.4x для centralized (hub-spoke).
Ошибки в децентрализованных агентных системах усиливаются до 17x по сравнению с 4.4x для централизованных. --- Google Research: Towards a Science of Scaling Agent Systems
Архитектурные паттерны
| Паттерн | Координация | Контролируемость | Масштабируемость | Когда использовать |
|---|---|---|---|---|
| Hub-spoke | Центральный оркестратор | Высокая | Средняя | Продакшн, критические задачи |
| Pipeline | Последовательные стадии | Высокая | Низкая | Чёткий workflow, ETL |
| Swarm | Peer-to-peer, blackboard | Низкая | Высокая | Exploration, широкий поиск |
| Hierarchical | Дерево менеджер-подчинённые | Средняя | Высокая | Enterprise, сложные org-структуры |
Hub-spoke доминирует в продакшене из-за контролируемости. Pipeline --- самый простой для отладки: чёткие input/output конт ракты на каждом шаге. Swarm масштабируется, но отладка --- ночной кошмар из-за "emergent" координации. Hierarchical зеркалит корпоративную структуру.
Gastown (Steve Yegge)
Steve Yegge построил Gastown --- систему, которую он называет "Kubernetes для кодинг-агентов". Это 20--30 параллельных Claude Code инстансов, координируемых через tmux.
"Gas Town is an industrialized coding factory manned by superintelligent robot chimps." --- Steve Yegge, Welcome to Gas Town
7 ролей:
- Overseer --- человек-PM
- Mayor --- координатор, запускает "конвои"
- Polecats --- эфемерные воркеры, каждый создаёт один MR и деактивируется
- Refinery --- решает проблему merge queue: ребейзит или пересоздаёт MR-ы
- Witness --- per-project watchdog, ловит зависших агентов
- Deacon --- cross-project daemon-супервайзер
- Dogs --- maintenance-воркеры для инфра-задач
Beads --- Git-backed data plane (SQLite + git). Всё состояние хранится в Git как структурированные данные, не в эфемерных чатах. Это обеспечивает NDI (Nondeterministic Idempotence): если Claude Code сессия упала или исчерпала контекст --- новая сессия читает Git-стейт и продолжает с того же места.
Стоимость: ~$100/час для 12--30 агентов. Это реальная промышленная система, работающая в продакшене.
graph TB
O["Overseer<br/>(человек)"] --> M["Mayor<br/>(координатор)"]
M --> P1["Polecat 1"]
M --> P2["Polecat 2"]
M --> P3["Polecat N"]
P1 & P2 & P3 --> R["Refinery<br/>(merge queue)"]
W["Witness"] -.-> P1 & P2 & P3
D["Deacon"] -.-> W
B["Beads<br/>(Git + SQLite)"] --- M & P1 & P2 & R
Claude Code Agent Teams
Встроенная мультиагентная система Claude Code. В отличие от Gastown, использует файловую координацию через ~/.claude/teams/ и ~/.claude/tasks/.
- JSON mailboxes для обмена сообщениями между агентами
flock()для claiming задач --- атомарный захват без race conditions- idle_notification protocol --- агенты сообщают, когда свободны
- Два типа: peer agents (параллельные равные) и child agents (подчинённые)
Файловая координация через JSON mailboxes с flock() для claiming задач. --- dev.to: Reverse-Engineering Agent Teams Protocol
Практические паттерны: параллельный research (несколько агентов исследуют разные аспекты), competing hypotheses (агенты предлагают разные решения, team lead выбирает), cross-layer coordination (frontend + backend агенты работают синхронно).
Devin 2.0: compound AI
Devin 2.0 использует compound AI multi-agent архитектуру: Planner + Coder + Critic + Browser --- четыре специализированных sub-модели, каждая в изолированной VM.
Внутри Devin: Planner + Coder + Critic + Browser --- compound AI multi-agent system. --- Medium: Deep Dive into Devin 2.0
Bottleneck: single planning loop всё равно последовательный. Несколько Coder-ов могут работать параллельно, но Planner --- единственная точка синхронизации.
OpenAI Codex Subagents
OpenAI Codex (GA март 2026) может порождать subagents --- дочерние агенты в изолированных cloud-контейнерах. Каждый subagent работает в собственном sandbox с файловой системой и сетевым доступом. Это позволяет Codex параллельно исследовать несколько подходов или работат ь над разными частями кодобазы одновременно.
Сравнение мультиагентных систем
| Gastown | Agent Teams | Devin 2.0 | Codex Subagents | |
|---|---|---|---|---|
| Координация | Git-backed Beads + tmux | File-based mailboxes | Planner orchestrator | Cloud containers |
| Персистентность | NDI --- crash-resilient | Файловая, session-scoped | VM snapshots | Эфемерная |
| Стоимость | ~$100/час | Включена в Claude Code | $20/мес + ACU | Включена в Codex |
| Зрелость | Production (Yegge) | Experimental | Production | GA (март 2026) |
Практический опыт показывает: orchestration beats raw autonomy. "8 правил из недели управления 20 AI-агентами" --- структура важнее количества агентов. --- zachwills.net
Блок 3. Agent SDKs --- обзор 2026
Главный архитектурный вопрос: кто управляет оркестрацией --- модель или код? Ответ определяет выбор SDK.
Claude Agent SDK: thin harness
Философия Anthropic: "Claude Code как библиотека". Вся интеллектуальность в модели, scaffolding минимальный.
Claude Agent SDK раскрывает харнесс через единственную функцию
query(), которая создаёт агентный цикл. Runtime --- "тупой цикл". --- Anthropic, Building Agents with Claude Agent SDK
from claude_agent_sdk import query
async for message in query(
prompt="Refactor the auth module to use JWT",
tools=["bash", "file_read", "file_write", "file_edit"],
):
print(message)
- Built-in tools: bash, file ops, search --- глубокая OS-интеграция
- Три типа sub-агентов: Fork (копия контекста), Teammate (изолированная панель + mailbox), Worktree (git-ветка)
- Managed Agents API:
/v1/agentsendpoint, серверные сессии, без локальной инфраструктуры
OpenAI Agents SDK: code-first, provider-agnostic
OpenAI Agents SDK предлагает пять примитивов: Agents (конфигурация модели + инструкции), Handoffs (передача управления другому агенту), Tools (функции), Guardrails (валидация ввода/вывода), Sessions (персистентное состояние). Работает с 100+ LLM через Chat Completions API.
Два паттерна делегирования:
- agents-as-tools --- агент вызывается как инструмент для подзадачи, результат возвращается вызывающему
- handoffs --- полная передача управления, вызывающий агент больше не участвует
OpenAI Agents SDK: 5 примитивов --- Agents, Handoffs, Tools, Guardrails, Sessions. --- mem0.ai: OpenAI Agents SDK Review
LangGraph: thick framework
Полная противоположность. Разработчик явно определяет граф состояний:
from langgraph.graph import StateGraph
graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_node("implement", implement_node)
graph.add_conditional_edges("implement", should_review)
app = graph.compile(checkpointer=MemorySaver())
- v1.0 GA. Production: Klarna, Uber, JPMorgan
- Typed state + nodes + conditional edges. Checkpointing, time-travel debugging
- Философия: "разработчик контролирует каждый переход"