헤르메스 에이전트 delegate_task 업데이트 후기 — 서브에이전트마다 모델·프로필 따로 고르는 라우팅 백엔드 (2026.10.24)

배치 작업 하나에 하위 작업 여덟 개를 던져놓고 결과를 받아보면, 늘 같은 지점에서 아쉬움이 남습니다. 여섯 개는 문서 읽고 로그 긁고 표 정리하는 단순 조회인데, 두 개는 동시성 버그를 풀고 모듈 경계를 다시 설계하는 어려운 작업입니다. 그런데 위임되는 자식 에이전트는 여덟 개 전부 같은 모델로 돌아갑니다. 비싼 모델을 고르면 단순 조회 여섯 개가 돈을 태우고, 싼 모델을 고르면 어려운 두 개가 그럴듯한 헛소리로 돌아옵니다.

이 강제된 이분법이 2026년 10월 22일부로 필수가 아니게 됐습니다. 노우스 리서치(Nous Research)의 오픈소스 에이전트 헤르메스 에이전트(Hermes Agent) 에 병합된 PR #142563이 위임(delegation)을 플러그형 백엔드 범주로 바꿨습니다. TTS·이미지 생성·터미널 백엔드와 같은 모양새로, delegation.backend 한 줄이 “하위 작업을 어떤 방식으로 라우팅할지”를 결정합니다.

AI 에이전트를 실사용하는 입장에서 이건 기능 하나 추가된 수준이 아니라, 에이전트 배치를 굴리는 비용 구조 자체가 바뀌는 변화라고 봅니다. 설정 파일 몇 줄로 배치 안에서 모델 등급을 섞을 수 있게 됐기 때문입니다.

헤르메스 에이전트 공식 홈페이지의 서브에이전트 위임 섹션 헤르메스 에이전트 공식 홈페이지의 대표 기능 이미지. 이번 변경은 이 위임 계층의 “라우팅 결정”만 떼어내 플러그인으로 만든 것이다 (출처: Nous Research 공식 홈페이지)

📌 한줄 요약: delegate_task의 위임 방식이 delegation.backend로 분리됐습니다. default는 기존 동작 그대로(도구 스키마까지 동일), model_map은 등급별 모델 목록에서 모델이 작업마다 하나를 고르고, profile_routes는 하위 작업을 프로필 단위로 실행해 그 프로필의 모델·크레덴셜·스킬·페르소나·터미널 정책을 그대로 물려줍니다. 두 전략 모두 공식 플러그인 advanced-delegation으로 제공되고, 모든 결과에 어디서 실제로 돌았는지 알려주는 route 영수증이 붙습니다. 실패는 조용한 폴백 대신 그 자리에서 거부됩니다.


1. 기존 규칙: 배치 전체가 모델 하나에 묶여 있었다

바뀐 점을 이해하려면 먼저 예전 제약을 정확히 짚어야 합니다. 위임 모델은 config.yaml에서 전역으로 고정됐습니다. delegation.model, delegation.provider, delegation.base_url 세 값이 전부였고, 기본 전략에서 delegate_task에는 작업별 모델 파라미터 자체가 없었습니다. 즉 배치에 자식이 몇 개든 전부 같은 경로로 나갑니다.

공식 문서도 이 점을 분명히 적어뒀습니다. 품질이 중요한 하위 작업이 있으면 ① 그 세션에서 delegation.model을 비우거나 ② 칸반 보드로 넘기라(칸반은 작업별 모델 오버라이드를 지원)는 식이었습니다. 결국 실무에서는 모두 같은 타협을 했습니다. 중간 등급 모델 하나를 박아두고 감수하는 것.

작업 난이도가 들쭉날쭉한 배치를 자주 돌리는 쪽이라면, 이 타협이 얼마나 비싼지 아실 겁니다. 조회 작업 아홉 개에 최상위 모델을 붙이면 청구서가 튀고, 반대로 최저가 모델을 붙이면 어려운 두 개를 사람이 다시 손봐야 합니다.

