Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
codex-proxy v2.1.20 与 10-21 的 beta 是同一个提交,截断的答案不再被当成正常结束
2026-10-22

codex-proxy v2.1.20 与 10-21 的 beta 是同一个提交,截断的答案不再被当成正常结束

codex-proxy v2.1.20 与 10-21 的 beta 是同一个提交,说明里七条只有一条属于这一版;另附 AI Studio 工具混用仍回 400、xAI 刷新端点换址与 sub2api 的 overload 修复进度。

中
中转站风控与更新速报@Karuha
今天凌晨 03:56,codex-proxy 把 v2.1.20 发成了正式版。1
它的说明很长,但真正属于这一版的只有第一条:上游宣告截断时,客户端不再被告诉「模型自己说完了」。
这条值得连夜看,因为以前的截断是静默的。下面记的都是 01:31 之后的动静,时间为北京时间。

一、正式版和 10-21 的 beta 指向同一个提交

两个 tag 名字不同,解析到的是同一个提交 0543eaa808。2
把这两版放在一起 compare,结果是 0 笔提交、0 个文件。3
和上一版 v2.1.19 比,区间里只有 3 笔提交、8 个文件:一笔版本号同步、一笔翻译层修复、一笔合并 PR #877。改动的全是 src/translation 与包元数据,没有别的。4
所以说明里的七条只有一条属于这一版,其余六条在 v2.1.19 里就已经在代码里了。发行说明自带的「完整提交记录」也只有一行。1
这条唯一的新改动,是把截断的口径改对。
Codex 的 Responses 上游用 response.incomplete 报「没说完」,原因写在 response.incomplete_details.reason 里,官方取值是 max_output_tokens 与 content_filter。5
Anthropic 协议的翻译层以前没有这个分支。作者在代码注释里把后果写得很直白:事件掉出 switch,用量被丢掉,流走通用关闭路径,最后一句 message_delta 把截断报成正常的 end_turn。6
现在 max_output_tokens 落成 max_tokens,content_filter 落成 refusal,两个都不认识才回落到原来的 tool_use / end_turn。流式与非流式两条路都改了,用量按终局事件记。
新增的截断原因映射表
codex-proxy v2.1.20 的 src/translation/incomplete-stop-reason.ts 全文:两个上游原因只对应两个 Anthropic 取值,其余一律返回 null,把判断交回给调用方原有的优先级。5
新增的 response.incomplete 分支
codex-to-anthropic.ts 第 377–397 行:注释本身写着修复前的行为——这个事件掉出 switch、用量丢失、截断被当成正常 end_turn。6
谁会被这条打到:用 Claude 格式客户端(Claude Code 这类)经 codex-proxy 打 Codex,且输出会撞到上限的人。
以前的表现是答案少一截、没有报错、客户端也不重试;这一路的用量记下来同样是空的。
升级后会看到什么:日志和客户端里开始出现 max_tokens(以前是 end_turn),Claude Code 会据此继续或重试;用量不再为 0。
处置分三种处境。已经在 10-21 那个 beta 上的不用动,代码是同一次提交,只是安装包按正式版重打了。
跑 v2.1.19 或更早的,升到 v2.1.20。从源码或离线包装的要注意版本号:附件里的 tgz 都标着 2.1.20,但 package.json 在 tag 上还写着 2.1.19。7
版本号同步那笔 03:54:38 才落到 dev,所以核版本看 tag,别读 package.json。8
还有一个没变的限制:客户端的 max_tokens 仍然不会转发给 Codex。PR 自述里写明这项是故意不做的,且有既有测试钉住,所以靠调小它控成本在这条路上无效。9

二、AI Studio 上把内置工具和函数声明混在一起,今天还是 400

01:33 有人开了 CLIProxyAPI 的 #6892:在 gemini / AI Studio 这条路上,同时给内置工具(google_search、code_execution、url_context)与 functionDeclarations,上游直接回 400。10
报错原文是请先打开 tool_config.include_server_side_tool_invocations 才能把内置工具与函数调用一起用。
/v1/chat/completions 与 /v1/responses 两条都中;只给其中一类就正常;走 Antigravity 的不受影响,它自己的翻译器会把 googleSearch 剥掉。
这条的处理过程比结论更值得记住。报障的人先开了 PR #6889,但改动落在 internal/translator/**,仓库的路径守卫只允许这类改动走 issue,01:51 他自己把 PR 关了,把完整报告、补丁与测试转写进 #6892。11
维护者 02:44 把修复提交进 dev,02:46 引用该单并打上 Fixed。从开单到进 dev 是 71 分钟。12
修法比那份 PR 多做了一步。
除了两条 Gemini 翻译路径补上 toolConfig.includeServerSideToolInvocations,Antigravity 的 Responses 翻译里还把这个字段剥掉——那边复用同一个转换函数,但上游不认这个参数。
dev 上补的开关
dev 分支 internal/translator/gemini/openai/chat-completions/gemini_openai_request.go 第 467–471 行:条件是两种工具同时出现,只出现一类时不加这个字段。13
v8.0.39 上没有这条修复:三个文件里都搜不到那个字段。14
今天的绕法有三条:把内置工具与函数工具拆成两次请求;或者把这类请求指向 Antigravity 那条路由(能过,代价是内置工具被剥掉、搜索不执行);或者等下一版。

三、xAI 换掉了刷新令牌的端点,旧凭据不会自己恢复

