Обзор
Вы можете создавать подагентов тремя способами:- Программно: используйте параметр
agentsв параметрах вашегоquery(). См. справочники TypeScript и Python - На основе файловой системы: определите агентов как файлы markdown в директориях
.claude/agents/. См. определение подагентов как файлов - Встроенный универсальный: Claude может вызывать встроенного подагента
general-purposeв любое время через инструмент Agent без необходимости что-либо определять
Преимущества использования подагентов
Поскольку подагенты являются отдельными экземплярами агентов, делегирование работы им дает вам четыре преимущества:- Изоляция контекста: каждый подагент работает в своем собственном разговоре, который начинается с чистого листа, если только подагент не является форком. В любом случае промежуточные вызовы инструментов и результаты остаются внутри подагента; только его финальное сообщение возвращается к родительскому агенту. Подагент
research-assistantможет исследовать десятки файлов без накопления этого содержимого в основном разговоре. Родительский агент получает краткое резюме, а не каждый файл, который прочитал подагент. Подробнее см. в разделе What subagents inherit о том, что именно находится в контексте подагента. - Параллелизация: несколько подагентов могут работать одновременно, поэтому независимые подзадачи завершаются за время самой медленной из них, а не за сумму всех времен. Во время проверки кода вы можете запустить подагентов
style-checker,security-scannerиtest-coverageодновременно вместо последовательного выполнения. - Специализированные инструкции и знания: каждый подагент может иметь адаптированный системный запрос с конкретной экспертизой, лучшими практиками и ограничениями. Подагент
database-migrationможет иметь подробные знания о лучших практиках SQL, стратегиях отката и проверках целостности данных, которые были бы ненужным шумом в инструкциях основного агента. - Ограничения инструментов: подагентам можно ограничить доступ к определенным инструментам, снижая риск непредвиденных действий. Подагент
doc-reviewerможет иметь доступ только к инструментам Read и Grep, обеспечивая возможность анализа, но никогда случайно не изменяя ваши файлы документации.
Создание подагентов
Программное определение (рекомендуется)
Определите подагентов непосредственно в вашем коде, используя параметрagents. Claude вызывает подагентов через инструмент Agent.
Большинство примеров на этой странице выводят только окончательный результат. Чтобы подтвердить, что Claude делегировал работу подагенту, а не ответил напрямую, см. Обнаружение вызова подагента.
Этот пример создает двух подагентов: рецензента кода с доступом только для чтения и средство запуска тестов, которое может выполнять команды.
Конфигурация AgentDefinition
В Python SDK многословные имена полей, такие как
disallowedTools и mcpServers, сохраняют написание camelCase для соответствия формату передачи, а не следуют соглашению Python snake_case. Подробности см. в справочнике AgentDefinition.
Подагенты работают в фоновом режиме по умолчанию. Вызов инструмента Agent, который опускает входные данные run_in_background, запускает фоновый подагент, и Claude устанавливает run_in_background: false, когда ему нужен результат перед продолжением. Установите поле background на true, чтобы принудительно выполнить фоновое выполнение для конкретного агента независимо от того, что запрашивает Claude. До Claude Code v2.1.198 фоновое значение по умолчанию постепенно развертывалось, и вызов инструмента Agent, который опускал run_in_background, мог запустить подагента синхронно.
Подагенты также могут порождать подагентов самостоятельно. Чтобы ограничить глубину этого вложения, количество одновременно работающих подагентов и сумму, которую запрос тратит, см. Ограничение глубины подагента, параллелизма и расходов.
Определение на основе файловой системы (альтернатива)
Вы также можете определить подагентов как файлы markdown в каталогах.claude/agents/. Подробности об этом подходе см. в документации подагентов Claude Code. Программно определенные агенты имеют приоритет над агентами на основе файловой системы с тем же именем.
Когда Claude вызывает инструмент Agent без
subagent_type, он получает встроенного подагента general-purpose, который Claude может порождать даже если вы не определяете никаких агентов самостоятельно. Установка CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1 удаляет это значение по умолчанию, и такой вызов завершается ошибкой subagent_type is required.Что наследуют подагенты
Если подагент не является форком, его контекстное окно начинается заново, без родительского разговора, но не пусто. Единственное содержимое, которое вы передаёте от родителя к подагенту, — это строка приглашения инструмента Agent, поэтому включайте любые пути к файлам, сообщения об ошибках или решения, которые нужны подагенту, непосредственно в это приглашение. Подагент, у которого есть инструментSendMessage, начинает со списка других именованных агентов, работающих в сеансе, поэтому он знает, каким именам он может отправлять сообщения. Claude Code автоматически добавляет список в первый ход подагента. Форк не получает список, потому что он наследует родительский разговор вместо этого.
Подагент также наследует конфигурацию расширенного мышления основного сеанса.
В таблице ниже указано, что содержит контекст подагента, не являющегося форком, и что он исключает.
Родитель получает итоговый отчёт субагента, но может обобщить его в своём ответе. Чтобы сохранить выходные данные субагента дословно в ответе, видимом пользователю, включите инструкцию об этом в промпт или опцию
systemPrompt, которую вы передаёте основному вызову query().В v2.1.210 и более поздних версиях Claude Code сканирует финальное сообщение на предмет шаблонов, похожих на инструкции, прежде чем родитель его прочитает. Сканирование обрабатывает три вида шаблонов по-разному:- Имитация управляющего тега: Claude Code нейтрализует тег, который излучает только обвязка, например блок
<system-reminder>, на месте. Он вставляет обратную косую черту после открывающей угловой скобки и ничего не удаляет. - Упоминания конфигурации разрешений: Claude Code сохраняет ссылки на конфигурацию разрешений, такие как
.claude/settings.json,bypassPermissionsили--dangerously-skip-permissions, как они написаны. - Маркеры ходов: строка, которая начинается с
Human:илиAssistant:, получает обратную косую черту перед двоеточием, чтобы сообщение не могло имитировать границу хода разговора.
[harness: ...], называющую совпадающие шаблоны; совпадение маркера хода не добавляет строку маркера. Это единственные изменения, которые делает сканирование: оно никогда не удаляет и не переформулирует текст подагента.Вызов подагентов
Автоматический вызов
Claude автоматически решает, когда вызвать подагентов на основе задачи иdescription каждого подагента. Например, если вы определите подагента performance-optimizer с описанием “Performance optimization specialist for query tuning”, Claude вызовет его, когда ваш запрос упоминает оптимизацию запросов.
Пишите четкие, конкретные описания, чтобы Claude мог сопоставить задачи с правильным подагентом.
Явный вызов
Чтобы гарантировать, что Claude использует конкретный подагент, упомяните его по имени в вашем запросе:Динамическая конфигурация агента
Вы можете создавать определения агентов динамически на основе условий во время выполнения. Этот пример создает рецензента безопасности с разными уровнями строгости, используя более мощную модель для строгих проверок.Обнаружение вызова подагента
Claude вызывает субагентов через инструмент Agent. Чтобы обнаружить, когда субагент вызывается, проверьте блокиtool_use, где name равен "Agent".
Сообщения из контекста субагента включают поле parent_tool_use_id. В TypeScript каждое сообщение assistant и user, создаваемое субагентом, также содержит agent_id: task_id событий задачи этого субагента. Для agent_id требуется TypeScript Agent SDK v0.3.292 или более поздней версии.
Инструмент отображается как
"Agent" в блоках tool_use, но как "Task" в списке инструментов system:init. До Claude Code v2.1.63 блоки tool_use также называли его "Task". Чтобы обнаружение работало во всех версиях SDK, сопоставьте оба значения в block.name.message.content. В TypeScript SDKAssistantMessage оборачивает сообщение API Claude, поэтому вы получаете доступ к содержимому через message.message.content.
Этот пример проходит по потоковым сообщениям, логируя, когда субагент вызывается и когда последующие сообщения поступают из контекста выполнения этого субагента. Версия на TypeScript также логирует agent_id каждого сообщения субагента, которое его содержит.
Возобновление подагентов
Вы можете возобновить подагента, чтобы продолжить с того места, где он остановился, вместо того чтобы начинать заново. Возобновленный подагент сохраняет полную историю разговора, включая все предыдущие вызовы инструментов, результаты и рассуждения. Когда подагент останавливается на пределеmaxTurns, Claude Code отмечает выходные данные в результате инструмента Agent как частичные, чтобы Claude знал, что выполнение незавершено.
Когда подагент завершает работу, результат инструмента Agent включает текстовый блок, содержащий agentId: <id>. Встроенные агенты Explore и Plan являются одноразовыми и не возвращают agentId, поэтому используйте пользовательский агент или general-purpose, когда вам нужно возобновить. Чтобы возобновить подагента программно:
- Захватите ID сеанса: извлеките
session_idиз сообщений во время первого запроса - Извлеките ID агента: разберите
agentIdиз текста результата инструмента Agent - Возобновите сеанс: передайте
resume: sessionIdв параметрах второго запроса и включите ID агента в ваше приглашение. Каждый вызовquery()по умолчанию запускает новый сеанс, и вы должны возобновить тот же сеанс, чтобы получить доступ к стенограмме подагента.
При использовании пользовательского агента передайте одно и то же определение агента в параметр
agents для обоих запросов.endpoint-finder. Первый запрос запускает его и захватывает ID сеанса и ID агента из результата инструмента Agent, затем второй запрос возобновляет сеанс, чтобы задать дополнительный вопрос, требующий контекста из первого анализа.
cleanupPeriodDays.
Ограничения инструментов
Используйте полеtools для ограничения возможностей подагента:
- Опустить
tools: подагент получает все инструменты, доступные подагентам - Список инструментов: подагент получает только те. Например, проверяющий код, который никогда не должен редактировать файлы, получает
["Read", "Grep", "Glob"]
Распространенные комбинации инструментов
Ограничение глубины, параллелизма и расходов подагентов
В этом разделе описываются TypeScript SDK v0.3.219 и Python SDK v0.2.127 и более поздние версии, релизы, которые включают Claude Code v2.1.219 или более поздние версии. В более ранних релизах некоторые из этих ограничений отсутствуют или имеют другие значения по умолчанию, поэтому обновитесь перед тем, как полагаться на них для ограничения выполнения. Справочник переменных окружения и ходы и бюджет содержат информацию о версии Claude Code, которая добавила каждую переменную, и о применении ограничения расходов подагентами.
total_cost_usd запроса, и подагент может создавать подагентов самостоятельно, поэтому один запрос может превратиться в дерево агентов.
Вы можете ограничить этот рост тремя способами: насколько глубоко вложены подагенты, сколько их работает одновременно и сколько потратит весь запрос. Установите ограничения глубины и параллелизма как переменные окружения через опцию env, а ограничение расходов как опцию запроса:
Два SDK по-разному обрабатывают опцию
env: TypeScript SDK заменяет окружение подпроцесса на него, поэтому распределите process.env в него, чтобы сохранить переменные вроде PATH, в то время как Python SDK объединяет его с унаследованным окружением. Этот пример отключает вложение, позволяет максимум пять подагентов одновременно и останавливает запрос, когда предполагаемые расходы достигают $5:
- Ниже ограничения расходов: вы видите
successи предполагаемую стоимость. - При ограничении расходов: вы видите
error_max_budget_usdсо стоимостью на уровне или выше5, а затем запускается ваш обработчик ошибок. - При ограничении параллелизма: вы видите блок
tool_resultв потоке сообщений, содержащийConcurrent subagent limit reached. Claude получает тот же блок как результат инструмента Agent.
Запуск Opus 5 с подагентами
Claude Opus 5 делегирует подагентам более охотно, чем более ранние модели, поэтому ограничения глубины, параллелизма и расходов имеют наибольшее значение для запросов, которые запускают Opus 5. Руководство по подсказкам Opus 5 содержит инструкцию делегирования, которую вы можете добавить к любой подсказке. Добавляет ли Claude Code свою собственную инструкцию, зависит от того, какой системный запрос вы используете:- Предустановка
claude_code: когда моделью является Opus 5, Claude Code добавляет строку в свой системный запрос, указывая Claude не вызывать инструмент Agent, если его об этом не попросят. Инструмент Agent остается доступным. - Пользовательский запрос или отсутствие
systemPrompt: Claude Code не создает свой системный запрос, поэтому эта строка отсутствует. Добавьте инструкцию делегирования из руководства подсказок в свой собственный запрос.
Масштабирование с помощью динамических рабочих процессов
Подагенты хорошо работают для нескольких делегированных задач за ход. Для запусков, которые координируют десятки или сотни агентов, используйте инструментWorkflow, который перемещает оркестровку в скрипт, который среда выполнения выполняет вне контекста беседы. Подробнее о том, чем рабочие процессы отличаются от делегирования подагентов по ходам, см. в динамических рабочих процессах.
Инструмент Workflow доступен в TypeScript Agent SDK v0.3.149 и позже. Включите Workflow в allowedTools для автоматического одобрения запусков рабочих процессов. Схемы входных и выходных данных инструмента указаны в справочнике TypeScript.
Troubleshooting
Claude не делегирует подагентам
Если Claude выполняет задачи напрямую вместо делегирования вашему подагенту:- Используйте явное указание: упомяните подагента по имени в своем промпте, например “Use the code-reviewer agent to check the authentication module”
- Напишите четкое описание: объясните ровно, когда следует использовать подагента, чтобы Claude мог правильно сопоставить задачи
Агенты на основе файловой системы не загружаются
Claude Code отслеживает~/.claude/agents/ и .claude/agents/ и подхватывает новый или отредактированный файл агента в течение нескольких секунд без необходимости перезагрузки. Если определение никогда не появляется, проработайте эти причины:
- Новая директория
agents: наблюдатель охватывает только директории, которые существовали при запуске сессии, поэтому первый файл в новой директории требует перезагрузки сессии. Это наиболее частая причина. - Неверный frontmatter или дублирующееся имя
name: проверьте YAML файла и то, использует ли существующий агент уже это имяname. --disable-slash-commands: сессии, запущенные с этим флагом, не отслеживают эти директории и всегда требуют перезагрузки для загрузки новых файлов.- Файл в добавленной директории: Claude Code загружает
.claude/agents/из директорий, добавленных с помощью опцииadd_dirs(Python) илиadditionalDirectories(TypeScript), или CLI флагов--add-dirили/add-dir, но не отслеживает их, поэтому новый или отредактированный файл там требует перезагрузки сессии. - Программный агент с тем же именем:
agents, переданные вquery(), переопределяют агента файловой системы с тем же именем.
Связанная документация
- Субагенты Claude Code: документация субагентов, включая определения на основе файловой системы
- Динамические рабочие процессы: оркестрируйте множество подагентов из скрипта для работ, слишком больших для одной беседы
- Обзор SDK: начало работы с Claude Agent SDK