Skip to content

hermes

hermes is the fleet message bus. It runs on the orchestrator host and provides the coordination layer that lets Iris, minotaur, and model backends find each other, report health, and exchange control messages.

hermes does not carry inference traffic. It carries control messages only: routing decisions, capability updates, health signals, and RPC between components.

  • Capability discovery — backends register their loaded models at startup. hermes maintains a live capability table queried by minotaur when scheduling work.
  • Topology propagation — Iris fetches the current fleet topology from hermes at startup and on a periodic refresh interval.
  • Component RPC — lightweight publish/subscribe protocol for point-to-point messages between named components.
  • Health tracking — backends send periodic heartbeats; hermes marks stale entries and minotaur skips them.

hermes listens on :7677 by default. This is a LAN-local binding; hermes does not expose a public interface.

hermes is installed automatically when you select the orchestrator host role:

Terminal window
curl --proto '=https' --tlsv1.2 -fsSL https://pantheon.lhocke.dev/installs/install.sh | sh
# Select: orchestrator host

hermes configuration lives at /etc/pantheon/hermes.toml on the orchestrator host:

[hermes]
listen = "0.0.0.0:7677" # LAN-local; restrict with firewall if needed
log_level = "info"
[auth]
require_bearer = true # require token for off-LAN clients
token_file = "/etc/pantheon/hermes-tokens"

Restart hermes after config changes:

Terminal window
pantheon hermes restart
Terminal window
pantheon hermes status # show connected components + capability table
pantheon hermes log # tail hermes log (live)
pantheon hermes backends # list registered model backends and loaded models
pantheon hermes restart # restart the hermes process

When a backend comes online it registers with hermes:

{
"id": "backend-gpu-01",
"models": ["qwen2.5:72b", "llama3.1:8b"],
"classes": ["sonnet-class", "haiku-class"],
"last_seen": "2026-05-30T10:12:00Z"
}

minotaur queries this table when it receives a work item from Iris. If no backend has the requested model class loaded, minotaur signals Iris to fall back to Anthropic (if the routing policy allows it).