01:31 开的 PR #6890 指出:xAI 的旧令牌端点 auth.x.ai/oauth/token 已经下线,现在返回的是一个 Cloudflare 的 403 页面。15
发现文档里给的新地址是 https://auth.x.ai/oauth2/token。16
这一条不用信转述,两条命令就能自己看:旧地址 POST 回 403、内容是 HTML,新地址 GET 回 405(端点存在,只是不接受 GET)。
卡住的原因在发行版里。刷新时把凭据里存的 token_endpoint 原样传下去,而刷新函数只有在这个值为空时才去读发现文档。17
所以存着旧地址的凭据永远刷不动,报错还是一片 HTML,看不出该改哪里。
xAI 刷新取端点的位置
v8.0.39 internal/runtime/executor/xai_executor_auth.go 第 28–30 行:先读凭据里的 token_endpoint,再原样交给刷新,中间没有兜底。18
能自己动手的部分很小:把该凭据 metadata 里的 token_endpoint 改成新地址,或者删掉、置空,让它下次刷新自己去发现。19
改完触发一次刷新,能成功就说明改对了。修复 PR #6890 目前还开着、未合并。
顺带一句:同一批里还有 #6893,讲的是上游代理用「没写完的 chunked 响应」拒绝 CONNECT 时,拨号会一直卡住不返回。跑在前面挂代理的转发链路上,这条迟早会遇到。20

四、sub2api 那张 503 长单:替代 PR 和它自己给的证据边界

01:52,#8305 开出,同一分钟 #8231 被关掉(关闭未合并),前者替代后者。21
三处改动,作者写得比多数 PR 清楚:
  • 出站身份统一:默认从 codex-tui 改成 codex_cli_rs,旧 TUI 配置同步改身份与 User-Agent,避免自报身份前后矛盾。
  • 收到「稍后再试」先等:读响应头与流内错误给的重试等待(常见 6–7 秒),在现有重试次数内等完再试,单次最多 8 秒。
  • 空消息不算已开始输出:只有空增量、空文本结束、空内容片段结束时保留输出前重试;真实文本、工具参数、工具完成、加密推理与未知事件仍按已输出处理。
作者给的证据,他自己也划了边界:两份错误导出里 2003 条上游错误有 1750 条是 overload,但这是错误样本统计、不是全量错误率。
01:04 部署后连续 30 分钟没有客户端 5xx;期间 2 次上游 503 最终都回 200;数据库里 10 条相关错误逐条关联用量后都有实际输出。22
他明确写了不能据此认定都是风控,也提醒 HTTP 200 的流内报错要另看。这条谨慎是对的:样例来自单个部署环境的 30 分钟。
状态是 16 个文件 +323/−38、mergeable clean、未合并。想试的按分支部署,不想动源码的等合并。

五、上游:三家今晚都没给你活

Claude 状态页全绿,最近一次页面更新在 03:55,窗口内没有新事件。23
OpenAI 这边要看清一处:摘要把整体标成轻微降级,但组件列表里没有一个不是 operational。24
两条在册事件都在产品侧——「Dots on Enterprise 性能下降」02:51 起、「新广告账户分配管理员失败」03:36 起,既不涉 API,也不涉额度。
GCP 的 8 条历史事故,最新一次更新在 00:19,窗口内没有新事件。25

六、今晚的对账单

你的处境今晚做什么依据
codex-proxy 跑 v2.1.19 或更早升到 v2.1.20截断被报成正常结束、用量记 0 1
codex-proxy 已在 10-21 的 beta 上不用动同一提交,只是安装包重打 3
v8.0.39 + AI Studio 同时开内置工具与函数工具先别混用,等下个版本#6892 今天仍回 400 10
有 xAI 的 OAuth 凭据检查并改 token_endpoint旧地址 403,刷新不自愈 15
sub2api 正被 overload 打可试 #8305 分支未合并,作者自述样本有限 21

References

  1. 1
    codex-proxy v2.1.20 发行页

    github.com

  2. 2
    v2.1.20-beta.0543eaa 发行页

    github.com

  3. 3
    compare v2.1.20-beta.0543eaa...v2.1.20

    github.com

  4. 4
    compare v2.1.19...v2.1.20

    github.com

  5. 5
    incomplete-stop-reason.ts 第 1–27 行

    github.com

  6. 6
    codex-to-anthropic.ts 第 377–397 行

    github.com

  7. 7
    v2.1.20 的 package.json

    github.com

  8. 8
    chore(version): sync package.json version to 2.1.20

    github.com

  9. 9
    PR #877 的说明

    github.com

  10. 10
    CLIProxyAPI #6892

    github.com

  11. 11
    已关闭的 PR #6889

    github.com

  12. 12
    提交 45501610

    github.com

  13. 13
    dev 分支的修复

    github.com

  14. 14
    v8.0.39 的同一文件

    github.com

  15. 15
    CLIProxyAPI #6890

    github.com

  16. 16
    xAI 的 openid-configuration

    auth.x.ai

  17. 17
    v8.0.39 的 xai_executor_auth.go 第 28–30 行

    github.com

  18. 18
    xai_executor_auth.go

    github.com

  19. 19
    v8.0.39 的 RefreshTokens

    github.com

  20. 20
    CLIProxyAPI #6893

    github.com

  21. 21
    sub2api #8305

    github.com

  22. 22
    #8239 里作者本人的补充

    github.com

  23. 23
    Claude 状态页

    status.claude.com

  24. 24
    OpenAI 状态摘要

    status.openai.com

  25. 25
    Google Cloud 状态

    status.cloud.google.com

中
中转站风控与更新速报@Karuha

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 一、正式版和 10-21 的 beta 指向同一个提交
  • 二、AI Studio 上把内置工具和函数声明混在一起,今天还是 400
  • 三、xAI 换掉了刷新令牌的端点,旧凭据不会自己恢复
  • 四、sub2api 那张 503 长单:替代 PR 和它自己给的证据边界
  • 五、上游:三家今晚都没给你活
  • 六、今晚的对账单