更新日期:2026-10-08。本文描述当前代码的实际行为,适用于维护自己账号下的角色资料。入口为「知识库」和资源库中的「记忆管理」。
先确定要管理哪一种数据
| 数据 | 用途 | 管理入口 | 清理后还需要做什么 |
|---|---|---|---|
| 知识库资料 | 产品规则、FAQ、手册等参考原文 | /resources?tab=knowledge | 检查角色启用范围并重新进入对话 |
| 长期记忆 | 偏好、关系、目标、纠正 | /resources?tab=memory | 如果当前对话已经提过相同内容,新建对话 |
| 网页对话记录 | 查看已经发生的对话、从有运行时标识的记录续聊 | /conversations | 删除及过期清理会移除来源自动记忆;手工整理记忆保留 |
| 运行时 Journal 与当前上下文 | 多轮推理、工具结果、语义恢复 | 新建对话建立新 thread | 新建不会删除旧网页记录或长期记忆 |
“归零”有不同含义。让助手不再读取长期偏好,用关闭记忆或清空记忆;让下一次聊天不继承当前前文,用新建对话。删除弹窗可选择移除网页记录,或擦除关联运行时对话并安排录音清理。缺少关联、运行时归属不能验证或录音受保护时,关联擦除会失败并保留网页记录供重试。录音物理清理可能延迟,备份按独立策略处理。当前没有覆盖所有存储和备份的一键账号数据擦除流程。
知识库增删改与缩减
个人事实目前支持生日和明确的当前居住城市更正。城市仅自动识别“我目前居住在…市”陈述及记住/纠正前缀,问句、假设、临时旅行或详细地址不在该规则范围内。新事实替换同角色旧事实并更新来源;删除旧对话不会移除已由新对话更正的事实。其他自由文本事实冲突仍需在记忆管理中整理。
- 在资源库新增资料,可用粘贴文本、文件或公开 HTTPS 网页,无需选择角色。角色关联在角色配置页维护。
- 点击「预览」查看正文,勾选资料并测试检索;在角色配置中关联同一份资料。
- 修改时点击「编辑」,改名称和正文并保存。重新导入相同文件名或网页可更新原资料;检查版本号与新正文。
- 缩减资料可编辑正文,删除失效条款;暂时不用则取消角色绑定并保存,保留原资料供以后维护。
- 资料列表可直接删除,也可在编辑状态删除;会同步移除所有角色关联,当前没有资料回收站。
共享示例只读,不能当成自己的资料修改。私人资料按账号隔离,可被该账号的多个角色关联。修改资料对所有关联角色生效。并发修改使用 expectedRevision:旧版本的修改或删除会返回冲突,刷新后核对新版本再操作,避免覆盖他人的更新。版本号用于冲突检查,当前没有版本历史还原功能。
名称上限 120 字符,正文上限 32,000 UTF-8 字节,上传文件上限 5,000,000 字节;一个角色最多启用 30 份资料。PDF 不支持 OCR。网页不执行脚本,也不能读取登录后的私人页面。检索当前采用关键词片段匹配,语义与向量检索仍是扩展方向。
完整导入、来源和故障排查见知识库使用指南。
长期记忆的维护与重置
在 /resources?tab=memory 选择角色,查看数量并点击「刷新记忆」获取其他页面刚保存的记录。切换角色会清除编辑草稿,避免把旧角色的内容误写到新角色。
- 预览:列表展示完整记忆正文,可搜索内容;展开「预览详情」查看更新时间与手动添加/对话提取来源。
- 增加:选择个人信息、偏好、关系、目标或纠正,填写内容并添加;每条最多 300 字符,每个账号与角色最多 100 条,相同内容去重。
- 修改:点击条目「编辑」,修改正文后保存;现有条目的类型和来源不随正文编辑改变。需要不同类型时可删除旧条目再添加。
- 单条删除:点击删除并确认,适用于失效或冲突信息。
- 重置为零:点击「清空当前角色记忆」并确认,永久删除当前账号在该角色下的全部长期记忆,不影响其他角色或其他用户。
- 关闭自动使用:关闭角色记忆开关;不删除记录,停止自动提取和模型注入。关闭期间仍可以手动增加、编辑和删除,便于提前整理。
敏感内容过滤同样适用于手动添加和修改,拒绝包含密码、密钥、手机号、邮箱等内容;这是基于规则的过滤,不能保证识别所有敏感信息。自动提取是保存网页对话记录时的规则匹配,并非模型自动总结。
清空不会关闭自动提取:如果角色仍开启记忆,之后保存匹配句式的对话可能再次产生记录,包括重新保存旧对话。希望保持空白时,先关闭开关,再清空,并从新对话开始。清空不撤回已生成的答案,也不擦除当前会话前文和外部供应商已处理的数据。
运行时构造提示词时读取当前文件,按更新时间选最近 20 条;旧记录缺少时间时保留原相对顺序。更新通常在下一次构造模型输入时生效,已经开始生成的回答不会追溯更新。想验证删除效果,使用新对话,避免前文仍包含同样信息。生日更正会替换旧生日,编辑带有版本冲突保护;当前没有记忆回收站、批量导入导出或通用语义冲突替换。
API 维护约定
以下 API 需要现有登录授权,写入还需要同源检查;记忆和角色关联需要有效角色,独立资料管理不需要角色参数。不要把任意用户 ID 当成授权。API 不提供跨账号管理能力。
| 方法与路径 | 输入 | 结果 |
|---|---|---|
GET /api/memory?roleId=… | 角色 ID | 按更新时间倒序的 memories |
POST /api/memory?roleId=… | JSON {kind, content} | 201 与 memory,重复内容返回既有条目 |
PATCH /api/memory?roleId=… | JSON {id, content} | 修改后的 memory;未找到为 404 |
DELETE /api/memory?roleId=…&id=… | 条目 ID | 删除当前范围中的一条;重复删除也成功 |
DELETE /api/memory?roleId=… | 不传条目 ID | 清空当前账号与角色,幂等 |
PATCH /api/knowledge/documents/:id | JSON {title,content,expectedRevision},roleId 可选 | 更新资料,旧版本冲突为 409 |
DELETE /api/knowledge/documents/:id | JSON {expectedRevision},roleId 可选 | 删除资料并清理绑定 |
记忆类型为 fact、preference、relationship、goal、correction。用户输入不合法返回 400,请求过大返回 413。记忆文件读取或写入异常返回服务错误;API 授权流程详情以 conversation-history-auth.ts、memory-role.ts 与知识库授权代码为准。
部署、备份与恢复
Next.js 和 Python 必须共享 KNOWLEDGE_CATALOG_DIR、VOICEAGENT_MEMORY_DIR 和对应角色配置目录。使用绝对路径、持久化卷与同一身份格式;网页看到记录不代表另一个进程读到同一份数据。
当前知识和记忆是文件存储;VOICEAGENT_STATE_BACKEND=postgres 只持久化其覆盖的运行时状态,不会自动迁移这些文件。记忆按用户存储于 owners/<用户标识的 SHA-256>/memories.json,知识文件是 catalog.json。网页历史按会话存储于 records/<UUID>/conversation.jsonl,列表只读取首行摘要。首次访问会迁移旧版单个 JSON 文件;升级前停止相关服务并备份整个目录,回退旧代码时需要恢复升级前的目录快照。
Compose 明确启用 PostgreSQL Runtime,知识库和托管数字人设置也共享 /data。Web 使用 PostgreSQL advisory lock 管理文件写入锁,进程退出后数据库释放锁;本地开发默认仍使用目录锁。锁机制不改变文件存储的共享卷要求。切换锁后端前必须停掉全部写入进程,避免不同机制同时写同一文件。
历史保存按 UTF-8 字节分段提交,带有 revision 冲突检查和幂等重试;超过 500 条的会话可以继续保存。删除网页记录时同时清理由它自动提取的记忆,手工编辑后的记忆会保留。延迟到达的保存不能重新创建已删除记录。选择移除网页记录时,服务端 Journal 与录音按原保留策略处理;选择擦除关联对话时,会验证运行时归属、擦除 Journal 并安排录音清理。PostgreSQL 路径还在同一事务中清除该用户/租户/Session 的语音投递文本;恢复重放复用此清理。PostgreSQL 播报记录创建及输出停止请求/确认写入会在同一 Session 锁内检查删除标记,删除提交后拒绝旧 Session 的新记录;PostgreSQL 遥测批量写入按租户/用户/Session 顺序锁定,并过滤已有删除标记的旧事件;同批次其他用户继续保存。PostgreSQL 诊断日志沿用现有全局 Session 标识,批量写入与关联擦除回执共用诊断 Session 锁;已有回执的晚到日志不再保存,其他 Session 保留。它没有用户字段,不提供同名 Session 的按用户日志隔离。Runtime普通会话删除在同一事务写入独立session_history_deletion回执,播报、遥测与诊断日志也识别该回执;它不提前安排录音对象清理。直接调用PostgreSQL日志删除/保留期清理未经过Runtime回执路径时,不具备这项保护;默认内存播报存储也会在同一内存锁中移除播报文本/停止记录,关联擦除后拒绝该租户/用户/Session 的新写入,并保留其他身份。标记仅在当前进程有效;内存诊断日志和遥测删除在同一存储锁内登记全局Session标记并过滤晚到批次,播放索引只使用未过滤回执;这些标记不跨进程持久化,也不改变录音对象保留策略。自定义非持久播报存储必须实现可选 VolatileSpeechHistoryErasure 能力,否则删除会在数据修改前失败。其他非持久状态仍需独立核对。旧备份需独立处理。配置 VOICEAGENT_CONVERSATION_RETENTION_DAYS 后,网页历史过期会在读取时或 Web 后台定时扫描时物理删除,即使用户不再打开历史也会清理。Web 启动时运行一次,默认每小时扫描;VOICEAGENT_CONVERSATION_RETENTION_INTERVAL_SECONDS 可设置 60–86400 秒。后台和访问触发的过期清理均移除来源自动 Memory;手工整理的记忆使用独立保存策略。
备份或恢复时停止所有写入相关目录的进程,保存知识、记忆与角色绑定目录的一致快照,并单独备份 PostgreSQL Journal 及其他资源存储。恢复后核对 JSON 可读、账号隔离、角色绑定、知识检索和记忆开关,再恢复服务。不要直接把运行中的文件替换为空数组,也不要在活跃写入时移除锁。锁恢复步骤见可靠性运维。备份包含用户数据,应限制读取权限和保留时间;删除线上条目不会删除旧备份中的副本。
文件目录可使用 python -m scripts.catalog_snapshot 管理离线快照。先停止所有 Web/Python 写入进程,再显式传入每个目录;--writers-stopped 是操作者确认,工具不能检测 PostgreSQL advisory lock 下的全部存活写入者。示例中的目录均需替换为实际绝对路径:
python -m scripts.catalog_snapshot create --writers-stopped \
--source history=/data/conversations --source memory=/data/memory \
--source knowledge=/data/knowledge --source roles=/data/role-catalog \
--source hosted-avatar-settings=/data/hosted-avatar-settings \
--source avatar-catalog=/data/avatar-catalog \
--output /backups/openrealtime
python -m scripts.catalog_snapshot verify /backups/openrealtime/catalog-YYYYMMDDTHHMMSSZ-UUID
python -m scripts.catalog_snapshot restore /backups/openrealtime/catalog-YYYYMMDDTHHMMSSZ-UUID \
--output /data/recovery-new \
--deletions /backups/openrealtime/catalog-NEWER-UUID
python -m scripts.catalog_snapshot prune --output /backups/openrealtime --older-than-days 30 --keep 1
完整维护窗口步骤见 离线备份运行手册(内部资料)。目录示例对应当前 Compose 的容器内路径;在宿主运行时须改为实际挂载路径。尚未初始化的目录不能直接加入命令,先核对其是否应存在;不要创建空目录来掩盖路径错误。
快照保存完整文件、空目录及删除墓碑,以 SHA-256 和目录清单校验;拒绝符号链接、特殊文件及残留目录锁,文件权限 0600、新目录 0700。复制后重新检查所有源目录的库存与文件版本,检测到变动会撤销未发布的快照。发布和恢复完成前刷写文件、目录元数据;需要支持目录 fsync 的文件系统,不能据此保证远端存储或硬件故障恢复。恢复只允许新建隔离目录,不覆盖线上数据,且恢复目录不能位于快照内。清理默认仅预览,检查候选列表后加 --apply 才删除;至少保留最新一份完整快照,发现损坏快照时整次清理失败且不删除其他快照。创建、恢复与清理应由单个运维任务串行执行,备份目录不得位于源目录内。
restore --deletions 重放较新快照包含的对话、Memory 和知识删除回执。知识删除在同一个 catalog.json 原子提交中保存账号摘要、资料 ID 和删除时间,并移除源资料及该账号的绑定;恢复时移除对应旧源资料(包含其内嵌 Wiki)、该账号的所有角色绑定及旧目录写入临时文件,保留其他账号和共享资料。也支持只包含 knowledge 的快照。恢复会保留回执,以便后续再次备份;无效回执会撤销整个隔离恢复目录。回执不含资料正文,但会随删除数量增长,不能在仍有旧备份可恢复时随意移除。此前未生成回执的知识删除无法靠较新目录缺少资料来证明,仍需独立核对;工具不修改旧备份本体,只处理本次恢复副本。
默认 create 只备份文件目录;可加 --postgres 同时封装 PostgreSQL 归档。工具仍不备份云对象或 IndexedDB,不提供加密、远端复制和备份调度。对旧快照做隔离恢复后,必须先核对并重放快照之后的删除请求及墓碑,再考虑上线;旧快照自身不能证明后续删除仍然生效。仍需为数据库和录音对象制定一致恢复点、删除请求账本及独立保留策略,验证完整恢复与账号隔离。
create --postgres 要求已安装匹配数据库版本的 pg_dump/pg_restore,并通过环境 VOICEAGENT_POSTGRES_DSN 中的 PostgreSQL URI 连接专用应用数据库。URI 查询参数目前支持 sslmode、sslrootcert、sslcert、sslkey、connect_timeout、application_name;其他参数明确拒绝,避免默默忽略连接要求。先停止所有文件与数据库写入者(含保留期限/录音清理后台任务),再执行原 create 命令并添加 --postgres;postgres 为工具保留的源名称。工具在连接前校验文件源与输出路径,并冻结源文件清单/版本,然后生成 custom-format 数据库归档、用 pg_restore --list 检查可读性,再捕获文件目录并统一校验封装。导出期间文件发生变化也会拒绝发布。凭据不写入清单/命令参数,子进程输出不显示;数据库工具失败时不发布快照。停写确认仍是操作者责任,工具不证明数据库没有其他写入者;归档和文件复制不是一个分布式事务。
新的 PostgreSQL 备份还包含 postgres/erasure-ledger.json:从 VOICEAGENT_POSTGRES_SCHEMA(默认 voiceagent)读取对话墓碑和录音清理回执,记录所属租户、用户、对话/Session 标识及删除时间,不含正文或连接凭据。必须已应用 0043/0044 迁移并安装 asyncpg。账本以只读 repeatable-read 事务导出,权限 0600,与归档一起纳入快照 SHA-256 校验;导出失败则不发布备份。归档与账本不是同一数据库快照,仍须严格停写。较新的账本可提供旧备份之后发生的删除依据,但当前 restore --deletions 仍只重放文件回执,不会自动应用数据库账本;完成数据库重放与核对前不可据此声称已阻止恢复后数据复活。
数据库归档恢复到名称以 openrealtime_restore_ 开头的专用数据库后,可单独执行数据库回执重放。连接只从 VOICEAGENT_POSTGRES_RESTORE_DSN 读取,数据库名须与显式参数相同,不能指向默认在线数据库。先停止应用与所有清理进程:
.venv/bin/python -m scripts.replay_database_erasure \
--backup /private/backups/OLDER_SNAPSHOT \
--deletions /private/backups/LATEST_SNAPSHOT \
--database openrealtime_restore_recovery \
--writers-stopped
两份快照均需包含新格式数据库删除账本,较新快照的时间与账本捕获时间不可倒退,schema 必须相同。工具校验快照 SHA、回执身份与时间,在单个数据库事务内阻止相关表的普通写入,检查恢复 Session 是否存在其他用户/租户归属,再重放对话墓碑、诊断清理、对应语音投递文本清理和录音清理排队。保留策略/不可变录音、所有权冲突、SQL失败或提交前快照改变均回滚;重复执行支持幂等。操作者仍须确认目标数据库确实来自所指定旧备份,数据库名称检查并不证明这一点。object_cleanup=scheduled 仅表示清理已排队。恢复库中的 Artifact 可能仍显示可用,必须运行清理协调器并核对其最终 DELETED 状态、账本完成及对象实际不可读取,才能确认该存储中的擦除;这不代表 S3 历史版本、复制桶或备份中的音频已经擦除;文件回执和 Memory 仍按文件 restore 流程核对。这不是完整账号擦除,不能自动切换上线。
隔离文件 restore 仅复制 postgres/database.dump,不会连接或覆盖数据库。数据库恢复须在单独创建的隔离数据库中进行,核对应用迁移、用户隔离、Runtime 续聊及最新删除账本后才可考虑切换;工具的 restore_verified=false 与 object_store_included=false 明确保留这些未验证范围。不得将归档清单可读或文件校验成功当成实际数据库恢复成功。归档包含应用数据库的用户数据和准入信息,应与目录快照使用相同的访问限制及保留策略。
restore --deletions 接收停写后生成的较新完整快照,并校验其清单与文件。两份快照必须包含名为 history 的已迁移目录;待恢复的 Memory 应命名为 memory。工具重放较新快照的 format=2 删除回执:清除旧网页正文和该用户索引,保留新删除标记,移除同一用户且 source_conversation_id 匹配的来源 Memory;手工记忆与其他用户数据保留。支持旧全局和新分用户 Memory 文件。旧版或范围未知的删除标记、用户不匹配、损坏 Memory 或恢复期间删除快照变动会阻止恢复,并移除工具新建的隔离目录。未传 --deletions 的普通恢复不会重放后续删除。
恢复清单的 deletion_replay 记录回执数量、移除来源记忆数量和删除快照时间,并明确 runtime_replayed=false、recordings_replayed=false。这不是完整账号擦除或最新删除证明:操作者需确认提供的删除快照足够新,并继续核对 PostgreSQL、录音、独立手动删除的 Memory 和旧备份保留策略。自动化脚本不能据此直接上线恢复目录。
新执行的单条 Memory 删除和按角色清空会先在 memory/owners/<owner_digest>/deleted/<memory_id>.json 同步记录删除意图,再改写在线目录。标记含用户摘要、角色与记忆 ID,不保存记忆正文;请求中途失败需重试清理。较新快照须包含名为 memory 的源,--deletions 才能重放这些标记,同时保留标记供后续恢复使用。重放仅移除同用户、同角色、同 ID 条目,清单记录 memory_receipts 与 independent_memories_removed。上线前仍需核对未记账的旧删除;历史版本没有这些标记,不能从条目缺失推断删除。
删除有对话来源的记忆还记录 source_conversation_id,并建立角色/来源索引。网页历史补全不会再次从这个已删除来源自动提取 Memory;界面会提示保留了记忆变更或删除。为避免猜测具体被忘记的正文,该保护按同用户、同角色、同来源覆盖,而不是对正文做指纹匹配;可能同时跳过该来源其他恢复文字的提取。用户在新对话中再次明确告知仍可产生新记忆。Python 备份恢复会据删除回执重建这个索引;旧标记没有来源信息时不能补猜该保护。纯手工记忆没有来源关联,不承诺识别恢复历史中语义相同的内容。
历史详情中的“核对服务器记录”分批读取关联的运行时对话,读完后比较网页记录与服务器可见文本。同账号、同对话的未确认本机草稿单独展示,核对操作不修改或移除草稿,也不覆盖网页原记录。仅有旧网页记录、缺少运行时关联时无法核对;服务器不可用时可稍后重试。读完后,相同角色/文本前缀可以查看合并文本预览;出现分叉则分别保留。导出包含各份原记录与本机草稿,并标明分页是否完整、草稿是否读取成功;文本相同不等于已验证同一运行时消息。预览本身不会保存。当服务器记录以当前网页记录为完整文本前缀、且本机没有未确认草稿或草稿读取故障时,可显式选择“补全网页记录”。服务器会重新读取记录,复核账号、版本、过期和删除状态,只追加缺少的尾部;相同文字但尚未确认结束的条目,也可据服务器修复最终状态。条数相同时仍提供这个修复入口,已读完后可用“重新核对服务器记录”刷新服务器状态。分叉、生成中内容和旧版本拒绝补全,原文字保留。补全会更新续聊的 Session 关联,新增的最终用户消息按当前角色记忆开关提取 Memory;提取失败单独提示。其他页面的旧草稿不会被移除,后续保存遇到版本冲突时应保留或导出核对。若请求超时,刷新后先核对实际记录,再决定重试。分叉内容仍需分别核对,不能直接覆盖。
建议的验收流程
用测试账号创建两个角色,关联同一份资料并分别添加记忆;验证共享资料更新可被两者读取,解除一个角色关联后停止命中,记忆跨角色和知识跨账号不可见。编辑资料并检索新条款,删除后检查绑定已移除。关闭记忆后手动维护条目,开启后在新会话询问偏好;清空并关闭后新建对话再次验证。对当前有运行时标识的历史验证续聊,并在持久化部署中另做进程重启恢复测试。
单元与接口测试证明存储和隔离规则;实际模型是否检索、如何回答、语音输出和跨进程恢复需要独立验收。更多上下文边界见Memory 与续聊。
工具资源管理
「资源库 → 工具」支持按名称、说明或函数名搜索,以及按启用状态筛选。展开「预览配置」可查看目录中的服务地址、风险、作用及输入 Schema。工具可编辑、启停,并从页面进入「工具权限设置」。内置工具缺省元数据由运行时实现定义;预览目录配置不等于已执行测试调用。状态切换与保存会等待服务端结果,新对话加载最新工具配置。
记忆页面使用单个角色选择列表,只显示该角色的开关和记录。新增与编辑在弹窗中完成。生日目前支持明确自述的数字月份与日期,并兼容 ASR 在月、日之间插入的标点;询问、否认和模糊候选不会保存。不支持的表述仍可能漏提取,请核对记忆列表,模型口头说“记住了”不等于写入成功。
删除回执与恢复核对
切换「使用长期记忆」时,开关会暂时显示本次选择并提示「正在保存…」,等待结束前无法重复操作。保存成功后采用服务端返回的状态;失败会恢复此前显示并提示错误。页面的待保存状态不代表服务器已经完成配置,遇到网络错误后可重新打开页面核对实际设置。
单条 Memory 删除或按角色清空写入删除回执后,即使在线 memories.json 因中途失败仍保留旧条目,Web 列表、添加去重、编辑及 Python 提示投影也会检查对应用户目录中的回执。已记账条目不再显示或使用,旧 ID 编辑返回无可编辑条目;用户重新明确添加相同内容会生成新 ID。回执损坏或身份不匹配时,Web 操作报错,Python 本轮跳过 Memory 投影;仍需重试删除以完成在线文件清理。旧版没有 UUID/回执的条目不具备此项保护。已经构造或发送给模型的提示词无法由此撤回;这是后续读取保护,不是跨存储原子事务。
新网页对话删除标记包含 format=2、conversation_id、owner_digest 和删除范围。来源 Memory 清理完成与 Runtime 擦除分别记录;recording_cleanup=scheduled 仅表示录音清理已排队。web/retention 不代表 Runtime 擦除,unspecified 或旧版标记的范围未知。标记在移除网页正文前同步到磁盘。文件快照恢复可按上述 --deletions 流程重放已知回执,但不能证明数据库、对象存储或独立手动删除的记忆已同步恢复。
录音清理实际验收可在独立测试PostgreSQL连接及已配置S3环境中,设置 RUN_OBJECT_ERASURE_LIVE=1、VOICEAGENT_RUN_POSTGRES_INTEGRATION=1、VOICEAGENT_POSTGRES_TEST_DSN 后运行 .venv/bin/python -m pytest tests/live/test_recording_erasure_live.py -q。该用例创建随机对象前缀与schema,使用合成音频,验证所有者删除、对象删除故障后的Runtime重启重试、另一所有者对象保留,并清理测试对象。不要以无版本对象通过推断多版本桶历史版本均已擦除;有版本ID时用例额外检查该已知版本不可读取。
曾启用版本控制的 S3 桶(包括目前 Suspended)必须配置 S3_PURGE_VERSIONS=true,并授予应用 s3:ListBucketVersions、s3:DeleteObjectVersion 权限。此模式清理指定完整对象键的全部数据版本,再清理删除标记,不删除同前缀的其他对象;每次最多十个批次,未完成继续由清理账本重试。供应商权限、Object Lock 或批量响应中的单项删除错误会阻止记录成功。默认 false 只适用于从未启用版本控制的桶,不提供历史版本擦除保证。此配置不清理跨区域复制或备份桶,部署者仍须核对这些副本的删除策略。
对象服务客户端默认连接超时为 5 秒、读取等待超时为 15 秒,使用 standard 重试策略且总尝试次数为 3(包含首次请求)。可通过 S3_CONNECT_TIMEOUT_SECONDS、S3_READ_TIMEOUT_SECONDS 和 S3_MAX_ATTEMPTS 调整;超时须为大于 0 且不超过 300 的有限秒数,总尝试次数须为 1–10 的整数,非法配置启动时明确报错。显式重试配置覆盖 SDK 环境默认值。超时是连接/读取等待边界,不是整个下载或多批次版本删除的总时限;DNS、重试退避和持续到达的数据均可能使总耗时更长。对象删除失败仍由持久清理账本重试,不记为删除成功。
知识删除回执的格式边界:format=1 必须且只能包含 format、document_id、owner_digest、deleted_at 四字段,不得附带正文、Wiki 引文、URL 或其他属性。Web 目录读取与 Python 恢复均拒绝未知字段;异常恢复不会发布新目录,原快照保留。当前生产者生成的合法四字段记录保持兼容。未来增加字段应定义新格式版本及显式迁移,不能把旧版本记录当成可任意扩展的对象。
Memory 恢复会合并旧快照与较新删除快照中的有效删除回执;不因新快照漏回执而复活旧数据。format=1 为整数,包含 format/memory_id/role_id/owner_digest/deleted_at,只允许额外 source_conversation_id(可缺失或 null),其他字段拒绝。同 owner/id 的角色或两个已知来源冲突会停止并回滚恢复;新回执漏来源不能抹去旧回执已知的 source fence。生成回执的生产者保持不变。
独立 Memory 来源屏蔽标记也会从旧/新快照合并恢复到已选的 Memory 模块,不依赖 UUID 删除回执同时存在。标记必须只有整数format=1、role_id、source_conversation_id,用户SHA256目录与role/source哈希文件名一致;异常回滚。此标记阻止旧历史再提取,只对该用户、角色和来源生效,既不扩大到其他角色,也不阻止用户明确重新添加新记忆。未恢复Memory模块时不会额外创建该模块。
手工编辑来源 Memory 同样会先记录旧来源屏蔽,再解除来源关联;不写该 Memory UUID 的删除回执,当前手工值仍可读取。普通历史保存使用可选 source_entry_key 标记其对应的语音会话/条目,只有当前未删除记录中的匹配来源条目可继续修订;手工编辑清除该标识。带 --deletions 恢复时,屏蔽来源中旧记录的 source_entry_key 会被移除,清单非零时记录 memory_source_entry_keys_removed,避免旧快照将来源屏蔽转成可绕过的许可。这只清理修订标识;正文仍按所选快照恢复,不自动合并较新快照中的手工值,不代表历史备份正文已擦除。
带删除快照恢复Memory时,会清理恢复根目录及已识别SHA256用户目录的 memories-UUID.tmp 未提交写入副本;未知临时文件、正式数据和原备份保持。非零移除数量写入恢复manifest的memory_partial_files_removed。该操作不替代原备份保留期或云版本清理。