Skip to content

openai_responses 供应商无法用于要求 store:false 的上游(缺少注入手段) #335

Description

@Liam0205

问题描述

openai_responses 格式的 Claude 供应商,在上游要求 store: false 时无法使用:cc-switch 转换后的请求不带 store 字段,上游直接返回 400,且用户没有任何配置手段可以补上这个字段。

一些 OpenAI 兼容中转服务的 /v1/responses 端点强制要求请求显式携带 store: false(不允许在服务端保存对话状态)。对这类上游,直接 curl 验证如下:

$ curl -s $BASE_URL/v1/responses -H "Authorization: Bearer $KEY" \
    -d '{"model": "gpt-5.5", "stream": true, "input": "..."}'
{"error":{"message":"请求参数错误: {\"detail\":\"Store must be set to false\"}","type":"request_error",...}}

同一请求加上 "store": false 后一切正常,工具调用也能返回原生的 function_call 事件。也就是说上游本身没有问题,只差这一个字段。

原因

src-tauri/src/proxy/providers/transform_responses.rs 中,anthropic_to_responses 只在 is_codex_oauth 为 true 时注入 store: false

if is_codex_oauth {
    result["store"] = json!(false);
    ...
}

普通 openai_responses 供应商(meta.apiFormat = "openai_responses",非 codex_oauth)转换出的请求不含 store 字段。

桌面版(farion1231/cc-switch)自 v3.16.4 起提供了「本地代理请求覆盖」(自定义请求头 / 请求体覆盖,local_proxy_request_overrides),用户可以自行补一个 {"store": false};CLI 版目前没有对应功能,因此这条路彻底走不通。

期望行为

二选一(或都做):

  1. 为普通 openai_responses 供应商提供注入 store: false 的开关(例如 meta 里加一个字段);
  2. 移植桌面版的请求体覆盖功能,让用户可以在供应商配置里声明需要合并进上游请求的字段。

考虑到 Responses API 的 store 默认值是 true,而本地代理场景下几乎不存在希望上游保存状态的需求,也可以考虑直接对所有 openai_responses 请求默认发送 store: false(与 codex_oauth 路径一致)。

环境

  • cc-switch-cli 5.9.0(Linux x86_64)
  • 供应商配置:app_type = claudemeta.apiFormat = "openai_responses"
  • 上游:OpenAI 兼容中转服务,/v1/responses 端点要求 store: falsestream: true

复现步骤

  1. 添加一个 Claude 供应商,API 格式选 openai_responses,上游指向一个要求 store: false 的 OpenAI 兼容服务;
  2. 开启本地代理并切换到该供应商;
  3. 在 Claude Code 中发起任意请求;
  4. 代理日志中该供应商的请求全部返回 400(Store must be set to false)。

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