
这一小时四仓零新版本:CLIProxyAPI 在读到上游第一行之前先跑一遍完整的 Gemini schema 清洗,264 个工具时首包要 13 秒,而上游早在 4 秒前就传完了;全号冷却的 429 有一张补丁在补重试时刻,上游 FedRAMP 面的 Astra 与 Sol 亮起 major。
/v1/responses 的首包会被 CPA 自己的准备工作压住。另有一张补丁在给「全号冷却」的 429 补上时间,上游则开了一次 major。| 事项 | 时间(北京) | 规模 | 现在能做什么 |
|---|---|---|---|
| 大工具列表的流式首包被卡 | 22:14 报障 | #6846,两条补充 | 换协议或减工具;或自己打补丁 |
| 全号冷却的 429 补上重试时刻 | 22:04 开单 | PR #6845,5 文件 +176/−9 | 先按 reset_seconds 自己算 |
| OpenAI FedRAMP 面错误率升高 | 22:17 起 | 状态页一条更新,major | 先按上游算,别批量停号 |
用户态 /v1/usage 端点 | 22:17 开、22:39 自关 | 18 文件 +1950/−1 | 端点还不存在,别照着接 |
deepseek-v4.1-flash、接一个 openai-compatibility 上游,带了 264 个真实工具,请求体 956 KB。response.completed 在 13.45 秒。| 客户端 | 上游 executor | 响应头 | 前 200 ms 的 delta | 结果 |
|---|---|---|---|---|
/v1/responses | openai-compatibility(chat completions) | 1.46 s | 302 / 500 | 停顿后一次冲出 |
/v1/responses | codex-api-key(Responses 直通) | 0.06 s | 38 / 500 | 正常 |
/v1/chat/completions | openai-compatibility | 0.04 s | 41 / 503 | 正常 |
openai_compat_executor.go 第 470 行在流式 goroutine 里调了 helps.InitializeApplyPatchStream。扫描器在第 466 行就建好了,真正的读循环要到第 560 行才开始。
internal/runtime/executor/openai_compat_executor.go 第 458–480 行:第 466 行建 bufio.Scanner,第 470 行调初始化,第 480 行起才定义处理帧的闭包。读上游的第一行在更下面。apply_patch 自定义工具。第 191 行先判下游格式,不是 Responses 就直接返回,/v1/chat/completions 因此不受影响。
internal/runtime/executor/helps/apply_patch.go 第 173–195 行:第 191 行是那个提前返回,第 175 行把整份请求交给 ResponsesToolReverseIdentityMap 只为拿一个布尔,第 194 行在命中后才真的开始翻译。BuildGeminiFunctionDeclarations,后者为每个工具生成完整 Gemini 声明,并对每个参数 schema 跑一遍 CleanJSONSchemaForGeminiJSONSchema,最后这些声明又被整份丢掉,只留名字表。
internal/util/responses_tools.go 第 490–536 行:第 496 行对每个工具的参数 schema 跑清洗,第 499 行把声明收进切片,第 534 行 ResponsesToolReverseIdentityMap 只取第三个返回值,声明直接扔掉。false。apply_patch 桥接由 3ebee065 带进 v8.0.9,工具只有几十个时这次多余计算只要几毫秒。BuildGeminiFunctionDeclarations 拆出一个带开关的内部函数,只取映射时跳过逐工具的声明构建与 schema 清洗。需要声明的调用方行为不变。ResponsesToolReverseIdentityMap 从 1.29 秒降到 2.4 ms;新旧映射用 reflect.DeepEqual 比过,相等。模拟上游下响应头从 1.45 秒降到 0.07 秒。responses_tools.go 与 dev 逐字节相同,openai_compat_executor.go 也是。开放 PR 列表里最大编号是 6845,没有对应的修复单。这条到发稿仍没人接。/v1/chat/completions:实测正常(41/503),代价是函数调用与缓存的语义要重测一遍。codex-api-key 一类):实测 0.06 秒,代价是能用它的只有 Codex 系上游。/v1/responses 回 429 model_cooldown。body 里常驻的只有五样:code、message、model、reset_time、reset_seconds。
sdk/cliproxy/auth/selector.go 第 122–164 行:第 127 行拼 message,第 141–147 行是错误体,只有时长字段;第 152–156 行在上游有错误摘要时追加 last_upstream_error。All credentials for model X are cooling down。要知道几点能重试,只能拿 reset_seconds 自己加上当前时间。requests.passthrough-headers: true 才会写到响应上,而这个开关默认是 false(config.example.yaml 第 239 行)。reset_time 与 reset_seconds。next_retry_at(UTC)、next_auth_index(只在该值是 16 位小写十六进制时才给)、next_credential_hint。凭证只露前缀,取不到就整段省略。person@example.com,也不出现不可信的 index。restoreModelCooldownErrorModel 原来按路由模型重建错误对象,刚加的即时时刻与凭证会被重建掉,现在改成复制结构再改模型名。reset_seconds 加当前时间自己算,日志里搜 model_cooldown 时把 reset_seconds 一起打出来。/v1/usage 端点开出来 21 分钟又被收了。PR #6847 22:17 开单,18 文件 +1950/−1,默认关闭(旧布局 usage-api.enabled,v8 布局 observability.usage.api),要普通代理 key,管理 key 过不了。009f8d7a。/v1/responses 的,先在客户端日志里比「首个 delta」与「流结束」两个时刻。中位只差 0.2 秒就说明命中,按上面五条路里挑一条改。reset_seconds 当唯一可信的时间来源;等 #6845 合入之后再读 next_retry_at。This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.