헤르메스 에이전트 데스크톱 앱 화면 헤르메스 데스크톱 앱 공식 스크린샷. 이번 변경의 후속 PR에서는 데스크톱에 위임 모드 선택기와 모델 라우트 편집기까지 붙을 예정이다 (출처: Nous Research 공식 홈페이지)


2. 새 규칙: delegation이 플러그형 백엔드 범주가 되다

변화를 한 문장으로 줄이면 이렇습니다. 위임이 TTS·이미지 생성·터미널 백엔드와 같은 플러그형 범주가 됐고, delegation.backend가 전략을 고릅니다.

핵심은 “무엇을 떼어냈는가”입니다. 코어는 위임의 생애주기 전체를 그대로 들고 있습니다. 스폰, 격리, leaf/orchestrator 역할, 깊이, 동시성, 백그라운드 유닛, 팬아웃 중단, 결과 수집, output_schema, 진행 표시까지 전부 그대로입니다. 떨어져 나간 건 라우팅 결정 하나뿐입니다.

이 설계 덕분에 하위 호환도 깔끔합니다. delegation.backend를 비우거나 default로 두면 delegate_task의 스키마와 모든 hermes-cli 도구 정의가 바이트 단위로 이전과 동일합니다. 기존 설정을 쓰던 쪽은 업데이트 후에 아무것도 바뀌지 않습니다.

나머지 두 전략은 공식 플러그인 advanced-delegation 이 제공합니다.

전략 라우팅 주체 자식이 물려받는 것 어울리는 배치
default 전역 delegation.model 기존과 동일 난이도가 고른 배치, 설정 변경 없이 쓰던 사람
model_map 모델이 작업마다 등급 선택 지정한 provider/model 조합 난이도 편차가 큰 배치 (조회 6 + 설계 2)
profile_routes 작업마다 프로필 지정 그 프로필의 모델·크레덴셜·스킬·SOUL.md·터미널 정책 권한을 분리해야 하는 배치 (코드 작업은 제한된 터미널에서)

3. 설정은 이렇게 생겼다

model_map은 “제목 붙은 선택지”를 나열하고, 각 선택지에 한 줄 설명과 provider/model을 붙입니다. 모델은 작업마다 그중 하나를 고릅니다.

delegation:
  backend: model_map
  backends:
    model_map:
      options:
        - name: fast
          description: Cheap and quick; lookups, summaries, simple edits.
          provider: openrouter
          model: google/gemini-3-flash-preview
        - name: deep
          description: Slow and careful; hard debugging and design work.
          provider: anthropic
          model: claude-opus-5
          reasoning_effort: high
          service_tier: fast   # optional; refused at spawn if this route has no fast tier
      default: fast            # optional: option for tasks that set none
    profile_routes:            # read when backend: profile_routes
      profiles:
        - name: coder
          description: Writes and refactors code; runs tests.

여기서 놓치기 쉬운 디테일이 description입니다. 이건 장식이 아니라 모델에게 주는 유일한 판단 근거입니다. 모델은 설정한 이름과 설명만 보고, 실제 provider·model·키 필드는 절대 보지 못합니다. 그래서 “Cheap and quick; lookups, summaries, simple edits”라고 쓰면 언제 돈을 아껴야 하는지를 가르치는 셈이고, “Slow and careful; hard debugging and design work”라고 쓰면 언제 돈을 써야 하는지를 가르치는 셈입니다.

바꿔 말하면 설명 문구를 대충 쓰면 라우팅 품질도 대충이 됩니다. 등급 이름만 fast/deep으로 두고 설명을 비워두면, 모델은 이름만 보고 추측합니다. 이건 설정 항목이라기보다 프롬프트 설계에 가깝습니다.

profile_routes는 결이 다릅니다. 자식이 신원 자체를 바꿉니다. 각 프로필은 자기 모델, 크레덴셜 풀, SOUL.md, 터미널 정책을 들고 있고, 하위 작업은 그 프로필로 실행됩니다. “이 서브에이전트들은 서로 다른 권한 아래에서 돌아야 한다”는 요구에 맞는 구조입니다.

