Sub-agent
Sub-agent는 기존 에이전트 실행에서 생성된 백그라운드 에이전트 실행입니다. 자체 세션 (agent:<agentId>:subagent:<uuid>)에서 실행되며 완료되면 요청자 채팅 채널에 결과를 알립니다.
슬래시 명령
/subagents를 사용하여 현재 세션의 sub-agent 실행을 검사하거나 제어합니다:
- /subagents list
- /subagents stop <id|#|all>
- /subagents log <id|#> [limit] [tools]
- /subagents info <id|#>
- /subagents send <id|#> <message>
/subagents info는 실행 메타데이터 (상태, 타임스탬프, 세션 ID, 트랜스크립트 경로, 정리)를 보여줍니다.
주요 목표:
- 메인 실행을 차단하지 않고 "연구 / 긴 작업 / 느린 도구" 작업을 병렬화합니다.
- 기본적으로 sub-agent를 격리된 상태로 유지합니다 (세션 분리 + 선택적 샌드박싱).
- 도구 표면을 오용하기 어렵게 유지합니다: sub-agent는 기본적으로 세션 도구를 얻지 못합니다.
- 중첩된 팬아웃 방지: sub-agent는 sub-agent를 생성할 수 없습니다.
비용 참고: 각 sub-agent는 자체 컨텍스트 및 토큰 사용량을 가집니다. 무겁거나 반복적인 작업의 경우 sub-agent에 더 저렴한 모델을 설정하고 메인 에이전트는 더 높은 품질의 모델을 유지하세요. agents.defaults.subagents.model 또는 에이전트별 재정의를 통해 구성할 수 있습니다.
도구
sessions_spawn 사용:
- Sub-agent 실행을 시작합니다 (deliver: false, 전역 레인: subagent)
- 그런 다음 알림 단계를 실행하고 알림 응답을 요청자 채팅 채널에 게시합니다
- 기본 모델: agents.defaults.subagents.model (또는 에이전트별 agents.list[].subagents.model)을 설정하지 않는 한 호출자에서 상속합니다; 명시적인 sessions_spawn.model이 여전히 우선합니다.
도구 매개변수:
- task (필수)
- label? (선택사항)
- agentId? (선택사항; 허용되는 경우 다른 에이전트 ID 아래에서 생성)
- model? (선택사항; sub-agent 모델 재정의; 유효하지 않은 값은 건너뛰고 sub-agent는 도구 결과에 경고와 함께 기본 모델에서 실행됩니다)
- thinking? (선택사항; sub-agent 실행에 대한 thinking 수준 재정의)
- runTimeoutSeconds? (기본값 0; 설정 시 N초 후 sub-agent 실행이 중단됩니다)
- cleanup? (delete|keep, 기본값 keep)
허용 목록:
- agents.list[].subagents.allowAgents: agentId를 통해 대상이 될 수 있는 에이전트 ID 목록 (모든 것을 허용하려면 ["*"]). 기본값: 요청자 에이전트만.
검색:
- agents_list를 사용하여 현재 sessions_spawn에 허용되는 에이전트 ID를 확인합니다.
자동 아카이브:
- Sub-agent 세션은 agents.defaults.subagents.archiveAfterMinutes (기본값: 60) 후 자동으로 아카이브됩니다.
- 아카이브는 sessions.delete를 사용하고 트랜스크립트를 *.deleted.<timestamp> (같은 폴더)로 이름을 바꿉니다.
- cleanup: "delete"는 알림 직후 즉시 아카이브합니다 (이름 변경을 통해 트랜스크립트는 여전히 유지합니다).
- 자동 아카이브는 최선을 다합니다; 게이트웨이가 다시 시작되면 대기 중인 타이머가 손실됩니다.
- runTimeoutSeconds는 자동 아카이브하지 않습니다; 실행만 중지합니다. 세션은 자동 아카이브까지 남아 있습니다.
인증
Sub-agent 인증은 세션 유형이 아닌 에이전트 ID로 해결됩니다:
- Sub-agent 세션 키는 agent:<agentId>:subagent:<uuid>입니다.
- 인증 저장소는 해당 에이전트의 agentDir에서 로드됩니다.
- 메인 에이전트의 인증 프로필은 폴백으로 병합됩니다; 충돌 시 에이전트 프로필이 메인 프로필을 재정의합니다.
참고: 병합은 추가적이므로 메인 프로필은 항상 폴백으로 사용 가능합니다. 에이전트별로 완전히 격리된 인증은 아직 지원되지 않습니다.
알림
Sub-agent는 알림 단계를 통해 보고합니다:
- 알림 단계는 sub-agent 세션 내에서 실행됩니다 (요청자 세션이 아님).
- Sub-agent가 정확히 ANNOUNCE_SKIP로 응답하면 아무것도 게시되지 않습니다.
- 그렇지 않으면 알림 응답이 후속 agent 호출 (deliver=true)을 통해 요청자 채팅 채널에 게시됩니다.
- 알림 응답은 사용 가능한 경우 스레드/주제 라우팅을 유지합니다 (Slack 스레드, Telegram 주제, Matrix 스레드).
- 알림 메시지는 안정적인 템플릿으로 정규화됩니다:
- Status: 실행 결과에서 파생됩니다 (success, error, timeout 또는 unknown).
- Result: 알림 단계의 요약 내용 (없으면 (not available)).
- Notes: 오류 세부 정보 및 기타 유용한 컨텍스트.
- Status는 모델 출력에서 유추되지 않습니다; 런타임 결과 신호에서 나옵니다.
알림 페이로드에는 마지막에 통계 줄이 포함됩니다 (래핑된 경우에도):
- 런타임 (예: runtime 5m12s)
- 토큰 사용량 (입력/출력/합계)
- 모델 가격이 구성된 경우 예상 비용 (models.providers.*.models[].cost)
- sessionKey, sessionId 및 트랜스크립트 경로 (메인 에이전트가 sessions_history를 통해 히스토리를 가져오거나 디스크의 파일을 검사할 수 있도록)
도구 정책 (sub-agent 도구)
기본적으로 sub-agent는 세션 도구를 제외한 모든 도구를 얻습니다:
- sessions_list
- sessions_history
- sessions_send
- sessions_spawn
구성을 통해 재정의:
{
agents: {
defaults: {
subagents: {
maxConcurrent: 1
}
}
},
tools: {
subagents: {
tools: {
// deny가 우선
deny: ["gateway", "cron"],
// allow가 설정되면 allow 전용이 됩니다 (deny는 여전히 우선)
// allow: ["read", "exec", "process"]
}
}
}
}
동시성
Sub-agent는 전용 인프로세스 큐 레인을 사용합니다:
- 레인 이름: subagent
- 동시성: agents.defaults.subagents.maxConcurrent (기본값 8)
중지
- 요청자 채팅에서 /stop을 보내면 요청자 세션이 중단되고 그로부터 생성된 활성 sub-agent 실행이 중지됩니다.
제한 사항
- Sub-agent 알림은 최선을 다합니다. 게이트웨이가 다시 시작되면 대기 중인 "알림" 작업이 손실됩니다.
- Sub-agent는 여전히 동일한 게이트웨이 프로세스 리소스를 공유합니다; maxConcurrent를 안전 밸브로 취급하세요.
- sessions_spawn은 항상 논블로킹입니다: { status: "accepted", runId, childSessionKey }를 즉시 반환합니다.
- Sub-agent 컨텍스트는 AGENTS.md + TOOLS.md만 주입합니다 (SOUL.md, IDENTITY.md, USER.md, HEARTBEAT.md 또는 BOOTSTRAP.md 없음).