개요
Nous Research가 자체 오픈소스 에이전트인 Hermes Agent에 비동기 서브에이전트 기능을 붙였습니다. 핵심 변화는 한 문장으로 정리됩니다. delegate 도구가 더 이상 부모 채팅을 멈추지 않습니다. 이전까지는 부모 에이전트가 자식에게 일을 맡기면, 자식이 끝날 때까지 부모 쪽 채팅창이 그대로 얼어붙었습니다. 이번 업데이트로 자식 작업이 백그라운드에서 돌고, 그 사이에 부모는 다른 일을 계속할 수 있습니다. 기존 사용자는 hermes update 한 줄로 바로 켤 수 있습니다.
핵심 요약
- 무엇이 바뀌었나 —
delegate_task는 그대로 두고, 비동기 경로용async_delegation툴셋을 새로 추가했습니다. 이슈 #5586에서 작업이 진행됐습니다. - 새 도구 6종 —
delegate_task_async,check_task,steer_task,collect_task,cancel_task,list_tasks. 서브에이전트의 생애주기(소환·확인·끼어들기·회수·취소·목록)를 모두 덮습니다. - 부모 컨텍스트는 그대로 — 자식 에이전트는 완전히 새 대화, 별도 터미널, 별도 툴셋으로 시작합니다. 부모에게는 최종 요약만 돌아옵니다.
- 자격 증명은 공유 — 자식은 부모의 API 키와 자격 증명 풀을 그대로 씁니다. 키 로테이션도 같이 작동합니다.
config.yaml로 자식만 더 싼 모델에 붙이는 것도 가능합니다. - 실행 모델 — 백그라운드 에이전트는 같은 프로세스 안의 스레드로 돕니다. 동기 위임의
AIAgent기계 장치를 그대로 재사용합니다. - 활성화 — 기존 사용자는
hermes update만 실행하면 됩니다.

