Skip to main content

Pluggable memory system with hierarchical recall, FTS search, and multiple backend support.

Project description

Harness Memory Banner

A memory-tree based memory system — tiered recall, pluggable storage, and memory that migrates to OpenClaw / Hermes and beyond.

Python 3.11+ License: MIT PyPI version Code Style: Ruff GitHub stars

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 (recall/)
Storage MemoryBackend Protocol — SQLite/FTS5, Postgres, vector (Chroma/Qdrant)
Host adapters lightclaw/ bridge for OpenClaw & Hermes
LangGraph Optional checkpointer (SQLite / Postgres)
Build / quality hatchling · ruff · mypy · pytest

🤔 Features

Memory tree

  • root → branch → leaf hierarchy; leaves reference atoms, content is projected on read.
  • Tiered distillation: L0 raw event → L1 candidate → L2 AtomCardL3 entity page (plus an L2.5 episode/diary layer).

Recall

  • recall_for_prompt_v2(memory, query) returns result.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

  • MemoryBackend Protocol keeps storage swappable, so the engine is agent-agnostic.
  • lightclaw/ is a shared bridge (JSON-RPC + path projection) reused by both OpenClaw and Hermes.
  • plugins/openclaw/ ships a TypeScript shell (harnessmemory); plugins/hermes/ ships a Python plugin — both build on the same bridge.
  • CLI: harness-memory openclaw ... and harness-memory hermes ... manage the integration.

Cross-agent migration

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.recall import recall_for_prompt_v2

m = Memory(namespace="my-agent")
m.store("User prefers Python over Java", topic="preferences")

result = recall_for_prompt_v2(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

🏗️ Architecture

Memory                      facade + backend factory
 ├─ core.py                 store / get / update / delete / recall / get_tree
 ├─ backends/               MemoryBackend Protocol · sqlite · postgres · fts
 ├─ recall/                 M4 pipeline (parse/route/gather/rerank/...)
 ├─ extractor/ + promotion/ L0→L1→L2 distillation
 ├─ page/ + episode/        entity pages + diary layer
 ├─ vector/                 optional Chroma / Qdrant
 ├─ lightclaw/              OpenClaw / Hermes host bridge
 └─ migration/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

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Run make all before submitting
  4. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

harness_memory-0.8.4.tar.gz (34.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

harness_memory-0.8.4-py3-none-any.whl (327.8 kB view details)

Uploaded Python 3

File details

Details for the file harness_memory-0.8.4.tar.gz.

File metadata

  • Download URL: harness_memory-0.8.4.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

Hashes for harness_memory-0.8.4.tar.gz
Algorithm Hash digest
SHA256 4daf6873e94cc22e72229167a4bc89ab4e8c199d9fb2121e46f3ddfe51af7870
MD5 98b660d09150878e6e33df17840d2f0c
BLAKE2b-256 bf3a844e3aa5ed7f59308d7eaf326784ef2982a6a2cca71589ee5c62dcd21c30

See more details on using hashes here.

File details

Details for the file harness_memory-0.8.4-py3-none-any.whl.

File metadata

  • Download URL: harness_memory-0.8.4-py3-none-any.whl
  • Upload date:
  • Size: 327.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for harness_memory-0.8.4-py3-none-any.whl
Algorithm Hash digest
SHA256 626e4a0418d26105275fe9acedcf4c41083b43883eb0246ef2dd6123093941fc
MD5 f8f69f150a857511291bc233bcf65972
BLAKE2b-256 c68ae583c91078a5abe3a4097c92d27d70493d3edf5668ae6c3d9accdcf74d71

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page