Что внутри Claude Code? Почему он так работает и как в этом разобраться? (Разбор исходного кода)
Разобрал исходники Claude Code, чтобы показать, как реально устроена его внутренняя архитектура.
Канал с гайдами и контентом по ИИшкам и что с ними можно реализовывать, мы выписываем абсолютно всю базу по ИИ в наш канал и там другие полезные материалы: https://t.me/claudedevolper
Здесь речь не о внешнем интерфейсе, а о внутренней кухне системы.
Если ты занимаешься созданием AI-продуктов, подходы Anthropic — это фактически готовый разбор того, как строить агентные архитектуры.
Ниже — подборка архитектурных приёмов, которые без лишних сомнений можно адаптировать под свои задачи.
Если материал окажется полезным — смело делись.
Многие воспринимают Claude Code как обычный чат прямо в терминале. Но при детальном изучении кода становится очевидно: за этим стоит многоуровневая система оркестрации агентов, насчитывающая около десятка уровней и покрывающая ключевые сложности разработки AI-продуктов.
Каждый слой — это не абстракция, а конкретное инженерное решение, которое можно внедрить у себя. Причём не имеет значения, создаёшь ли ты coding-агента, бота поддержки или инфраструктурный инструмент для работы с AI.
Давай разбираться.
1. Точка входа безжалостно оптимизирована под скорость
Claude Code стартует за миллисекунды. Как?
- Fast-path routing. Простые команды вроде --version и --daemon перехватываются еще до загрузки всего приложения. Никакой лишней инициализации.
- Parallel prefetching. Пока CLI парсит твою команду, он уже параллельно грузит настройки, чекает авторизацию, поднимает TLS-соединения и преконнектится к API. Всё одновременно.
- Memoized initialization. Тяжелые операции сетапа выполняются один раз и улетают в cache.
Что можно украсть:Если в твоем AI-продукте есть CLI или долгий запуск, не грузи всё сразу. Делай fast-path для частых кейсов. Используй parallel prefetching. Мемоизируй тяжелые операции. Юзеры замечают время старта гораздо сильнее, чем кажется.
2. Кастомный рендерер терминала, написанный с нуля
Claude Code не использует стандартные библиотеки для UI в терминале. Они написали собственный React-based рендерер на базе Ink со следующими фичами:
- Yoga flexbox движок для лейаутов в терминале
- Виртуальный скроллинг с кэшированием высоты
- Инкрементальный вывод ANSI diff-ов через интернированные буферы экрана
- Парсинг ввода CSI u для поддержки мыши и выделения текста
Они буквально притащили концепции веб-рендеринга в терминал.
Что можно украсть:Ставка здесь не на дефолтный UI-фреймворк, а на собственный слой рендеринга под нужный паттерн взаимодействия. Если в продукте специфичный паттерн взаимодействия — streaming ответов, вывод tool outputs, multi-agent вьюшки — вложись в слой рендеринга. Кастомный UI, который плавно переваривает streaming, — это гигантское преимущество в UX. У большинства AI-продуктов стриминг дерганый, потому что они на это забили.
3. Цикл диалога — это стейт-машина на async generator'ах
Это ядро продукта. REPL грузит инструменты, собирает system prompt, подтягивает context, а затем заходит в цикл async generator:
for await (event of query({ messages, systemPrompt, tools }))
Каждый event обрабатывается и рендерится в реальном времени. Tool calls, text deltas, ошибки — всё летит через единый стрим.
Сам движок запросов — это цикл while (true), который:
- нормализует сообщения и сжимает context
- билдит system prompt (статический + динамический)
- дергает модель со streaming
- собирает блоки tool_use
- выполняет инструменты
- аппендит результаты
- крутится до end_turn
Что можно украсть:Если ты строишь AI-продукт с tool use, вот твой паттерн. Async generators для потока ивентов. Стейт-машина в цикле для работы агента. Четко разделяй «нормализацию context» от «вызова модели» и «выполнения тулзов». Обычно разработчики делают не чистый цикл агента, а одну большую кашу из контекста, модели и тулзов — и получают спагетти-код. Anthropic разделили всё максимально чисто, и это видно.
4. Умная конкурентность при выполнении тулзов
В Claude Code больше 60 инструментов. Но главная фишка в том, как они запускаются.
Когда модель возвращает несколько tool calls, система их разбивает:
- Concurrent batch — read-only тулзы (чтение файлов, поиск, globs) крутятся параллельно
- Serial batch — мутирующие тулзы (редактирование, запись, bash) выполняются последовательно
Каждый тулз проходит через:
валидацию инпута (Zod) → pre-hooks → проверку пермишенов → выполнение → post-hooks → truncation результата
Что можно украсть:Если твой AI-продукт использует тулзы, думай о конкурентности. Операции чтения можно смело параллелить. Операции записи требуют строгой очереди. Большинство AI-продуктов выбирают не умную конкурентность, а тупую последовательность — и сами себе режут скорость.
И еще: валидируй инпуты через схему. Обрезай аутпуты. LLM не нужен файл на 50 KB в context, если достаточно 8 KB.
5. Система пермишенов работает как многослойная гонка (race)
Это реально крутое инженерное решение.
Когда Claude Code нужен доступ для какого-то действия, он не просто спрашивает юзера. Он запускает гонку нескольких резолверов параллельно:
- клик юзера (диалоговое окно)
- hook classifier (автоматизированные правила)
- bash security classifier (LLM-чекер безопасности)
- bridge/web UI (внешний аппрув)
Кто ответит первым — тот и победил. Паттерн createResolveOnce.
Поверх этого работает 5-уровневый каскад правил:
policy > flag > local > project > user
Правила на высоких уровнях нельзя переопределить на нижних.
Что можно украсть:Если твой продукт делает что-то рискованное — доступ к файлам, вызовы API, изменение данных — делай многослойную систему доступов. Тут идея не в том, чтобы дергать пользователя подтверждениями на каждый чих, а в том, чтобы дать системе самой найти самый быстрый безопасный способ разрешения. Сделай настраиваемые правила, авто-классификаторы и интерактивные фоллбеки. Паттерн с гонкой особенно хорош: он гарантирует, что самый быстрый безопасный путь всегда выигрывает.
6. В context management зашито 5 стратегий сжатия
Сразу видно, что инженеры убили на это месяцы.
Дефолтное окно — 200K токенов. Опционально — 1M. И пять стратегий для обработки переполнения:
- microcompact — вычищает старые результаты тулзов по времени
- context collapse — саммаризует куски переписки в более короткие версии
- session memory — вытаскивает структурированный context (спеки задач, файлы, найденные решения) в отдельный файл
- full compact — делает саммари всей истории диалога
- PTL truncation — как крайняя мера, дропает самые старые группы сообщений
Система пробует их по очереди — от наименее деструктивных к самым жестким. И делает это автоматически, когда context начинает переполняться.
Что можно украсть:Если в твоем продукте диалоги длятся дольше пары реплик, тебе жизненно необходима стратегия управления контекстом. Большинство делает не context management, а обычную обрезку истории сверху. Это самый тупой подход из возможных. Делай многоуровневое сжатие. Сохраняй важный context во внешнее хранилище. Делай саммари перед тем, как удалять. Разница между продуктом, который «теряет контекст», и тем, который «помнит всё», кроется именно в такой инженерии.
7. System prompt разбит на кэшируемую и динамическую части
Anthropic делит system prompt на две части:
- Статическая (кэшируемая): инструкции роли, гайдлайны для тулзов, правила кода и стиля. Они почти не меняются между запросами.
- Динамическая (для каждого реквеста): файлы CLAUDE.md, инфа об окружении, статус git, текущая дата, память. Это меняется на каждом ходу.
Между ними проходит жесткая граница кэширования. Статическая часть улетает в cache на стороне API (TTL 1 час). Динамическая часть пересобирается каждый ход.
Что можно украсть:Если ты отправляешь system prompts в LLM API, строй их не как один монолит, а как две разные зоны: кэшируемую и динамическую. Сначала ставь стабильные инструкции — для кэша. Динамический context кидай в конец. Это радикально режет косты на API, потому что закэшированный префикс не процессится заново. Большинство AI-продуктов пересобирают весь system prompt каждый раз и платят по полной программе.
8. Subagents спроектированы для шаринга кэша
Когда Claude Code форкает субагента (subagent), он создает байт-в-байт идентичную копию родительского контекста. Это значит, что форкнутый агент попадает в тот же prompt cache, что и родитель.
Пять параллельных агентов стоят почти столько же, сколько один, работающий последовательно.
Три модели выполнения
- fork — тот же процесс, общий cache, рекурсивные форки запрещены
- teammate — отдельная панель в tmux/iTerm, общение через файловый mailbox
- worktree — отдельный git worktree под агента, изолированные ветки
Что можно украсть:Если пилишь мультиагентную систему, думай не только про роли агентов, а про топологию кэша между ними. Агенты с общими префиксами контекста могут шарить API cache. Проектируй спавн агентов так, чтобы максимизировать cache hits.
И еще: общение агентов через файлы — это просто и надежно. Не надо переусложнять брокерами сообщений, когда JSON-файла в известной директории вполне достаточно.
9. Система хуков дает расширяемость без форков
Больше 25 lifecycle-ивентов. Пять типов хуков: command, prompt, agent, HTTP, function.
Хуки могут подтягиваться из:
- настроек
- плагинов
- фронтматтера агента
- SDK-коллбеков
PreToolUse может блокировать или модифицировать действия до их начала.PostToolUse может трансформировать результаты.UserPromptSubmit может инжектить context в каждое сообщение.
Что можно украсть:Хуки стоит закладывать не как поздний enterprise-апгрейд, а как часть архитектуры с первого дня. Даже если сразу они тебе не нужны. Возможность прогонять кастомную логику до и после каждого tool call, каждого сообщения и каждой сессии — вот что превращает продукт в платформу. Твои power users построят поверх этих хуков такое, о чем ты даже не подозревал.
10. Всё сохраняется и всё можно возобновить
Диалоги пишутся в JSONL. Session memory выгружается в файлы. Любую сессию можно продолжить, возобновить (resumable) или форкнуть.
Что можно украсть:Подход должен быть «всё сохраняется и всё можно поднять снова». Диалоги, результаты тулзов, стейт агента. Делай так, чтобы процесс можно было резьюмить. Стоимость стораджа — ничто по сравнению с ценой потерянного контекста. Большинство AI-продуктов относятся к сессиям как к чему-то временному, и это убивает весь UX на длинных задачах.
Общая картина
Что подход Claude Code говорит о создании AI-продуктов в целом:
Разделяй слой рендеринга и логику агента
Claude Code использует React для UI и async generators для цикла агента. Они полностью независимы. Именно поэтому они могут поддерживать интерфейсы терминала, web bridge и SDK из одного ядра.
Относись к context как к управляемому ресурсу
А не как к помойке. Пять стратегий сжатия существуют потому, что подход «просто засунь всё в модель» не скейлится. Любому серьезному AI-продукту в итоге понадобится context management. Делай его сразу.
Закладывай параллелизм с первого дня
Tool batching, fork subagents, cache sharing. Архитектура изначально предполагает, что несколько вещей происходят одновременно. Однопоточные циклы агента — это тупик.
Делай пермишены гибкими, а не бинарными
5-уровневый каскад с авто-классификаторами — это куда умнее, чем «разрешить всё» или «спрашивать каждый раз». У юзеров разная толерантность к рискам. Дай им это настроить.
Hooks > plugins > захардкоженные фичи
Самая расширяемая часть Claude Code — это не какая-то конкретная фича. Это система хуков, которая позволяет любому добавлять функционал, не трогая ядро.
Cache-aware архитектура экономит деньги
Разделение system prompts на статику/динамику, шаринг кэша между subagents, использование эфемерных маркеров. Это оптимизация костов, зашитая прямо в архитектуру. На масштабе это разница между прибылью и банкротством.
TL;DR для разработчиков
- Делай fast-path для точек входа. Не грузи то, что не нужно.
- Вкладывайся в слой стриминга и рендеринга. Это и есть UX.
- Используй async generator state machine для циклов агента.
- Разделяй выполнение тулзов: чтение параллельно, запись последовательно.
- Запускай гонку пермишенов. Первый безопасный ответ побеждает.
- Делай 5 уровней сжатия контекста, а не просто truncation.
- Разделяй system prompts: статика (cache) + динамика (на каждый ход).
- Проектируй запуск subagents с учетом шаринга кэша.
- Внедряй хуки с первого дня. Хуки превращают продукты в платформы.
- Сохраняй всё. Делай сессии resumable.
Финальная мысль
Claude Code — это не просто удачный продукт, а чертеж того, как вообще стоит строить AI-native софт.
Исходники открыты. Иди читай. Воруй паттерны. И сделай что-нибудь еще круче.