Pluggable memory system with hierarchical recall, FTS search, and multiple backend support.
Project description
A memory-tree based memory system — tiered recall, pluggable storage, and memory that migrates to OpenClaw / Hermes and beyond.
Highlights · Overview · Core Technology · Features · Quick Start · Contents
English · 中文
Harness Memory is a pluggable long-term memory system for LLM agents, built around the memory tree model — a hierarchy of root → branch → leaf nodes. It does not talk to an LLM itself; it is a storage-and-recall layer any agent can drop in. What makes it special is portability: the storage backend is abstracted behind a MemoryBackend Protocol, and first-class host adapters let the same memory travel to other agents such as OpenClaw and Hermes.
Harness Memory's design goal: memory is a portable asset, not a lock-in. Capture it once, recall it anywhere — including in a different agent framework.
✨ Highlights
| Feature | Description | |
|---|---|---|
| 🌳 | Memory tree | Hierarchical root → branch → leaf nodes for organized recall |
| 🧩 | Portable by design | MemoryBackend Protocol makes storage swappable |
| 🔄 | Agent-agnostic | Drop into any agent; OpenClaw & Hermes adapters ship in-box |
| 🚚 | Cross-agent migration | Pack to .hmpkg, adopt into OpenClaw / Hermes / another agent |
| 🔍 | Recall pipeline | M4 pipeline: parse → route → gather → rerank → diversify → suppress → budget → render |
| 💾 | Pluggable storage | SQLite + FTS5 by default; PostgreSQL / Chroma / Qdrant optional |
| 🪶 | Zero core deps | stdlib + sqlite3; extras add the rest |
| 🧠 | Tiered distillation | L0 raw → L1 candidate → L2 atom → L3 entity |
📌 Overview
A fact is recorded canonically as an AtomCard (L2) grouped under an Entity (L3). The memory tree is a lightweight index over those atoms: root and branch nodes hold directory-style labels, and each leaf points at an atom — its content is projected from the atom at read time, so there is never a second copy of the fact to drift out of sync. Recall walks the tree and surfaces the linked leaves most relevant to a query.
Because storage sits behind a Protocol, the same Memory object can run on a local SQLite file, a Postgres database, or a vector index — and because host adapters exist for OpenClaw and Hermes, the memory you build in one agent can be adopted by another.
🧠 Core Technology
| Layer | Technology |
|---|---|
| Language | Python 3.11+ |
| Core deps | None — stdlib + sqlite3 |
| Model | MemoryNode tree + AtomCard |
| Recall | M4 pipeline (pipeline/recall/) |
| Storage | MemoryBackend Protocol — SQLite/FTS5, Postgres, vector (Chroma/Qdrant) |
| Host adapters | adapters/bridge/ host bridge for OpenClaw & Hermes |
| LangGraph | Optional checkpointer (SQLite / Postgres) |
| Build / quality | hatchling · ruff · mypy · pytest |
🤔 Features
Memory tree
root → branch → leafhierarchy; leaves reference atoms, content is projected on read.- Tiered distillation: L0 raw event → L1 candidate → L2
AtomCard→ L3 entity page (plus an L2.5 episode/diary layer).
Recall
recall_for_prompt(memory, query)returnsresult.rendered+result.snippets.- M4 pipeline routes the query, gathers candidates, reranks, diversifies, suppresses noise, and budgets tokens before rendering.
Pluggable backends
- Default: SQLite + FTS5 (full-text search).
- Optional: PostgreSQL (
[postgres]), ChromaDB ([chroma]), Qdrant ([qdrant]), local embeddings ([embeddings]), and a LangGraph checkpointer ([langgraph]).
Portability — OpenClaw & Hermes
MemoryBackendProtocol keeps storage swappable, so the engine is agent-agnostic.adapters/bridge/is a shared JSON-RPC bridge reused by OpenClaw; in-process hosts call the sameapplication/runtime.pythroughMemoryService.plugins/openclaw/ships a TypeScript shell (harnessmemory);plugins/hermes/ships a Python plugin — both build on the same bridge.- CLI:
harness-memory openclaw ...andharness-memory hermes ...manage the integration.
Cross-agent migration
operations/migration/portable/ packs memory into a .hmpkg and adopts it into a target host:
harness-memory portable pack --namespace my-agent --out my-agent.hmpkg
harness-memory portable adopt --source my-agent.hmpkg --host openclaw
adopt() rewrites the host / namespace and resolves the target store for OpenClaw, Hermes, another agent, or a plain harnessmemory backend.
🚀 Quick Start
Prerequisites
- Python 3.11+
1. Install
pip install harness-memory # core (SQLite + FTS5)
pip install "harness-memory[postgres]" # PostgreSQL backend
pip install "harness-memory[chroma,embeddings]" # vector index + embeddings
pip install "harness-memory[langgraph]" # LangGraph checkpointer
pip install "harness-memory[cli]" # CLI (incl. openclaw / hermes)
2. Store & recall
from harness_memory import Memory
from harness_memory.pipeline.recall import recall_for_prompt
m = Memory(namespace="my-agent")
m.store("User prefers Python over Java", topic="preferences")
result = recall_for_prompt(m, "language preference")
print(result.rendered)
3. Use with another agent
# OpenClaw
harness-memory openclaw status
harness-memory portable adopt --source my-agent.hmpkg --host openclaw
# Hermes
harness-memory hermes status
harness-memory portable adopt --source my-agent.hmpkg --host hermes
📑 Contents
- Highlights
- Overview
- Core Technology
- Features
- Quick Start
- Reference
- Project Info
🏗️ Architecture
harness_memory/
├─ core.py Memory facade + backend factory
├─ service.py in-process adapter over application runtime
├─ application/ MemoryRuntime, config, host files, path projection
├─ pipeline/ extractor · promotion · page · episode · recall · lifecycle
├─ storage/ MemoryBackend Protocol · sqlite · postgres · vector
├─ ports/ LLMClient protocol and clients
├─ adapters/ bridge · CLI · dashboard
└─ operations/migration/ export/import/rename/portable pack → .hmpkg → adopt
📖 CLI reference
| Command | Description |
|---|---|
harness-memory openclaw ... |
Manage the OpenClaw integration |
harness-memory hermes ... |
Manage the Hermes integration |
harness-memory portable pack |
Export memory to a .hmpkg |
harness-memory portable adopt |
Import a .hmpkg into a target host |
harness-memory portable doctor |
Validate a portable package |
harness-memory store / recall |
Direct store / recall helpers |
🛠️ Development
Prerequisites: Python 3.11+, uv
make install # pip install -e ".[dev,cli]"
make all # lint + typecheck + test
🤝 Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Run
make allbefore submitting - Open a Pull Request
🔗 Related projects
| Project | Description |
|---|---|
| harness-agent | Agent runtime that consumes the memory |
| harness-browser | Browser automation for memory-backed agents |
| harness-gateway | Multi-platform IM channel bridge |
| Octop | The self-hosted assistant that composes the Harness stack |
📄 License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
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 harness_memory-0.8.5.tar.gz.
File metadata
- Download URL: harness_memory-0.8.5.tar.gz
- Upload date:
- Size: 34.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f96e7993a1743c80e2939288122c02fb59dba6c3569113342bb1c5629c703330
|
|
| MD5 |
3ce7961825dfb42dcf0c2fc6b1aa3ea5
|
|
| BLAKE2b-256 |
7032444b4568e62215d49339ad8a419908361298fbd974804a4ccec6f2b869dc
|
File details
Details for the file harness_memory-0.8.5-py3-none-any.whl.
File metadata
- Download URL: harness_memory-0.8.5-py3-none-any.whl
- Upload date:
- Size: 302.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
362864aa83fc211b6f62023855e15f5feae9126a0ec000ca4f6f65938878e226
|
|
| MD5 |
5572aee8a76f61c62dea73fc723edc58
|
|
| BLAKE2b-256 |
62861cc1e0d955d3f18a4fc8fbc2f57964da6b6f9394af2a3991466ee5a5cbb4
|