Prerequisites
Before installing the plugin, make sure you have:- Hermes Agent installed and available on your
PATH ATOMICMEMORY_API_URLexported in your shell pointing to a running AtomicMemory coreATOMICMEMORY_API_KEYexported if your core requires authentication (the Core Quickstart service does)
Install
Run the plugin installer
Install the provider from the published npm package. The installer copies the Python provider files into Hermes’ memory-provider directory — no repository clone required.
Configuration
Hermes’ setup wizard prompts for the two most important settings (scope_user and memory_scope). All advanced settings can be set through environment variables or the provider-local config file at $HERMES_HOME/atomicmemory.json.
Environment variables
| Variable | Purpose | Default |
|---|---|---|
ATOMICMEMORY_API_URL | AtomicMemory core URL | Required |
ATOMICMEMORY_API_KEY | Bearer credential for authenticated cores | — |
ATOMICMEMORY_PROVIDER | Memory backend name | atomicmemory |
ATOMICMEMORY_SCOPE_USER | User identity for memory scoping | $USER |
ATOMICMEMORY_MEMORY_SCOPE | shared or siloed | shared |
ATOMICMEMORY_MEMORY_MODE | hybrid, context, or tools | hybrid |
ATOMICMEMORY_PREFETCH_ENABLED | Enable background prefetch before each turn | true |
ATOMICMEMORY_PREFETCH_METHOD | Prefetch strategy: context (full package) or fast (keyword search) | context |
ATOMICMEMORY_SEARCH_LIMIT | Default result count for search and list operations | — |
ATOMICMEMORY_TOKEN_BUDGET | Context-package token budget | — |
Provider-local config file
The$HERMES_HOME/atomicmemory.json file accepts the same keys as environment variables, for settings you want to persist across shell sessions:
Secrets are never persisted in this file.
api_key and api_url are deliberately excluded from the allowed key set — always pass them through environment variables.Memory scope
ATOMICMEMORY_MEMORY_SCOPE controls which memories Hermes can recall:
| Scope | Recall | Ingest |
|---|---|---|
shared (default) | All AtomicMemory memories for the user, across all tools | Stamped with source_site=hermes |
siloed | Only memories ingested by Hermes | Stamped with source_site=hermes |
shared when you want Hermes to benefit from context gathered in Claude Code, Codex, or other AtomicMemory tools. Use siloed when you want a strictly Hermes-only memory context — for example, when running multiple agents with separate knowledge domains.
Memory mode
ATOMICMEMORY_MEMORY_MODE controls which Hermes memory surfaces AtomicMemory exposes:
| Mode | Auto-recall + turn sync | Explicit tools |
|---|---|---|
hybrid (default) | Enabled | Visible |
context | Enabled | Hidden |
tools | Disabled | Visible |
hybridgives the agent both automatic background recall and on-demand tool access — the recommended mode for most workflows.contextkeeps recall transparent to the agent; use this when you want memories injected into context without the agent being aware of the mechanism.toolsdisables automatic recall and relies entirely on the agent calling tools explicitly; useful when you want full agent control over when memory is accessed.
Available tools
Whenmemory_mode is hybrid or tools, the agent has access to four explicit tools:
| Tool | Description |
|---|---|
atomicmemory_search | Search AtomicMemory by semantic meaning |
atomicmemory_context | Build an injection-ready context package for the current turn |
atomicmemory_conclude | Store one explicit durable fact verbatim |
atomicmemory_profile | List recent memory records (description reflects current memory_scope) |
Lifecycle and reliability
The provider integrates deeply with Hermes’ turn lifecycle:Background prefetch
queue_prefetch(query) searches AtomicMemory in a background thread before the next turn. A generation counter ensures a slow earlier prefetch cannot overwrite a faster newer one.Non-blocking turn sync
sync_turn(user, assistant) enqueues the completed turn to a single-writer worker thread and returns immediately, so AtomicMemory writes never block the chat loop.Circuit breaker
After 5 consecutive failures, the circuit breaker pauses all SDK calls for 2 minutes. Hermes continues to run normally while AtomicMemory is temporarily unavailable. The breaker resets automatically on the next successful call.
Session drain
on_session_end(messages) drains the worker queue before closing the SDK client, ensuring no buffered turns are lost at session end.Troubleshooting
Provider does not appear in 'hermes memory setup'
Provider does not appear in 'hermes memory setup'
The provider is installed to the wrong path. User-installed memory providers must live directly under
$HERMES_HOME/plugins/<name>/. The plugins/memory/ layout is reserved for providers bundled inside Hermes Agent itself. Re-run the installer and verify the output path.is_available() returns False
is_available() returns False
Either
ATOMICMEMORY_API_URL is unset, or the Hermes Python environment is missing the atomicmemory SDK dependency from plugin.yaml. Export ATOMICMEMORY_API_URL and confirm the SDK is installed in Hermes’ Python environment.Import fails at startup
Import fails at startup
The Hermes Python environment is missing the
atomicmemory dependency. Install it into the environment Hermes uses, not your global Python environment.PROVIDER_UNSUPPORTED error with memory_scope=siloed
PROVIDER_UNSUPPORTED error with memory_scope=siloed
The configured SDK provider is not the AtomicMemory core. Either set
ATOMICMEMORY_PROVIDER=atomicmemory to use the AtomicMemory backend, or switch to ATOMICMEMORY_MEMORY_SCOPE=shared to remove the provider requirement for scope filtering.