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

2026-04-29 08:452阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

基于哈雷彗星大佬 原帖 #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+ 的新形态也处理了。

网友解答:
--【壹】--: joneai:

claude-anyrouter

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


--【贰】--:

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


--【叁】--:

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


--【肆】--:

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


--【伍】--:

佬,好像现在any出现新的错误了
image710×256 55.7 KB


--【陆】--:

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


--【柒】--:

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


--【捌】--: 1x2y3z4:

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

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


--【玖】--:

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


--【拾】--: zksync:

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

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


--【拾壹】--:

现在any用不了,不过看到一个新的解决方案。
https://linux.do/t/topic/1993243?u=c.zephyr


--【拾贰】--:

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

simple:

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


--【拾叁】--:

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


--【拾肆】--:

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


--【拾伍】--:

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


--【拾陆】--:

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


--【拾柒】--:

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

问题描述:

基于哈雷彗星大佬 原帖 #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+ 的新形态也处理了。

网友解答:
--【壹】--: joneai:

claude-anyrouter

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


--【贰】--:

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


--【叁】--:

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


--【肆】--:

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


--【伍】--:

佬,好像现在any出现新的错误了
image710×256 55.7 KB


--【陆】--:

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


--【柒】--:

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


--【捌】--: 1x2y3z4:

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

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


--【玖】--:

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


--【拾】--: zksync:

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

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


--【拾壹】--:

现在any用不了,不过看到一个新的解决方案。
https://linux.do/t/topic/1993243?u=c.zephyr


--【拾贰】--:

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

simple:

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


--【拾叁】--:

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


--【拾肆】--:

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


--【拾伍】--:

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


--【拾陆】--:

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


--【拾柒】--:

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