状态、记录与记忆
每个会话拥有 session.sqlite。仓库接口是持久化契约,SQLite 只是实现。架构修改必须添加有序迁移,并测试旧数据库升级。
事件记录事实,在记录员验证期间是草稿;完成 pending commit 的同一事务会将它封存,之后不可编辑或删除。感知记录某个角色从事件中得到的内容,可以不完整、错误或稍后补充。信念是跨事件的可变知识;关系和实体知识是独立的结构化状态。
轮次先进入 pending_commits。GM 可主动请求 record_memory,否则默认 memory.backlogRounds = 6 兜底。失败会保留队列;memory.verify 要求记录员回读并与来源轮次核对后才能封存。
回忆流程
检索只看该角色自己的感知和信念:先按场景线索、FTS5 词语和可选向量含义检索;约低于 0.3 的相似度不计入。三类分数权重为 1 / 1 / 1.5。最多保留 memory.overRetrieve × memory.recall 个候选,上限 60。若有 reranker,最终相关度由 70% reranker 和 30% 检索分组成,再结合重要度、保留度和新近度选择并按时间顺序呈现。
recall_items 是检索投影,recall_fts 是全文索引,recall_vec 是按角色隔离的向量索引。文本变化会清除向量;首批向量固定会话的模型与维度。向量服务缺失或失败时,线索和词语检索仍可工作。
不完美记忆按故事时间衰减:retention = 0.5 ^ (故事天数 / 半衰期)。最低重要度事件初始半衰期为六个故事日,每提高一级重要度翻倍,信念再延长四倍;回忆会加强它。重要度 5 不会低于“模糊但仍记得”。关闭 memory.flaky 后不遗忘且感知准确。
上下文默认在模型窗口的 60%(至少 4000 token)开始折叠完整回合。编年者从记录产生 digest,并在默认 1500/2500 token 阈值把短期摘要归入章节、再合并长期章节;有记录时旧摘要绝不是事实来源。
timeline.json 是只追加的时间线树,SQLite 快照表示节点后的状态。移动时间线只恢复快照并追加对话标记;分支创建新会话和聊天;回退不删除媒体。新的持久状态必须支持快照、恢复、分支、归档和删除。