Nous Research's hermes-agent bindufied. A real tool-using coding/research agent (web, file, code-exec) with tiered safety controls — pick read (web only), sandbox (web + file + moa), or full (everything) via env.
PEP-723-style script header: uv run reads the dependency comment at the top of hermes_simple_example.py and resolves bindu + the hermes-agent git dep on first run.
export OPENROUTER_API_KEY=<get one at https://openrouter.ai/keys>
# Optional: pick a tier (default: read)
export HERMES_TOOL_TIER=sandbox # read | sandbox | fullNo uv sync needed — the script header installs deps on demand.
uv run examples/hermes_agent/hermes_simple_example.py
# http://localhost:3773There's a working signed-request reference client in this folder:
uv run examples/hermes_agent/call.py "summarize bindu in one sentence"call.py reuses the agent's own Ed25519 key (.bindu/private.pem) as the caller identity, fetches an OAuth token from Hydra, signs each JSON-RPC body, and polls tasks/get until terminal. Read it as the canonical reference for the auth-on flow.
Without auth, the same plain curl as every other example works:
curl -sS http://localhost:3773/ \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"message/send","id":"00000000-0000-0000-0000-000000000004","params":{"message":{"role":"user","parts":[{"kind":"text","text":"Summarize bindu in one sentence."}],"kind":"message","messageId":"00000000-0000-0000-0000-000000000001","contextId":"00000000-0000-0000-0000-000000000002","taskId":"00000000-0000-0000-0000-000000000003"},"configuration":{"acceptedOutputModes":["application/json"]}}}'The example may break against newer hermes-agent releases — current AIAgent.__init__ doesn't accept the persist_session kwarg this example passes. If you see unexpected keyword argument 'persist_session', drop that arg from the AIAgent(...) call or pin an older hermes-agent SHA in the script header.
See docs/AUTH.md for the auth-on flow.