
v8.0.36 与 v8.0.37 那三笔改动各自带出的问题,被同一位报障人在 19 分钟里逐条交回;本篇给出四张单的触发条件、今天能改的键,以及 sub2api 把国产限频当成窗口耗尽时怎么解冻。
error.type 是 invalid_request_error、error.code 是 context_length_exceeded。已经生成的文本、工具调用和 usage 一起消失。finish_reason,也没有末尾那条 usage。OpenAI 的 SDK 在流里收到 error 就直接抛错,已经流出去的内容多数调用方接不住。stop_reason 写在成功响应里,处理方式是「按截断对待」。5 OpenAI 那边,context_length_exceeded 指的是输入塞不进窗口、请求在生成前就被拒。1max_tokens 时,翻译器按模型的输出上限注入一个值。6 长对话里输入加这个上限超过窗口,Claude 就以这条原因停下。
internal/translator/claude/openai/chat-completions/claude_openai_response.go 第 261–263 行:message_delta 一认出这条终止原因就返回 error 对象,第 265 行的 finish_reason 分支因此走不到。context_length_exceeded 改写成 HTTP 400。8max_tokens 或 max_completion_tokens,让 Claude 先撞输出上限。那条原因映射成 finish_reason: length,文本与 usage 都保住。finish_reason 仍然是 tool_calls,因为那段代码只要收集到工具调用就写 tool_calls。toolCallsCount > 0 之外再加一个 finishReason != "length" 的判断。这处毛病在 max_tokens 上早就存在,改映射时顺手带上。response.failed,status 写 failed,error.code 还是 context_length_exceeded。输出项与 usage 都还在信封里,状态却说这条响应失败了。2status: incomplete,incomplete_details.reason 写 max_output_tokens。本刊核过 Anthropic 文档那句「按截断对待」,两种协议对同一件事的口径差着一整个状态字段。
internal/translator/claude/openai/responses/claude_openai-responses_response.go 第 203–205 行构造错误对象,第 223–229 行先把它判成 response.failed,incomplete 那一支轮不到。response.failed 加这个 code 会当成上下文满,提示用户开新线程,信封里的 usage 丢掉;收到 response.incomplete 它会记下 usage。2response.failed 当终局,一条正常结束的流被记成 408 断连。status,会把自己已经拿到的输出当成失败丢掉。cloak_mode: never 把指纹头改回硬编码那一套auto 模式下,上行 UA 是 2.2.5、包版本 0.128.0。同一请求换成 never,上行变成 claude-cli/2.1.280、包版本 0.112.1。cc_version 仍是 2.2.5.179。3claude-header-defaults。配置基线在 2.2.x、客户端也在 2.2.x 时,第一次检测通过、第二次不通过,落进未确认分支。
internal/runtime/executor/claude_executor_request.go 第 1629–1630 行的 never 分支传 nil;同一函数第 1643 行的通用分支传的是 cfg。cloak_mode: never、cloak.mode: never 与全局 disable-claude-cloak-mode: true 这三处去掉。auto 已经能保留确认客户端的头,对照表第一行就是证据。11tryRefreshAfterUnauthorized 在 conductor_execution.go 第 607 行先跑,matchRequestScopedErrorAction 到第 642 行才判。12auth_unavailable,一次上游都没打出去。4oauth-request-scoped-errors、每个 key 的 request-scoped-errors、凭证 metadata 的 request_scoped_errors 三处都算,动作 stop 与 continue 都中。applyCNProviderReactive429:第一步认余额不足文案,第二步对 Coding Plan 一律冷却到配额快照里最早的未来窗口重置点。17
backend/internal/service/ratelimit_cn_providers.go 第 291–295 行:注释写着「429 多由 5h 窗口触发,取较早点避免过度停调」,代码里没有任何按文案或按已用比例区分的分支。POST /api/v1/admin/accounts/:id/clear-error,或 DELETE /api/v1/admin/accounts/:id/temp-unschedulable 解冻。18| 仓库 | 当前版本 | 主干头(北京) | 窗口内条目 |
|---|---|---|---|
| CLIProxyAPI | v8.0.38 | dev 10-22 10:56、main 10-21 23:04 | #6861、#6862、#6863、#6865、#6864 |
| sub2api | v0.2.17 | main 10-22 10:33 | #8286 |
| codex-proxy | v2.1.20-beta.0543eaa | dev 10-21 09:58 | 0 |
| codex2api | v3.1.1 | main 10-21 01:01 | 0 |
/v1/responses 优先打 Responses 那个。默认关闭,无实现。cloak_mode: never 与 disable-claude-cloak-mode: true。有就改回 auto,改完抓一条 Claude 请求确认上行 UA 与 body 的 cc_version 是同一个版本。max_tokens,或在 payload.override 里压一个更小的值。补完拿一条长对话试,确认截断时拿到的是 finish_reason: length 与 usage。status: 401。有就去掉,已经中招的凭证靠重启进程解,别指望 cooldown/reset。github.com
github.com
github.com
platform.claude.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.