Repository navigation
fix(gateway): propagate upstream stream termination to chat completions clients - #487
Conversation
|
您好,感谢维护 Codex-Manager。 这个 PR 修的是流式回答中途结束时的错误传递:客户端只会看到
想麻烦看下是否可以合入,并在下一个版本里带上?如果实现位置或风格需要调整,我可以按你们的意见改。 |
|
这项修复有实际价值:上游提前结束、读取失败或空闲超时时,把具体原因传给 chat 客户端,并保留已经收到的内容,比静默断流更便于排障。审查当前 head 已实际复现:单个 MCP 工具失败会截断随后成功的回答。 chat_completions.rs:442 使用 Generic SSE 分类器,并在第 451–465、494 行将其错误结果直接转为结束;而 aggregate/sse_frame.rs:120 把所有 以下三个事件依次输入这个 reader: 预期是保留后续回答,输出 建议按以下步骤修复:
必要验证命令如下;第一条测试需要将上述反例保留在 PR 中,修复后应通过: cargo test --locked -p codexmanager-service --lib review_mcp_tool_failure_does_not_abort_completed_response -- --nocapture --test-threads=1
cargo test --locked -p codexmanager-service --lib gateway::http_bridge:: -- --test-threads=1
cargo test --locked -p codexmanager-service --lib gateway::upstream:: -- --test-threads=1
cargo fmt --all -- --check
git diff --check本次没有调用外部模型。失败证据来自实际执行的合成 SSE reader 回归,不代表生产链路已验证;修改后还应保留成功文本/工具流与非流式桥接的回归覆盖。 |
|
已直接补齐修复并同步当前 main,提交
审查通过,可以合并。验证来自合成 SSE 和本地上游传输测试,没有调用外部模型或生产账户。 |
当上游 Responses 流提前结束、读取失败或超时,chat-completions 客户端此前只能看到静默断流。本 PR 将具体原因转换为标准 SSE error,保留此前已收到的内容,不伪造成功的 finish_reason 或 [DONE]。
失败判断限定到响应级错误事件、响应错误字段和失败状态;MCP 调用或工具列表失败及其工具错误详情不会截断随后成功的回答。显式失败、取消、不完整响应、event-only/无效 JSON 错误帧和正常文本/tool_calls 路径均有回归覆盖。
验证:cargo fmt --all -- --check、git diff --check;http_bridge 153 项、upstream 252 项全部通过(单线程执行)。包含合成 SSE 与本地传输测试,未调用外部模型或生产链路。