헤르메스 에이전트 자동화 기능 이미지 공식 홈페이지의 자동화 섹션. 위임 라우팅은 이 자동화 계층 아래에서 “누가 얼마짜리 모델로 일할지”를 결정하는 부품에 해당한다 (출처: Nous Research 공식 홈페이지)


4. 라우팅 결과에 ‘영수증’이 붙는다

이번 변경에서 가장 실용적인 부분은 모델 선택 기능이 아니라 route 영수증입니다. 백엔드를 거친 작업은 결과에 자신이 실제로 어디서 돌았는지를 기록합니다. 백엔드 이름, 선택된 옵션(또는 프로필) 이름, 그리고 자식이 사용한 provider·model·reasoning effort·속도 등급까지입니다. 폴백 provider가 개입했다면 fallback_activated가 true로 표시됩니다.

이게 왜 중요할까요. 예전에는 “내가 delegation.model을 이렇게 설정했으니 자식도 그 모델이겠지”라고 추론할 수밖에 없었습니다. 이제는 결과가 보고합니다. 배치 하나가 갑자기 비싸졌을 때, 원인을 짚으려고 로그를 뒤지는 대신 영수증 한 줄을 읽으면 됩니다.

비용 최적화를 자동화 파이프라인에 넣으려는 쪽이라면 이 차이가 결정적입니다. 라우팅 결정을 자동화하려면 먼저 결정의 결과를 측정할 수 있어야 하니까요.


5. 실패는 조용히 넘어가지 않는다

이 PR이 공을 가장 많이 들인 지점은 기능 추가가 아니라 실패 처리입니다. 그리고 이 부분이 실무에서 제일 반갑습니다. 조용한 폴백은 디버깅을 지옥으로 만들기 때문입니다.

  • 백엔드 자체가 없을 때 — 플러그인이 설치되지 않았거나 비활성 상태면 delegate_task가 도구 오류를 반환합니다. 오류 메시지에 백엔드 이름과 해결책(플러그인 설치·활성화, /delegation default, 또는 hermes config set delegation.backend default)이 함께 나옵니다. 서브에이전트는 하나도 시작되지 않고, 자식들이 몰래 기본 경로로 도는 일도 없습니다.
  • 배치 안의 특정 작업만 라우팅 불가일 때 — 존재하지 않는 옵션, 해당 백엔드가 받지 않는 파라미터, 없는 프로필, 그 라우트가 제공하지 않는 service_tier, 알 수 없는 reasoning_effort, 크레덴셜 누락 같은 경우입니다. 이때는 그 작업만 거부됩니다. 결과 항목에 status: "error", 사유, route.refused: true가 붙고, 형제 작업들은 계속 실행됩니다. 전체가 도구 오류가 되는 건 모든 작업이 거부됐을 때뿐입니다.
  • 폴백 규칙 — 자체 fallback_providers가 없는 모델 라우트는 delegation.fallback_providers를 상속합니다. fallback_providers: []로 두면 그 라우트의 폴백이 꺼집니다. 프로필 라우트는 그 프로필의 폴백 체인을 씁니다.

“일부만 실패했을 때 전체를 죽이지 않는다”와 “실패한 작업은 반드시 표시한다”를 동시에 만족시키는 구조라, 배치 자동화를 오래 굴려본 쪽이라면 이 균형이 얼마나 어려운지 아실 겁니다.


6. 전환과 복귀는 명령 세 줄

플러그인을 설치하고 나면 파일을 열지 않고도 전환됩니다.

hermes plugins search advanced-delegation
hermes plugins install advanced-delegation
hermes plugins enable advanced-delegation
/delegation model_map              # 이번 세션만
/delegation profile_routes --global  # config.yaml에 기록
/delegation default                # 기본 전략으로 복귀

hermes delegation config는 모델 라우트를 만들고 고치고 지우는 작업과 프로필 선택을 담당합니다.

여기에 문서가 명시적으로 짚은 미묘한 함정이 하나 있습니다. 세션 전환은 라우팅을 바꾸지만 도구 스키마는 바꾸지 않습니다. 작업별 파라미터(option, profile 등)는 캐시되는 프롬프트의 일부이고 config.yaml을 따라가므로, 실제 반영은 다음 세션입니다. 그 전까지 모델은 이전 백엔드의 파라미터를 보낼 수 있습니다. profile_routes로 바꿨는데 모델이 option: fast를 보내는 식입니다.

