Agent 记忆库 API
面向集成方的 HTTP 说明。请求与响应均使用产品术语 Library、Scope、Topic、Atom;Atom JSON 字段 `libraryKey`(写入仍接受 legacy `persona`);选择库须传 `memoryLibraryId`。路径前缀 /api/v1/memory。
分层模型
写入与检索前先理解四层结构:
- Library
- 隔离的记忆工作区;通过 memoryLibraryId 选择;引擎绑定 libraryKey(library-{uuid})
- Scope
- 粗领域,如 engineering、finance
- Topic
- 领域内话题,如 billing、api-auth
- Atom
- 一条可检索的记忆单元(正文 + 可选附件)
记忆栈(检索模式)
- POST /quick-search — 快速问答(小 k + 精准片段,适合用户自助查询)
- POST /retrieve — 组合 L2+L3(一次请求;今日底层共享语义检索)
- POST /search — L3 深度语义搜索
- POST /recall — L2 按需召回(可带 scope / topic / libraryKey 过滤)
- POST /wake-up — L0+L1 会话唤醒上下文
集成版本 v1.6.0
- REST API
- v1.6.0
- MCP
- v1.9.0
- Agent Skill
- v1.9.0
- 记忆引擎
- v0.5.0
版本查询: GET /api/v1/memory/version
响应头: X-Engra-Memory-Api-Version, X-Engra-Memory-Engine-Version
鉴权
请求头 Authorization: Bearer <API_KEY>,Scope 需包含 memory:read 或 memory:write。
/api/v1/memory
端点
| Method | Path | Scope | Description |
|---|---|---|---|
| POST | /api/v1/memory/atoms | memory:write | 创建 Atom(JSON / multipart / directUpload) |
| POST | /api/v1/memory/atoms/upload-url | memory:write | 申请 R2 presigned PUT(推荐上传大文件) |
| GET | /api/v1/memory/source-files/{id}/open | memory:read | 鉴权后打开附件(302 presigned GET) |
| GET | /api/v1/memory/atoms | memory:read | 分页列出 Atom(sourceFiles[].openUrl 为鉴权入口) |
| DELETE | /api/v1/memory/atoms/{atomId} | memory:write | 删除单条 Atom |
| PATCH | /api/v1/memory/atoms/{atomId} | memory:write | 修正 Atom(版本控制,归档旧修订) |
| POST | /api/v1/memory/quick-search | memory:read | 快速问答(返回 answer + snippets) |
| POST | /api/v1/memory/retrieve | memory:read | 组合 L2+L3 检索(一次请求) |
| POST | /api/v1/memory/search | memory:read | L3 搜索 |
| POST | /api/v1/memory/recall | memory:read | L2 召回 |
| POST | /api/v1/memory/wake-up | memory:read | 唤醒记忆栈 |
| GET | /api/v1/memory/version | — | 集成版本(api / mcp / skill / engine,无需鉴权) |
创建 Atom(JSON)
POST /api/v1/memory/atoms
Content-Type: application/json
{
"scope": "engineering",
"topic": "billing",
"document": "客户每月 25 日结账。"
}
// 201 响应(单节点或多节点)
{
"atom": { "id": "…", "scope": "…", "topic": "…", "libraryKey": "…", "document": "…", "metadata": {}, "createdAt": "…" },
"atoms": [ "…全部落盘的 Atom;多 scope/topic 时可能 >1" ]
}multipart/form-data(兼容):字段 atom 为 JSON 字符串,file 为可选附件。大文件推荐直传(见下方)。
推荐直传(绕过网关请求体限制):
1) POST /api/v1/memory/atoms/upload-url
{ memoryLibraryId, filename, mime, sizeBytes, contentHash, uploadId }
2) PUT <presigned url> (浏览器直连 r2.cloudflarestorage.com)
3) POST /api/v1/memory/atoms
{ scope, topic, document, memoryLibraryId,
directUpload: { uploadId, key, filename, mime, sizeBytes, contentHash } }R2 私有存储与附件
附件与源文件不对公网匿名开放。列表中的 openUrl 指向 GET /source-files/{id}/open(须 memory:read),成功时 302 到约 15 分钟有效的 presigned URL。生产环境应关闭 R2 bucket 公开访问。
异步写入 / 修正(202)
平台开启摄取队列时,POST /atoms 与 PATCH /atoms/{atomId} 默认返回 202 Accepted(verbatim / 修正 / 索引在后台执行)。需要立即拿到落盘或修正结果时用 ?sync=1;显式禁用异步用 ?async=0。MCP memory_save_atom / memory_correct_atom 与 REST 默认行为一致(MCP 1.4.0+)。任务状态仅在控制台 Admin API 查询;集成方也可稍后 GET /atoms 确认。
// 202 响应(队列已启用,POST 或 PATCH)
{
"async": true,
"queue": { "driver": "cloudflare", "maxConcurrent": 2 },
"job": {
"id": "…",
"status": "queued",
"generateMemoryNodes": true,
"scope": "engineering",
"topic": "billing"
}
}
// PATCH 异步额外字段
{
"async": true,
"operation": "correct",
"atomId": "…",
"job": { "id": "…", "status": "queued", … }
}
// 同步成功:POST 仍为 201(atom/atoms);PATCH 仍为 200(corrected + atom)异步写入与可见性
默认异步的设计目标:集成方与 IDE Agent 在提交正文后快速得到确认,而不等待 verbatim 拆分、R2 落盘与向量索引完成。
- 典型时延:纯文本 POST/PATCH 入队通常亚秒级返回 202;完整 pipeline 多在数秒至数十秒内完成(取决于正文长度、是否 generateMemoryNodes、队列负载)。
- 何时可检索:job 完成且向量索引就绪后,POST /search 与 POST /recall 才能稳定命中新内容;202 响应本身不含 atom.id。
- 确认方式:稍后 GET /atoms 按 scope/topic 或正文关键词查找;或登录控制台查看摄取任务(/dashboard/memory → Jobs,Admin API GET /api/admin/memory/jobs/[jobId])。
- API Key 集成方目前无法通过公开 REST 轮询 job 状态;需要 atom.id 或同步错误时,请对 REST 使用 ?sync=1(MCP 写工具无 sync 参数,可改调 REST)。
- 失败感知:异步 job 失败时 202 仍已成功;需通过控制台 Jobs 或再次 GET /atoms 发现未落盘。同步模式(?sync=1)会在同一请求内返回 4xx/5xx。
- 选用建议:IDE / Agent 会话内落盘 → 默认异步;自动化脚本需 atom.id 或强一致 → REST ?sync=1。
列出 Atom
GET /api/v1/memory/atoms?offset=0&limit=50&libraryKey=<可选>&memoryLibraryId=<library-id>(legacy query persona 仍接受)
删除单条 Atom
DELETE /api/v1/memory/atoms/{atomId}?memoryLibraryId=<library-id>
// 200 响应
{ "ok": true, "atomId": "…" }修正 Atom(版本控制)
PATCH /api/v1/memory/atoms/{atomId}?memoryLibraryId=<library-id>
Content-Type: application/json
{
"document": "修正后的完整正文",
"expectedVersion": 2,
"scope": "engineering",
"topic": "billing"
}
// 200 响应(?sync=1 或 ?async=0)
{
"corrected": true,
"atom": {
"id": "…",
"version": 3,
"scope": "engineering",
"topic": "billing",
"document": "…",
"metadata": { "version": 3 }
}
}
// 202 响应(默认异步,见上方 asyncWriteJson)
// 409 version_conflict — 重新 GET 列表/检索获取最新 version 后重试搜索示例
跨库语义(search / recall / quick-search / retrieve):
- memoryLibraryId(或 Label):主库(必填)
- 省略 memoryLibraryIds / Labels → 主库 Cross-library Search Defaults(若启用)
- memoryLibraryIds: [] → 仅主库(并关闭 shared-common 自动合并)
- 非空 memoryLibraryIds / Labels → 主库 + 列表(Common Knowledge 须显式列入)
- allAccessible: true → 覆盖 API Key 可 list 的全部库(与 Ids/Labels 互斥,400)
每条 hit 可含 memoryLibraryId / memoryLibraryName / source(team | platform_shared)。
响应可含 searchedLibraryIds、crossLibraryIncluded。
POST /api/v1/memory/quick-search
{ "query": "结账日是哪天?", "k": 3, "memoryLibraryId": "<library-id>" }
// 200 响应
{
"query": "结账日是哪天?",
"answer": "客户每月 25 日结账。",
"snippets": [
{ "id": "…", "path": "engineering / billing", "excerpt": "客户每月 25 日结账。", "similarity": 0.91 }
]
}
POST /api/v1/memory/search
{ "query": "结账规则", "k": 8, "scope": "engineering", "topic": "billing", "memoryLibraryId": "<library-id>" }
POST /api/v1/memory/retrieve
{
"query": "结账规则",
"memoryLibraryId": "<primary-library-id>",
"allAccessible": true,
"layers": ["recall", "search"],
"k": 8
}
// 200:recall / search 各含 hits(今日 L2/L3 共享语义引擎,一次 ANN)MCP 接入
Cursor / Claude Desktop 等 MCP 客户端推荐使用边缘端点 https://mcp.engra.ai/api/v1/memory/mcp(兼容 https://engra.ai/api/v1/memory/mcp)。在 mcp.json 中除 Authorization 外,还需设置 Accept: application/json, text/event-stream 与 Content-Type: application/json(缺省常见 HTTP 406)。先调用 memory_list_libraries 获取 memoryLibraryId,再调用检索或写入工具。团队库检索默认合并 Common Knowledge 共享常识库(可配置关闭)。
https://mcp.engra.ai/api/v1/memory/mcp
兼容旧路径:https://engra.ai/api/v1/memory/mcp
不在本页范围(控制台)
下列能力无 API Key 公开端点,需登录后在控制台使用(底层为 /api/admin/memory/* + Session):
引擎内部实现细节见 packages/agent-memory/docs/技术说明.md 与 docs/agent-memory-技术说明.md。