From deb327ce1fdb4852985ea4791b04ea2e575bea45 Mon Sep 17 00:00:00 2001 From: Linghong Date: Mon, 14 Sep 2026 12:31:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=81=E5=AE=9A=20Provider=20=E9=80=82?= =?UTF-8?q?=E9=85=8D=E5=B1=82=E5=85=BC=E5=AE=B9=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 验证 neutral adapter 默认关闭 reasoning 捕获 补充带 reasoning 上游响应的正文流回归覆盖 确认 GameAgent 与 AGC Runtime 继续只消费正文字段 --- ...Provider适配层兼容与GameAgent回归-2026-09-14.md | 54 +++++++++++++++++++ .../platform-llm/src/provider_adapter.rs | 5 +- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 docs/project-memory/plans/【实施计划】Provider适配层兼容与GameAgent回归-2026-09-14.md diff --git a/docs/project-memory/plans/【实施计划】Provider适配层兼容与GameAgent回归-2026-09-14.md b/docs/project-memory/plans/【实施计划】Provider适配层兼容与GameAgent回归-2026-09-14.md new file mode 100644 index 000000000..c8ea74824 --- /dev/null +++ b/docs/project-memory/plans/【实施计划】Provider适配层兼容与GameAgent回归-2026-09-14.md @@ -0,0 +1,54 @@ +# 【实施计划】Provider 适配层兼容与 GameAgent 回归 + +| 字段 | 值 | +| --- | --- | +| Milestone | `docs/project-memory/plans/【里程碑】Provider推理与正文分离及策划Agent展示-2026-09-14.md` | +| Status | awaiting-review | +| Owner | Codex | + +## 修改边界 + +本轮覆盖 `server-rs/crates/platform-llm/src/provider_adapter.rs` 与 AGC Runtime 中已有的正文流测试/辅助构造点;不新增 ProviderStreamEvent、HTTP DTO、OpenAPI、SpacetimeDB 字段,也不接入策划 Runtime 或前端 UI。 + +## 实现顺序 + +1. 核对 neutral Provider adapter 的请求映射保持 `capture_reasoning=false`,并确保适配层不把 reasoning 写入正文 content 或工具调用。 +2. 用带 reasoning 的 loopback 响应补充 invoke/stream 回归测试,证明适配层仍只向 GameAgent 暴露正文事件。 +3. 检查 AGC Runtime 的正文流校验、回退和工具调用测试只依赖 `delta_text`/`accumulated_text`/`finish_reason`,必要时补充新增字段为空的构造断言。 + +## 验收标准 + +- Provider adapter 的普通调用返回正文和工具调用不变,reasoning 不进入 `ProviderResponse.content()`。 +- Provider adapter 的流式 sink 只收到现有 `ProviderStreamEvent::TextDelta`,reasoning 不改变正文累计和 finish reason。 +- GameAgent/Agent Runtime 的现有正文流、回退、工具调用测试通过;未新增 reasoning 消费逻辑。 +- 不修改公开 Provider stream 枚举或 GameAgent 业务协议。 + +## 本轮验收证据 + +| 证据 | 结果 | +| --- | --- | +| `cargo test --manifest-path server-rs/Cargo.toml -p platform-llm` | PASS,151 个测试通过 | +| `cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --tests` | PASS;现有编译警告未新增为错误 | +| `cargo fmt --manifest-path server-rs/Cargo.toml --all -- --check` | PASS | +| `cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check` | PASS | +| `npm run check:encoding` | PASS,4561 个文件 | +| `npm run check:doc-index` | PASS,101 份 Markdown | +| `git diff --check` | PASS | + +未验证项:未连接真实 Provider;第三轮未引入新的 ProviderStreamEvent,也未接入策划 Runtime/UI。 + +## 验证命令 + +```text +cargo test --manifest-path server-rs/Cargo.toml -p platform-llm +cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --tests +cargo fmt --manifest-path server-rs/Cargo.toml --all -- --check +cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check +npm run check:encoding +git diff --check +``` + +## 风险与回滚点 + +- 若 neutral Provider core 后续需要公开 reasoning 事件,将另开契约变更,不在本轮扩展枚举。 +- 若 AGC 测试暴露 reasoning 字段被误写入正文,回退 adapter 透传改动,保留共享 Provider 解析结果供策划专用路径使用。 diff --git a/server-rs/crates/platform-llm/src/provider_adapter.rs b/server-rs/crates/platform-llm/src/provider_adapter.rs index 2426bcc46..7392ec2d1 100644 --- a/server-rs/crates/platform-llm/src/provider_adapter.rs +++ b/server-rs/crates/platform-llm/src/provider_adapter.rs @@ -808,6 +808,7 @@ mod tests { assert_eq!(mapped.max_output_tokens, Some(2048)); assert_eq!(mapped.request_timeout_ms, Some(3000)); assert!(mapped.enable_web_search); + assert!(!mapped.capture_reasoning); assert_eq!(mapped.function_tools.len(), 1); assert!(mapped.function_tools[0].strict); assert_eq!(mapped.tool_choice, Some(LlmToolChoice::Required)); @@ -1091,7 +1092,7 @@ mod tests { ( "text/event-stream", concat!( - "data: {\"id\":\"loopback-stream\",\"choices\":[{\"delta\":{\"content\":\"可\"},\"finish_reason\":null}]}\n\n", + "data: {\"id\":\"loopback-stream\",\"choices\":[{\"delta\":{\"reasoning_content\":\"隐藏\",\"content\":\"可\"},\"finish_reason\":null}]}\n\n", "data: {\"id\":\"loopback-stream\",\"choices\":[{\"delta\":{\"content\":\"用\"},\"finish_reason\":\"stop\"}]}\n\n", "data: [DONE]\n\n" ), @@ -1099,7 +1100,7 @@ mod tests { } else { ( "application/json", - r#"{"id":"loopback-non-stream","model":"loopback-model","choices":[{"message":{"content":"可用"},"finish_reason":"stop"}]}"#, + r#"{"id":"loopback-non-stream","model":"loopback-model","choices":[{"message":{"reasoning_content":"隐藏","content":"可用"},"finish_reason":"stop"}]}"#, ) }; let response = format!(