Как работает Claude Code

Как работает Claude Code

@ai_longreads

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

Это AI-перевод статьи, сделанный каналом Про AI: Лучшие Статьи и Исследования.


Как работает Claude Code

How Claude Code works Оригинальный текст:

Claude Code — это терминальный агент для написания кода, который работает в непрерывном агентном цикле: он считывает ваш запрос, рассуждает о том, что нужно сделать, вызывает инструменты, наблюдает за результатами и повторяет этот процесс, пока задача не будет выполнена или пока ему не потребуется ваш ввод.

Агентный цикл

Каждое взаимодействие следует одному и тому же фундаментальному циклу:

1. Пользователь отправляет сообщение

Вы вводите сообщение в терминале (интерактивный режим) или передаёте его через --print / stdin (неинтерактивный / headless-режим). Сообщение добавляется в историю диалога.

2. Собирается контекст

Перед обращением к модели Claude Code собирает системный промпт, который включает: текущую дату, статус git (ветку, последние коммиты, состояние рабочего дерева), все загруженные файлы памяти CLAUDE.md и список доступных инструментов. Этот контекст формируется один раз за диалог и кэшируется — подробнее см. в разделе context.ts.

3. Claude рассуждает и выбирает инструменты

Собранный диалог отправляется в API Anthropic. Модель рассуждает о задаче и генерирует один или несколько блоков tool_use — каждый из которых содержит имя инструмента и структурированный JSON-ввод.

4. Проверка разрешений

Перед выполнением каждого вызова инструмента Claude Code проверяет текущий режим разрешений и все правила allow/deny. В зависимости от режима вызов либо одобряется автоматически, либо выводится запрос на подтверждение, либо блокируется полностью. Подробнее см. Разрешения.

5. Инструмент выполняется и возвращает результат

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

6. Цикл продолжается

Модель получает результаты инструментов и либо вызывает дополнительные инструменты, либо формирует финальный текстовый ответ. Цикл повторяется до тех пор, пока в текущем шаге модели не останется вызовов инструментов.

Цикл полностью выполняется в вашем терминальном процессе. Никакого удалённого сервера выполнения нет — ваши файлы, оболочка и учётные данные никогда не покидают вашу машину, если только инструмент явно не отправляет их (например, WebFetch, WebSearch или MCP-сервер).

Загрузка контекста

В начале каждого диалога Claude Code формирует два блока контекста, которые подставляются в начало каждого обращения к API:

Системный контекст

Собирается функцией getSystemContext() в context.ts. Содержит:

  • Статус git — текущая ветка, основная/главная ветка, имя пользователя git, вывод git status --short (обрезается до 2 000 символов при превышении) и последние 5 коммитов из git log --oneline.
  • Инъекция для сброса кэша — необязательная эфемерная строка, используемая внутри для сброса серверного кэша промптов при отладке.

Статус git пропускается, если установлена переменная CLAUDE_CODE_REMOTE=1 (удалённый/облачный режим) или если инструкции git отключены в настройках.

Пользовательский контекст

Собирается функцией getUserContext() в context.ts. Содержит:

  • Память CLAUDE.md — все файлы памяти, обнаруженные через 4-уровневую иерархию (управляемые → пользовательские → проектные → локальные). Отключается переменной CLAUDE_CODE_DISABLE_CLAUDE_MDS=1 или в bare-режиме без явного --add-dir. Подробнее см. Память и контекст.
  • Текущая дата — вставляется как Today's date is YYYY-MM-DD, чтобы модель всегда знала текущую дату.

Оба блока контекста кэшируются (мемоизируются) на протяжении всего диалога с помощью lodash/memoize. Вызов setSystemPromptInjection() немедленно очищает кэши.

Модель выполнения инструментов

Claude Code не выполняет вызовы инструментов автономно по умолчанию. У каждого инструмента есть метод checkPermissions, и его результат определяет дальнейшие действия:

| Результат проверки разрешений | Что происходит |

|-------------------------------|----------------|

| allow | Инструмент выполняется немедленно, результат добавляется в диалог |

| ask | Claude Code приостанавливается и отображает диалог подтверждения |

| deny | Вызов инструмента отклоняется; Claude получает результат с ошибкой |

Поведение разрешений контролируется активным режимом разрешений и настроенными правилами allow/deny. В режиме bypassPermissions все проверки пропускаются. В режиме acceptEdits инструменты редактирования файлов одобряются автоматически, но команды bash по-прежнему требуют подтверждения. Вызовы инструментов, которые являются безопасными и только для чтения (например, Read, Glob, Grep), обычно одобряются автоматически во всех режимах.

Интерактивный vs. неинтерактивный (task) режим

Интерактивный (REPL) режим

Режим по умолчанию. Claude Code отрисовывает живой терминальный интерфейс с использованием React/Ink. Вы видите потоковый вывод, подтверждения вызовов инструментов и анимации спиннеров во время работы агента. Сообщения сохраняются на протяжении сессии до выхода.

Неинтерактивный / print-режим

Активируется флагом --print или через передачу данных в stdin. Интерфейс не отрисовывается. Вывод записывается в stdout, чтобы его можно было перехватить скриптами или CI-конвейерами. Полезен для одноразовых задач автоматизации.

Подагенты (инструмент Task)

Claude может запускать подагентов через инструмент Task (AgentTool). Каждый подагент выполняет собственный вложенный агентный цикл с изолированным диалогом и, при необходимости, ограниченным набором инструментов. Подагенты могут работать локально (в процессе) или на удалённых вычислительных ресурсах. Результаты возвращаются родительскому агенту после завершения работы подагента. Подробнее см. Инструменты.

Хранение и возобновление диалогов

Диалоги хранятся как JSON-файлы транскриптов на диске (по умолчанию в ~/.claude/). Каждый диалог имеет уникальный идентификатор сессии. Вы можете возобновить предыдущий диалог с помощью --resume или выбрать из списка, используя --resume без аргументов. При возобновлении диалога:

  • Полная история сообщений загружается с диска.
  • Файлы памяти обнаруживаются заново и могут отличаться от тех, что были при первом запуске диалога.
  • Режим разрешений сбрасывается к настроенному по умолчанию, если он не был сохранён в сессии.

Длинные диалоги периодически уплотняются (compacted) — самые старые сообщения обобщаются, чтобы контекстное окно оставалось управляемым. Полный исходный транскрипт всегда сохраняется на диске; уплотнение влияет только на то, что отправляется в API.

Движок запросов

Под капотом каждый «шаг» в агентном цикле управляется запросом — вызовом query.ts, который отправляет текущий список сообщений в API Anthropic и потоково получает ответ. Движок запросов отвечает за:

  • Потоковый вывод токенов (токены, единицы текста) в терминал в реальном времени.
  • Диспетчеризацию блоков tool_use в соответствующие обработчики инструментов.
  • Соблюдение бюджетов токенов и вызовов инструментов на каждый шаг.
  • Сбор результатов инструментов и их добавление перед следующим обращением к модели.
  • Запуск уплотнения при заполнении контекстного окна.

У каждого инструмента есть свойство maxResultSizeChars. Когда результат превышает этот лимит, содержимое сохраняется во временный файл, а модель получает превью с путём к файлу — это предотвращает переполнение контекстного окна большими выводами.


Подпишитесь на канал и каждый день читайте лучшие материалы про AI переведенные на русский!

Нашли интересную статью для перевода? Пришлите нашему боту: @ailongreadsbot

Report Page