2026最新版|Claude Code 接第三方模型端点完整教程(附一键脚本,四条命令验证跑通)
前言
这篇解决一个具体问题:把 Claude Code 的推理请求从官方端点切到第三方网关,并且确认它是真的通了,而不是"看起来装好了"。
网上大部分教程写到"填完 Base URL 和 API Key"就结束了。实际卡住人的恰恰在后面——claude --version能打印版本号,很多人就以为配置成功了,其实这只证明客户端装上了,端点通不通、密钥有没有效、模型有没有回包,一个字都没证明。
全文按这个顺序走:先判断你该用哪个脚本 → 跑脚本 → 看清它往系统里写了什么 → 桌面版图形界面的另一条路 →四条命令确认真的跑通→ 常见报错对照。所有命令都可以直接复制执行,所有数字都是本机实测。
一、环境与版本
本文所有命令在下面这个环境里实际执行过:
| 项目 | 版本 |
|---|---|
| 操作系统 | Windows 10 Pro 22H2(19045) |
| PowerShell | 7.x(脚本兼容 5.1,见下文 TLS 说明) |
| Node.js | v24.21.0 |
| Claude Code | 2.1.283 |
| Git | 未安装 |
最后一行不是笔误。后面第六节会说到,这台机器没有 Git,claude照样跑,端到端请求照样通——Git 不是 Claude Code 的运行依赖。
二、步骤 1:先判断该用哪个脚本,别一上来就跑
打开终端,先敲这一句:
claude--version根据输出选路径:
| 输出 | 说明 | 该用哪个脚本 |
|---|---|---|
打印出版本号(如2.1.283) | Claude Code 已装好 | configure——只写配置 |
| 提示命令不存在 | 环境是空的 | setup——先装依赖再写配置 |
很多人跳过这一步,随手抓一个"全量安装"脚本就跑,结果在已有环境上把依赖重装一遍。
好消息是configure这一支带硬检查:它做的第一件事就是在 PATH 里找claude,找不到直接抛错退出,不往下走。所以选错了也不会搞坏东西,它只是拒绝执行。反过来不成立——用setup去动一个已经配好的环境是有代价的。
三、步骤 2:执行一键脚本
情况 A:已经有 Claude Code —— 只写配置
macOS / Linux:
curl-fsSLhttps://raw.githubusercontent.com/xujfcn/crazyrouter-claude-code/main/configure.sh|bashWindows PowerShell:
irmhttps://raw.githubusercontent.com/xujfcn/crazyrouter-claude-code/main/windows/configure.ps1|iex情况 B:完全没有 Claude Code —— 完整安装
同一个仓库、同一个目录里还有一支完整安装脚本,把上面命令里的configure换成setup就是(setup.sh/windows/setup.ps1),它会先装 Git、Node.js、Claude Code,再写配置。
反过来别换:已经配好的环境上跑setup,依赖会被重装一遍。
执行前务必把链接在浏览器里打开看一眼内容。这跟脚本是谁写的无关,任何| bash、| iex形式的命令都该这么处理。下面这些细节就是通读源码读出来的。
顺带交代setup在 Windows 上的实现,因为这决定了老机器上能不能跑通:winget 优先,没有 winget 就回退到直接下载(Node.js 用固定版本的 LTS 安装包,Git 从官方 release 拉),并且专门为 PowerShell 5.1 开启了 TLS 1.2 / 1.3。差别就在这些回退分支上。
四、步骤 3:脚本只会问三件事
三个交互式提问,除第一项外都有默认值,回车即可:
| 提问 | 是否必填 | 实际行为 |
|---|---|---|
| Token | 必填 | 输入过程不回显,粘贴完屏幕上什么都看不见,这是正常的。空值直接报错退出 |
| Base URL | 有默认值 | 回车接受默认;会自动去掉你多打的结尾斜杠 |
| 模型 | 有默认值 | 回车接受默认,之后随时能改 |
两个读源码才知道的点:
- Token 有格式预检(前缀是否为
sk-/cr-/rk-),不匹配只打一行警告,不会拦截。看到 warning 别急着重来,先看后面有没有真的报错。 - 脚本输出是英文的,即使你看的是中文文档。看到一屏英文属正常。
我实测跑过一次完整的一键命令:脚本成功下载执行,打印[OK] Claude Code detected: 2.1.283,走到 token 输入环节;因为跑在非交互子进程里,读取 token 时报错退出(退出码 1)。事后核对六个环境变量,一个都没被改动——说明脚本是"先问全、再落盘",中途退出不会留半截配置。这一点对反复重试的人很重要。
无人值守部署
服务器上不想交互,先用环境变量喂进去:
exportCRAZYROUTER_TOKEN="你的密钥"curl-fsSLhttps://raw.githubusercontent.com/xujfcn/crazyrouter-claude-code/main/configure.sh|bash(裸机服务器上连 Claude Code 都还没有的话,同样把configure换成setup。)
这一支额外处理了一个坑:curl | bash通常跑在非登录 shell 里,找不到 npm 全局路径。脚本会主动去/usr/local/bin、~/.local/bin、~/.npm-global/bin这几个目录找claude;即使最终仍定位不到,它也会把配置写完并打印诊断信息,不会留个半截状态。
五、步骤 4:确认它往系统里写了什么
脚本改了什么必须心里有数。答案是六个用户级环境变量:
ANTHROPIC_BASE_URL 网关地址(不带 /v1) ANTHROPIC_AUTH_TOKEN 你的 token ANTHROPIC_MODEL 默认模型 CLAUDE_MODEL 默认模型 OPENAI_API_KEY 同一个 token OPENAI_BASE_URL 网关地址(带 /v1)为什么写两套?不同工具读的是不同约定:Claude Code 走 Anthropic 那一组,其他 OpenAI 兼容客户端走后一组。写成两份,一个 token 两边都能用。
落盘位置:
- Windows:直接写成用户级环境变量(
SetEnvironmentVariable(..., 'User')) - macOS / Linux:写进
~/.crazyrouter-claude-code.env,再往 shell 启动文件里加一行自动加载
这里有个细节值得一提:脚本选启动文件时,是按你真正的登录 shell 来选,而不是看哪个文件存在。服务器上很多人有一个用不着的.zshrc但实际用 bash,按"文件存在"判断就会写错地方。
手动配置的写法
不想用脚本完全可以手动来,效果一样。
Windows PowerShell:
[Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL','https://api.crazyrouter.com','User')[Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN','sk-你的密钥','User')[Environment]::SetEnvironmentVariable('ANTHROPIC_MODEL','claude-opus-4-8','User')[Environment]::SetEnvironmentVariable('CLAUDE_MODEL','claude-opus-4-8','User')[Environment]::SetEnvironmentVariable('OPENAI_API_KEY','sk-你的密钥','User')[Environment]::SetEnvironmentVariable('OPENAI_BASE_URL','https://api.crazyrouter.com/v1','User')macOS / Linux,写进~/.zshrc或~/.bashrc:
exportANTHROPIC_BASE_URL="https://api.crazyrouter.com"exportANTHROPIC_AUTH_TOKEN="sk-你的密钥"exportANTHROPIC_MODEL="claude-opus-4-8"exportCLAUDE_MODEL="claude-opus-4-8"exportOPENAI_API_KEY="sk-你的密钥"exportOPENAI_BASE_URL="https://api.crazyrouter.com/v1"按项目走的第三种写法
不想动全局环境变量,可以在项目根目录建.claude/settings.json,只对这个项目生效:
{"env":{"ANTHROPIC_BASE_URL":"https://api.crazyrouter.com","ANTHROPIC_AUTH_TOKEN":"sk-你的密钥","ANTHROPIC_MODEL":"claude-opus-4-8"}}注意ANTHROPIC_BASE_URL只填根域名,Claude Code 会自己拼/v1/messages,手动补一个/v1上去,请求路径就变成/v1/v1/messages,这是错的。要注意的是你未必会收到报错:严格按路径路由的网关会直接回 404,宽松的网关可能照样返回 200(我实测手上这个就是),这种情况下你完全看不出来自己写错了。
六、步骤 5:桌面版图形界面(另一条路)
用 Claude Code 桌面应用的话,不碰环境变量也能配。但这个面板默认是隐藏的——在设置里怎么翻都翻不到,因为它归在开发者模式底下。
先开开发者模式:
Help → Troubleshooting → Enable Developer Mode确认后应用会自动重启一次,左上角汉堡菜单里才会多出Developer项:
展开它,点Configure third-party inference:
进去后选左侧Connection,配好之后长这样:
逐项说明:
| 字段 | 填什么 | 注意事项 |
|---|---|---|
| Credential kind | Static API key | 含义是"锁定凭据来源"——选定后只用这一个来源,不再回退到登录态或环境变量。填完发现请求还走老地址,先回来查这一项 |
| Gateway base URL | 服务方给的地址 | 图形界面不会像脚本那样帮你清理格式:结尾不带斜杠、不要自己补/v1(客户端会拼路径,多补一层变成/v1/v1/...)、不要挂查询参数 |
| Gateway API key | 你的密钥 | 粘完点右边小眼睛看一眼。从网页复制经常带一个不可见空格,报错和"密钥无效"长得一模一样 |
| Gateway auth scheme | bearer或x-api-key | 决定密钥以Authorization: Bearer xxx还是x-api-key: xxx发出。实测这两种在该网关都返回 200,但别家网关选错就是 401 |
| Artifact preview iframe origin | 留空 | 没特殊需求走默认 |
最后两个按钮的顺序不能错:先点右上角 Test connection,通过了再点右下角 Apply Changes。漏掉第二个,配置不会保存。
补充一个排查方向:左侧还有Sandbox & workspace和Egress两栏,桌面版对工具流量做沙箱隔离。如果字段全填对了但 Test connection 不通,去这两栏看一眼出网白名单里有没有你的网关域名。这条本机没遇到(当前配置直接就通),列出来仅作排查参考。
七、步骤 6:四条命令确认真的跑通
这是全文最该抄走的一段。不要停在claude --version。
第 1 条:客户端装上了吗
claude--version第 2 条:运行时在吗
node--version第 3 条:配置真的写进去了吗
Windows PowerShell:
'ANTHROPIC_BASE_URL','ANTHROPIC_AUTH_TOKEN','ANTHROPIC_MODEL','CLAUDE_MODEL','OPENAI_API_KEY','OPENAI_BASE_URL'|ForEach-Object{"{0,-22} {1}"-f$_,[Environment]::GetEnvironmentVariable($_,'User')}macOS / Linux:
env|grep-E'ANTHROPIC|OPENAI'重点看两件事:六个变量都在;OPENAI_BASE_URL结尾带/v1,ANTHROPIC_BASE_URL不带。
第 4 条:端点、密钥、模型三者一起验(关键)
发一个max_tokens=16的最小请求,让模型回一个pong:
curl-shttps://api.crazyrouter.com/v1/messages\-H"Content-Type: application/json"\-H"Authorization: Bearer$ANTHROPIC_AUTH_TOKEN"\-H"anthropic-version: 2023-06-01"\-d'{ "model": "claude-opus-4-8", "max_tokens": 16, "messages": [{"role": "user", "content": "reply with: pong"}] }'Windows PowerShell:
$token=[Environment]::GetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN','User')$headers= @{'Content-Type'='application/json''Authorization'="Bearer$token"'anthropic-version'='2023-06-01'}$body= @{model ='claude-opus-4-8'max_tokens = 16 messages = @(@{role ='user';content ='reply with: pong'})}|ConvertTo-Json-Depth 5Invoke-RestMethod-Uri'https://api.crazyrouter.com/v1/messages'-Method Post-Headers$headers-Body$body第四条才是关键。前三条全过、第四条不过的情况非常常见:密钥过期、额度用完、模型 ID 不认、代理软件把域名分流走了——全都停在这一步,而前三条一个都不会报错。
我把bearer和x-api-key两种认证头各发了一次真实请求,在这个网关上两种都返回 200 并拿到pong,说明它同时接收两种头。但这不是普遍情况,换到别家网关选错就是 401。
八、常见报错与解决
报错 1:配置完了,终端还是提示claude: command not found
原因:环境变量只对新开的进程生效,你在旧窗口里验证。
解决:Windows 把 PowerShell 完全关掉重开(不是新开标签页,是关掉整个窗口);macOS / Linux 新开一个终端,或者:
source~/.crazyrouter-claude-code.env在旧窗口里看到"命令不存在"是预期结果,不是配置失败。脚本执行完打印的第一条 Next step 就是 “Open a NEW PowerShell window”,但这行字很容易被一屏英文盖过去。
报错 2:请求返回 404
原因:Base URL 多补了一层/v1。
ANTHROPIC_BASE_URL只填根域名,Claude Code 会自己拼/v1/messages。你手动补上去就变成https://api.crazyrouter.com/v1/v1/messages,这个写法本身就是错的。但反过来提醒一句:不是所有网关都会给你 404。严格按路径路由的会直接报 404,宽松的可能照样返回 200(我实测手上这个就是)。所以看到 404 要想到这一条,没看到 404 也不代表你写对了——还是以读回来的值为准。
排查:
[Environment]::GetEnvironmentVariable('ANTHROPIC_BASE_URL','User')输出不应该包含/v1。
反过来,OPENAI_BASE_URL必须带/v1——这两个是不对称的,手动配置的人很容易统一成同一种写法,然后出现"Claude Code 通了、别的工具却连不上"或者反过来的诡异现象——多半是 404,但具体报什么错要看网关怎么路由。这不是文档写错,是两套协议的路径约定本来就不一样。
报错 3:返回 401 / 提示密钥无效
三个可能,按顺序排查:
- 认证头选错了。
bearer和x-api-key传递方式不同,选错的报错和密钥错误几乎一致,很难从报错反推。照服务方文档来。 - 密钥尾部有不可见空格。从网页复制经常带上,肉眼看不出来。重新粘一次,桌面版点小眼睛核对。
- 密钥没被读到。在脚本或子进程里,
$env:ANTHROPIC_AUTH_TOKEN可能是空的。改成显式读用户级:
[Environment]::GetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN','User')我自己就在这里踩过一次——子进程里取不到值,端点返回"未提供令牌",看起来像密钥失效,实际是作用域问题。
报错 4:端点地址带了查询参数
很多人是从某个分享链接里复制的地址,尾巴上挂着?utm_source=xxx之类。在浏览器里没事,填进接口端点轻则被忽略,重则校验不过。端点地址必须是干净的。
报错 5:Git 安装失败,是不是要重来
不用。本机 Git未安装,claude跑得好好的,第四条端到端请求也通。Git 不是 Claude Code 的运行依赖,setup脚本装它是为了你之后用得上。看到 Git 装失败先别推翻重来,接着往下验证。
报错 6:桌面版 Test connection 不通,但字段都对
去左侧Sandbox & workspace和Egress两栏,看出网白名单里有没有你的网关域名。桌面版对工具流量做沙箱隔离。(本机未复现,仅作排查方向。)
九、总结
整套流程的特点是每一步都不难,但错了不知道错在哪。真正值钱的不是配置步骤,而是第七节那四条验证命令——把"装上了"和"跑通了"分开确认。
三条最容易踩的:
- 两个 Base URL 不对称:
ANTHROPIC_BASE_URL不带/v1,OPENAI_BASE_URL带 - 配置写完必须新开终端窗口,旧窗口里验证必然失败
- 端点地址不要带任何查询参数
换机器、新同事入职,把第七节那四条命令跑一遍再说别的,能省掉大量无头绪的排查时间。有卡住的地方欢迎在评论区交流。