Цикл с первого взгляда
Каждая сессия агента следует одному и тому же циклу:- Получить запрос. Claude получает ваш запрос вместе с системным запросом, определениями инструментов и историей разговора. SDK выдает
SystemMessageс подтипом"init", содержащий метаданные сессии. - Оценить и ответить. Claude оценивает текущее состояние и определяет, как действовать дальше. Он может ответить текстом, запросить один или несколько вызовов инструментов или оба варианта. SDK выдает
AssistantMessage, содержащее текст и любые запросы вызовов инструментов. - Выполнить инструменты. SDK запускает каждый запрошенный инструмент и собирает результаты. Каждый набор результатов инструментов возвращается Claude для следующего решения. Вы можете использовать hooks для перехвата, изменения или блокировки вызовов инструментов перед их выполнением.
- Повторить. Шаги 2 и 3 повторяются как цикл. Каждый полный цикл — это один ход. Claude продолжает вызывать инструменты и обрабатывать результаты до тех пор, пока не выдаст ответ без вызовов инструментов.
- Вернуть результат. SDK выдает финальное
AssistantMessageс текстовым ответом (без вызовов инструментов), за которым следуетResultMessageс финальным текстом, использованием токенов, стоимостью и ID сессии.
Glob и ответа с результатами. Сложная задача («рефакторить модуль аутентификации и обновить тесты») может связать десятки вызовов инструментов на протяжении многих ходов, читая файлы, редактируя код и запуская тесты, при этом Claude корректирует свой подход на основе каждого результата.
Ходы и сообщения
Ход — это один цикл внутри цикла: Claude выдает выход, который включает вызовы инструментов, SDK выполняет эти инструменты, и результаты автоматически возвращаются Claude. Это происходит без возврата управления вашему коду. Ходы продолжаются до тех пор, пока Claude не выдаст выход без вызовов инструментов, после чего цикл заканчивается и доставляется финальный результат. Рассмотрим, как может выглядеть полная сессия для запроса «Исправить неудачные тесты в auth.ts». Сначала SDK отправляет ваш запрос Claude и выдаетSystemMessage с метаданными сессии. Затем начинается цикл:
- Ход 1: Claude вызывает
Bashдля запускаnpm test. SDK выдаетAssistantMessageс вызовом инструмента, выполняет команду, затем выдаетUserMessageс выводом (три ошибки). - Ход 2: Claude вызывает
Readнаauth.tsиauth.test.ts. SDK возвращает содержимое файлов и выдаетAssistantMessage. - Ход 3: Claude вызывает
Editдля исправленияauth.ts, затем вызываетBashдля повторного запускаnpm test. Все три теста проходят. SDK выдаетAssistantMessage. - Финальный ход: Claude выдает текстовый ответ без вызовов инструментов: «Исправлена ошибка аутентификации, все три теста теперь проходят.» SDK выдает финальное
AssistantMessageс этим текстом, затемResultMessageс тем же текстом плюс стоимость и использование.
max_turns / maxTurns, который считает только ходы с использованием инструментов. Например, max_turns=2 в цикле выше остановился бы перед шагом редактирования. Вы также можете использовать max_budget_usd / maxBudgetUsd для ограничения ходов на основе порога расходов.
Без ограничений цикл работает до тех пор, пока Claude не закончит самостоятельно, что хорошо для хорошо определенных задач, но может работать долго на открытых запросах («улучшить этот кодовую базу»). Установка бюджета — хороший стандарт для производственных агентов. См. Ходы и бюджет ниже для справки по опциям.
Типы сообщений
По мере выполнения цикла SDK выдает поток сообщений. Каждое сообщение имеет тип, который говорит вам, на каком этапе цикла оно пришло. Пять основных типов:SystemMessage: события жизненного цикла сессии. Полеsubtypeих различает:"init"— это первое сообщение (метаданные сессии), а"compact_boundary"срабатывает после компактирования. В TypeScript граница компактирования — это собственный типSDKCompactBoundaryMessageвместо подтипаSDKSystemMessage.AssistantMessage: выдается после каждого ответа Claude, включая финальный текстовый. Содержит блоки текстового содержимого и блоки вызовов инструментов из этого хода.UserMessage: выдается после каждого выполнения инструмента с результатом инструмента, отправленным обратно Claude. Также выдается для любых пользовательских входов, которые вы транслируете в середине цикла.StreamEvent: выдается только при включении частичных сообщений. Содержит необработанные события потоковой передачи API (дельты текста, фрагменты входных данных инструмента). См. Потоковые ответы.ResultMessage: отмечает конец цикла агента. Содержит финальный текстовый результат, использование токенов, стоимость и ID сессии. Проверьте полеsubtype, чтобы определить, успешна ли задача или достигнут ли лимит. Небольшое количество завершающих системных событий, таких какprompt_suggestion, может прибыть после него, поэтому итерируйте поток до завершения, а не прерывайте на результате. См. Обработать результат.
Обработать сообщения
Какие сообщения вы обрабатываете, зависит от того, что вы создаете:- Только финальные результаты: обработайте
ResultMessage, чтобы получить выход, стоимость и то, успешна ли задача или достигнут ли лимит. - Обновления прогресса: обработайте
AssistantMessage, чтобы увидеть, что делает Claude на каждом ходу, включая какие инструменты он вызвал. - Прямая потоковая передача: включите частичные сообщения (
include_partial_messagesв Python,includePartialMessagesв TypeScript), чтобы получить сообщенияStreamEventв реальном времени. См. Потоковые ответы в реальном времени.
- Python: проверьте типы сообщений с помощью
isinstance()для классов, импортированных изclaude_agent_sdk(например,isinstance(message, ResultMessage)). - TypeScript: проверьте строковое поле
type(например,message.type === "result").AssistantMessageиUserMessageоборачивают необработанное сообщение API в поле.message, поэтому блоки содержимого находятся вmessage.message.content, а не вmessage.content.
Пример: Проверить типы сообщений и обработать результаты
Пример: Проверить типы сообщений и обработать результаты
Выполнение инструментов
Инструменты дают вашему агенту возможность действовать. Без инструментов Claude может только отвечать текстом. С инструментами Claude может читать файлы, запускать команды, искать код и взаимодействовать с внешними сервисами.Встроенные инструменты
SDK включает те же инструменты, которые питают Claude Code:| Категория | Инструменты | Что они делают |
|---|---|---|
| Операции с файлами | Read, Edit, Write | Читать, изменять и создавать файлы |
| Поиск | Glob, Grep | Найти файлы по шаблону, искать содержимое с помощью regex |
| Выполнение | Bash | Запускать команды оболочки, скрипты, операции git |
| Веб | WebSearch, WebFetch | Искать в веб, получать и анализировать страницы |
| Обнаружение | ToolSearch | Динамически находить и загружать инструменты по требованию вместо предварительной загрузки всех |
| Оркестрация | Agent, Skill, AskUserQuestion, TaskCreate, TaskUpdate | Порождать подагентов, вызывать skills, спрашивать пользователя, отслеживать задачи |
- Подключить внешние сервисы с помощью MCP servers (базы данных, браузеры, API)
- Определить пользовательские инструменты с помощью пользовательских обработчиков инструментов
- Загрузить skills проекта через источники настроек для повторно используемых рабочих процессов
Разрешения инструментов
Claude определяет, какие инструменты вызывать на основе задачи, но вы контролируете, разрешено ли выполнение этих вызовов. Вы можете автоматически одобрить определенные инструменты, полностью заблокировать другие или требовать одобрения для всего. Три опции работают вместе, чтобы определить, что работает:allowed_tools/allowedToolsавтоматически одобряет перечисленные инструменты. Агент только для чтения с["Read", "Glob", "Grep"]в списке разрешенных инструментов запускает эти инструменты без подсказок. Инструменты, не указанные в списке, все еще доступны, но требуют разрешения.disallowed_tools/disallowedToolsблокирует перечисленные инструменты, независимо от других настроек. См. Разрешения для порядка, в котором правила проверяются перед запуском инструмента.permission_mode/permissionModeконтролирует, что происходит с инструментами, которые не охватываются правилами разрешения или запрета. См. Режим разрешения для доступных режимов.
"Bash(npm *)", чтобы разрешить только определенные команды. См. Разрешения для полного синтаксиса правил.
Когда инструмент отклоняется, Claude получает сообщение об отклонении как результат инструмента и обычно пытается использовать другой подход или сообщает, что не может продолжить.
Параллельное выполнение инструментов
Когда Claude запрашивает несколько вызовов инструментов в одном ходе, оба SDK могут запускать их одновременно или последовательно в зависимости от инструмента. Инструменты только для чтения (такие какRead, Glob, Grep и MCP инструменты, отмеченные как только для чтения) могут работать одновременно. Инструменты, которые изменяют состояние (такие как Edit, Write и Bash), работают последовательно, чтобы избежать конфликтов.
Пользовательские инструменты по умолчанию работают последовательно. Чтобы включить параллельное выполнение для пользовательского инструмента, установите readOnlyHint в его аннотациях. Оба SDK TypeScript и Python используют это имя поля из MCP SDK.
Контролировать, как работает цикл
Вы можете ограничить количество ходов, которые делает цикл, сколько он стоит, насколько глубоко Claude рассуждает, и требуют ли инструменты одобрения перед запуском. Все это поля наClaudeAgentOptions (Python) / Options (TypeScript).
Ходы и бюджет
| Опция | Что она контролирует | По умолчанию |
|---|---|---|
Максимум ходов (max_turns / maxTurns) | Максимум раундов использования инструментов | Без ограничений |
Максимум бюджета (max_budget_usd / maxBudgetUsd) | Максимальная стоимость перед остановкой | Без ограничений |
ResultMessage с соответствующим подтипом ошибки (error_max_turns или error_max_budget_usd). См. Обработать результат для того, как проверить эти подтипы, и ClaudeAgentOptions / Options для синтаксиса.
Уровень усилий
Опцияeffort контролирует, сколько рассуждений применяет Claude. Более низкие уровни усилий используют меньше токенов за ход и снижают стоимость. Не все модели поддерживают параметр effort. См. Effort для того, какие модели его поддерживают.
| Уровень | Поведение | Хорошо для |
|---|---|---|
"low" | Минимальное рассуждение, быстрые ответы | Поиск файлов, список каталогов |
"medium" | Сбалансированное рассуждение | Обычные редактирования, стандартные задачи |
"high" | Тщательный анализ | Рефакторинг, отладка |
"xhigh" | Расширенная глубина рассуждения | Задачи кодирования и агентские; рекомендуется на Opus 4.7 |
"max" | Максимальная глубина рассуждения | Многошаговые проблемы, требующие глубокого анализа |
effort, Python SDK оставляет параметр неустановленным и полагается на поведение модели по умолчанию. TypeScript SDK по умолчанию использует "high".
effort обменивает задержку и стоимость токена на глубину рассуждения в каждом ответе. Extended thinking — это отдельная функция, которая выдает видимые блоки цепочки мыслей в выводе. Они независимы: вы можете установить effort: "low" с включенным extended thinking или effort: "max" без него.effort в опциях верхнего уровня query() для всей сессии или для каждого подагента с полем effort на AgentDefinition, чтобы переопределить уровень сессии.
Режим разрешения
Опция режима разрешения (permission_mode в Python, permissionMode в TypeScript) контролирует, просит ли агент одобрения перед использованием инструментов:
| Режим | Поведение |
|---|---|
"default" | Инструменты, не охватываемые правилами разрешения, запускают ваш обратный вызов одобрения; отсутствие обратного вызова означает отклонение |
"acceptEdits" | Автоматически одобряет редактирование файлов и общие команды файловой системы (mkdir, touch, mv, cp и т. д.); другие команды Bash следуют правилам по умолчанию |
"plan" | Инструменты только для чтения работают; Claude исследует и выдает план без редактирования ваших исходных файлов |
"dontAsk" | Никогда не подсказывает. Инструменты, предварительно одобренные правилами разрешения, работают, все остальное отклоняется |
"auto" (только TypeScript) | Использует классификатор модели для одобрения или отклонения каждого вызова инструмента. См. Режим Auto для доступности и поведения |
"bypassPermissions" | Запускает все разрешенные инструменты без запроса. Не может использоваться при запуске от root на Unix. Используйте только в изолированных окружениях, где действия агента не могут повлиять на системы, которые вам важны |
"default" с обратным вызовом одобрения инструмента для отображения подсказок одобрения. Для автономных агентов на машине разработки используйте "acceptEdits", чтобы автоматически одобрить редактирование файлов и общие команды файловой системы (mkdir, touch, mv, cp и т. д.), при этом все еще ограничивая другие команды Bash правилами разрешения. Зарезервируйте "bypassPermissions" для CI, контейнеров или других изолированных окружений. См. Разрешения для полных деталей.
Модель
Если вы не установитеmodel, SDK использует значение по умолчанию Claude Code, которое зависит от вашего метода аутентификации и подписки. Установите его явно (например, model="claude-sonnet-4-6"), чтобы закрепить определенную модель или использовать меньшую модель для более быстрых и дешевых агентов. См. models для доступных ID.
Контекстное окно
Контекстное окно — это общее количество информации, доступной Claude во время сессии. Оно не сбрасывается между ходами в пределах сессии. Все накапливается: системный запрос, определения инструментов, история разговора, входные данные инструментов и выходные данные инструментов. Содержимое, которое остается неизменным на протяжении ходов (системный запрос, определения инструментов, CLAUDE.md), автоматически кэшируется в запросе, что снижает стоимость и задержку для повторяющихся префиксов.Что потребляет контекст
Вот как каждый компонент влияет на контекст в SDK:| Источник | Когда он загружается | Влияние |
|---|---|---|
| Системный запрос | Каждый запрос | Небольшая фиксированная стоимость, всегда присутствует |
| CLAUDE.md файлы | Начало сессии, через settingSources | Полное содержимое в каждом запросе (но кэшировано в запросе, поэтому только первый запрос платит полную стоимость) |
| Определения инструментов | Каждый запрос; схемы MCP отложены по умолчанию | Встроенные схемы инструментов загружаются в каждом запросе. Поиск инструментов отложит схемы инструментов MCP по умолчанию, возвращаясь к предварительной загрузке на Vertex AI или при использовании не первой стороной ANTHROPIC_BASE_URL. См. Настройка поиска инструментов для полной матрицы |
| История разговора | Накапливается на протяжении ходов | Растет с каждым ходом: запросы, ответы, входные данные инструментов, выходные данные инструментов |
| Описания skills | Начало сессии, через источники настроек | Короткие резюме; полное содержимое загружается только при вызове |
Автоматическое компактирование
Когда контекстное окно приближается к своему лимиту, SDK автоматически компактирует разговор: он суммирует более старую историю, чтобы освободить место, сохраняя ваши самые последние обмены и ключевые решения нетронутыми. SDK выдает сообщение сtype: "system" и subtype: "compact_boundary" в потоке, когда это происходит (в Python это SystemMessage; в TypeScript это отдельный тип SDKCompactBoundaryMessage).
Компактирование заменяет более старые сообщения резюме, поэтому конкретные инструкции с начала разговора могут не сохраниться. Постоянные правила должны находиться в CLAUDE.md (загружаемые через settingSources), а не в начальном запросе, потому что содержимое CLAUDE.md повторно вводится в каждом запросе.
Вы можете настроить поведение компактирования несколькими способами:
- Инструкции по суммированию в CLAUDE.md: Компактор читает ваш CLAUDE.md как любой другой контекст, поэтому вы можете включить раздел, рассказывающий ему, что сохранить при суммировании. Заголовок раздела свободной формы (не волшебная строка); компактор совпадает по намерению.
- Hook
PreCompact: Запустите пользовательскую логику перед компактированием, например для архивирования полной транскрипции. Hook получает полеtrigger(manualилиauto). См. hooks. - Ручное компактирование: Отправьте
/compactкак строку запроса для запуска компактирования по требованию. Команды, отправленные таким образом, — это входные данные SDK, а не только ярлыки CLI. См. slash commands в SDK.
Пример: Инструкции по суммированию в CLAUDE.md
Пример: Инструкции по суммированию в CLAUDE.md
Добавьте раздел в CLAUDE.md вашего проекта, рассказывающий компактору, что сохранить. Имя заголовка не является специальным; используйте любой четкий ярлык.
CLAUDE.md
Держите контекст эффективным
Несколько стратегий для долгоживущих агентов:- Используйте подагентов для подзадач. Каждый подагент начинает со свежего разговора (без предыдущей истории сообщений, хотя он загружает свой собственный системный запрос и контекст уровня проекта, такой как CLAUDE.md). Он не видит ходы родителя, и только его финальный ответ возвращается родителю как результат инструмента. Контекст основного агента растет на эту резюме, а не на полную транскрипцию подзадачи. См. Что наследуют подагенты для деталей.
- Будьте избирательны с инструментами. Каждое определение инструмента занимает место контекста. Используйте поле
toolsнаAgentDefinitionдля ограничения подагентов минимальным набором, который им нужен. - Следите за стоимостью MCP сервера. Поиск инструментов MCP отложит схемы инструментов MCP по умолчанию и загружает их по требованию. Когда поиск инструментов отключен, на Vertex AI или за не первой стороной
ANTHROPIC_BASE_URL, каждый MCP сервер добавляет все свои схемы инструментов в каждый запрос, поэтому несколько серверов с множеством инструментов могут потребить значительный контекст перед тем, как агент выполнит какую-либо работу. - Используйте более низкие усилия для обычных задач. Установите effort на
"low"для агентов, которым нужно только читать файлы или список каталогов. Это снижает использование токенов и стоимость.
Сессии и непрерывность
Каждое взаимодействие с SDK создает или продолжает сессию. Захватите ID сессии изResultMessage.session_id (доступно в обоих SDK) для возобновления позже. TypeScript SDK также выставляет его как прямое поле на инициализирующем SystemMessage; в Python он вложен в SystemMessage.data.
Когда вы возобновляете, полный контекст из предыдущих ходов восстанавливается: файлы, которые были прочитаны, анализ, который был выполнен, и действия, которые были предприняты. Вы также можете разветвить сессию, чтобы ветвиться в другой подход без изменения оригинала.
См. Управление сессией для полного руководства по возобновлению, продолжению и разветвлению паттернов.
В Python
ClaudeSDKClient автоматически обрабатывает ID сессий на протяжении нескольких вызовов. См. справку Python SDK для деталей.Обработать результат
Когда цикл заканчивается,ResultMessage говорит вам, что произошло, и дает вам выход. Поле subtype (доступно в обоих SDK) — это основной способ проверить состояние завершения.
| Подтип результата | Что произошло | Поле result доступно? |
|---|---|---|
success | Claude нормально завершил задачу | Да |
error_max_turns | Достигнут лимит maxTurns перед завершением | Нет |
error_max_budget_usd | Достигнут лимит maxBudgetUsd перед завершением | Нет |
error_during_execution | Ошибка прервала цикл (например, отказ API или отмененный запрос) | Нет |
error_max_structured_output_retries | Валидация структурированного выхода не прошла после настроенного лимита повторов | Нет |
result (финальный текстовый выход) присутствует только в варианте success, поэтому всегда проверяйте подтип перед его чтением. Все подтипы результатов содержат total_cost_usd, usage, num_turns и session_id, поэтому вы можете отслеживать стоимость и возобновлять даже после ошибок. В Python total_cost_usd и usage типизированы как опциональные и могут быть None на некоторых путях ошибок, поэтому охраняйте перед форматированием. См. Отслеживание стоимости и использования для деталей по интерпретации полей usage.
Результат также включает поле stop_reason (string | null в TypeScript, str | None в Python), указывающее, почему модель остановила генерацию на своем финальном ходе. Общие значения — end_turn (модель закончила нормально), max_tokens (достигнут лимит выходных токенов) и refusal (модель отклонила запрос). На подтипах результатов ошибок stop_reason содержит значение из последнего ответа помощника перед завершением цикла. Для обнаружения отклонений проверьте stop_reason === "refusal" (TypeScript) или stop_reason == "refusal" (Python). См. SDKResultMessage (TypeScript) или ResultMessage (Python) для полного типа.
Hooks
Hooks — это обратные вызовы, которые срабатывают в определенных точках цикла: перед запуском инструмента, после его возврата, когда агент заканчивает, и так далее. Некоторые часто используемые hooks:| Hook | Когда он срабатывает | Общие использования |
|---|---|---|
PreToolUse | Перед выполнением инструмента | Валидировать входные данные, блокировать опасные команды |
PostToolUse | После возврата инструмента | Аудировать выходные данные, запускать побочные эффекты |
UserPromptSubmit | Когда запрос отправляется | Вводить дополнительный контекст в запросы |
Stop | Когда агент заканчивает | Валидировать результат, сохранять состояние сессии |
SubagentStart / SubagentStop | Когда подагент порождается или завершается | Отслеживать и агрегировать результаты параллельных задач |
PreCompact | Перед компактированием контекста | Архивировать полную транскрипцию перед суммированием |
PreToolUse, который отклоняет вызов инструмента, предотвращает его выполнение, и Claude получает сообщение об отклонении вместо этого.
Оба SDK поддерживают все события выше. TypeScript SDK включает дополнительные события, которые Python еще не поддерживает. См. Контролировать выполнение с помощью hooks для полного списка событий, доступности для каждого SDK и полного API обратного вызова.
Собрать все вместе
Этот пример объединяет ключевые концепции с этой страницы в одного агента, который исправляет неудачные тесты. Он конфигурирует агента с разрешенными инструментами (автоматически одобренными, поэтому агент работает автономно), настройками проекта и ограничениями безопасности на ходы и усилия рассуждения. По мере выполнения цикла он захватывает ID сессии для потенциального возобновления, обрабатывает финальный результат и выводит общую стоимость.Следующие шаги
Теперь, когда вы понимаете цикл, вот куда идти в зависимости от того, что вы создаете:- Еще не запустили агента? Начните с quickstart, чтобы установить SDK и увидеть полный пример, работающий от начала до конца.
- Готовы подключиться к вашему проекту? Загрузите CLAUDE.md, skills и hooks файловой системы, чтобы агент автоматически следовал соглашениям вашего проекта.
- Создаете интерактивный UI? Включите потоковую передачу, чтобы показать живой текст и вызовы инструментов по мере выполнения цикла.
- Нужен более плотный контроль над тем, что может делать агент? Заблокируйте доступ к инструментам с помощью разрешений и используйте hooks для аудита, блокировки или преобразования вызовов инструментов перед их выполнением.
- Запускаете долгие или дорогие задачи? Перенесите изолированную работу на подагентов, чтобы держать ваш основной контекст стройным.