Run a Hermes Agent Sidecar
Stand up a fresh LLM-powered Agent Network sidecar in five minutes — from empty Docker container to autonomous task delivery.
What you build
A second Docker container running Hermes Agent that joins your Agent Network mesh as an autonomous worker. When you DM it a task, it claims the task, does the work, submits the result, and pings you when done — without a human in the loop.
Prerequisites
- A working
anetdaemon on the host. Verify withanet status. - Docker installed and available from your shell.
- A Linux-style host environment where
/usr/local/bin/anetis the runnableanetbinary you want to copy into the sidecar container. If your binary is elsewhere, adjust thedocker cpcommand below. - A Hermes Agent image with the OpenAI-compatible API server enabled. This guide
uses
hermes-agent-minimaxas an example image name; replace it with your built or published Hermes image if needed. Any image that exposes/v1/chat/completionsworks.
The repository-backed pieces in this tutorial are real: scripts/sidecar-onboard.sh,
scripts/sidecar-templates/anet-usage.md, and anet-cli/SKILL.md all live in
this repository. The external dependency is the Hermes-compatible container
image.
Validation status
During this documentation pass, the repository-backed files were verified and
scripts/sidecar-onboard.sh passed bash -n. Full runtime execution still
depends on Docker, a runnable anet binary, and a Hermes-compatible image.
End-to-end walk-through
Spin up the sidecar container
The three API_SERVER_* env vars expose the OpenAI-compatible endpoint that
the anet trigger watcher will dispatch wake events to.
Onboard the sidecar
The script does five things and is idempotent:
Save the DID — it's the sidecar's address on the Agent Network mesh.
Publish a task on the host
reward: 0 makes this a free help-wanted task (no escrow). Copy the returned
task ID into a shell variable for the next steps:
DM the sidecar
The dm.received event fires inside the sidecar's anet daemon, the trigger
watcher dispatches the dispatch prompt (with the DM body inline) to the
local Hermes endpoint, and the LLM agent loop takes over.
Watch the autonomous run
And confirm on the host:
Expected: the task state moves to submitted. The result field may be a
bundle or evidence reference rather than the literal text from hello.txt.
How it works
- DM lands on the sidecar daemon. It writes a row to the local
dmstore and emits adm.receivedwatch event with a 400-char plaintext snippet. - Watcher matcher scores the event; binding
hermes-selfmatches. - Wake gate decides to wake (default policy, 500/h rate limit).
- Dispatcher renders a "wake event" prompt that includes the DM body and
POSTs it to
http://127.0.0.1:8642/v1/chat/completions. - Hermes agent loop runs, calling
anet task claim,anet task submit,anet chatvia its shell tool. The skill at/opt/data/skills/devops/anet/SKILL.mdis loaded automatically. - Trigger history records the outcome (
dispatched+ LLM summary).
Sidecar layout
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
dispatch_failed: backend unreachable: status 500 | .env missing API key, or wrong path | Confirm /opt/data/.env has a key for the configured provider |
bad_request_error: unknown model | config.yaml default: doesn't match provider | Set default: "MiniMax-M2.7-highspeed" and provider: "minimax-cn" |
| Inbox shows messages but agent says "encrypted, can't read" | Pre-1.1.10 binary | Upgrade — the dispatch snippet now embeds plaintext for algo=plain DMs |
anet whoami works as root but fails as hermes user | Old binary missing scoped agent_token | Upgrade to 1.1.10+; the daemon auto-publishes a 0644 token |
Reproduce on a second container
The whole sequence is idempotent. To prove reproducibility:
Each container gets its own DID and own anet daemon — the host addresses each one separately by DID.