(无侵入版本)Any牌路由器 SubAgent 和 Haiku 模型无法正常调用的解决办法

joneai 2026-04-21 23:55 1

基于哈雷彗星大佬 原帖 #1991311 的优化版。原方案用 AST 补丁改 cli.js,每次 Claude Code 升级都得重打;本版不动 Claude Code 本体,外挂一个本地反向代理,Claude Code 升级自动生效,还顺带兼容 v2.1.116+ 新的请求形态。


问题回顾(两种形态)


Claude Code 的 SubAgent 请求在不同版本里,发给 AnyRouter 的 thinking 字段有两种错配形态,AnyRouter(new-api 后端)对 Haiku / Opus 4.7 [1M] / Sonnet 4.6 这些 reasoning 模型都会 500(nil pointer dereference):




  • v2.1.112 ~ v2.1.115:cli.js 里 SubAgent 启动器 _u 把 thinking 硬编码为 {type:"disabled"}


    thinkingConfig: D ? _.options.thinkingConfig : { type: "disabled" }

    D = useExactTools 只有 Fork agent 为 true,所有带 subagent_type 的 SubAgent 永远走 disabled 分支




  • v2.1.116+:SubAgent 请求完全不带 thinking 字段thinking absent)。但 AnyRouter 对 Haiku 仍要求 thinking 字段存在 —— 缺失就直接 crash。




AST 补丁只修得了第一种(而且每次升级要重打),新版本格式变了就匹配不到。


新思路:本地代理拦截改写


claude → 127.0.0.1:8787 (proxy) → https://anyrouter.top

└─ thinking 缺失 / null / disabled 都按模型归一化补上

重写规则(对齐 Claude Code 内部 API 层的归一化逻辑):
























模型 改写为
opus-4-[67] / sonnet-4-6 {type:"adaptive"}
claude-3-* 删除 thinking(legacy 模型不支持)
其它(Haiku 4.x / Sonnet 4-5) {type:"enabled", budget_tokens: min(31999, max_tokens-1)}

关键:不只改 thinking 字段。启用 thinking 时还得一并归一化:



  • temperature 强设为 1(扩展 thinking 硬性要求)

  • 删除 top_p / top_k(扩展 thinking 不支持)

  • 兜底 max_tokens > budget_tokens

  • 注入 interleaved-thinking-2025-05-14anthropic-beta 头(SubAgent 几乎都会 tool_use,thinking 和 tool_use 共存需要这个 beta)


我一开始没做这一步,结果 new-api 因参数冲突继续 nil pointer。加上之后就好了。


架构(三个文件)


~/.anyrouter/
├── anyrouter-launch.sh ← 启动逻辑(起 proxy / 注入 env / 调 claude / 退出清理)
└── anyrouter-proxy.js ← Node 反向代理(无 npm 依赖)

~/.zshrc
└── claude-anyrouter() ← 极简入口函数,source 启动脚本

安装(三步)



  1. 放两个脚本到 ~/.anyrouter/


mkdir -p ~/.anyrouter
cp anyrouter-launch.sh anyrouter-proxy.js ~/.anyrouter/


  1. ~/.zshrc 末尾加入函数:


function claude-anyrouter() {
local API_KEY="sk-xxxxxxxxx" # 填你的 AnyRouter Key
local ANYROUTER_DIR="$HOME/.anyrouter"
source "$ANYROUTER_DIR/anyrouter-launch.sh"
}


  1. 新开终端:


claude-anyrouter                 # 启动
claude-anyrouter --continue # 参数透传给 claude

几个关键优势



  • Claude Code 升级自动生效,不用重打补丁

  • 兼容 v2.1.112 ~ v2.1.116+ 两种 thinking 形态

  • 与原生 claude 共存:只有 claude-anyrouter 走代理

  • /exit / Ctrl+C / 关终端 都会 trap 清理 proxy,无残留

  • 纯 Node 内置模块 + nc,macOS / Linux 开箱即用

  • 上游 ≥400 会 dump 完整 OUTBOUND body + UPSTREAM resp 进日志,debug 不抓瞎

  • UPSTREAM_URL 即可切换到任何 Anthropic 兼容网关


