6.9 KiB
6.9 KiB
module-ai 首版基座设计
日期:2026-04-21
1. 文档目标
本文只冻结一件事:
为 server-rs/crates/module-ai 建立一套可以直接编码落地的首版领域模型与最小服务边界。
本轮不做以下内容:
- 不直接接入真实供应商 SDK。
- 不在
SpacetimeDB里提前写完整ai_task表。 - 不提前改造
api-server的 story/chat/custom world 路由。
本轮只解决两个问题:
module-ai不能再停留在“目录占位 + README 口号”状态。- 后续
api-server、platform-llm、spacetime-module接线时,需要先有稳定的任务、阶段、流式片段、结果引用领域模型可复用。
2. 依据
本文以以下现有文档和代码为准:
- SPACETIMEDB_AXUM_OSS_BACKEND_REWRITE_DESIGN_2026-04-20.md
- NODE_BACKEND_MODULE_AND_API_INDEX.md
- EXPRESS_BACKEND_TASK4_AI_ORCHESTRATION_STATUS_2026-04-08.md
server-node/src/modules/ai/storyOrchestrator.tsserver-node/src/modules/ai/chatOrchestrator.tsserver-node/src/modules/ai/customWorldOrchestrator.ts
3. 现状问题
当前 server-rs/crates/module-ai 只有 README,占位描述虽然说明了“AI 编排模块”的方向,但还缺失编码级约束:
- 没有任务主键、阶段主键、结果引用 ID 的统一前缀。
- 没有 story/chat/custom world/quest/runtime-item 六类任务的共用枚举。
- 没有“排队中/运行中/已完成/失败/已取消”的状态模型。
- 没有“流式片段如何暂存与聚合”的领域对象。
- 没有“结果引用”与“最终文本/结构化结果”的最小抽象。
- 没有可供
api-server直接依赖的最小内存服务。
如果继续在没有这层基座的前提下直接接 platform-llm 或 api-server,后续很容易再次把:
- 阶段枚举散落在 handler 里,
- 流式文本拼接散落在路由里,
- 结果引用结构散落在 story/custom-world/quest 各模块里。
4. 首版职责冻结
module-ai 首版只负责以下职责:
- 定义统一 AI 任务类型、任务状态、阶段状态、任务快照。
- 定义统一流式片段、阶段输出、结果引用、最终结果快照。
- 提供最小编排服务,支持:
- 创建任务
- 启动任务
- 记录阶段开始/完成
- 追加流式文本片段
- 绑定结果引用
- 成功完成 / 失败 / 取消
- 提供一套内存态 store,作为
api-server首轮联调和测试 fallback。
module-ai 首版明确不负责:
- 真实 HTTP 请求、重试、超时和供应商切换。
- SSE 协议写回。
- 数据库存储与表结构。
- 业务模块自己的 prompt 组装细节。
5. 任务类型范围
首版统一冻结以下任务类型:
StoryGenerationCharacterChatNpcChatCustomWorldGenerationQuestIntentRuntimeItemIntent
说明:
- 这 6 类直接来自当前 Node 后端已经存在的正式运行时 AI 主链。
- 不提前引入媒体类资产生成任务,因为资产生成后续归
module-assets + platform-oss主导。 - 如果后续要增加
NarrativeRepair、ProfileRepair这类内部子任务,应作为新枚举值追加,不复用现有值的语义。
6. 阶段模型
首版阶段固定支持以下通用阶段语义:
PreparePromptRequestModelRepairResponseNormalizeResultPersistResult
说明:
- 不是每种任务都必须走满 5 个阶段。
- 任务创建时应携带自己的阶段蓝图,按需要裁剪。
- 阶段蓝图是显示给上层 orchestration 的稳定数据,不把“阶段名字符串”重新散落到 handler。
首版建议默认蓝图:
| 任务类型 | 默认阶段 |
|---|---|
StoryGeneration |
PreparePrompt -> RequestModel -> RepairResponse -> NormalizeResult |
CharacterChat |
PreparePrompt -> RequestModel -> NormalizeResult |
NpcChat |
PreparePrompt -> RequestModel -> NormalizeResult |
CustomWorldGeneration |
PreparePrompt -> RequestModel -> RepairResponse -> NormalizeResult -> PersistResult |
QuestIntent |
PreparePrompt -> RequestModel -> NormalizeResult |
RuntimeItemIntent |
PreparePrompt -> RequestModel -> NormalizeResult |
7. 结果模型
首版结果拆成三层:
7.1 流式片段
用于记录模型增量输出:
chunk_idtask_idstage_kindsequencedelta_textcreated_at_micros
这层只负责“增量片段”,不直接宣称是最终结果。
7.2 阶段输出
用于记录阶段收口后的聚合内容:
stage_kindtext_outputstructured_payload_jsonwarning_messages
7.3 结果引用
用于让 AI 编排结果和其他模块的记录形成稳定绑定:
result_ref_idtask_idreference_kindreference_idlabel
首版 reference_kind 冻结为:
StorySessionStoryEventCustomWorldProfileQuestRecordRuntimeItemRecordAssetObject
8. 服务边界
首版 AiTaskService 只暴露纯领域操作,不直接暴露供应商能力:
create_taskstart_taskstart_stageappend_text_chunkcomplete_stageattach_result_referencecomplete_taskfail_taskcancel_taskget_task
这层返回的都是领域快照,不返回 HTTP DTO。
9. 与其他 crate 的边界
9.1 与 platform-llm
platform-llm 负责:
- 真实模型请求
- 流式回调
- 超时 / 重试 / 供应商错误
module-ai 负责:
- 把这些外部回调映射为任务快照与阶段快照
- 把供应商响应组织成稳定的模块领域状态
9.2 与 api-server
api-server 负责:
- HTTP 入参校验
- SSE 输出
- Bearer/Cookie 鉴权
- response envelope
module-ai 不负责 HTTP。
9.3 与 spacetime-module
后续 spacetime-module 负责:
- 任务真相表
- 阶段表 / 事件表 / 结果引用表
- reducer / procedure
本轮 module-ai 只提供后续可映射到 SpacetimeDB 的稳定领域结构。
10. 首版编码要求
首版 crate 必须满足:
- 提供
Cargo.toml - 提供
src/lib.rs - 默认不依赖
platform-llm - 默认不依赖
SpacetimeDB - 可选提供
spacetime-typesfeature,便于后续映射表结构 - 提供完整中文注释与基础测试
11. 本轮验收口径
本轮完成后,以下条件同时满足才算 module-ai 首版落地:
server-rs/Cargo.toml已把module-ai纳入 workspace。module-ai不再只有 README,而是有真实可编译源码。- 任务/阶段/结果引用/流式片段领域模型已存在。
- 有最小内存服务可供后续
api-server直接复用。 - 至少有任务创建、流式片段聚合、阶段完成、结果引用绑定、任务失败/取消等测试。