이런 작업은 새 백엔드의 기본 라우트로 억지로 돌지 않고 그 작업만 거부되며, 메시지에 해결책이 함께 나옵니다. /delegation <backend> --global 후 /new, 또는 /delegation <저장된 백엔드>로 되돌리라는 안내입니다. 플러그인 없이 원복하려면 hermes config set delegation.backend default 한 줄이면 됩니다.


7. 어떤 전략이 어떤 상황에 맞나

문서가 정리한 구분은 명확합니다.

model_map — 크레덴셜 한 세트로, 난이도에 따라 돈을 나눈다. 가벼운 작업은 싼 모델로, 어려운 작업은 강한 모델로. 하위 작업 난이도 편차가 큰 배치에 맞습니다. 이슈 열 개를 한 번에 고치거나, 리서치 스레드 스무 개를 동시에 돌리는 작업이 대표적입니다.

profile_routes — 자식이 신원을 바꾼다. 프로필마다 모델·크레덴셜 풀·SOUL.md·터미널 정책이 다르므로, 권한을 분리해야 하는 경우에 맞습니다. 코드 작업은 제한된 터미널 정책 안에서만 돌게 하는 식입니다.

다만 profile_routes에는 문서가 굵게 강조한 경고가 따라붙습니다. delegation.backends.profile_routes에 프로필을 올리면, 그 프로필의 크레덴셜·크레덴셜 풀·SOUL.md·터미널 정책을 이 에이전트의 서브에이전트가 그대로 쓸 수 있게 된다는 점입니다. 키와 터미널 접근 권한을 이 에이전트에 넘겨도 된다고 판단한 프로필만 올려야 합니다. 편의 기능이지 격리 기능이 아닙니다.


8. 지금 적용하려면 알아야 할 제약

솔직히 말하면, 이 변경은 아직 “모두에게 바로 권할” 단계는 아닙니다. 문서에 적힌 제약을 그대로 옮기면 이렇습니다.

  • model_map/profile_routes가 켜져 있는 동안 delegation.model과 delegation.provider는 비활성입니다. 라우트가 결정하기 때문입니다. 옵션을 잘 설정해놓고 “왜 예전 고정값이 안 먹지” 하고 헤매는 상황이 여기서 나옵니다.
  • 채널 구분이 있습니다. PR #142563은 2026년 10월 22일 main에 병합됐고, 후속으로 #142564가 기본 전략 자체를 번들 플러그인으로 옮기고 #143126이 데스크톱 위임 설정(모드 선택기, 모델 라우트 편집기, 프로필 라우트)을 추가합니다. 이 기능은 v0.22.5(2026년 10월 22일자 릴리스, 10월 23일 공개)의 변경 창에 포함됐습니다. 즉 지금 안정 채널에서 쓸 수 있지만, 설정 파일을 손대기 전에 hermes --version으로 자기 채널을 먼저 확인하는 게 안전합니다.
  • 기본 전략은 여전히 안전한 선택입니다. 자동화 파이프라인을 운영 중이고 배치 난이도가 고르다면, 굳이 라우팅을 쪼갤 이유가 없습니다. default는 도구 스키마까지 이전과 동일하므로 업그레이드 리스크가 가장 낮습니다.

9. 같은 주에 함께 들어온 변화: 사용량 창(allowance) 게이지

같은 릴리스 창에 성격이 다른 변화도 하나 들어왔습니다. PR #142308로, 크레딧 잔액이 아니라 일·주·월 사용량 한도로 과금되는 플랜에서 남은 양을 터미널에서 보여주는 기능입니다.

