agent-memory README

The project's README from github.com/tigerless-labs/agent-memory. As one markdown file: README.md.

agent-memory: the long-term memory runtime for AI agents

Invariants · Skill · Issues


An agent that closes its session forgets everything it learned in it. agent-memory is the runtime that fixes that, for any agent — not only coding ones. Markdown files in one store are the single source of truth, the SQLite index beside them is a cache you can delete at any time, and Claude Code, Codex CLI, and anything else that can run a shell command share that store.

Retrieval is local and ranked, and it answers with paths rather than pasted text — the agent opens each hit only as deep as the task needs. Writes do not wait for the agent to remember to make them: they fire at conversation boundaries. A sleep-time pass then consolidates and forgets by value, on its own clock. None of it needs an API key.

Two lines, one store

Agent memory has grown along two architectural lines. One builds a retrieval engine — embeddings, a knowledge graph, a ranking pipeline — which finds the right thing, but hands the agent an opaque chunk it cannot inspect and a store it cannot migrate off. The other hands the agent a filesystem — markdown it reads directly, browsable with ls and grep — which is legible and costs nothing to run, but does not rank, and stops scaling the moment the tree outgrows a listing.

agent-memory is the two of them in one store: the retrieval engine indexes a filesystem the agent can also just read. Relations live as links inside the memories, a local index ranks them, and every hit resolves to a whole markdown file on disk. Recall gains the precision of a graph and a vector search without giving up a plain directory an agent can walk — and it stays fast, because nothing in the read path calls a model or crosses a network.

Retrieve by path, then read by level

Recall does not paste text into your context. It answers with an L0 list — one-line abstract, file path, anchor, score — and the agent opens what it wants at the depth the task needs:

mem recall "why files instead of a database"    # L0 list, 8 entries by default
mem read <name> --level outline                 # headings only; or abstract, or full
mem context "why files instead of a database"   # both in one call, top few expanded in full

Index line → abstract → full file → raw material: each rung costs an order of magnitude more than the last, and each is a place to stop. Long files add two free rungs — the anchor that matched, and an outline computed at read time.

Design commitments

The store

$AGENT_MEMORY_STORE/
├── MEMORY.md              root index, one line per memory — the only resident injection
├── config.toml            every tunable; an unknown knob is refused at load
├── schemas/               one file per type: its key fields, the field it groups by, write mode
├── decision/              memories live at <type>/<group>/<name>.md, placed by the schema
│   └── agent-memory/        …/markdown-files-are-the-single-source-of-truth.md
├── archive/               append-only, out of the retrieval surface by default
│   ├── provenance/        distillation evidence, kept forever
│   └── sessions/          full trace copies, in case the host prunes its own
├── dream-reports/         one per sleep: what moved, what was proposed, evidence pointers
├── .index/                fully rebuildable: content-hash manifest, FTS5, access log
└── .state/                runtime state that is not: distillation watermark, write lock

One memory is one file, because the file boundary is the invalidation atom: superseding, weight, and recall all operate on whole files, and a file is either active or invalid with nothing in between. Frontmatter carries the stable name, a one-sentence abstract, the type and its schema fields, status, timestamps, links, weight, and provenance; the body is free markdown.

Proof it works

Measured on LongMemEval-S with a bounded haystack, 120 episodes, claude -p (Haiku 4.5) as host, one calibrated Sonnet 5 judge, two exam replays per arm.

arm pooled accuracy paired vs agent-memory
agent-memory W2 127/240 = 52.9% —
MemCore W2 86/240 = 35.8% +37/−17, p=0.009 · +35/−14, p=0.004
no memory 7/120 = 5.8% +61/−4 · +60/−4, p<0.001

Absolute numbers are not comparable to published LongMemEval scores — the haystack is bounded to 12 sessions per episode, which makes this a write-strategy study rather than a corpus-size one. The system-to-system row differs in write and read together, so it is an end-to-end comparison and licenses no attribution to either half.

One store, three hosts: all 9 ordered writer/reader pairs across Claude Code, Codex CLI, and Hermes pass — what one host's shell writes, another's finds, specifics intact. Pooled net contribution over no memory: 2/36 → 13/36, p=0.0074.

The protocol that decides whether a measurement counts as a result, the full ledger, and the raw run records live in docs/experiments.md and experiments/ in the working tree. They ship with the source, not with git history.

Install

Requires Python 3.12 or higher and uv. There is no release on PyPI yet, so install from a checkout:

git clone https://github.com/tigerless-labs/agent-memory.git
cd agent-memory
uv sync --all-packages

That builds mem, mem-mcp, and mem-hook into .venv/bin. Inside the checkout uv run mem reaches them; put the directory on your PATH so your agents can too — the hook installed in the next section is a bare mem-hook command, and a host that cannot resolve it records nothing:

