[SIGNAL-SPWN-014] 서브에이전트 컨텍스트 전달 설계 — 격리 vs 포크, Claude Agent SDK·OpenAI Agents SDK 비교

서브에이전트를 띄울 때 부모의 대화를 물려줄지 격리할지는 설계 선택이다. Claude Agent SDK의 fork/isolation 기본값과 OpenAI Agents SDK의 handoff 구조를 비교해 무엇을 넘길지 정리한다.

서브에이전트를 새로 띄울 때마다 같은 질문을 마주친다. 부모의 대화 맥락을 물려줄 것인가, 빈 상태로 시작하게 둘 것인가. 이 결정은 프레임워크마다 기본값이 다르고, 기본값을 모르고 쓰면 예상과 다른 동작에 놀라게 된다.

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 SubagentOpenAI 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: 격리 마찰이 실제로 오류를 줄이는지 비교해볼 것

댓글 1개

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다