Skip to content

记忆 API

前缀: /api/memory

这是主服务器为记忆浏览器和设置页面提供的 API,涵盖近期记忆编辑、记忆功能开关、角色记忆重命名,以及由用户主动触发的遗留存储清理。它不是进程内 记忆服务器 API 的通用代理。

所有路由都不带末尾斜杠。云存储处于维护态或只读态时,写操作可能返回 409

端点一览

方法路径用途
GET/api/memory/recent_files列出近期记忆的逻辑文件名
GET/api/memory/recent_file读取一个近期记忆文件
POST/api/memory/recent_file/save替换一个角色的近期记忆历史
POST/api/memory/update_catgirl_name完整角色改名事务的兼容别名
GET/api/memory/review_config读取近期记忆自动复核开关
POST/api/memory/review_config更新近期记忆自动复核开关
GET/api/memory/powerful_memory_config读取强力记忆开关
POST/api/memory/powerful_memory_config更新强力记忆开关,并执行必要迁移
GET/api/memory/legacy/scan只读扫描用户可见的遗留记忆根目录
POST/api/memory/legacy/purge删除从遗留根目录中明确选中的条目

近期记忆文件

为兼容旧版记忆浏览器,API 仍使用逻辑文件名 recent_<角色>.json。当前存储会把它解析到 memory/<角色>/recent.json;迁移期间仍可读取旧的扁平文件。

GET /api/memory/recent_files

无参数。

该路由会搜索活动记忆根目录和项目记忆根目录,去重逻辑文件名并排序返回。

json
{
  "files": ["recent_小天.json", "recent_小夜.json"]
}

GET /api/memory/recent_file

查询参数

名称类型必填说明
filename字符串例如 recent_小天.json;拒绝路径分隔符和 ..

content 是文件中的 UTF-8 JSON 文本,不是已经解析的消息数组。

json
{
  "content": "[{\"type\":\"human\",\"data\":{...}}]",
  "fingerprint": "b4c1000000000000000000000000000000000000000000000000000000000000",
  "identity_token": "a7e3111111111111111111111111111111111111111111111111111111111111"
}

fingerprintidentity_token 是不透明的快照令牌。客户端编辑内容时必须保留二者,并在对应的保存请求中原样回传。

错误响应为 {"success": false, "error": "..."}:文件名非法返回 400,逻辑文件无法解析返回 404

POST /api/memory/recent_file/save

替换所选角色的近期历史,并取消该角色正在执行的复核任务,使手动编辑立即生效。

请求体

json
{
  "filename": "recent_小天.json",
  "fingerprint": "b4c1000000000000000000000000000000000000000000000000000000000000",
  "identity_token": "a7e3111111111111111111111111111111111111111111111111111111111111",
  "chat": [
    { "role": "human", "text": "你好!" },
    { "role": "ai", "text": "晚上好!" }
  ]
}
字段类型必填说明
filename字符串必须匹配 recent_<角色>.json;角色名从该字段推导
fingerprint字符串用于载入本次编辑的 GET 所返回的不透明内容令牌
identity_token字符串同一次 GET 所返回的不透明文件身份令牌
chat数组替换后的历史,最多 10,000 条
chat[].role字符串写入的消息类型,通常为 humanaisystem
chat[].text字符串消息文本;默认为空字符串

单条消息文本上限为 32,768 个字符,请求中全部消息文本合计上限为 2,097,152 个字符。聊天条目中的未知字段不会持久化。

成功响应:

json
{
  "success": true,
  "need_refresh": true,
  "catgirl_name": "小天",
  "fingerprint": "d8f2222222222222222222222222222222222222222222222222222222222222",
  "identity_token": "a7e3111111111111111111111111111111111111111111111111111111111111"
}

校验失败返回 400success: false。缺少快照令牌,或文件内容/身份已经并发变化时返回 409;冲突响应带有 code: "RECENT_FILE_CONFLICT" 和当前令牌。发生冲突后必须重新 GET 文件、合并用户编辑再保存,不能仅替换为响应中的新令牌后重放旧 chat。成功响应会返回下一次编辑要使用的令牌。存储失败返回 success: falseerror;云存储维护态同样返回 409