헤르메스는 원래 “충전하고, 쓰고, 0에서 멈추는” 크레딧 잔액 모델로 자랐습니다. 반면 사용량 창 플랜은 차오르는 쿼터입니다. 잔액은 숫자 하나지만 쿼터는 게이지 묶음이라, 인터페이스가 다를 수밖에 없습니다. 그래서 이 변경은 플랜을 헤르메스 안에 모델링하지 않고, 서버가 보내는 대로 그립니다. usage_window.gauges와 x-nous-credits-window-gauges 응답 헤더가 그 원천이고, 각 게이지는 scope: all(모든 유료 모델 차단) 또는 scope: top_tier(최상위 등급만 차단)를 달고 옵니다.

바뀐 화면은 이렇습니다.

  • /usage에 허용량별 막대 하나씩, 사용률과 리셋까지의 시간이 표시됩니다.
  • 데스크톱 Settings → Billing에도 같은 게이지가 뜨고, “Keep going on credits” 스위치로 한도 소진 후 크레딧으로 이어갈지 정할 수 있습니다.
  • 모델 선택기의 가격 표시가 Free / Small / Medium / Large 태그로 바뀝니다. 사용량 창 플랜에서는 모든 모델이 포함이므로 토큰 단가 대신 등급 단어를 보여주는 겁니다.
  • 한도에 닿으면 거부 메시지가 어느 허용량이 소진됐고, 언제 리셋되고, 지금 쓸 수 있는 모델 두 개까지 알려줍니다.

여기서 설계 결정 하나가 눈에 띕니다. 헤르메스는 스스로 모델을 바꾸지 않습니다. 사용량 한도 초과는 폴백 체인을 타지 않습니다. 폴백 체인은 “이 provider가 죽었다”를 위한 장치이고, “플랜을 초과했다”를 위한 장치가 아니라는 구분입니다. 대신 쓸 수 있는 모델을 고르거나 리셋을 기다립니다. 에이전트가 조용히 더 비싼 경로로 넘어가 청구서를 만드는 사고를 구조적으로 막는 셈입니다.

크레딧 그랜트, 종량제, 무료 티어는 이 모듈에서 아무것도 받지 않습니다. 해당 코드 경로는 그대로입니다.


정리 — 배치 자동화를 굴리는 쪽이라면 체크할 세 가지

  1. 배치 난이도가 들쭉날쭉한가. 그렇다면 model_map이 바로 그 문제를 겨냥한 기능입니다. 다만 옵션 설명 문구를 진짜로 공들여 써야 효과가 납니다. 이름만 fast/deep으로 두면 라우팅은 추측이 됩니다.
  2. 권한을 분리해야 하는가. 그렇다면 profile_routes가 답이지만, 올린 프로필의 키와 터미널 접근을 넘긴다는 전제를 반드시 확인해야 합니다.
  3. 비용을 측정하고 있는가. route 영수증이 생겼으니 이제 “어느 작업이 어느 모델로 갔는지”를 사후에 확인할 수 있습니다. 이걸 로그로 쌓아두면 다음 배치의 라우트 설명을 다듬는 근거가 됩니다.

업무 자동화 파이프라인을 운영하는 입장에서 이번 변경의 본질은 “모델을 골라 쓸 수 있게 됐다”가 아니라, 위임이라는 계층이 설정 가능한 부품이 됐다는 데 있습니다. 좋은 부품은 조용히 실패하지 않고, 결과에 자기 경로를 남깁니다. 이번 PR은 그 두 가지를 꽤 진지하게 구현했습니다.

가성비 좋은 자동화 구성을 찾는 분들께는, 화려한 신기능보다 route 영수증과 조용한 폴백 금지 규칙을 먼저 보시라고 권하고 싶습니다. 배치를 오래 굴릴수록 결국 그 두 가지가 유지비를 결정합니다.


참고 자료

  • Nous Research 공식 문서 — Subagent Delegation: https://hermes-agent.nousresearch.com/docs/user-guide/features/delegation
  • GitHub 릴리스 v0.22.5 (2026-10-22): https://github.com/NousResearch/hermes-agent/releases/tag/v0.22.5
  • 변경 PR: #142563 (위임 백엔드), #142308 (사용량 창 게이지)

이미지 출처: Nous Research 공식 홈페이지(hermes-agent.nousresearch.com) 기능·데스크톱 섹션