
Claude Code 夹在对话中间的 system 消息会让 Anthropic 兼容上游直接回 400,这里给出半分钟自查、v8.0.48 里唯一能开的 rebuild 开关,以及 drop 选项刚被认领意味着今晚该等还是该自己动手。
messages[] 的中间,标成 role:"system"。报障人那条链路上,第三方 Anthropic 兼容上游收到这种请求回 400,body 里只有 {"model":"deepseek-v4.1-flash"} 一行。1system。v8.0.48 的 rebuild-mid-system-message 干的就是这件事,搬完条目从 messages 里消失、文字留在顶层。整段丢掉这条路,发行版里一行代码都没有。{"model":"…"}:上游原样退回,没有 message 字段。这类往下查请求里有没有中段 system。invalid_request_error: role 'system' is not supported on this model.:这句由本中转拼出来,里面带着模型名,说明请求在你这里就被挡了。count_tokens 跟着报错:报障人那条链路上,计数接口回的是 Claude token count request message role must be user or assistant。1
claude_executor_cloaking.go 第 596–646 行(v8.0.48):第 603 行起的那句文案由本地拼出,第 641 行的 validateClaudeMidSystemMessageModel 先判客户端指纹与上游归属,再判模型清单。2deepseek-v4.1-flash,上游是 OpenCode Go:system,仍回 400。input_tokens 458,285。input_tokens 860,829,耗时 40.9 秒。rebuild-mid-system-message 是 v8.0.48 里的布尔项,默认 false。3api-keys.claude[].keys[].rebuild-mid-system-message;或者给单张凭证加属性 rebuild_mid_system_message,值写成字符串 "true" 才认。后一种适合只给号池里部分号开。45rebuildMidSystemMessagesToTopLevel:遍历 messages,把 role 为 system 的条目里的文本片段收进切片,其余条目照原样留下;收完把这段文本追加到顶层 system,再重写 messages。6
claude_executor_request.go 第 1588–1630 行(v8.0.48):第 1609 行把命中的条目文本收进 movedSystemParts,第 1620 行追加到顶层 system,第 1626 行重写 messages。6drop-mid-system-message 与 DropMidSystemMessage,两处都是零命中。要把这些条目整段丢掉,今晚只能自己在上游前面加一层。messages 少了几条,报文前缀就变了。按前缀缓存的规则推断,长对话第一次开这个开关,下一次命中的部分会少一截。validateClaudeMidSystemMessageModel。四个条件同时成立才拦:客户端指纹对不上原生 Claude Code、目标是第一方 Anthropic、模型落在老清单里、报文里确实有中段 system。2messages 里,这条就不再命中。drop-mid-system-message,对应凭证属性 drop_mid_system_message,管理端补一个字段;两个开关同时开时 drop 优先;默认关。测试覆盖字符串与数组两种 content、两开关同开、没有中段 system 时原样通过。mid-system-message: move|drop 的枚举。feat(plugin): add host-managed on-demand token refresh,59 个文件 +6445/−155,5 笔提交,base 是 dev,状态 open、mergeable clean。10head_ref_force_pushed,头提交仍是第五笔 6ddfdaae。内容没有变化。docs/plugin-on-demand-refresh.md 66 行,连同 README 一行。11access_token 与到期时间会在选号阶段就被判过期。12
selector.go 第 820–845 行(v8.0.48):第 833 行判 AccessTokenExpirationTime() 已过期即返回无法选中,这段判定在原生插件执行器之前跑。13
ngcto/CLIProxyAPI @ feat/plugin-on-demand-refresh 的 sdk/pluginapi/types.go 第 238–315 行:第 259–267 行定义 RefreshPolicy 与 default/on-demand 两个取值,第 306 行把它挂到 AuthData 上,注释写明省略的更新沿用当前策略。14ID 与 Provider 要原样返回,access/refresh token 与到期时间要自洽,否则整次派发中止,错误标成 InvalidRefreshResultError;注释写明上一个刷新凭据可能已被消耗,这一笔不能重试。1516go test -count=1 ./... 与 -race 仍红,这些失败在干净的 dev 基线上同样复现。ParseCodexRateLimitHeaders 取 x-codex-primary-used-percent 与 x-codex-secondary-used-percent;CLIProxyAPI 的额度观测只对 claude、codex、devin 生效。2122git ls-remote 显示 CLIProxyAPI 的 tag、main、dev 三个 SHA 相同,主干上没有待发提交。/goal 任务在额度重置后自动续跑,1 帖 5 浏览。28invalid_request_error 那句的是本地挡的。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
reddit.com
help.openai.com
codex-reset.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
opentherank.com
community.openai.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.