fix(model-bridge): handle SDK context hints and Responses metadata
This commit is contained in:
1 parent
194853ac01
commit
2cfd53b923
4 files changed
+98
-5
No files matched your search
@@ -0,0 +1,58 @@
|
||||
# GPT 对话桥接兼容修复(2026-10-21)
|
||||
|
||||
## 问题与定位
|
||||
|
||||
用户当前运行的是安装版 `C:\Users\Administrator\AppData\Local\Programs\YCode\YCode.exe`。
|
||||
模型 `gpt-6.1-sol`(GPT-6.1 Sol)配置为 `openai-responses`。
|
||||
真实会话在北京时间 2026-10-21 19:21:59 记录
|
||||
`API Error: 400 Unsupported Messages field: context_management`。
|
||||
该错误来自 YCode 本地 `model-bridge/protocol.ts`,请求在转发远程服务之前被拒绝。
|
||||
|
||||
真实本地 Claude SDK/原生 CLI 请求复现:
|
||||
|
||||
- 关闭思考时不附带该字段。
|
||||
- `effort: high` 时附带
|
||||
`context_management: { edits: [{ type: 'clear_thinking_20251015', keep: 'all' }] }`。
|
||||
- SDK 还在消息数组尾部附带一条 `role: system` 的文本环境说明,旧转换器也会拒绝。
|
||||
|
||||
## 实现
|
||||
|
||||
- 仅接受不修改历史的上下文配置:缺省、null、空配置、空 edits,以及保留全部思考的指令。桥接后的上游请求不携带该字段。
|
||||
- 仍拒绝真实清理、压缩、未知或非法配置,避免静默忽略会改变历史的操作。
|
||||
- 接受消息数组里的文本系统消息,保留顺序和角色;系统消息中的其他内容类型继续拒绝。
|
||||
- Responses 的加密推理历史重放保持原逻辑,并增加携带 keep-all 配置的重放回归。
|
||||
|
||||
## 验证与边界
|
||||
|
||||
- `npm run test:model-bridge`:146 项协议检查、16 组离线宿主回归通过。
|
||||
- `node scripts/ops.mjs build --json`:`PASS / BUILT`,含类型检查;产物位于 `out/`,基于 `194853a` 加本地修改。最终日志 `.git/ycode-ops/logs/1792582138654-3a0f3ac4-1914-49d8-919a-ad6ad8e551bf.log`。
|
||||
- `.tmp/context-management-probe.mjs`:真实原生 SDK 在隔离临时目录请求本地服务,确认字段与系统消息的实际形态。
|
||||
- `node .tmp/context-management-sdk-verification.mjs`:真实 SDK 开启 high 思考,经真实桥接层分别连接本地 Responses / Chat Completions SSE 模拟服务,均收到 `LOCAL_SDK_OK` 并成功结束。共两次本地上游请求。
|
||||
- 上述验证没有调用用户远程模型服务,也没有修改用户模型配置或会话数据。
|
||||
- 修复尚未发布、安装或加载到用户当前安装版窗口;远程 GPT 服务端的完整对话/工具调用仍需在更新后验证。
|
||||
|
||||
## 安装后续报错:流式 metadata 中断(2026-10-21)
|
||||
|
||||
用户安装首轮修复包后,19:59 开始收到真实 GPT 思考与工具调用,
|
||||
期间多次发生 `Server error mid-response`,20:00:27 最终报
|
||||
`400 Responses reasoning history is not available in this lease; start a new conversation`。
|
||||
该会话的桥接历史文件存在,但 entries 为 0;这是流被提前终止后的后续错误。
|
||||
|
||||
使用用户配置的远程 GPT 接口发送独立诊断提示和无外部动作的
|
||||
`diagnostic_echo` 工具定义,确认上游在 `response.completed` 前发送
|
||||
`response.metadata`。该事件只有 moderation 元数据,旧桥接器的默认分支拒绝了它,
|
||||
因此没有读到完整终态并保存推理历史。
|
||||
|
||||
修复 `stream.ts`,将 `response.metadata` 视为无正文的元数据事件,
|
||||
继续读取终态;不修改未知事件、真正断流、内容不一致等异常的处理。
|
||||
协议回归中的所有 Responses 流均补入与实际上游一致的 metadata 形态,
|
||||
包括推理历史持久化和重新获取桥接租约场景。
|
||||
|
||||
验证:
|
||||
|
||||
- `npm run test:model-bridge`:148 项协议检查、16 组宿主回归通过。
|
||||
- `.tmp/responses-live-events.sse`:实际远程独立诊断流,确认 metadata 的顺序与内容;未发送用户会话。
|
||||
- `.tmp/responses-sdk-tool-probe.mjs`:真实原生 SDK + 本地模拟 Responses,经思考摘要、正文、Read 工具、工具结果、最终回复连续两轮成功;包含 metadata,验证加密推理重放。
|
||||
- `.tmp/responses-live-bridge-probe.cjs`:真实桥接器连接用户配置的 GPT 接口,独立诊断工具调用和后续回复两轮均返回干净 `message_stop`。仅模拟返回 `OK`,没有执行外部工具,也没有修改用户模型或会话。
|
||||
- 原会话已经保存的中断思考没有对应完整加密历史,不能从摘要重建;安装本轮修复后应新建会话。此次未删除或改写原会话。
|
||||
- `node scripts/ops.mjs package --json`:`PASS / PACKAGED`,包含类型检查、完整构建与 Windows x64 NSIS 打包。产物 `release/YCode-0.0.12-Setup-x64.exe` 已更新为本轮修复包,401801432 字节,SHA-256 `cee3c43810e0fcb93af7f33351d14789b0ee28444bcea1520b991acdbfb12e97`。日志 `.git/ycode-ops/logs/1792584536233-a08ce860-240e-41de-99a0-255bcf26dfd4.log`。本地未签名包,未发布或自动安装。
|
||||
Reference in new issue
Block a user