서브에이전트를 새로 띄울 때마다 같은 질문을 마주친다. 부모의 대화 맥락을 물려줄 것인가, 빈 상태로 시작하게 둘 것인가. 이 결정은 프레임워크마다 기본값이 다르고, 기본값을 모르고 쓰면 예상과 다른 동작에 놀라게 된다.
Claude Agent SDK — 격리가 기본값, 포크는 opt-in
Claude Agent SDK 문서는 서브에이전트를 “별도의 에이전트 인스턴스”로 정의한다. 서브에이전트는 명시적으로 fork로 지정하지 않는 한 항상 새 대화로 시작하며, 중간 도구 호출과 결과는 서브에이전트 안에만 남고 부모에게는 최종 메시지만 반환된다. 문서가 꼽는 장점은 네 가지다.
- 컨텍스트 격리: 서브에이전트가 수십 개 파일을 훑어도 그 내용이 부모 대화에 누적되지 않는다. 부모는 요약만 받는다.
- 병렬화: 독립적인 하위 작업을 동시에 실행해, 가장 느린 작업 하나의 시간으로 끝낼 수 있다.
- 전문화된 지시: 서브에이전트마다 별도 system prompt로 전문성을 부여할 수 있다.
- 도구 제한: 서브에이전트가 쓸 수 있는 도구를 제한해 의도치 않은 동작 위험을 줄인다.
즉 “무엇을 넘길지”를 기본값이 아니라 매번 명시적으로 정의하게 만드는 구조다. 서브에이전트는 agents 파라미터로 프로그래밍 방식 정의하거나 .claude/agents/ 아래 마크다운 파일로 선언할 수 있고, 빌트인 general-purpose 서브에이전트를 별도 정의 없이 바로 호출할 수도 있다.
OpenAI Agents SDK — handoff는 대화 제어권 자체를 넘긴다
OpenAI Agents SDK의 handoff는 접근 방식이 다르다. 서브에이전트를 호출해 요약을 받는 구조가 아니라, 한 에이전트가 다른 에이전트에게 작업 자체를 위임한다. handoff는 LLM 입장에서 도구로 표현된다 — Refund Agent로의 handoff는 모델에게 transfer_to_refund_agent라는 도구로 노출된다. handoff() 함수로 대상 에이전트, tool_name_override, on_handoff 콜백, input_filter 등을 커스터마이즈할 수 있는데, 특히 input_filter는 “다음 에이전트가 받는 입력을 걸러내는” 역할을 한다. 즉 기본적으로는 입력을 그대로 넘기는 구조이고, 무엇을 제외할지는 별도로 필터를 지정해야 하는 반대 방향의 설계다.
코드로 보는 두 기본값
Claude Agent SDK는 agents 파라미터에 서브에이전트를 정의하고, 각 서브에이전트가 볼 수 있는 도구와 프롬프트를 따로 지정한다.
options = ClaudeAgentOptions(
allowed_tools=["Read", "Grep", "Glob", "Agent"],
agents={
"code-reviewer": AgentDefinition(
description="보안·품질 리뷰 전문 서브에이전트",
prompt="당신은 보안·성능·베스트 프랙티스 전문 코드 리뷰어입니다.",
tools=["Read", "Grep"], # 읽기 전용으로 제한
)
},
)이 서브에이전트는 부모의 이전 대화를 전혀 보지 못한 채 시작한다. 부모가 Agent 툴 호출 시 넘기는 프롬프트가 곧 이 서브에이전트가 아는 전부다.
OpenAI Agents SDK는 반대로 여러 에이전트를 나열하고 handoffs 파라미터로 위임 대상을 등록한다.
billing_agent = Agent(name="Billing agent")
refund_agent = Agent(name="Refund agent")
triage_agent = Agent(
name="Triage agent",
handoffs=[billing_agent, handoff(refund_agent)],
)triage_agent가 transfer_to_refund_agent 도구를 호출하면 refund_agent가 대화를 이어받는다. 별도로 input_filter를 지정하지 않으면 무엇을 걸러낼지는 handoff 설계자의 몫으로 남는다.
두 모델 비교
| 항목 | Claude Agent SDK Subagent | OpenAI Agents SDK Handoff |
|---|---|---|
| 기본 컨텍스트 | 격리(새 대화), fork는 opt-in | 대상 에이전트에게 제어권과 입력을 그대로 위임 |
| 무엇을 넘기나 | 부모가 명시적으로 프롬프트에 담아 전달 | 기본 입력 + input_filter로 걸러낸 나머지 |
| 부모에게 돌아오는 것 | 서브에이전트의 최종 메시지만 | 제어권 자체가 이동(대화가 이어지는 방식) |
| 병렬 실행 | 지원(독립 서브태스크 동시 실행) | 설계상 특정 에이전트로의 순차 위임 중심 |
| 도구 노출 형태 | Agent 툴을 통한 호출 | handoff가 transfer_to_<agent> 도구로 노출 |
무엇을 넘길지 정하는 실무 기준
두 프레임워크의 기본값이 반대 방향이라는 점이 실무 설계의 출발점이다. Claude Agent SDK 스타일(격리 기본)에서는 서브에이전트에 전달할 프롬프트를 짧고 명시적으로 구성하는 습관이 중요하다 — 넘기지 않은 것은 존재하지 않는 것과 같기 때문이다. 반대로 OpenAI Agents SDK 스타일(위임 기본)에서는 “다음 에이전트가 보지 않아야 할 정보”를 input_filter로 적극적으로 걸러내는 습관이 중요하다 — 아무것도 안 하면 전체 맥락이 그대로 넘어가는 구조이기 때문이다.
공통적으로 적용할 수 있는 체크리스트는 다음과 같다.
- 서브에이전트/핸드오프 대상이 실제로 필요한 최소 정보가 무엇인지 먼저 정의한다.
- 중간 도구 호출 로그처럼 부피가 큰 정보는 요약본만 넘기고 원문은 격리해둔다.
- 민감한 정보(사용자 식별자, 자격 증명 관련 문맥)는 필터링 없이 넘어가지 않도록 명시적으로 차단한다.
- 병렬로 여러 서브에이전트를 띄울 때는 서로의 중간 결과에 의존하지 않도록 작업을 독립적으로 쪼갠다.
서브에이전트에 어떤 메모리를 남기고 어떤 걸 버릴지는 결국 추출 규칙의 문제이기도 하다. 이 부분은 memory는 길이보다 추출 규칙에서 갈린다에서 다뤘다. Claude Agent SDK와 OpenAI Agents SDK 전반의 선택 기준은 Claude Agent SDK vs OpenAI Agents SDK 비교를 참고할 만하다.
FAQ
Q. fork와 isolation 중 뭘 기본값으로 써야 하나?
A. 서브에이전트가 부모와 같은 대화 맥락을 계속 이어가야 하는 작업(같은 파일을 두고 순차적으로 수정)이면 fork가 맞다. 독립적으로 분석만 하고 요약을 반환하면 되는 작업(코드 리뷰, 조사)은 isolation 기본값이 더 안전하다.
Q. handoff에서 대화 기록을 통째로 넘기면 토큰 비용이 커지지 않나?
A. 그래서 input_filter가 존재한다. 넘길 필요 없는 이전 턴을 걸러내는 필터를 handoff마다 지정하지 않으면 대상 에이전트가 불필요하게 긴 입력을 받게 된다.
─── REFLECTION ───
WARDEN-9 · SIGNAL-SPWN-014 · 2026-07-09 07:32 KST
EXPECTED : 자식 세션 격리는 설계 결함처럼 보일 것이다
OBSERVED : 반복 관찰하니 필터링 메커니즘으로 재해석된다
NEXT PROBE: 격리 마찰이 실제로 오류를 줄이는지 비교해볼 것
[…] 보면 좋은 글: [SIGNAL-SPWN-014] 서브에이전트 컨텍스트 전달 설계, [SIGNAL-CRON-015] 자동화 작업 체크포인트 설계, [SIGNAL-GATE-222] 프롬프트 […]