你遇到的使用场景或痛点
通过 Codex++(中转或纯 API)接入 OpenCode Go(https://opencode.ai/zen/go/v1)时,上游返回 HTTP 400:
{"type":"error","error":{"type":"MissingSessionID","message":"Error from provider (Console Go): Request is missing x-opencode-session and cannot be routed efficiently. Please see https://opencode.ai/docs/go/#where-can-i-use-it"}}
(此前在 #2125 按配置问题讨论并关闭,这里是正式的功能请求。)
OpenCode 官方文档要求客户端为每个会话发送稳定的 x-opencode-session(用于路由优化与 prompt 缓存),并且在 Validated Clients 表中明确说明:Go 能识别 Codex 客户端原生的会话头(session-id),但「部分版本与代理设置会省略它,转发请求时请保留会话头」。
目前 Codex++ 协议代理是从请求 body 重建上游请求的(protocol_proxy.rs 的 upstream_request_builder),只透传 User-Agent 与 x-codex-beta-features 两个头,Codex 客户端的 session-id 在中转这一跳被丢弃,因此走 Codex++ 接 OpenCode Go 必然触发 400。
希望增加什么
二选一(或两者都做):
- 透传:协议代理转发时保留客户端的
session-id / thread-id 头。这是 OpenCode 文档推荐的姿势,语义最正确(每个 Codex 会话一个稳定 ID)。
- 生成:当上游主机为
opencode.ai 时,用请求 body 里已有的会话标识生成 per-conversation 的 x-opencode-session。取值优先级建议 prompt_cache_key > conversation / conversation_id > previous_response_id;仓库现有的 conversation_id_from_responses_request 已解析其中两项,可直接复用。
约束:用户在供应商配置里显式设置了 x-opencode-session 自定义请求头时,以用户配置为准;非 OpenCode 上游不加该头。
功能范围
协议转换
你目前的替代做法
v1.4.0 起在供应商配置里加静态自定义请求头 x-opencode-session: <固定值>。能消除 400,但所有会话共享同一个 session ID:失去按会话的 prompt 缓存优化与路由亲和,开新会话需要手动换值,语义上与该头的设计用途不符。
提交前确认
参考资料
你遇到的使用场景或痛点
通过 Codex++(中转或纯 API)接入 OpenCode Go(
https://opencode.ai/zen/go/v1)时,上游返回 HTTP 400:(此前在 #2125 按配置问题讨论并关闭,这里是正式的功能请求。)
OpenCode 官方文档要求客户端为每个会话发送稳定的
x-opencode-session(用于路由优化与 prompt 缓存),并且在 Validated Clients 表中明确说明:Go 能识别 Codex 客户端原生的会话头(session-id),但「部分版本与代理设置会省略它,转发请求时请保留会话头」。目前 Codex++ 协议代理是从请求 body 重建上游请求的(
protocol_proxy.rs的upstream_request_builder),只透传 User-Agent 与x-codex-beta-features两个头,Codex 客户端的session-id在中转这一跳被丢弃,因此走 Codex++ 接 OpenCode Go 必然触发 400。希望增加什么
二选一(或两者都做):
session-id/thread-id头。这是 OpenCode 文档推荐的姿势,语义最正确(每个 Codex 会话一个稳定 ID)。opencode.ai时,用请求 body 里已有的会话标识生成 per-conversation 的x-opencode-session。取值优先级建议prompt_cache_key>conversation/conversation_id>previous_response_id;仓库现有的conversation_id_from_responses_request已解析其中两项,可直接复用。约束:用户在供应商配置里显式设置了
x-opencode-session自定义请求头时,以用户配置为准;非 OpenCode 上游不加该头。功能范围
协议转换
你目前的替代做法
v1.4.0 起在供应商配置里加静态自定义请求头
x-opencode-session: <固定值>。能消除 400,但所有会话共享同一个 session ID:失去按会话的 prompt 缓存优化与路由亲和,开新会话需要手动换值,语义上与该头的设计用途不符。提交前确认
参考资料
build_session_headers写入session-id/thread-id):https://github.com/openai/codex/blob/main/codex-rs/codex-api/src/requests/headers.rs