딥 에이전트 이벤트 스트리밍하기

딥 에이전트 이벤트 스트리밍하기 (Event Streaming)

Deep Agents에서 서브에이전트(subagent), 메시지, 툴 호출, 그리고 최종 출력을 스트리밍하는 방법을 다루는 페이지예요. 특히 위임된 서브에이전트에서 오는 스트리밍을 stream.subagents로 처리하는 부분이 핵심이에요. 일반적인 에이전트 스트리밍(stream.messages, stream.values, 툴 호출, 커스텀 업데이트)은 LangChain 이벤트 스트리밍 문서에서 다루니까 그쪽도 참고해 주세요.

출처: 공식문서

서브에이전트 스트리밍

Deep Agents는 LangGraph 스트리밍 위에 서브에이전트 프로젝션(projection)을 추가해요. 위임된 task 호출 하나당 스트림 핸들 하나를 원할 때 stream.subagents를 사용해요. 이 프로젝션은 가벼워서 서브에이전트 task를 먼저 발견하고, 메시지·툴 호출·값 스트림은 서브에이전트 핸들에서 해당 프로젝션에 접근할 때만 열려요.

stream = agent.stream_events({
    "messages": [{"role": "user", "content": "Write me a haiku about the sea"}],
}, version="v3")

for subagent in stream.subagents:
    print(subagent.name, subagent.path, subagent.status)

    for message in subagent.messages:
        print(message.text)

서브에이전트 스트림 필드

각 서브에이전트 스트림은 부모 실행과 같은 종류의 프로젝션(메시지, 툴 호출, 중첩 서브에이전트, 최종 출력)을 노출해요. 파이썬에서는 tool_calls처럼 snake_case 프로젝션 이름을 사용해요.

필드 설명
name 서브에이전트 이름
messages 서브에이전트가 내보낸 메시지
subagents 중첩된 서브에이전트 호출
output 최종 서브에이전트 상태 또는 위임 task의 완료 신호
path 서브에이전트 스트림의 네임스페이스 경로
status started, completed, failed, interrupted 같은 생명주기 상태
tool_calls 서브에이전트에 범위가 한정된 툴 호출

서브에이전트 생명주기 추적

어떤 서브에이전트가 시작하고 끝났는지만 보여주면 될 때는 stream.subagents를 사용해요. 개별 서브에이전트에서 해당 프로젝션에 접근하지 않는 한 메시지·값 스트림을 구독할 필요는 없어요.

stream = agent.stream_events(input, version="v3")

running = 0
completed = 0
failed = 0

for subagent in stream.subagents:
    running += 1
    print(f"{subagent.name}: started")

    try:
        _ = subagent.output
        running -= 1
        completed += 1
        print(f"{subagent.name}: completed")
    except Exception:
        running -= 1
        failed += 1
        print(f"{subagent.name}: failed")

메시지·툴 호출·중첩 작업 스트리밍

Deep Agents는 코디네이터 에이전트와 서브에이전트 양쪽에서 메시지를 내보낼 수 있어요. 스트리밍 툴 호출, 중첩된 작업(nested work), 그리고 여러 스트림을 동시에 소비(consume concurrently)하는 방법은 문서에서 계속 소개돼요. 서브에이전트(subagent)와 서브그래프(subgraph)의 차이도 관련 문서에서 비교할 수 있어요.

더 알아보기 (Learn more)

  • 일반 에이전트 스트리밍 모델(stream.messages, stream.values)은 LangChain 이벤트 스트리밍 문서를 참고하세요.
  • 각 스트림 필드와 최종 출력에 대한 자세한 내용은 상위 페이지의 링크에서 확인할 수 있어요.