export PATH="$PWD/.venv/bin:$PATH"

Quick start

mem init

The store defaults to ~/agent-memory-store; export AGENT_MEMORY_STORE only to put it somewhere else, and export it everywhere your agents run, not just in this shell.

Write one memory, find it again, then throw the index away and prove nothing was lost:

mem record --type decision --field project=agent-memory \
  --abstract "Markdown files are the single source of truth" \
  --body "Indexes are rebuildable caches."
mem --json recall "source of truth"
rm -rf ~/agent-memory-store/.index && mem rebuild

Wire it into your agent

mem setup --host claude-code   # or: --host codex

setup probes the host, appends the mem-hook command to its own hook dialect, and leaves the rest of the settings alone — SessionStart injects, Stop and SessionEnd distil, PreCompact evicts. Agents that speak MCP get the same core calls through mem-mcp (memory_recall, memory_read, memory_record, memory_correct, memory_feedback). Anything that can run a shell command needs neither: the CLI is the universal fallback, and it is the wider surface — context, sleep, and the proposal ledger have no MCP tool yet.

Let it sleep

mem sleep --reason host   # consolidate; T0 applies, T1 files a proposal
mem proposals             # what is waiting on you
mem decide <id> --accept

Manage borrows its reasoning from the host CLI you point it at, writes a dream report for the pass, and cannot delete anything unattended.

Develop

uv run pytest -q && uv run ruff check . && uv run mypy

The task lifecycle and the invariants a change must not break are in CLAUDE.md.

License

MIT.

agent-memory (tigerless-labs/agent-memory)

Searching Database…

这是什么?agent-memory 是面向 AI 智能体的长期记忆运行时——它把记忆存成纯 Markdown 文件(唯一事实来源),配合本地 SQLite/FTS5 索引实现快速的排序检索,让 Claude Code 和 Codex CLI 这类智能体跨会话记住学到的东西。
这是向量数据库,还是只是一堆 markdown 文件?单独哪个都不全是——两者皆是:既有智能体能直接用 ls 和 grep 浏览的 markdown 文件,又在上面叠加了本地检索引擎(BM25/FTS5,可选融合向量插件)负责排序,并通过链接承载图结构,不需要单独运行数据库。
怎么把它接进 Claude Code 或 Codex?setup 命令会探测你的宿主智能体,并把 mem-hook 命令追加到它自己的钩子体系中——SessionStart 注入记忆,Stop/SessionEnd 提炼新记忆,PreCompact 驱逐旧记忆。支持 MCP 的智能体也可以改用 mem-mcp 的工具(memoryrecall、memoryread、memoryrecord、memorycorrect、memoryfeedback)。
运行它需要 API 密钥或单独的数据库吗?不需要。安装只需要 Python 3.12+ 和 uv;库本身不含大模型客户端,判断力借自已在运行的宿主 CLI(Claude Code、Codex 等),因此无需密钥,也不涉及任何计费环节。
有现成的 pip 可安装包吗?还没有——没有发布 PyPI 包,所以你要用 uv 从 git 检出安装。目前 CLI 也是功能更全的入口:context、sleep 和提案账本等一些功能还没有对应的 MCP 工具。
它只适用于编程智能体吗?不是——它面向任何能运行 shell 命令的智能体,不限于编程助手;Claude Code、Codex CLI 和其他宿主都能读写同一个记忆库。
我的记忆数据会离开我的电脑吗?不会——召回完全在本地进行,从不调用模型,也不经过网络;markdown 记忆库就在磁盘上(默认 ~/agent-memory-store),始终可以 grep、可以用 git 管理,也便于迁出系统。
睡眠时段的 Manage 层如何决定遗忘什么?一个独立的整理过程按自己的节奏运行,权限分级:它可以自由添加或更新记忆,但删除只会以提案的形式出现,必须由你确认,因此不会在无人值守时丢掉任何东西。
多个智能体能共用同一个记忆库吗?可以——测试中 Claude Code、Codex CLI 和 Hermes 读写同一个共享库,三个宿主之间全部 9 组按序的写/读配对都成功找到了彼此的记忆。
相比完全没有记忆,它真的能提升召回效果吗?在以 claude -p(Haiku 4.5)为宿主的 LongMemEval-S 基准上,agent-memory 的综合准确率为 52.9%,一个竞品记忆系统为 35.8%,而完全没有记忆时只有 5.8%。
如果我删掉 SQLite 索引会怎样?什么都不会丢——markdown 文件才是事实来源,索引只是可重建的缓存;有测试专门保证运行 rm -rf .index/ && mem rebuild 后知识零丢失。
Size
117.6 MB
Stars
4.4K
Updated
CommitOct 16
Age
1mo
Commits · 90 Days