2.7 KiB
2.7 KiB
Runtime NPC 聊天 LLM 迁移设计(2026-04-25)
背景
当前 server-rs/crates/api-server/src/runtime_chat.rs 已承接 POST /api/runtime/chat/npc/turn/stream,但只返回确定性兜底文本。实际游戏聊天里,NPC 回复、下一轮建议、好感变化和限轮收束都应该沿用旧 Node 服务器的 LLM 编排。
迁移源
本轮只参考旧 Node 已冻结实现,不恢复 server-node 服务,也不把前端切回 Express:
server-node/src/prompts/chatPromptBuilders.tsserver-node/src/modules/ai/chatOrchestrator.tsserver-node/src/services/chatService.tspackages/shared/src/contracts/rpgRuntimeChat.ts
提示词常量必须原样迁移,禁止改写:
NPC_CHAT_TURN_REPLY_SYSTEM_PROMPTNPC_CHAT_TURN_SUGGESTION_SYSTEM_PROMPT
本轮落地边界
- Rust
api-server在同一路由内优先调用platform-llm。 - LLM 回复使用旧 Node 的
buildNpcChatTurnReplyPrompt(...)等价构造逻辑,保持输入字段和中文上下文组织一致。 - LLM 建议使用旧 Node 的
buildNpcChatTurnSuggestionPrompt(...)等价构造逻辑,解析规则保持“最多 3 行、去掉编号/项目符号”。 - 好感变化沿用旧 Node 的关键词打分规则:
- 正向与负向关键词计分。
- 首聊无明显关键词时给
+1。 - 单轮变化限制在
[-3, 3]。
chatDirective.forceExitAfterTurn / closingMode=foreshadow_close时不生成建议,返回空数组,并在complete.chatDirective.forceExit中显式告知前端退出。- LLM 未配置或失败时继续返回后端兜底 SSE,保证相遇和点击聊天链路不断。
暂不落地
- 暂不迁移
maybeBuildPendingNpcQuestOffer(...)的完整 quest 生成链。 - 暂不新增 SpacetimeDB reducer;本路由属于 Axum 侧 LLM 编排,SpacetimeDB reducer 仍保持确定性。
- 暂不扩展前端 UI 文案。
工程落点
- 新增
server-rs/crates/api-server/src/runtime_chat_prompt.rs- 承载旧 Node 提示词常量。
- 承载 NPC 聊天 prompt builder 与轻量 JSON 读取 helper。
- 修改
server-rs/crates/api-server/src/runtime_chat.rs- 注入
State<AppState>。 - 优先
LlmClient.stream_text(...)生成reply_delta。 - 再调用
request_text(...)生成建议。 - 计算
affinityDelta / affinityText / chatDirective后输出complete。
- 注入
- 修改
server-rs/crates/api-server/src/main.rs- 注册
runtime_chat_prompt模块。
- 注册
验收
cargo fmt -p api-servercargo check -p api-servernode scripts/check-encoding.mjs docs/technical/RUNTIME_NPC_CHAT_LLM_MIGRATION_2026-04-25.md server-rs/crates/api-server/src/runtime_chat.rs server-rs/crates/api-server/src/runtime_chat_prompt.rs server-rs/crates/api-server/src/main.rs