Files

2.2 KiB

Delegation Model Routing

Setup

Configured in ~/.hermes/config.yaml:

delegation:
  child_timeout_seconds: 600
  max_concurrent_children: 3
  max_iterations: 50
  max_spawn_depth: 1
  orchestrator_enabled: true
  subagent_auto_approve: false
  model: openrouter/anthropic/claude-opus-4.7
  provider: admin-ai
  fallback:
    model: deepseek-chat
    provider: admin-ai

Routing architecture

Layer Model Provider
My conversation deepseek-chat (fast, cheap) admin-ai
Subagents (delegation) Claude Opus 4.7 (smarter background work) admin-ai
Fallback deepseek-chat admin-ai

Verified behavior

  • Subagent model routing works — subagents dispatched with delegate_task() correctly run on Claude Opus 4.7
  • The fallback to deepseek-chat fires if the primary model is unavailable
  • The main conversation thread never drops or degrades — delegation runs in independent background processes
  • deepseek-v4-pro also works as a delegation model but Claude Opus was preferred for smarter background reasoning

Standing instruction: delegate by default

User established (Jul 5, 2026) that independent tasks should be automatically delegated to subagents rather than serialized in the main thread. This includes:

  • Research tasks (product research, pricing, API documentation)
  • Data extraction and processing (parsing emails, extracting PDFs, formatting data)
  • Parallel workstreams (multiple independent investigations)
  • Any task that can run independently without blocking the conversation

This is recorded in memory as a standing practice. The user should not have to request delegation — it's the default for any task that can be parallelized.

Testing

# Verify models available
curl -s https://admin-ai.itpropartner.com/v1/models \
  -H "Authorization: Bearer $(grep 'api_key:' ~/.hermes/config.yaml | head -1 | awk '{print $2}')" \
  | python3 -c "import sys,json; [print(m['id']) for m in json.load(sys.stdin)['data'] if 'claude-opus' in m['id'].lower()]"

# Test a subagent dispatch (runs in background, result returns as async message)
delegate_task(goal="Respond with what model you're running on.", context="Delegation routing test")