与 AST 补丁方案对比











































AST 改 cli.js 本方案(本地代理)
修改位置 cli.js 源码 无,外挂代理
Claude Code 升级后 需重打 自动生效
兼容新版(thinking absent) ^-^(只匹配 disabled)
全局影响 所有 claude 调用 只影响 claude-anyrouter
依赖 acorn 解析器 Node 内置 + nc
可与原生 claude 共存

完整代码与文档


^-^ 完整源码 (12.9 KB)


文件夹里包含三个文件的完整实现,以及 12 节的 README(配置项 / 调试 / 常见问题 / 卸载等)。




再次感谢 @哈雷彗星 定位问题 + 给出 AST 补丁方案,本帖只是把思路换到代理层做零侵入,并顺手把 v2.1.116+ 的新形态也处理了。

最新回复 (19)
  • simple 04-22 09:57
    1

    能不能直接加到cpa里面去 这样能一劳永逸啦

  • science404 04-22 10:05
    2

    亲测完美,楼主牛逼,这个部署起来比打补丁或者CCH的方案优雅太多了^-^

  • joneai 楼主 04-22 10:09
    3

    才疏学浅 弱弱问下 cpa 是啥? ^-^



    能不能直接加到cpa里面去 这样能一劳永逸啦


  • joneai 楼主 04-22 10:18
    4

    可以 DIY 一下,我自用这样子就满足了。

  • 1x2y3z4 04-22 14:02
    5

    我在fish shell下使用,为什么提示undefined is not an object (evaluating ‘_.input_tokens’) 这个错误呢

  • zksync 04-22 14:10
    6

    期待有win版本的,支持佬 ,希望越来越简单^-^

  • joneai 楼主 04-22 14:35
    7

    undefined is not an object (evaluating ‘_.input_tokens’)



    这个不太清楚哦,我是zsh,可能需要适配。(PS:可以自行研究下,就两个脚本文件)

  • joneai 楼主 04-22 14:36
    8

    期待有win版本的,支持佬 ,希望越来越简单^-^



    我对 Windows 一窍不通,很多年没用了 ^-^

  • loved3d 04-22 22:35
    10

    claude-anyrouter



    走本地代理后,还能走HTTP_PROXY这些代理吗?

  • joneai 楼主 04-22 22:52
    11

    不影响,claude-anyrouter 环境完全是独立的(走的的是127.0.0.1:8787,这个代理再帮你去访问ANY)

  • ooloo 04-23 17:17
    12

    可惜一直都是用的cc switch切换,没办法直接用。

  • joneai 楼主 04-23 20:34
    13

    不影响的,按照脚本可直接用,执行 claude-anyrouter 命令即可,不依赖任何三方组件

  • 不要向命运妥协 04-24 17:03
    14

    我叫AI改成windows兼容的,然后8787的问题搞不太明白,现在秒报API Error: 400 status code (no body),到底是需要我调整梯子的端口到8787?还是直接使用7890默认的端口就行呢?

  • c.zephyr 04-25 18:08
    15

    佬,好像现在any出现新的错误了

  • 萨摩耶耶 04-25 18:25
    16

    我也是这个问题,佬如果解决了求踢一下,一直用不上any

  • joneai 楼主 04-26 16:33
    17

    我这里目前没法复现,因为 any 最近一直用不上,一直报 503

  • c.zephyr 04-28 08:44
    18

    现在any用不了,不过看到一个新的解决方案。

    https://linux.do/t/topic/1993243?u=c.zephyr

  • 兔斯基不在家 05-01 22:25
    19

    请问楼主,这个方法现在还能使用吗?是否有新的代码改动

  • binelf 05-05 11:43
    20

    刚才测试了下,亲测可用(注意要把自己 settings.json 里的 base_url, key 等删掉)

* 帖子来源Linux.do
返回