MemoryEcho API
MemoryEcho(MemoryEcho 意回)为大语言模型提供长期记忆能力。通过 REST API 创建记忆库、写入对话、做语义召回,让您的 AI 应用无视上下文窗口限制,真正记住每一位用户。
https://api.artific.social 架构上,API 网关(Rust)负责鉴权、配额与消息持久化,背后的记忆引擎(litemem,记忆以原文存于 PostgreSQL、确定性检索,不依赖向量库)负责记忆整理与召回。引擎短暂不可用时,读写接口以 degraded 模式降级响应而不是直接失败——客户端应始终检查响应中的 degraded / pipeline 字段。
认证
API Key(推荐服务器端使用)
在 MemoryEcho 管理页创建 as_ 前缀的 API Key(完整密钥仅创建时展示一次),随请求放入 Authorization 头即可,无需会话:
Authorization: Bearer as_xxxxxxxx_…
Key 的 scope 决定能否访问记忆服务:
memory—— 记忆服务全部接口(管理页创建的 Key 默认此 scope)。目前不区分读写,没有更细的 scope。- 未设置任何 scope 的 Key 视为全功能 Key(不限服务)。
- 设置了 scope 但不含
memory的 Key 访问任何记忆接口都返回403 {"error":"insufficient scope: …"}。
Key 无效、已撤销或已过期直接返回 401——带了 as_ 前缀的请求只按 Key 校验,不会回退到会话认证。
会话 Cookie(浏览器端)
登录 artific.social 后,浏览器持有 HttpOnly 会话 Cookie。同源前端请求带上 credentials: 'include' 即可;命令行调试也可从浏览器开发者工具复制 Cookie 头使用。
所有 /api/v1/memory/* 接口按认证所属用户隔离数据;未认证请求返回 401 {"error":"unauthorized"}。
服务间集成(HMAC)合作接入
平台内一方服务(如 GamEcho)通过内部 HMAC 签名通道接入记忆能力,绕过会话与配额、由接入方自行计费。如需此级别的深度集成,请联系我们。
快速开始
三步接入:创建记忆库 → 写入记忆 → 语义查询。
# 0. 在 MemoryEcho 管理页创建 API Key(见「认证」一节)
API_KEY='as_xxxxxxxx_…'
# 1. 创建记忆库
curl -X POST https://api.artific.social/api/v1/memory/vaults \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $API_KEY" \
-d '{"name": "quickstart"}'
# => { "id": "<vault_id>", … }
# 2. 写入记忆
curl -X POST https://api.artific.social/api/v1/memory/append-user-message \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $API_KEY" \
-d '{"library_id": "<vault_id>", "message": "我喜欢深色模式,讨厌弹窗"}'
# => { "status": "ok", "memory_id": "…", "pipeline": "ok" }
# 3. 语义查询
curl -X POST https://api.artific.social/api/v1/memory/query \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer $API_KEY" \
-d '{"library_id": "<vault_id>", "message": "用户的界面偏好?"}'
# => { "memory_id": "…", "results": [ … ], "degraded": false }数据模型
MemoryVault — 记忆库
| id | UUID | 记忆库 ID(即各接口中的 library_id) |
| user_id | integer | 所属用户 ID |
| name | string | 名称 |
| description | string | null | 描述 |
| vault_type | string | 类型:normal(默认)或 snapshot |
| share_code | string | null | 分享码(预留) |
| clone_source_id | UUID | null | 克隆来源 |
| memory_count | number | 记忆条数统计 |
| storage_bytes | number | 占用存储(字节) |
| deleted_at | timestamp | null | 软删除时间(回收站) |
| created_at / updated_at | timestamp | 创建 / 更新时间 |
Memory — 记忆消息
| id | UUID | 记忆消息 ID |
| library_id | UUID | 所属记忆库 |
| user_id | integer | 所属用户 ID |
| role | string | 消息角色:user 或 assistant |
| content | string | 消息内容 |
| metadata | object | null | 附加数据;查询消息会带 recalls(召回快照)与 degraded 标记 |
| created_at | timestamp | 写入时间 |
记忆库 Vaults
记忆库(Vault)是记忆的隔离单元——每个 Agent、每个用户会话或每个知识域一个库。接口中的 library_id 均指记忆库 ID。
/api/v1/memory/vaults创建记忆库
{
"name": "my-agent-memory",
"description": "可选描述",
"vault_type": "normal"
}{
"id": "0197c9a2-…",
"user_id": 1024,
"name": "my-agent-memory",
"description": "可选描述",
"vault_type": "normal",
"memory_count": 0,
"storage_bytes": 0,
"created_at": "2026-07-16T12:00:00Z",
"updated_at": "2026-07-16T12:00:00Z"
}- 按次计费:每个记忆库 45,000 配额,经配额服务预授权后扣除(见「配额与计费」);被拒返回 402,error_code 说明原因(见「错误处理」)。
- vault_type 省略时默认 normal。
/api/v1/memory/vaults列出当前用户的所有记忆库(不含已删除,按更新时间倒序)
[ MemoryVault, … ]
/api/v1/memory/vaults/{id}获取记忆库详情
- 非本人记忆库返回 403,不存在返回 404。
/api/v1/memory/vaults/{id}更新记忆库名称 / 描述
{
"name": "新名称",
"description": "新描述"
}- 两个字段均可选,只更新提供的字段。
/api/v1/memory/vaults/{id}删除记忆库(软删除,移入回收站)
- 成功返回 204 No Content。
- 删除后可在回收站中恢复或彻底删除,见下方回收站接口。
/api/v1/memory/vaults/trash列出当前用户回收站中的记忆库(按删除时间倒序)
[
{
"id": "0197c9c1-…",
"base_id": "0197c9a2-…",
"original_name": "my-agent-memory",
"deleted_at": "2026-07-17T12:00:00Z"
}
]- id 为回收站条目 ID(恢复 / 彻底删除时使用),base_id 为原记忆库 ID。
/api/v1/memory/vaults/trash/{id}/restore从回收站恢复记忆库
MemoryVault
- {id} 为回收站条目 ID。
- 恢复后记忆库回到列表中,回收站条目被移除;条目不属于当前用户或已不存在返回 404。
/api/v1/memory/vaults/trash/{id}彻底删除回收站中的记忆库(不可恢复)
- {id} 为回收站条目 ID。成功返回 204 No Content。
- 记忆库及其全部记忆、权限记录一并删除;记忆库已被恢复时返回 409。
记忆消息
记忆库内的原始消息流。写入的用户消息 / AI 回复与语义查询记录都以消息形式留存。
/api/v1/memory/vaults/{vault_id}/messages?limit=50&offset=0获取记忆库内的记忆消息列表
[
{
"id": "0197c9b0-…",
"library_id": "0197c9a2-…",
"user_id": 1024,
"role": "user",
"content": "我喜欢深色模式",
"metadata": null,
"created_at": "2026-07-16T12:01:00Z"
}
]- limit 默认 50,offset 默认 0。
- 已删除的消息不再出现在列表里。
/api/v1/memory/vaults/{vault_id}/messages/erase按 id 删除几条记忆消息(不可恢复)
{
"memory_ids": ["0197c9b0-…", "0197c9b1-…"]
}{
"erased": ["0197c9b0-…"],
"already_erased": [],
"missing": ["0197c9b1-…"],
"unmapped": [],
"derived_cleanup_failed": false
}- 一次 1~50 条。删除后语义查询里再也召回不到它们,消息列表里也不再出现;不调模型、不消耗配额。
- erased 删掉的;already_erased 之前已删过的;missing 不在这个库里的(都不报错,同一批重复删没有额外效果)。
- unmapped:2026-11 之前写入、尚未与记忆引擎建立对应关系的消息,暂时删不了(不会只删一半)。
- 记忆引擎暂时不可达时返回 502,且什么都没删,可原样重试。由其它服务托管的库返回 403。
/api/v1/memory/vaults/{vault_id}/messages/{memory_id}/correct更正一条记忆消息:删掉原条,追加一条注明「更正」的新消息
{
"message": "我住在杭州"
}{
"erased": "0197c9b0-…",
"correction_memory_id": "0197d1e4-…",
"pipeline": "ok",
"derived_cleanup_failed": false
}- 新消息以 user 角色追加在库末尾,正文形如「【更正】2026-07-16 20:01(北京时间)记下的一条内容已删除,以此为准:我住在杭州」,召回时只会看到更正后的内容。
- 原条已删过返回 409;不在库里返回 404。更正写入按「写入」计费(摘要),删除本身不计费。
查询与写入
核心记忆管线:append 写入消息并整理进记忆,query 做语义召回。典型的一轮 Agent 对话 = query(取上下文)→ 生成回复 → append-user-message + append-assistant-message(写回记忆)。
/api/v1/memory/append-user-message写入一条用户消息(进入记忆管线)
{
"library_id": "0197c9a2-…",
"message": "我喜欢深色模式"
}{
"status": "ok",
"memory_id": "0197c9b0-…",
"pipeline": "ok"
}- pipeline 为 degraded 表示记忆引擎暂时不可用:消息已保存进记忆库的消息列表,但没有进入记忆管线,也不会自动补入,因此不会被语义召回。需要被召回的内容请在恢复后重新写入。
- 记忆管线处理消息时会调用模型,按 token 以配额计费(见「配额与计费」)。扣费被拒时返回 402:{"error_code": "INSUFFICIENT_BALANCE", "error": "…", "memory_id": "…", "pipeline": "denied"}——消息同样已保存进消息列表、但没有进入记忆管线;处理好 error_code 对应的问题后重新写入。
/api/v1/memory/append-assistant-message写入一条 AI 回复(与用户消息共同构成完整记忆)
{
"library_id": "0197c9a2-…",
"message": "好的,已为您切换深色模式。"
}{
"status": "ok",
"memory_id": "0197c9b1-…",
"pipeline": "ok"
}- pipeline 的 degraded 与扣费被拒(402)同 append-user-message。
/api/v1/memory/query语义查询相关记忆(本次查询写入历史,可被后续召回)
{
"library_id": "0197c9a2-…",
"message": "用户偏好是什么?"
}{
"memory_id": "0197c9b2-…",
"results": [ … 召回的记忆条目 … ],
"degraded": false
}- results 为记忆引擎返回的召回条目数组(含相关记忆内容与元信息)。
- degraded 为 true 表示记忆引擎降级:返回结果可能不完整,建议按普通上下文处理。
- 召回快照会持久化到该条查询消息的 metadata.recalls 中,便于审计与回放。
- 召回同样按模型 token 以配额计费。扣费被拒时返回 402({"error_code", "error", "memory_id"}),不会以 degraded 的空结果代替——请按 error_code 处理,不要当成「没想起来」。
/api/v1/memory/query-readonly只读语义查询(不写入查询历史、不留痕)
{
"library_id": "0197c9a2-…",
"message": "用户偏好是什么?"
}{
"results": [ … ],
"degraded": false
}- 降级时返回 { "results": [], "messages": [ 最近消息列表 ], "degraded": true },可用 messages 兜底拼接上下文。
- 扣费被拒时返回 402({"error_code", "error"}),与 query 相同。
对话生成 Chat
不想自己接大模型?让 MemoryEcho 直接代理一轮记忆增强的对话生成(经 Artific LLM Hub)。
/api/v1/memory/chat记忆增强对话生成(经 LLM Hub,SSE 流式返回)
{
"model": "deepseek-flash",
"messages": [
{ "role": "user", "content": "帮我总结一下最近的偏好" }
],
"stream": true
}- 只接受并转发以下字段:model(必填)、messages、stream、max_tokens、temperature、tools、thinking,其余字段会被忽略。含义与 LLM Hub 的 POST /api/v1/llm-hub/chat 相同(见 LLM Hub 文档)。
- model 必须是 GET /api/v1/llm-hub/models 列出的公开模型:缺 model 返回 400;不在公开列表里返回 403 {"error": "model '…' is not available for direct use"};模型列表暂时取不到返回 503,稍后重试。
- stream: true 时响应为 text/event-stream(SSE),否则为普通 JSON;两种形状与 LLM Hub /chat 相同。
- 网关以服务身份调用 LLM Hub,模型用量按 LLM Hub 的模型价目以配额从您的账户扣除。
- 扣费被拒时在调用模型之前返回 403(不是 402),响应体是 LLM Hub 的格式:{"detail": {"error_code": "INSUFFICIENT_BALANCE", "message": "…"}}。error_code 取值同「错误处理」里 402 的 PAYG_CONFIRM_REQUIRED / INSUFFICIENT_BALANCE / QUOTA_EXHAUSTED;对话不校验地区。
文件导入
将文档批量导入记忆库:Markdown、纯文本等格式解析、切分后写入记忆,导入过程通过 SSE 推送进度。
/api/v1/memory/vaults/{vault_id}/import_file导入文件到记忆库(SSE 流式返回处理进度)
{
"library_id": "0197c9a2-…",
"file_name": "notes.md",
"data_url": "data:text/markdown;base64,IyBO…",
"preset": "default"
}- 文件以 data URL(base64)内联上传,请求体上限 16 MiB。
- 响应为 text/event-stream:解析 → 切分 → 写入记忆的进度事件逐条推送。
- 走 /vaults/{vault_id}/import_file 时 library_id 可省略(以路径为准)。
- preset / running_mode / short_memory_style 为可选调优参数,默认即可。
- 导入过程中调用模型同样按 token 以配额计费。扣费被拒时以一条 type 为 error 的终止事件结束,事件里带 error_code(取值同「错误处理」的 402),请据此处理而不是重试。
/api/v1/memory/files?library_id={id}列出记忆库已导入的文件
/api/v1/memory/files/content?library_id={id}&attachment_id={aid}获取已导入文件的原始内容(Content-Type 与原文件一致)
用量 Usage
查询本月在记忆服务上消耗了多少配额。扣费逐笔明细见 artific.social 钱包的配额流水。
/api/v1/memory/usage本月记忆服务的配额消耗汇总
{
"vault_count": 3,
"period": {
"kind": "calendar_month",
"start": "2026-10-01T00:00:00Z",
"end": "2026-11-01T00:00:00Z"
},
"units_per_credit": 100000000,
"memory_create": { "units": 4500000000000, "user_paid_units": 0, "count": 1 },
"memory_query": { "units": 120000000, "user_paid_units": 120000000, "count": 42 }
}- 金额是配额的存储单位:units ÷ units_per_credit(10^8)= 配额数。
- memory_create 是建库的按次费;memory_query 是记忆管线(写入、召回、导入)的模型消耗。units 为净消耗(含套餐额度代付),user_paid_units 是其中从您账户余额扣的部分,count 为扣款笔数。
- 统计窗口为本自然月(UTC),与按量付费的月上限同一窗口。只统计经 artific.social 记忆前台与 API Key 发起的调用。
- 用量暂时取不到时返回 502 {"error": "usage_unavailable"},不会返回 0。
MCP 服务
支持 MCP(Model Context Protocol)的客户端(Claude Code、Claude Desktop、Cursor 等)可以直接把 MemoryEcho 接成工具: Streamable HTTP,地址 https://api.artific.social/api/v1/memory/mcp。 只接受 API Key(不认会话 Cookie),scope 同上;不带或无效返回 401。工具背后就是上面的 HTTP 接口,计费与权限完全相同。
claude mcp add --transport http memoryecho https://api.artific.social/api/v1/memory/mcp \ --header "Authorization: Bearer as_xxxxxxxx_…"
{
"mcpServers": {
"memoryecho": {
"type": "http",
"url": "https://api.artific.social/api/v1/memory/mcp",
"headers": { "Authorization": "Bearer as_xxxxxxxx_…" }
}
}
}| 工具 | 性质 | 说明 |
|---|---|---|
| memory_vaults | 只读 | 列出你的记忆库(id、名称、条数) |
| memory_recall | 只读 · 计费 | 按问题召回相关记忆,返回一段文本 |
| memory_write | 写入 · 计费 | 写入用户的一句话,同时返回相关记忆 |
| memory_append_assistant | 写入 | 写入助手的回复,构成完整的一轮 |
| memory_messages | 只读 | 按时间翻原始记录(带 memory_id),缺省最近 20 条 |
| memory_delete | 删除 | 按 memory_id 删除 1~50 条(不可恢复) |
| memory_correct | 删除 + 写入 | 删掉一条并追加更正 |
由其它服务托管的库(如 GamEcho 的世界记忆)只能读。claude.ai 网页版的自定义连接器需要 OAuth 登录,目前尚不支持。
配额与计费
Artific 平台内以配额(Credit)结算:充值时把人民币或美元换成配额,套餐与按次计费都以配额计价。下表的法币金额按当前价目(1,000,000 配额 = ¥72 = $11.11)折算,仅供参考,以配额数为准。订阅按 28 天为一个计费周期,主套餐互斥(升级即时生效、降级于周期末生效)。套餐购买与管理见 订阅中心。
| 套餐 | 价格 | 约合 | 权益 |
|---|---|---|---|
| 入门版 starter | 500,000 配额 / 28天 | 约 ¥36 / $5.56 | 3 个记忆库 · 50 MB 存储 · 1,000 次记忆查询 · 2,000 次 API 调用 |
| 标准版 standard | 1,500,000 配额 / 28天 | 约 ¥108 / $16.67 | 10 个记忆库 · 500 MB 存储 · 10,000 次记忆查询 · 20,000 次 API 调用 |
按次 / 按量计费
| 创建记忆库 | 45,000 配额 / 个 | 约 ¥3.24 / $0.50 |
| 写入 / 召回 / 文件导入 | 按记忆管线所用模型的价目 | 随 token 数 |
| 对话生成 chat | 按 LLM Hub 模型价目 | 随模型与 token 数 |
写入(append)、语义查询(query)与文件导入不收按次费,但记忆管线处理时调用的模型按 token 以配额计费,有套餐时先用套餐额度。建库与上述模型消耗都要先经配额服务预授权(建库要求已确认所在地区);从账户余额扣费时还需已开启按量付费且余额充足,否则返回 402(原因见「错误处理」的 error_code)。本月消耗用 GET /api/v1/memory/usage 查询,逐笔明细可在 artific.social 钱包的配额流水里查看。
错误处理
错误响应为裸 JSON:{"error": "描述信息"}(无统一 envelope 包装)。计费被拒(402)另带机器可读的 error_code:{"error_code": "REGION_REQUIRED", "error": "…"}(写入 / 查询还会带 memory_id),请按 error_code 分支处理,不要解析 error 文案。
| 状态码 | error / error_code | 处理建议 |
|---|---|---|
| 401 | unauthorized | API Key 无效 / 已撤销 / 已过期,或会话过期。带了 as_ 前缀的 Key 只按 Key 校验、不会回退到会话。检查 Key 或重新登录 artific.social。 |
| 402 | (适用接口) | 建库、append、query、query-readonly 的扣费被拒;文件导入则以带 error_code 的 SSE error 事件结束。下面四行是 error_code 的取值,配额服务以后可能新增取值,未识别的请按通用的计费失败提示。 |
| 402 | error_code: REGION_REQUIRED | 账户尚未确认所在地区(决定按哪种币种与价目结算)。登录 artific.social 按提示选择地区后重试。 |
| 402 | error_code: PAYG_CONFIRM_REQUIRED | 需要从账户配额余额扣费,但尚未开启按量付费。在 artific.social 开启按量付费后重试。 |
| 402 | error_code: INSUFFICIENT_BALANCE | 配额余额不足。充值后重试。 |
| 402 | error_code: QUOTA_EXHAUSTED | 本月按量付费已达您设置的上限。调高上限或等待下月。 |
| 403 | forbidden / insufficient scope: … | 访问了不属于当前用户的记忆库,或 API Key 设置了 scope 但不含 memory(见「认证」一节)。对话接口 /chat 扣费被拒也返回 403,body 为 {"detail": {"error_code", "message"}}(见「对话生成」)。 |
| 403 | model '…' is not available for direct use | /chat 指定的模型不在公开模型列表里。换用 GET /api/v1/llm-hub/models 列出的模型。 |
| 404 | not found | 记忆库或资源不存在(含已删除)。 |
| 413 | payload too large | 请求体超限(文件导入上限 16 MiB)。 |
| 503 | api key verification unavailable | API Key 校验服务暂时不可用(不代表 Key 无效,请勿因此换 Key),稍后重试。 |
| 503 | model list unavailable, try again later | /chat 暂时取不到公开模型列表,稍后重试。 |
| 500 / 502 | internal error / upstream error | 服务端错误或记忆引擎暂时不可用;读写接口会尽量以 degraded 模式响应而非直接失败。 |
路线图
- 事件订阅 —— 记忆创建 / 导入等事件的 Webhook 推送。
- 官方 SDK —— Python / TypeScript 客户端库。