角色记忆重命名

POST /api/memory/update_catgirl_name

这是规范接口 POST /api/characters/catgirl/{old_name}/rename 的兼容别名。它会排空记忆复核/压缩任务、发布角色改名、迁移全部记忆与卡面状态、重载 memory server,并在失败时回滚。若旧客户端在该事务已经提交后重复调用,本接口会以幂等 no-op 成功返回。

json
{
  "old_name": "旧名字",
  "new_name": "新名字"
}

两个字段都是必填字符串。历史 old_name 可以包含点号;new_name 使用当前角色名规则,且不能是保留路由名。

json
{
  "success": true,
  "memory_renamed": true,
  "memory_server_reloaded": true
}

幂等重复调用返回 changed: falsealready_renamed: trueexists_after。只有配置已经包含新名称且旧存储已经消失时才允许该 no-op;若配置已发布但旧存储仍残留,接口返回 409,不会掩盖部分改名,需通过规范的角色管理接口修复。名称缺失或非法返回 400;存储不可写时也可能返回 409

记忆功能开关

GET /api/memory/review_config

返回是否启用近期记忆的自动复核和修正。配置不存在时默认为 true

json
{ "enabled": true }

POST /api/memory/review_config

json
{ "enabled": false }

该路由把 recent_memory_auto_review 写入 core_config.json

json
{ "success": true, "enabled": false }

失败响应为 {"success": false, "error": "..."}。存储维护态可能返回 409

GET /api/memory/powerful_memory_config

返回 powerful_memory_enabled 设置。已有安装没有显式配置时默认为 true

json
{ "enabled": true }

POST /api/memory/powerful_memory_config

json
{ "enabled": false }

强力记忆开关控制证据驱动的 LLM 路径,包括信号分析、晋升时合并、反驳检查、负向目标检查、事实去重和 persona 修正。关闭强力记忆后,轻量反馈路径仍可用。

ON 切换到 OFF 时,会先请求记忆服务器进程重置已确认反思的计时锚点,避免旧的 confirmed 条目被时间驱动的降级路径立即晋升。只有迁移成功后才保存配置。

成功响应:

json
{ "success": true, "enabled": false }

迁移或持久化失败:

json
{ "success": false, "error": "migration HTTP 409" }

遗留记忆清理

遗留清理是明确的两步操作:先扫描,再提交选中的绝对路径。扫描不会迁移或删除任何数据。

GET /api/memory/legacy/scan

无参数。

响应会标识活动运行时记忆目录之外的候选根目录,并描述每个根目录的直接子项。无法计算大小或超过安全扫描上限时,size_bytes-1

json
{
  "success": true,
  "runtime_memory_dir": "C:\\...\\memory",
  "legacy_roots": [
    {
      "root": "C:\\...\\old-root\\memory",
      "source": "legacy_app_root",
      "exists": true,
      "entries": [
        {
          "name": "小天",
          "path": "C:\\...\\old-root\\memory\\小天",
          "is_dir": true,
          "size_bytes": 12345,
          "is_unlinked": false,
          "runtime_has_same_name": true
        }
      ]
    }
  ],
  "total_entries": 1,
  "total_size_bytes": 12345
}

意外的扫描失败返回 500success: false

POST /api/memory/legacy/purge

这是破坏性操作。只应提交最近一次扫描作为条目返回的路径。

json
{
  "paths": [
    "C:\\...\\old-root\\memory\\小天"
  ]
}

paths 必须是非空的绝对路径数组。每个路径都必须严格位于当前识别出的遗留根目录之下。该路由拒绝相对路径、.. 段、根目录本身和活动运行时记忆目录。目标不存在会被视为已删除,因此重试是幂等的。

删除按条目尽力执行,因此成功请求可以同时包含 removederrors

json
{
  "success": true,
  "removed": ["C:\\...\\old-root\\memory\\小天"],
  "errors": [
    { "path": "C:\\...\\not-allowed", "error": "..." }
  ]
}

请求体非法返回 400;没有可识别的遗留根目录返回 409;初始化失败返回 500