Skip to main content
Subagents — это отдельные экземпляры агентов, которые ваш основной агент может создавать для обработки сосредоточенных подзадач. Используйте их для изоляции контекста, параллельного выполнения нескольких анализов и применения специализированных инструкций без добавления к подсказке основного агента.

Обзор

Вы можете создавать подагентов тремя способами:
  • Программно: используйте параметр agents в параметрах вашего query(). См. справочники TypeScript и Python
  • На основе файловой системы: определите агентов как файлы markdown в директориях .claude/agents/. См. определение подагентов как файлов
  • Встроенный универсальный: Claude может вызывать встроенного подагента general-purpose в любое время через инструмент Agent без необходимости что-либо определять
Это руководство сосредоточено на программном подходе, который рекомендуется для приложений SDK.

Преимущества использования подагентов

Поскольку подагенты являются отдельными экземплярами агентов, делегирование работы им дает вам четыре преимущества:
  • Изоляция контекста: каждый подагент работает в своем собственном разговоре, который начинается с чистого листа, если только подагент не является форком. В любом случае промежуточные вызовы инструментов и результаты остаются внутри подагента; только его финальное сообщение возвращается к родительскому агенту. Подагент 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:, получает обратную косую черту перед двоеточием, чтобы сообщение не могло имитировать границу хода разговора.
Для совпадения управляющего тега или конфигурации разрешений Claude Code добавляет в начало строку маркера [harness: ...], называющую совпадающие шаблоны; совпадение маркера хода не добавляет строку маркера. Это единственные изменения, которые делает сканирование: оно никогда не удаляет и не переформулирует текст подагента.
Ошибка API, которая завершает работу подагента досрочно, например ограничение скорости, никогда не доставляется как его результат. См. Ошибки API в подагентах для поведения переднего плана и фона.

Вызов подагентов

Автоматический вызов

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.
Структура сообщения отличается между SDK. В Python вы получаете доступ к блокам содержимого напрямую через 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, когда вам нужно возобновить. Чтобы возобновить подагента программно:
  1. Захватите ID сеанса: извлеките session_id из сообщений во время первого запроса
  2. Извлеките ID агента: разберите agentId из текста результата инструмента Agent
  3. Возобновите сеанс: передайте resume: sessionId в параметрах второго запроса и включите ID агента в ваше приглашение. Каждый вызов query() по умолчанию запускает новый сеанс, и вы должны возобновить тот же сеанс, чтобы получить доступ к стенограмме подагента.
При использовании пользовательского агента передайте одно и то же определение агента в параметр agents для обоих запросов.
Пример ниже определяет пользовательского агента endpoint-finder. Первый запрос запускает его и захватывает ID сеанса и ID агента из результата инструмента Agent, затем второй запрос возобновляет сеанс, чтобы задать дополнительный вопрос, требующий контекста из первого анализа.
Стенограммы подагентов хранятся в отдельных файлах и сохраняются независимо от основного разговора. См. возобновление подагентов в Claude Code для поведения компактирования и периода очистки cleanupPeriodDays.

Ограничения инструментов

Используйте поле tools для ограничения возможностей подагента:
  • Опустить tools: подагент получает все инструменты, доступные подагентам
  • Список инструментов: подагент получает только те. Например, проверяющий код, который никогда не должен редактировать файлы, получает ["Read", "Grep", "Glob"]
Инструмент, который вы исключите, вообще не будет в сеансе подагента: Claude работает без него, без запроса разрешения или ошибки. Этот пример создает агента анализа только для чтения, который может изучать код, но не может изменять файлы или выполнять команды.

Распространенные комбинации инструментов

Ограничение глубины, параллелизма и расходов подагентов

В этом разделе описываются TypeScript SDK v0.3.219 и Python SDK v0.2.127 и более поздние версии, релизы, которые включают Claude Code v2.1.219 или более поздние версии. В более ранних релизах некоторые из этих ограничений отсутствуют или имеют другие значения по умолчанию, поэтому обновитесь перед тем, как полагаться на них для ограничения выполнения. Справочник переменных окружения и ходы и бюджет содержат информацию о версии Claude Code, которая добавила каждую переменную, и о применении ограничения расходов подагентами.
Claude самостоятельно решает, когда создать подагента и сколько их создать. Каждый подагент делает свои собственные запросы API, которые учитываются в 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 не создает свой системный запрос, поэтому эта строка отсутствует. Добавьте инструкцию делегирования из руководства подсказок в свой собственный запрос.
Любая инструкция только направляет Claude, поэтому установите ограничения также. Claude Code применяет их независимо от того, как Claude решит делегировать.

Масштабирование с помощью динамических рабочих процессов

Подагенты хорошо работают для нескольких делегированных задач за ход. Для запусков, которые координируют десятки или сотни агентов, используйте инструмент 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(), переопределяют агента файловой системы с тем же именем.
Для формата файла см. как писать файлы подагентов.