AI内存协议
  
AI编码代理的版本化、基于图形的持久内存 --电源由 斯芬克斯需要.
AI代理在会话之间失去上下文。该协议为他们提供了一种结构化的方法 记住, 召回,以及 进化 知识——具有完整的Git历史记录、键入的条目、图形链接和机器可读的输出。
特性
- 打字记忆 --观察、决策、事实、偏好、风险、目标、未决问题
- 图表链接 --关联、支持、依赖、取代、反驳、举例
- 基于标签的发现 —
topic:api,repo:backend,tier:core - 上下文优化输出 --带正文切换的简短/紧凑/上下文/JSON格式
- 老化检测 --自动过期、审核提醒、过期检查
- 自动缩放 --RST文件分为50个条目,对查询透明
- Git原生 --每个内存都是一个RST指令,完全不同且版本化
- MCP服务器 --将内存作为工具公开给Claude Desktop、VS Code Copilot和其他MCP客户端
- 作为守护者建造 —
needs_warnings质量门在构建时强制执行标记、链接和车身质量 - CLI优先 --12个子命令用于全生命周期管理
安装
git clone https://github.com/bburda/ai_memory_protocol.git
pipx install -e ai_memory_protocol/
# With MCP server support
pipx install -e 'ai_memory_protocol/[mcp]'这将安装 memory CLI命令(以及可选 memory-mcp-stdio)在PATH全球范围内。
快速开始
# 1. Create a memory workspace
memory init .memories --name "My Project" --install
# 2. Add your first memory
memory add fact "API runs on port 8080" \
--tags "topic:api,repo:backend" \
--confidence high \
--body "Gateway listens on 0.0.0.0:8080 by default" \
--rebuild
# 3. Search
memory recall api port
memory recall --tag topic:api --format brief
# 4. Get full details
memory get FACT_api_runs_on_port_8080运作原理
RST files (memory/*.rst) ← Human + AI editable, Git-tracked
│
▼ memory rebuild (sphinx-build)
needs.json (_build/html/needs.json) ← Machine-readable index
│
▼ memory recall / get / list
Formatted output ← Optimized for LLM context windows记忆存储为 斯芬克斯需要 RST文件中的指令。A. memory rebuild 命令运行Sphinx以生成 needs.json --用于所有搜索操作的单个查询层。这意味着存储器同时是人类可读的文档和机器可查询的数据。
CLI参考
memory init # Create a new workspace
memory add "" [options] # Record a memory
memory recall [query] [--tag ...] [--format brief|compact|context|json]
memory get # Full details of one memory
memory related [--hops N] # Graph walk from a memory
memory list [--type TYPE] [--status S] # Browse all memories
memory update [--confidence ...] [--add-tags ...] [--body ...] [--title ...]
memory deprecate [--by NEW_ID] # Mark as deprecated
memory tags [--prefix PREFIX] # Discover tags in use
memory stale # Find expired/overdue memories
memory review # Show memories needing review
memory rebuild # Rebuild needs.json关键标志 recall:
--format brief--超紧凑、最少的代币--body--包含正文(默认情况下禁用)--sort newest|oldest|confidence|updated--limit N--上限结果--expand 0--禁用图形扩展--stale--仅过期/审核过期
MCP服务器
通过向LLM客户端公开内存工具 模型上下文协议.
设置
安装MCP附加组件:
pipx install -e 'ai_memory_protocol/[mcp]'克劳德代码
claude mcp add --transport stdio --env MEMORY_DIR=/path/to/.memories memory -- memory-mcp-stdio或添加到 .mcp.json 在项目根目录(项目范围)中:
{
"mcpServers": {
"memory": {
"type": "stdio",
"command": "memory-mcp-stdio",
"env": {
"MEMORY_DIR": "/path/to/.memories"
}
}
}
}VS代码(GitHub副本)
增添 .vscode/mcp.json:
{
"servers": {
"memory": {
"command": "memory-mcp-stdio",
"env": {
"MEMORY_DIR": "${workspaceFolder}/.memories"
}
}
}
}可用的MCP工具
| 工具 | 说明 |
|---|---|
memory_recall | 通过带有格式选项的文本/标签搜索记忆 |
memory_get | 获取特定内存的完整详细信息 |
memory_add | 使用标签和元数据记录新内存 |
memory_update | 更新内容或元数据(标题、正文、状态、置信度、标签等) |
memory_deprecate | 将内存标记为已弃用 |
memory_tags | 列出所有带有计数的标签 |
memory_stale | 查找过期/过期的记忆 |
memory_rebuild | 重建needs.json索引 |
内存类型
| 类型 | 前缀 | 用例 |
|---|---|---|
mem | MEM_ | 观察、记录或发现 |
dec | DEC_ | 设计或建筑决策 |
fact | FACT_ | 经过验证的稳定知识 |
pref | PREF_ | 编码风格或惯例 |
risk | RISK_ | 不确定性或假设 |
goal | GOAL_ | 目标或指标 |
q | Q_ | 需要解决的未决问题 |
图形链接
| 链接 | 含义 |
|---|---|
relates | 一般协会 |
supports | 证据或理由 |
depends | 硬性依赖 |
supersedes | 替换旧内存 |
contradicts | 冲突或紧张 |
example_of | 概念的具体实例 |
元数据
| 字段 | 值 | 目的 |
|---|---|---|
confidence | low / medium / high | 信任级别 |
scope | global, repo:X, product:X | 适用性 |
tags | prefix:value 格式 | 分类 |
source | URL、提交、描述 | 来源 |
review_after | ISO日期 | 稳定性触发器 |
expires_at | ISO日期 | 自动过期日期 |
created_at | ISO日期 | 捕获时间戳 |
标记惯例
标签使用 prefix:value 一致性发现的格式:
topic:--主题领域(topic:gateway,topic:auth)repo:--存储库(repo:backend,repo:web-ui)domain:--知识领域(domain:robotics,domain:web)tier:--重要性级别(tier:core,tier:detail)intent:--目的(intent:decision,intent:coding-style)
AI代理集成
推荐工作流程
1.阅读——先看后钻(两阶段回忆)
始终使用 两相 方法。不要在宽泛的问题上直接进入正文。
A阶段——窥视 (扫描标题,零正文):
memory recall --tag topic:gateway --format brief --expand 0退货 [ID] Title (confidence) 一个衬垫。最少的代币。先做这个。
B阶段——钻孔 (阅读具体记忆的全文):
memory get DEC_handler_context_pattern只有在偷看之后——选择2-3个最相关的ID get 他们各自。
何时召回 --回忆不仅仅是一个会话开始仪式。回想一下这些时刻:
| 触发器 | 要回忆什么 |
|---|---|
| 会话开始 | recall --format brief --limit 20 --sort newest |
| 新任务或主题 | recall --tag topic: --format brief |
| 输入不熟悉的代码 | recall --tag repo: --type fact --format brief |
| 在设计决策之前 | recall --tag topic: --type dec |
| 遇到错误或失败 | recall --调试前的第一反应;检查此问题是否已解决 |
| 初次尝试后被卡住 | recall --tag topic: --type mem,fact --将搜索范围扩大到相关领域和过去的解决方案 |
| 在实现模式之前 | recall --tag intent:coding-style --type pref |
2.WRITE——在特定触发点记录
录制记忆不是可选的。在这些具体时刻写下:
| 触发器 | 类型 | 示例 |
|---|---|---|
| 选择方法A而不是B | dec | “在异常情况下使用tl::expected” |
| 修复了一个不明显的错误 | mem | “EntityCache竞争条件修复” |
| 发现未记录的API | fact | “注册顺序中的路线匹配” |
| 用户表示偏好 | pref | “更喜欢Zustand而不是Redux” |
| 已识别风险 | risk | “JWT secret在测试中硬编码” |
| 问题仍未得到解答 | q | “合成成分应该暴露操作吗?” |
任务结束写入:总结所学的架构(fact),记录惯例(pref),记下未来代理人需要的任何东西(mem),捕捉未完成的目标(goal).
编写质量规则:
--tags是强制性的——没有标签,内存无法修复--body必须包含文件路径和具体细节- 使用
--rebuild标记以使新记忆可立即搜索
3.超级,不要编辑
当知识发生变化时,添加一个新条目 --supersedes OLD_ID 并弃用旧的。
4.定期检查员工满意度
跑 memory stale 在长时间会话开始时,要保持图表的准确性。
上下文窗口优化
recall默认情况下省略正文——这是有意的,而不是限制- 窥视 随着
--format brief→ 钻头 随着get--这是核心模式 - 使用
--limit 10和--expand 0在探索广泛的主题时 - 使用
--tag筛选以缩小结果范围,而不是自由文本 - 使用
memory tags在筛选之前发现可用的标记前缀
项目结构
ai_memory_protocol/
├── pyproject.toml # Package definition, CLI + MCP entry points
├── README.md
├── LICENSE # Apache 2.0
├── CONTRIBUTING.md
├── .pre-commit-config.yaml
├── .github/workflows/ci.yml
└── src/
└── ai_memory_protocol/
├── __init__.py
├── cli.py # CLI (argparse, 12 subcommands)
├── mcp_server.py # MCP server (8 tools, stdio transport)
├── config.py # Type definitions, constants
├── engine.py # Workspace detection, search, graph walk
├── formatter.py # Output formatting (brief/compact/context/json)
├── rst.py # RST generation, editing, file splitting
└── scaffold.py # Workspace scaffolding (init command)内存数据存在于 独立工作空间 (例如。, .memories/),创建于 memory init.
作为守护者建造
Sphinx构建充当内存图的质量门。 needs_warnings 在 conf.py 定义在以下过程中触发的约束 memory rebuild:
needs_warnings = {
"missing_topic_tag": "type in ['mem','dec','fact',...] and not any(t.startswith('topic:') for t in tags)",
"empty_body": "description == '' or description == 'TODO: Add description.'",
"deprecated_without_supersede": "status == 'deprecated' and len(supersedes_back) == 0",
}随着 sphinx-build -W (警告为错误),如果任何内存违反了这些约束,则构建将失败。这意味着:
- 每个内存必须至少有一个
topic:标签 - 索引中没有空占位符
- 废弃的记忆必须被替换物所取代
代理人学会自我纠正:如果 rebuild 如果失败,他们会读取警告,修复有问题的内存,然后重试。
人的角色
人类是 观察员和编辑,而不是看门人:
- 仪表盘 —
memory/dashboards.rst包含needtable,needlist,以及needflow将内存图的实时状态呈现为HTML的指令 - RST编辑 --内存是普通的RST,可以在任何文本编辑器或IDE中编辑,并在Git中使用完整的diff/funce
- 以(权力)否决 --人类可以通过CLI或直接RST编辑更新任何内存上的状态、置信度或标签
- 审查 —
memory review表面记忆review_after日期已过,提示人工验证
该协议的设计使代理能够自主维护知识,而人类则保持完全的可见性和覆盖能力。
贡献
看 贡献.md 了解如何做出贡献的指导方针。
