持久化¶
持久化分为 Neo4j 和内容寻址文件存储。Neo4j 存储结构化模拟状态和关系。文件存储保存不适合作为大型图属性的媒体和 JSON artifact。
Neo4j store facade¶
后端使用 DatabaseService 作为类型化 store 类之上的 facade。每个 store 负责图中的一个聚焦区域:
| Store 区域 | 示例 |
|---|---|
| 世界和模拟 | Worlds、simulations、当前时间、复制后的世界状态。 |
| 物理状态 | Characters、locations、landmarks、items、equipment、containers、地点和库存关系。 |
| 认知状态 | Memories、intents、relationships、subjective claims、emotions。 |
| 生成状态 | Turns、turn presentation、generation jobs、graph state snapshots、turn versions、world state checkpoints、audit records。 |
| 故事脚本化 | Trigger 及其已触发的 activation(TriggerStore)。 |
| 配置 | 供应商连接、模型配置、组件分配、prompt 和 workflow 分配。 |
| 媒体链接 | 媒体记录,以及来自 worlds、simulations、entities、prompts、workflows 和 turns 的关系。 |
已提交事实¶
物理图事实通过 StateCommitStore.apply_state_commit_proposal() 应用。面向 LLM 的 committer 会构建 StateCommitProposal,但这个 proposal 在 store 应用并记录 turn 之前不是事实。
抽象事实在物理提交之后应用:
MemorySummaryStore创建或更新事件、记忆和 intents。- 关系更新使用已提交记忆作为证据。
- 主观断言更新是观察者作用域的私有信念。
- 情绪更新是私有角色状态。
这种分离可以防止叙事直接变成数据库,也防止拟议变更在提交前被当作状态。
图状态快照¶
图状态快照在重要边界附近持久化生成状态:
| 快照类型 | 用途 |
|---|---|
BEFORE_USER_INPUT |
恢复用户输入生成之前的基础状态。 |
AFTER_USER_INPUT |
保留用户输入处理之后的状态。 |
AFTER_CHARACTER_ROUND |
为继续生成和重新生成提供基准。 |
快照不是图的替代品。它们捕获模拟器的执行状态,使后续继续生成或重新生成可以从已知的结构化边界恢复。
世界状态检查点与 turn 版本¶
图状态快照只捕获 LangGraph 运行的临时提案状态,并不是真正写入 Neo4j 的内容。WorldStateCheckpoint 补上了这一块:
在与 GraphStateSnapshotType 相同的三个边界,加上第四个只属于 checkpoint 的 BEFORE_OOC_MUTATION 边界(没有对
应的 LangGraph 状态可以回滚),完整捕获模拟已持久化的实体——角色、物品、容器、变量、关系、情绪、断言、记忆、事件。
TurnVersion 与之配合,在某个 turn 槽位即将被重新生成或回退替换之前,把它当前的内容归档下来。重新生成一个 turn
时,会先恢复该槽位之前的 checkpoint,再重新生成;回退则是恢复某个归档版本的内容,如果对应 checkpoint 还没被清
理,也会一并恢复相应的世界状态。SimulationStateCheckpointService.restore 始终按同样的三个阶段应用一次
checkpoint——按依赖顺序创建/覆盖实体、重新挂载归属关系、再按叶子到根的顺序删除多余实体——确保恢复过程不会让图停
在一个谁都没捕获过的中间状态。checkpoint 和 turn 版本都会在故事真正向前推进后被清理,不会让废弃分支一直堆积。
完整流程见 Turn 版本与状态检查点。
回合呈现¶
Turns 是发生了什么以及何时发生的规范记录。TurnPresentationRendering 单独存储显示块:
- 叙事;
- 对白;
- 动作文本;
- 生成音频引用;
- 生成图像引用。
这允许前端渲染或重新生成呈现,而不重写 turn 背后的事实。
媒体存储¶
StorageService 把二进制和 JSON 内容存储在内容寻址文件夹中。Neo4j 存储元数据和链接,不存储原始文件。这用于生成图像、上传封面媒体、语音文件、prompt JSON 和 workflow JSON。