무엇이 막혀 있었나
원래 delegate_task는 동기 호출이었습니다. 부모 에이전트가 위임을 시작하면, 자식이 끝날 때까지 도구 호출 안에서 그대로 기다립니다. 사용자 화면도 같이 멈춥니다.
이 구조 때문에 막혀 있던 흐름이 몇 가지 있었습니다.
- 오래 걸리는 자식 작업을 띄워 두고, 그 사이에 부모 채팅으로 다른 질문을 하고 싶다 — 안 됐습니다.
- 자식이 잘 돌고 있는지 중간에 들여다보고 싶다 — 안 됐습니다.
- 잘못 가고 있는 자식에게 “그쪽 말고 이쪽” 하고 끼어들고 싶다 — 안 됐습니다.
에이전트 운영의 결이 동기 호출 하나에 통째로 묶여 있었던 셈입니다.
async_delegation 툴셋 — 무엇을 할 수 있나
이슈 #5586이 추가한 async_delegation 툴셋은 백그라운드 에이전트를 즉시 띄우고 task_id만 돌려줍니다. 부모 쪽 도구 호출은 바로 끝납니다. 이후 흐름은 이 식별자를 가지고 조율합니다.
delegate_task_async— 백그라운드 에이전트를 띄우고task_id를 반환합니다. 호출은 즉시 끝납니다.check_task—task_id로 현재 상태와 최근 출력을 가져옵니다. 부모를 멈추지 않습니다.steer_task— 돌고 있는 자식에게 메시지를 끼워 넣습니다. 방향을 바꾸거나 새 정보를 주입할 때 씁니다.collect_task— 자식이 끝날 때까지 기다렸다가 전체 결과를 회수합니다. 이 호출만은 일부러 블로킹입니다.cancel_task— 진행 중인 자식을 중단시킵니다.list_tasks— 현재 세션에서 떠 있는 비동기 작업을 한눈에 보여줍니다.
부모는 자식의 중간 도구 호출이나 추론 흐름을 그대로 받지 않습니다. 최종 요약만 회수됩니다. 부모의 컨텍스트 윈도우가 자식의 부산물로 부풀지 않도록 잡아두는 설계입니다.
격리 강도는 그대로 셉니다. 자식은 부모의 대화 이력을 모릅니다. 필요한 정보는 부모가 goal과 context 필드로 명시적으로 넘겨야 합니다. 자격 증명만 공유합니다. 그래서 자식별로 다른 모델을 붙이거나, 자격 증명 풀로 레이트 리밋 회피용 키 로테이션을 그대로 받을 수 있습니다.
동기 vs 비동기, 동시성 한도
동기 경로는 그대로 살아 있습니다. delegate_task로 자식 여러 개를 한 번에 띄울 수 있고, 모두 끝날 때까지 부모가 기다립니다. 동시 자식 수는 delegation.max_concurrent_children 설정으로 정합니다. 기본값은 3입니다.
비동기 경로는 이 한도와는 다른 축에서 작동합니다. delegate_task_async는 호출 즉시 반환하므로, 부모는 자식이 도는 동안 같은 채팅에서 다른 일을 할 수 있습니다. list_tasks로 떠 있는 작업을 확인하고, steer_task로 방향을 조정하고, 필요할 때만 collect_task로 회수합니다.
실행 모델은 무겁지 않습니다. 백그라운드 에이전트는 같은 프로세스 안에서 스레드로 돕니다. 별도 컨테이너나 외부 큐를 띄우지 않습니다. 동기 위임이 쓰던 AIAgent 기계 장치, 도구, 자격 증명을 그대로 재사용합니다. 추가 인프라 부담 없이 비동기 흐름만 얻는 구조입니다.
어디에 쓰면 좋은가
- 장시간 리서치와 본업 병행 — 시장 스캔이나 자료 수집을 자식에게 맡깁니다. 부모 채팅에서는 다른 글을 계속 씁니다.
- 여러 접근법 동시 실험 — 검색 백엔드 세 개를 서브에이전트 세 개에 각각 붙여 비교합니다. 격리되어 있으니 결과가 서로 오염되지 않습니다.
- 백그라운드 코딩 작업 — 여러 파일을 건드리는 리팩터링을 자식에게 위임하고, 부모 쪽에서는 다른 파일을 직접 봅니다.
- 장시간 작업 모니터링 — TUI에는
/agents오버레이가 있고,/tasks별칭으로도 부를 수 있습니다. 진행 중인 자식과 끝난 자식이 트리 형태로 보입니다.
실무자가 볼 핵심 포인트
- API는 추가, 동기 호출은 유지 — 기존
delegate_task를 쓰던 파이프라인은 그대로 둬도 됩니다. 비동기로 옮기고 싶은 흐름만 골라delegate_task_async로 바꾸면 됩니다. - 부모 컨텍스트 보호가 핵심 가치 — 자식의 중간 호출이 부모에게 안 흘러갑니다. 긴 자식 작업을 자주 돌리는 흐름이라면 컨텍스트 비용이 눈에 띄게 줄어듭니다.
- 자식에게 모델을 갈아 끼울 수 있다 —
config.yaml에서 자식만 더 싼 모델로 돌리는 패턴이 가능합니다. 비싼 부모에 싼 자식 풀을 매다는 구조가 자연스럽게 짜집니다. - 자격 증명은 공유, 대화 이력은 분리 — 부모가 알고 있는 사실 중 자식이 알아야 할 것은
goal·context필드로 직접 넘겨줘야 합니다. 자식은 부모 채팅을 못 봅니다. - 인프라 추가 없음 — 백그라운드 작업이 별도 워커가 아니라 같은 프로세스 스레드입니다. 셀프 호스팅 환경에서 추가 컴포넌트 없이 바로 켤 수 있다는 뜻입니다.
- 활성화 방법은 단순 —
hermes update한 줄. 이슈 #5586 머지가 끝났고, 공식 문서와 X 공지에서 확인됩니다.
정리
비동기 위임은 새로운 발상이 아니지만, 부모 채팅이 멈추지 않는다는 단순한 약속이 에이전트 사용 패턴을 꽤 바꿉니다. 오래 걸리는 작업을 부모에게서 떼어내고, 부모는 같은 창에서 계속 다른 일을 합니다. 격리는 강하게 유지하면서 자격 증명만 공유하는 절충도 합리적입니다. Hermes Agent를 이미 쓰고 있다면 오늘 안에 hermes update로 확인해볼 만한 변경입니다.
원문 출처
원문 보기 — MarkTechPost, Michal Sutter (2026-06-16)
