Skip to content

fix: 修复第三方网关丢失 Codex 子代理任务 - #2382

Closed
geiweiwu-ai wants to merge 1 commit into
jlcodes99:mainfrom
geiweiwu-ai:codex/fix-provider-gateway-agent-messages
Closed

geiweiwu-ai wants to merge 1 commit into
jlcodes99:mainfrom
geiweiwu-ai:codex/fix-provider-gateway-agent-messages

Conversation

@geiweiwu-ai

Copy link
Copy Markdown

问题

Codex 通过 Cockpit 的第三方 Provider Gateway 调用 Chat Completions 模型时,子代理的任务消息会在协议转换阶段被丢弃。

Codex 使用 input[].type = "agent_message" 传递任务,正文位于该消息的 content[] 中,内容块类型为 encrypted_content。本次复现中的字段值是明文任务。

Provider Gateway 在 handleProviderGatewayRequest 中直接调用 ConvertOpenAIResponsesRequestToOpenAIChatCompletions,绕过了常规 executor 已有的 Codex 多代理输入归一化。因此会出现两种症状:

  • 首次创建子代理时,任务消失,模型只看到背景或旧消息,可能开始无关的工作区搜索。
  • 对已经回答过的子代理补发任务时,转换后的请求停留在 assistant 消息,Gemini 上游报 400: Requests ending with a model turn are not supported.。

本问题已在 Cockpit Tools 1.3.47 和 Codex CLI 0.153.4 的 Windows 环境中复现。当前 main 中同一网关分支仍缺少此处理。api-service-compatibility 并非此问题的解决开关,该旧选项针对官方 OAuth API Service 的容量恢复与请求头行为。

修复

仅在 Provider Gateway 的 Responses → Chat Completions 分支中,调用已有的 RewriteCodexMultiAgentV2Input,随后继续使用原来的通用转换器。

  • 复用现有 Codex 客户端识别与 optimize-multi-agent-v2 开关。
  • 保留代理任务的文本与顺序,包括中文内容。
  • 不改变原始 Responses 透传、其他客户端、关闭优化时的行为、认证、模型路由和 OAuth 账号池。
  • 不全局展开 reasoning 的加密内容,不新增协议代理或用户配置。

测试

新增 TestProviderGatewayCodexAgentMessages,以本地 HTTP 上游检查真正发出的请求。覆盖 7 种场景 × 2 种路由 × 流式/非流式,共 28 个子测试:

  1. 首次派发任务。
  2. assistant 回答后的后续任务。
  3. 工具结果后的任务,以及 tool_call_id 配对。
  4. 优化关闭。
  5. 非 Codex 客户端。
  6. 普通用户消息。
  7. 原生 Responses 输入保持不变。

修复前,前 3 种场景对应的 12 个子测试因任务缺失失败。修复后全部通过。

已执行:

cd sidecars/cockpit-cliproxy
go test ./... -count=1

cd third_party/CLIProxyAPI
go test ./internal/client/codex/optimize-multi-agent-v2 -count=1

相同补丁已回移至 v1.3.47 并编译为 Windows amd64 辅助程序,在独立端口通过真实 Gemini 上游的首次任务、后续任务及流式请求测试。安装后,通过 Codex 直接创建无继承上下文的 Gemini 子代理,成功读取指定测试文件并审查,随后通过 followup_task 完成定点修正,不再出现任务丢失或上述 400。

另一次独立子代理测试成功通过工具新建短文测试文件,主代理已核对实际文件内容。上述端到端测试均使用合成材料,没有读取或发布用户的小说资料。

本 PR 不包含账号凭据、第三方服务地址、实际工作区资料或生成的二进制文件。

在 Responses 转 Chat Completions 前复用现有代理消息转换,仅对已启用优化的 Codex 客户端生效。补充首次派发、后续派发、工具结果、流式和透传边界的 28 项回归测试。
@jlcodes99

Copy link
Copy Markdown
Owner

感谢复现和测试。已核对远端主线:在 Chat Completions 转换之前,共同入口已调用 OptimizeCodexMultiAgentV2Request 和 RewriteCodexMultiAgentV2Input,此 PR 解决的子代理任务丢失已被主线实现覆盖(提交 40ac74388)。我将本 PR 的测试放到远端 main 的独立快照执行,首次任务、后续任务、工具结果后的任务及关闭优化/非 Codex/普通消息共 24 个 Chat 场景通过。这里按已有实现覆盖关闭,避免重复改写;严格 Responses 对私有元数据的校验问题由 #2609 单独跟进。

代码
提交

@jlcodes99 jlcodes99 closed this Sep 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants