init with react+axum+spacetimedb
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-26 18:06:23 +08:00
commit cbc27bad4a
20199 changed files with 883714 additions and 0 deletions

View File

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