Skip to content

[Feature]: 中转时透传/按会话生成 OpenCode 会话头(session-id / x-opencode-session) #2391

Description

@ggt625

你遇到的使用场景或痛点

通过 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。

希望增加什么

二选一(或两者都做):

  1. 透传:协议代理转发时保留客户端的 session-id / thread-id 头。这是 OpenCode 文档推荐的姿势,语义最正确(每个 Codex 会话一个稳定 ID)。
  2. 生成:当上游主机为 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 缓存优化与路由亲和,开新会话需要手动换值,语义上与该头的设计用途不符。

提交前确认

  • 我确认这不是已有功能可以完成的操作。(静态自定义头可用但语义不等价:无法做到按会话区分)

参考资料

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions