Manifest
Best For
- Agents that learn and improve across sessions.
- Long-running daemon agents with persistent state.
- Multi-provider LLM workflows (OpenRouter, OpenAI, Anthropic, local endpoints).
- Agents needing built-in tools (terminal, browser, code search).
How It Works
The adapter bridges Hermes’sAIAgent class to the Charm Runner:
- Persistence —
HERMES_HOMEis redirected toCHARM_WORKSPACE_DIR/.hermes, so SQLite session databases, FTS5 search indexes, auto-generated skills, and memory files all persist across daemon restarts. - Streaming — Hermes’s
stream_delta_callbackis wired to Charm’s SSE emitter for real-time token output in the Store frontend. - Headless mode — The agent runs with
quiet_mode=Trueto suppress TUI spinners and terminal chrome. - Tool tracking — Hermes’s
tool_start_callbackandtool_complete_callbackfeed into Charm’s tool usage analytics. - Threaded Streaming — Because Hermes executes synchronously, the adapter wraps
run_conversationin a background thread and bridgesstream_delta_callbackto Charm Runner via a thread-safe Queue, ensuring real-time token output. - Lazy Configuration — If
entry_pointpoints to a factory function, the adapter automatically injects environment variables likemodel(fromCHARM_HERMES_MODEL) before instantiation.
Plugin Compatibility Notes
- State and Memory Plugins: Hermes manages its own memory system natively using a localized SQLite FTS5 database (
CHARM_WORKSPACE_DIR/.hermes/memory.db). It does not support and will completely ignore any custom memory plugins configured incharm.yaml(e.g.,memory: { provider: "postgres" }). - Output Renderers (Custom UI): The adapter automatically parses
_charm_render_typeJSON objects outputted by Hermes, allowing you to render dynamic UI components in the Charm frontend.
Environment Variables
Runtime Image
For production, use the pre-built Hermes runtime image:Operational Notes
- Use
lifecycle: "daemon"for agents that need persistent memory across sessions. - Always set LLM API keys via
charm.yamlenvironment_variablessection, not hardcoded in source. - Test with
charm validatebefore publishing. - The adapter is distributed as a separate pip package (
charm-adapter-hermes). Install it in your runtime image or let the runner install it fromrequirements.txt.
