개요
세 가지 방법으로 서브에이전트를 생성할 수 있습니다:- 프로그래매틱 방식:
query()옵션에서agents매개변수를 사용합니다. TypeScript 및 Python 참조를 확인하세요 - 파일 시스템 기반:
.claude/agents/디렉토리에 마크다운 파일로 에이전트를 정의합니다. 파일로 서브에이전트 정의하기를 참조하세요 - 기본 제공 범용: Claude는 사용자가 아무것도 정의하지 않아도 Agent 도구를 통해 언제든지 기본 제공
general-purpose서브에이전트를 호출할 수 있습니다
서브에이전트 사용의 이점
서브에이전트는 별도의 에이전트 인스턴스이므로, 작업을 위임하면 네 가지 이점을 얻습니다:- 컨텍스트 격리: 각 서브에이전트는 자체 대화에서 실행되며, 서브에이전트가 포크가 아닌 한 새로 시작됩니다. 어느 쪽이든 중간 도구 호출 및 결과는 서브에이전트 내부에 유지되며, 최종 메시지만 부모에게 반환됩니다.
research-assistant서브에이전트는 수십 개의 파일을 탐색할 수 있지만, 해당 콘텐츠는 주 대화에 누적되지 않습니다. 부모는 서브에이전트가 읽은 모든 파일이 아닌 간결한 요약을 받습니다. 서브에이전트의 컨텍스트에 정확히 무엇이 포함되는지는 서브에이전트가 상속하는 것을 참조하십시오. - 병렬화: 여러 서브에이전트가 동시에 실행될 수 있으므로, 독립적인 부작업은 모든 작업의 합이 아닌 가장 느린 작업의 시간에 완료됩니다. 코드 검토 중에
style-checker,security-scanner,test-coverage서브에이전트를 순차적으로 실행하는 대신 동시에 실행할 수 있습니다. - 특화된 지침 및 지식: 각 서브에이전트는 특정 전문 지식, 모범 사례 및 제약 조건이 포함된 맞춤형 시스템 프롬프트를 가질 수 있습니다.
database-migration서브에이전트는 SQL 모범 사례, 롤백 전략 및 데이터 무결성 검사에 대한 상세한 지식을 가질 수 있으며, 이는 주 에이전트의 지침에서는 불필요한 노이즈가 될 것입니다. - 도구 제한: 서브에이전트는 특정 도구로 제한될 수 있으므로, 의도하지 않은 작업의 위험을 줄입니다.
doc-reviewer서브에이전트는 Read 및 Grep 도구에만 액세스할 수 있으므로, 문서 파일을 분석할 수 있지만 실수로 수정할 수 없습니다.
서브에이전트 생성
프로그래밍 방식 정의 (권장)
agents 매개변수를 사용하여 코드에서 직접 서브에이전트를 정의합니다. Claude는 Agent 도구를 통해 서브에이전트를 호출합니다.
이 페이지의 대부분의 예제는 최종 결과만 출력합니다. Claude가 직접 답변하지 않고 서브에이전트에 위임했는지 확인하려면 서브에이전트 호출 감지를 참조하십시오.
이 예제는 두 개의 서브에이전트를 생성합니다: 읽기 전용 액세스 권한이 있는 코드 검토자와 명령을 실행할 수 있는 테스트 실행자입니다.
AgentDefinition 구성
Python SDK에서
disallowedTools 및 mcpServers와 같은 다중 단어 필드 이름은 Python의 snake_case 규칙을 따르지 않고 와이어 형식과 일치하도록 camelCase 철자를 유지합니다. 자세한 내용은 AgentDefinition 참조를 참조하십시오.
서브에이전트는 기본적으로 백그라운드에서 실행됩니다. run_in_background 입력을 생략하는 Agent 도구 호출은 백그라운드 서브에이전트를 시작하며, Claude는 계속하기 전에 결과가 필요할 때 run_in_background: false를 설정합니다. 특정 에이전트에 대해 background 필드를 true로 설정하여 Claude가 요청하는 것과 관계없이 백그라운드 실행을 강제합니다. Claude Code v2.1.198 이전에는 백그라운드 기본값이 점진적으로 출시되었으며, run_in_background를 생략하는 Agent 도구 호출은 서브에이전트를 동기적으로 실행할 수 있었습니다.
서브에이전트는 자신의 서브에이전트를 생성할 수도 있습니다. 해당 중첩이 얼마나 깊은지, 한 번에 몇 개의 서브에이전트가 실행되는지, 쿼리가 얼마나 많이 소비하는지를 제한하려면 서브에이전트 깊이, 동시성 및 지출 제한을 참조하십시오.
파일 시스템 기반 정의 (대안)
.claude/agents/ 디렉토리의 마크다운 파일로 서브에이전트를 정의할 수도 있습니다. 이 접근 방식에 대한 자세한 내용은 Claude Code 서브에이전트 설명서를 참조하십시오. 프로그래밍 방식으로 정의된 에이전트는 같은 이름의 파일 시스템 기반 에이전트보다 우선합니다.
Claude가
subagent_type 없이 Agent 도구를 호출하면 기본 제공 general-purpose 서브에이전트를 가져오며, Claude는 자신의 에이전트를 정의하지 않은 경우에도 이를 생성할 수 있습니다. CLAUDE_AGENT_SDK_DISABLE_BUILTIN_AGENTS=1을 설정하면 해당 기본값이 제거되며, 이러한 호출은 subagent_type is required 오류로 실패합니다.서브에이전트가 상속하는 것
서브에이전트가 포크가 아닌 경우, 그 컨텍스트 윈도우는 새로 시작되며 부모 대화가 없지만 비어있지는 않습니다. 부모에서 서브에이전트로 전달하는 유일한 콘텐츠는 Agent 도구의 프롬프트 문자열이므로, 서브에이전트가 필요로 하는 파일 경로, 오류 메시지 또는 결정 사항을 해당 프롬프트에 직접 포함시켜야 합니다.SendMessage 도구를 가진 서브에이전트는 세션에서 실행 중인 다른 명명된 에이전트 목록으로 시작하므로, 메시지를 보낼 수 있는 이름이 무엇인지 알 수 있습니다. Claude Code는 서브에이전트의 첫 번째 턴에 자동으로 목록을 추가합니다. 포크는 부모 대화를 상속하기 때문에 목록을 받지 않습니다.
서브에이전트는 또한 메인 세션의 확장 사고 구성을 상속합니다.
아래 표는 포크가 아닌 서브에이전트의 컨텍스트에 포함되는 것과 제외되는 것을 나열합니다.
부모는 서브에이전트의 최종 메시지를 Agent 도구 결과로 받지만, 자신의 응답에서 요약할 수 있습니다. 서브에이전트 출력을 사용자 대면 응답에 그대로 보존하려면, 메인
query() 호출에 전달하는 프롬프트 또는 systemPrompt 옵션에 그렇게 하도록 하는 지시사항을 포함시키십시오.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 서브에이전트를 정의하면, 프롬프트에서 쿼리 최적화를 언급할 때 Claude가 이를 호출합니다.
Claude가 작업을 올바른 서브에이전트와 일치시킬 수 있도록 명확하고 구체적인 설명을 작성하십시오.
명시적 호출
Claude가 특정 서브에이전트를 사용하도록 보장하려면 프롬프트에서 이름으로 언급하십시오:동적 에이전트 구성
런타임 조건에 따라 에이전트 정의를 동적으로 생성할 수 있습니다. 이 예제는 다양한 엄격성 수준을 가진 보안 검토자를 생성하며, 엄격한 검토를 위해 더 강력한 모델을 사용합니다.서브에이전트 호출 감지
Claude는 Agent 도구를 통해 서브에이전트를 호출합니다. 서브에이전트가 호출되는 시점을 감지하려면name이 "Agent"인 tool_use 블록을 확인하면 됩니다. 서브에이전트의 컨텍스트 내에서 생성된 메시지에는 parent_tool_use_id 필드가 포함됩니다.
이 도구는
tool_use 블록에서는 "Agent"로 표시되지만 system:init 도구 목록에서는 "Task"로 표시됩니다. Claude Code v2.1.63 이전에는 tool_use 블록도 이를 "Task"로 명명했습니다. SDK 버전 간에 감지가 작동하도록 유지하려면 block.name에서 두 값을 모두 일치시키십시오.message.content를 통해 콘텐츠 블록에 직접 액세스합니다. TypeScript에서는 SDKAssistantMessage가 Claude API 메시지를 래핑하므로 message.message.content를 통해 콘텐츠에 액세스합니다.
이 예제는 스트리밍된 메시지를 반복하며 서브에이전트가 호출될 때와 후속 메시지가 해당 서브에이전트의 실행 컨텍스트 내에서 생성될 때를 기록합니다.
서브에이전트 재개
서브에이전트를 재개하여 처음부터 시작하지 않고 중단된 지점에서 계속할 수 있습니다. 재개된 서브에이전트는 이전의 모든 도구 호출, 결과 및 추론을 포함한 전체 대화 기록을 유지합니다. 서브에이전트가maxTurns 제한에 도달하여 중지되면, Claude Code는 Agent 도구 결과의 출력을 부분적으로 표시하여 Claude가 실행이 미완료임을 알 수 있도록 합니다.
서브에이전트가 완료되면, Agent 도구 결과에는 agentId: <id>를 포함하는 텍스트 블록이 포함됩니다. 기본 제공되는 Explore 및 Plan 에이전트는 일회성이며 agentId를 반환하지 않으므로, 재개가 필요한 경우 사용자 정의 에이전트 또는 general-purpose를 사용하십시오. 서브에이전트를 프로그래밍 방식으로 재개하려면:
- 세션 ID 캡처: 첫 번째 쿼리 중에 메시지에서
session_id추출 - 에이전트 ID 추출: Agent 도구 결과 텍스트에서
agentId파싱 - 세션 재개: 두 번째 쿼리의 옵션에서
resume: sessionId를 전달하고, 프롬프트에 에이전트 ID를 포함합니다. 각query()호출은 기본적으로 새 세션을 시작하며, 서브에이전트의 기록에 액세스하려면 동일한 세션을 재개해야 합니다.
사용자 정의 에이전트를 사용할 때는 두 쿼리 모두에서
agents 매개변수에 동일한 에이전트 정의를 전달하십시오.endpoint-finder 에이전트를 정의합니다. 첫 번째 쿼리는 이를 실행하고 Agent 도구 결과에서 세션 ID와 에이전트 ID를 캡처한 다음, 두 번째 쿼리는 세션을 재개하여 첫 번째 분석의 컨텍스트가 필요한 후속 질문을 합니다.
cleanupPeriodDays 정리 기간에 대해서는 Claude Code에서 서브에이전트 재개를 참조하십시오.
도구 제한
tools 필드를 사용하여 서브에이전트가 수행할 수 있는 작업을 제한합니다:
tools생략: 서브에이전트는 서브에이전트에서 사용 가능한 모든 도구를 얻습니다- 도구 나열: 서브에이전트는 해당 도구만 얻습니다. 예를 들어 파일을 편집하면 안 되는 코드 검토자는
["Read", "Grep", "Glob"]을 얻습니다
일반적인 도구 조합
서브에이전트 깊이, 동시성 및 지출 제한
Claude는 서브에이전트를 언제 생성할지, 몇 개를 생성할지 자체적으로 결정합니다. 각 서브에이전트는 자체 API 요청을 수행하며, 이는 쿼리의
total_cost_usd에 계산되고, 서브에이전트는 자신의 서브에이전트를 생성할 수 있으므로 하나의 프롬프트가 에이전트 트리로 성장할 수 있습니다.
이러한 성장을 세 가지 방식으로 제한할 수 있습니다: 서브에이전트가 중첩되는 깊이, 한 번에 실행되는 개수, 그리고 전체 쿼리가 소비하는 금액입니다. env 옵션을 통해 환경 변수로 깊이 및 동시성 제한을 설정하고, 쿼리 옵션으로 지출 제한을 설정합니다:
두 SDK는
env 옵션을 다르게 처리합니다: TypeScript SDK는 서브프로세스 환경을 이것으로 대체하므로 PATH와 같은 변수를 유지하기 위해 process.env를 이것으로 전개하고, Python SDK는 이것을 상속된 환경에 병합합니다. 이 예제는 중첩을 끄고, 한 번에 최대 5개의 서브에이전트를 허용하며, 예상 지출이 $5에 도달하면 쿼리를 중지합니다:
- 지출 상한 이하:
success와 예상 비용이 표시됩니다. - 지출 상한에서:
error_max_budget_usd가5이상의 비용과 함께 표시되고, 그 다음 오류 핸들러가 실행됩니다. - 동시성 제한에서: 메시지 스트림에서
Concurrent subagent limit reached를 전달하는tool_result블록이 표시됩니다. 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 이상에서 사용 가능합니다. allowedTools에 Workflow를 포함하여 워크플로우 실행을 자동 승인합니다. 도구 입력 및 출력 스키마는 TypeScript 참조에 나열되어 있습니다.
문제 해결
Claude가 서브에이전트에 위임하지 않음
Claude가 서브에이전트에 위임하는 대신 작업을 직접 완료하는 경우:- 명시적 프롬프팅 사용: 프롬프트에서 서브에이전트를 이름으로 언급하세요(예: “code-reviewer 에이전트를 사용하여…”).
- 명확한 설명 작성: Claude가 작업을 적절히 일치시킬 수 있도록 서브에이전트를 사용해야 할 때를 정확히 설명하세요.
파일 시스템 기반 에이전트가 로드되지 않음
Claude Code는~/.claude/agents/ 및 .claude/agents/를 감시하며 새로운 또는 편집된 에이전트 파일을 몇 초 내에 선택하며, 재시작이 필요하지 않습니다. 정의가 나타나지 않으면 다음 원인들을 확인하세요:
- 새로운
agents디렉토리: 감시자는 세션이 시작될 때 존재했던 디렉토리만 포함하므로, 새 디렉토리의 첫 번째 파일은 세션 재시작이 필요합니다. 이것이 가장 일반적인 원인입니다. - 잘못된 frontmatter 또는 중복된
name: 파일의 YAML을 확인하고, 기존 에이전트가 이미 해당name을 사용하고 있는지 확인하세요. --disable-slash-commands: 이 플래그로 시작된 세션은 이러한 디렉토리를 감시하지 않으며 새 파일을 로드하려면 항상 재시작이 필요합니다.- 동일한 이름의 프로그래밍 방식 에이전트:
query()에 전달된agents는 동일한 이름의 파일 시스템 에이전트를 재정의합니다.
관련 문서
- Claude Code 서브에이전트: 파일 시스템 기반 정의를 포함한 포괄적인 서브에이전트 문서
- 동적 워크플로우: 한 대화에 너무 큰 작업을 위해 스크립트에서 많은 서브에이전트를 오케스트레이션합니다
- SDK 개요: Claude Agent SDK 시작하기