Hermes Tiered Memory
hermes-tiered-memory is a single Hermes Agent memory provider with a hot L1
(Mnemosyne) and durable L2 (Hindsight). It keeps the Hermes-facing namespace
small and explicit, fails closed when dependencies or configuration are invalid,
and promotes L1 writes through a durable local outbox.
Version: 1.0.1
Public tools
The provider exposes exactly these public memory tools:
tiered_memory_search— search withqueryand an optionallimit(1–100).tiered_memory_store— storecontentwith optional objectmetadata.tiered_memory_delete— delete bymemory_id.
The L1 and L2 adapters are internal implementation details. They do not register
additional Hermes tools. This project does not add native hermes tiered-memory
commands; its standalone commands are the hermes-tiered-memory console script
described below.
Architecture
Hermes Agent
└─ one CompositeProvider
├─ Mnemosyne L1 (profile/bank-scoped local memory)
├─ durable SQLite outbox (L1 write → asynchronous promotion)
└─ Hindsight L2 (HTTPS, stable document identity, provenance metadata)
Reads are L1-first, with L2 recall and L1 backfill on a miss. Writes commit to L1 and enqueue promotion. Deletes create durable L1 tombstone state and enqueue L2 deletion. The provider uses one configured profile and bank scope; it does not use ambient Mnemosyne defaults.
Installation
Requirements: Python >=3.11,<3.14 and hermes-agent>=0.7.0.
Install the package and the live adapter extras in the same Python environment used by Hermes:
python3 -m pip install 'hermes-tiered-memory[mnemosyne,hindsight]'
For a source checkout, build and install a wheel, then install the Hermes plugin
shim. HERMES_HOME must already exist:
python3 -m build --wheel
scripts/install_plugin.sh dist/hermes_tiered_memory-1.0.0-py3-none-any.whl "$HERMES_HOME"
The script installs the wheel, creates the tiered-memory plugin shim, and
writes its plugin.yaml. Then set memory.provider: tiered-memory in the
selected profile and restart Hermes. See INSTALL.md for discovery
and troubleshooting details.
Provisioning and diagnosis
These are the supported standalone commands:
hermes-tiered-memory provision --help
hermes-tiered-memory doctor --help
Provision a signed endpoint configuration and a reviewable Hermes YAML patch:
hermes-tiered-memory provision \
--output-dir ./tiered-memory-config \
--key-id operator-ed25519-1 \
--config-id hindsight-config-1 \
--host hindsight.example.invalid \
--auth-mode api_key
provision generates an Ed25519 private key, canonical protected config,
detached signature, and patch. It never accepts or reads the Hindsight API key.
Use a real HTTPS hostname and review the generated patch before applying it.
--auth-mode is exactly api_key or none.
Run read-only checks with the generated files and public key:
hermes-tiered-memory doctor \
--config ./tiered-memory-config/protected-config.json \
--signature ./tiered-memory-config/protected-config.sig \
--verification-key operator-ed25519-1=<base64-public-key>
doctor checks optional extras, protected-config validity, L1 availability, and
optionally an L2 /health endpoint. It does not write the live replay state.
Configuration and secret boundary
The provider reads memory.tiered through Hermes' effective profile
configuration. A minimal shape is:
memory:
provider: tiered-memory
tiered:
hindsight:
auth_mode: api_key # api_key or none
verification_keys:
- key_id: operator-ed25519-1
algorithm: ed25519
public_key_b64: <base64-public-key>
protected_config:
path: ./protected-config.json
signature:
path: ./protected-config.sig
profiles:
<active-profile>:
secrets:
hindsight:
api_key: <profile-secret> # required only for auth_mode: api_key
For api_key, the non-empty credential must exist in the active profile's
Hermes-owned secrets at profiles.<active-profile>.secrets.hindsight.api_key.
For none, that secret must be absent. The provider rejects both mismatches at
startup. Credentials are not stored in the protected endpoint file, generated
by provision, or sent by doctor; the API key is used only by the L2 HTTP
adapter's authorization header.
Read docs/security.md for the protected-config and crypto boundary, docs/migration.md for compatibility and upgrade notes, and docs/ci-release.md for CI and release behavior.
Quickstart
- Install
hermes-tiered-memory[mnemosyne,hindsight]into the Hermes Python environment. - Run
hermes-tiered-memory provision ...and keep the private key mode0600. - Apply the generated
memory.tieredpatch after review; put any API key in the active profile's Hermes secret configuration, never in the patch. - Set
memory.provider: tiered-memoryand restart Hermes. - Run
hermes-tiered-memory doctor ...before exercising the three public tools.
Documentation boundaries
README.md, INSTALL.md, and docs/ are user-facing documentation. The
research/ directory, map.md, issues/, and DEVELOPER.md are internal
design history or maintainer material, not product compatibility promises.
Start with docs/internal-design-history.md if
you need that distinction.
Development
python3 -m pip install -e '.[test]'
python3 -m pytest -q
See CHANGELOG.md and docs/release-notes-v1.0.0.md for the v1.0.0 release record.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hermes_tiered_memory-1.0.1.tar.gz.
File metadata
- Download URL: hermes_tiered_memory-1.0.1.tar.gz
- Upload date:
- Size: 48.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf315d171861315846ea89a9e931db66aaf8882434ec5957680c3b3876b9ab00
|
|
| MD5 |
c750ed1e48972bfa277804eb238b92d6
|
|
| BLAKE2b-256 |
c93b6f108baf000ee6b7f75226a641badf20ff24baa1f7423ee5ce59c046a5f7
|
Provenance
The following attestation bundles were made for hermes_tiered_memory-1.0.1.tar.gz:
Publisher:
release.yml on jtstothard/hermes-tiered-memory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_tiered_memory-1.0.1.tar.gz -
Subject digest:
bf315d171861315846ea89a9e931db66aaf8882434ec5957680c3b3876b9ab00 - Sigstore transparency entry: 2339316125
- Sigstore integration time:
-
Permalink:
jtstothard/hermes-tiered-memory@4418ada9e9e176ed448262f803eed5cbe2886c72 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/jtstothard
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4418ada9e9e176ed448262f803eed5cbe2886c72 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hermes_tiered_memory-1.0.1-py3-none-any.whl.
File metadata
- Download URL: hermes_tiered_memory-1.0.1-py3-none-any.whl
- Upload date:
- Size: 53.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
641b6895121bb39066a1fb786544e444efb1cc58facd45c3ae3b33f5d38f8826
|
|
| MD5 |
36ef815044372e8d3c2d867359409910
|
|
| BLAKE2b-256 |
7bba1d1121b7353708fdce46693cc3aede26942a87e168fe8d4a284be10d91a6
|
Provenance
The following attestation bundles were made for hermes_tiered_memory-1.0.1-py3-none-any.whl:
Publisher:
release.yml on jtstothard/hermes-tiered-memory
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_tiered_memory-1.0.1-py3-none-any.whl -
Subject digest:
641b6895121bb39066a1fb786544e444efb1cc58facd45c3ae3b33f5d38f8826 - Sigstore transparency entry: 2339316127
- Sigstore integration time:
-
Permalink:
jtstothard/hermes-tiered-memory@4418ada9e9e176ed448262f803eed5cbe2886c72 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/jtstothard
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@4418ada9e9e176ed448262f803eed5cbe2886c72 -
Trigger Event:
push
-
Statement type: