fix: 修复 Codex 多 Agent 消息私有字段导致 Responses 上游拒绝请求 - #2609
Conversation
本机独立复现 + 定位到可稳定重现的触发条件环境:Cockpit Tools 1.3.60,上游 我在本地独立复现了这个 400,并定位到一条关键触发条件,供维护者参考。 一、只有带 Codex 客户端 User-Agent 的请求才会进入这个改写路径
也就是说:用非 Codex UA 做探测会完全绕过这个缺陷。 我最初用 curl 直接探测了 8 次(含 stream / encrypted_content / metadata 等各种组合)全部通过,直到补上 Codex 客户端 UA 才稳定重现。这大概也是该问题不易被第三方复现的原因——如果 PR 的回归测试没有覆盖"Codex 客户端 UA"这个前置条件,可能测不到真实路径。 二、最小复现请求curl -N http://127.0.0.1:<gateway-port>/v1/responses \
-H 'Content-Type: application/json' \
-H 'Accept: text/event-stream' \
-H 'User-Agent: codex-tui/0.153.4 (Mac OS 26.5.0; arm64) iTerm.app/3.6.10 (codex-tui; 0.153.4)' \
-H 'Authorization: Bearer <local-gateway-key>' \
-d '{
"model": "gpt-6-sol",
"stream": true,
"input": [
{"type":"message","role":"user",
"content":[{"type":"input_text","text":"ping"}]},
{"type":"agent_message",
"id":"amsg_01a0e08a-e4cb-7a30-8bdf-93a98fa303c0",
"author":"/root",
"recipient":"/root/repo_scan",
"content":[
{"type":"input_text","text":"Message Type: NEW_TASK\nTask name: /root/repo_scan\nSender: /root\nPayload:\n"},
{"type":"encrypted_content","encrypted_content":"ping"}
],
"internal_chat_message_metadata_passthrough":{"turn_id":"01a0e086-56fc-7242-9669-b8517e5098f4","create_time":1790473594.059782}}
]}'HTTP 状态码是 200,错误发生在 SSE 流内部: {"type":"response.failed","response":{"status":"failed","error":{
"code":"unknown_parameter",
"param":"input[1].author",
"message":"Unknown parameter: 'input[1].author'.",
"type":"invalid_request_error"}}}注意 三、一个容易误判的排查陷阱这类失败在 sidecar 日志里 HTTP 状态码是 200,只看服务端日志会得出"请求全部成功"的错误结论。本机同日的两侧对照:
即 93% 的 200 里藏着流内失败。建议以客户端侧为准。 四、补充验证:该上游其实接受原生
|
|
已合入 main,感谢 @lwwtl 提供多 Agent 消息兼容修复! 已在当前主线完成必要的冲突适配,并通过前端测试、类型检查、翻译检查和相关 Go 回归/sidecar 构建。本地中英文 Unreleased 更新日志已补充本 PR 及你的贡献署名,后续随宿主版本发布;本次尚未发版。 |
问题
Codex 多 Agent 会话经 Cockpit Provider Gateway 发往严格校验请求结构的 Responses 上游时,会遇到
400 unknown_parameter: Unknown parameter: 'input[n].author'。rewriteCodexAgentMessageInput已将agent_message改写为普通message,但仍保留author、recipient、内部消息 ID 和internal_chat_message_metadata_passthrough。这些内部字段不应直接放在转换后的普通消息顶层。子 Agent 结果进入主会话历史后,后续请求也可能重复失败。修复
input_text内容块,保留发送者、接收者和内部关联信息。相关但不同的问题:#2382 处理 Responses → Chat Completions 分支的子代理任务丢失;本 PR 处理 Agent 消息归一化后,严格 Responses 上游拒绝私有字段的问题。
验证
在最新 main 基础上执行并通过:
此前在本地独立测试端口,包含上述私有字段的合成请求经修复版代理访问真实上游,返回 HTTP 200 并完成回复。该验证不等同于完整 Codex 多 Agent UI 端到端验收。
本 PR 仅包含源码和测试,不包含本地配置、凭据、真实项目内容或编译产物。