1. WSL 里 VS Code Claude Code 换模型的真实痛点
在 Windows 上做开发,又想用 Claude Code 的编码助手能力,很多人会把项目放在 WSL2 里,再用 VS Code Remote 打开。这个组合本身很顺,但一旦你想把 Claude Code 的后端模型从默认的 Claude 换成别的模型,比如 GLM-5,问题就来了。Claude Code 这个工具本身是围绕 Anthropic 的接口协议设计的,它默认只认 Claude 系列模型,你想让它走第三方通道,就得在中间加一层路由。
我一开始的想法很简单:Claude Code 支持自定义 Base URL,那我把它指到一个本地服务,本地服务再转发到目标模型不就行了。于是我在.bashrc里加了一行export ANTHROPIC_BASE_URL=http://127.0.0.1:3456,然后启动 Claude Code,结果直接报错:Not logged in · Please run /login。这个报错很迷惑,因为我已经把 Base URL 改掉了,为什么还要登录?
后来才搞明白,Claude Code 虽然允许你改 Base URL,但它仍然需要一组看起来像 Claude 的认证参数和模型名称。这些参数在最终请求里可能根本不会被真正使用,甚至会被路由层接管或忽略,但它们必须存在,否则 Claude Code 的前端逻辑会认为你没有完成认证,直接拒绝启动。换句话说,Claude Code 需要“以为自己在跟 Claude 说话”,而真正把请求转发到 GLM-5 的工作,交给 Claude Code Router 来完成。
这就是本文要解决的问题:在 WSL + VS Code 环境里,用 Claude Code Router 把 Claude Code 的请求统一指向 TaoToken 的 API 通道,再接入 GLM-5。整个链路是:VS Code 的 Claude Code 插件 → WSL 里的 Claude Code CLI → Claude Code Router → TaoToken 统一 Key/API 通道 → GLM-5。你不需要改动 Claude Code 的源码,也不需要理解它内部的协议细节,只需要把 Router 的配置文件和 Claude Code 的环境变量配对,就能让请求真正落到 GLM-5 上。
适合谁看?如果你已经在 WSL 里用 VS Code 写代码,想用 Claude Code 的交互式编码能力,但又希望后端模型换成 GLM-5,或者你手里有 TaoToken 的统一 Key,想把它接到 Claude Code 的编码流程里,这篇就是给你写的。下面我会从安装 Router 开始,一步步给出可复制的配置、环境变量、VS Code 侧验证步骤,以及一次真实对话确认模型生效的方法。
2. TaoToken 前置准备与 Claude Code Router 安装
在开始配置之前,你需要先准备好 TaoToken 的接入信息。TaoToken 提供统一的 API 通道,你可以在官网注册后拿到 API Key,然后在控制台里创建或查看你的 Key。这个 Key 就是后面 Router 配置里要填的凭证。TaoToken 的 API 地址是https://taotoken.net/api,这个地址会作为 Router 里 Provider 的api_base_url的基础。如果你还没有 Key,可以先到官网看一下接入文档,了解 Key 的获取方式和可用的模型列表。
拿到 Key 之后,我们进入 WSL 终端。先确认你当前确实在 WSL 环境里,可以在 VS Code 左下角看到WSL: Ubuntu的标识,或者在终端执行uname -a,输出里包含Linux和WSL2就说明没问题。接下来安装 Claude Code Router,它是一个 Node.js 包,用 npm 全局安装即可:
npm install -g @musistudio/claude-code-router如果你的 Node.js 版本比较低,可能会安装失败。建议用 nvm 升级到 Node 20:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash source ~/.bashrc nvm install 20 nvm use 20 nvm alias default 20 node -v npm -v安装完成后确认版本:
ccr --version另外,建议同时在 WSL 里安装 Claude Code CLI,方便先用命令行测通 Router 通道,再接 VS Code 插件:
npm install -g @anthropic-ai/claude-code这里有一个容易踩的坑:VS Code 的 Claude Code 插件可能会自带一个 native binary,并不一定使用你全局安装的claude命令。我在排查时看到插件实际拉起的进程路径类似/home/xxx/.vscode-server/extensions/anthropicclaude-code-2.1.xxx/resources/native-binary/claude。所以全局 CLI 和 VS Code 插件内置的 binary 是两回事,后面验证时要注意区分。
安装好 Router 和 CLI 之后,创建 Router 的配置目录:
mkdir -p ~/.claude-code-router然后编辑配置文件~/.claude-code-router/config.json。这个文件是 Router 的核心,它定义了 Provider、模型列表和路由规则。下面是一份可以直接复制修改的配置,我把 Provider 指向 TaoToken 的 API 通道,模型设为 GLM-5:
{ "PORT": 3456, "LOG": true, "LOG_LEVEL": "debug", "API_TIMEOUT_MS": 600000, "APIKEY": "sk-ant-my-ccr-secret", "NON_INTERACTIVE_MODE": false, "Providers": [ { "name": "taotoken-glm", "api_base_url": "https://taotoken.net/api/v1/chat/completions", "api_key": "你的_TaoToken_API_Key", "models": [ "glm-5" ], "transformer": { "use": [ [ "maxtoken", { "max_tokens": 200000 } ] ] } } ], "Router": { "default": "taotoken-glm,glm-5", "background": "taotoken-glm,glm-5", "think": "taotoken-glm,glm-5", "longContext": "taotoken-glm,glm-5", "longContextThreshold": 128000, "webSearch": "taotoken-glm,glm-5" } }这份配置里需要你替换的地方只有一处:api_key字段填上你自己的 TaoToken API Key。api_base_url我写的是https://taotoken.net/api/v1/chat/completions,这是 TaoToken 的 API 通道地址,Router 会把 Claude Code 的请求转发到这里。models里写的是glm-5,代表你要接入的模型。Router里的default、background、think、longContext、webSearch都指向同一个 Provider 和模型,这样无论 Claude Code 发起哪种类型的请求,最终都会落到 GLM-5 上。
配置写好后,启动 Router:
ccr start查看状态:
ccr status如果看到 Router 正在运行,端口是 3456,就说明 Router 已经就绪。接下来我们要配置 Claude Code,让它把请求发给 Router。
3. 可复制的 Claude Code 配置与环境变量
Claude Code 的配置有两种方式:一种是通过环境变量,另一种是通过~/.claude/settings.json文件。我建议用 settings.json,因为它更集中,也更容易在 VS Code 插件里生效。先看环境变量的方式,你可以在~/.bashrc里加上这几行:
export ANTHROPIC_BASE_URL=http://127.0.0.1:3456 export ANTHROPIC_API_KEY=sk-ant-my-ccr-secret export ANTHROPIC_MODEL=taotoken-glm,glm-5 export ANTHROPIC_DEFAULT_OPUS_MODEL=taotoken-glm,glm-5 export ANTHROPIC_DEFAULT_SONNET_MODEL=taotoken-glm,glm-5 export ANTHROPIC_DEFAULT_HAIKU_MODEL=taotoken-glm,glm-5这里有几个关键点。ANTHROPIC_BASE_URL指向本地 Router 的地址http://127.0.0.1:3456,这样 Claude Code 的请求会先到 Router。ANTHROPIC_API_KEY可以填一个占位值,比如sk-ant-my-ccr-secret,因为真正访问 TaoToken 的 Key 在 Router 的配置文件里,Claude Code 这边的 Key 只是为了让前端逻辑认为已经认证。ANTHROPIC_MODEL和几个DEFAULT模型变量仍然需要配置,它们看起来是 Claude 的模型名,但在 Router 模式下,这些名称主要是为了让 Claude Code 插件正常启动,真实转发到哪个模型由 Router 的Router字段决定。
如果你不想改.bashrc,可以直接编辑~/.claude/settings.json。这份文件是 Claude Code 的全局配置,VS Code 插件也会读取它。下面是一份可以直接复制的 settings.json:
{ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:3456", "ANTHROPIC_API_KEY": "sk-ant-my-ccr-secret", "ANTHROPIC_MODEL": "taotoken-glm,glm-5", "ANTHROPIC_SMALL_FAST_MODEL": "taotoken-glm,glm-5", "CLAUDE_CODE_AUTO_COMPACT_WINDOW": "128000", "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "78", "CLAUDE_CODE_MAX_OUTPUT_TOKENS": "16384" }, "theme": "dark" }这份配置里,ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY与前面环境变量里的含义一致。ANTHROPIC_MODEL和ANTHROPIC_SMALL_FAST_MODEL都写成taotoken-glm,glm-5,这样 Claude Code 在需要调用主模型或快速模型时,都会把请求交给 Router,再由 Router 转发到 GLM-5。CLAUDE_CODE_AUTO_COMPACT_WINDOW和CLAUDE_AUTOCOMPACT_PCT_OVERRIDE是控制上下文压缩的,CLAUDE_CODE_MAX_OUTPUT_TOKENS控制最大输出 token 数,这些可以根据你的实际需求调整。
配置完成后,重启 VS Code 的 WSL 窗口。在 VS Code 命令面板执行Developer: Reload Window,或者直接关闭 VS Code,再从 WSL 项目目录重新打开:
cd ~/work/your-project code .重启后,VS Code 的 Claude Code 插件会重新读取 settings.json 和环境变量。这时候你可以在 WSL 终端里先测试命令行版本的 Claude Code:
claude如果不需要登录就能直接进入对话界面,说明 Claude Code 已经成功连到了 Router。如果仍然提示Not logged in · Please run /login,说明配置没有生效,需要检查 settings.json 的路径是否正确,以及 Router 是否在运行。
这里要特别注意:VS Code 插件和命令行 CLI 可能使用不同的配置来源。插件可能会读取~/.claude/settings.json,也可能会读取项目目录下的.claude/settings.json。如果你在项目里也有.claude目录,建议把同样的配置放进去,或者确认插件的--setting-sources参数包含了user。我在排查时看到插件拉起的进程参数里有--setting-sources=user,project,local,这意味着它会依次读取用户级、项目级和本地级的配置。所以只要~/.claude/settings.json写对了,插件就应该能读到。
4. 验证请求与确认 GLM-5 生效
配置完成后,最重要的一步是验证请求是否真的走了 Router,并且最终落到了 GLM-5。很多人会直接看 Claude Code 界面里显示的模型名,比如Sonnet 4.6 · API Usage Billing,然后问它“你现在用的是哪个模型”,它可能会回答“I'm using Claude Sonnet 4.6”。这个回答不能作为判断依据,因为 Claude Code 本体仍然以为自己在和 Claude API 通信,Router 只是中间转发层,模型在上下文里看到的客户端信息可能仍然是 Claude Code / Sonnet,所以它会照着回答。
真正的验证方式是看 Router 的日志。Router 的配置文件里我开了"LOG": true和"LOG_LEVEL": "debug",所以它会记录详细的请求信息。先找到日志文件:
find ~/.claude-code-router -type f -printf '%T@ %p\n' | sort -nr | head -20然后 tail 最新的日志:
tail -f ~/.claude-code-router/*.log ~/.claude-code-router/logs/*.log 2>/dev/null在 Claude Code 里发送一条消息,比如“帮我写一个 Python 的快速排序”,然后观察日志输出。如果看到类似taotoken-glm和glm-5的字样,说明请求确实被 Router 路由到了 TaoToken 的 GLM-5 通道。日志里通常还会包含请求的 URL、模型名称、响应状态码等信息,你可以据此确认请求是否成功。
除了看日志,你还可以在 TaoToken 的控制台里查看 API 调用记录。登录 TaoToken 官网,进入控制台,查看 API 调用日志或用量统计。如果你看到有glm-5的调用记录,并且时间戳与你发送消息的时间吻合,那就说明请求已经成功到达 TaoToken 并转发给了 GLM-5。这种方式比看 Claude Code 界面更可靠,因为它直接反映了后端通道的真实调用情况。
如果你想进一步确认 VS Code 插件实际拉起的 Claude 进程,可以在 WSL 里执行:
ps aux | grep claude你会看到类似这样的进程:
/home/xxx/.vscode-server/extensions/anthropicclaude-code-2.1.xxx/resources/native-binary/claude \ --output-format stream-json \ --input-format stream-json \ --permission-prompt-tool stdio \ --resume xxxxxxxx \ --setting-sources=user,project,local这说明 VS Code 插件通过 stdio / stream-json 和本地 Claude Code binary 通信。如果你想看这个进程的环境变量,可以执行:
PID=你的进程ID tr '\0' '\n' < /proc/$PID/environ | sort | grep -E 'ANTHROPIC|CLAUDE|OPENAI|TAOTOKEN|BASE|MODEL'重点确认里面是否有ANTHROPIC_BASE_URL=http://127.0.0.1:3456和ANTHROPIC_MODEL=taotoken-glm,glm-5。如果没有,说明 VS Code 插件没有读到你的配置,可能需要检查 settings.json 的路径,或者重启 WSL 窗口。
最后,做一次真实的对话测试。在 Claude Code 里输入一个需要模型推理的问题,比如“用 Python 实现一个 LRU 缓存,并解释时间复杂度”。如果模型能正常返回代码和解释,并且 Router 日志里出现了glm-5的调用记录,那就说明整个链路已经打通:VS Code Claude Code → WSL Claude Code CLI → Claude Code Router → TaoToken API → GLM-5。这时候你可以在 VS Code 里正常使用 Claude Code 的编码助手功能,而实际后端模型是 GLM-5。
5. 本篇常见错误排查
配置过程中最容易遇到的报错是Not logged in · Please run /login。这个报错通常意味着 Claude Code 没有读到有效的认证配置。可能的原因有几个:一是~/.claude/settings.json文件不存在或路径不对;二是 settings.json 里的env字段没有正确写入ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY;三是 VS Code 插件没有读取用户级配置,只读了项目级配置。解决办法是确认 settings.json 的路径是~/.claude/settings.json,并且内容格式正确。如果项目目录下也有.claude/settings.json,可以把同样的配置复制过去,或者删除项目级配置,让插件回退到用户级配置。
另一个常见报错是local proxy failed或连接被拒绝。这通常是因为 Router 没有启动,或者端口被占用。先执行ccr status确认 Router 是否在运行。如果没有运行,执行ccr start启动。如果端口 3456 被占用,可以修改 Router 配置里的PORT字段,同时把 Claude Code 的ANTHROPIC_BASE_URL改成对应的端口。另外,如果你在 WSL 里启动 Router,但 VS Code 插件在 Windows 侧运行,可能会遇到网络隔离问题。不过 VS Code Remote WSL 模式下,插件实际是在 WSL 里运行的,所以127.0.0.1:3456应该是通的。如果仍然不通,可以尝试用0.0.0.0监听,但要注意安全。
还有一个报错是reading choices相关的解析错误。这通常是因为 Router 返回的响应格式和 Claude Code 期望的格式不一致。Claude Code 期望的是 Anthropic 风格的响应,而 TaoToken 的 API 返回的是 OpenAI 风格的响应。Claude Code Router 内置了转换逻辑,但如果你在 Provider 配置里没有正确设置transformer,可能会导致格式不匹配。检查你的 config.json 里 Provider 的transformer字段,确保maxtoken的配置正确。如果问题依旧,可以尝试在 Router 配置里加上"use": ["openai"]之类的转换器,具体取决于 Router 的版本和文档。
如果你看到OAuth相关的错误,比如OAuth token expired或OAuth authentication failed,这说明 Claude Code 在尝试用 OAuth 方式认证,而不是用你配置的 API Key。这可能是因为 settings.json 里的ANTHROPIC_API_KEY没有生效,或者 Claude Code 的版本较新,默认走 OAuth 流程。解决办法是确认ANTHROPIC_API_KEY的值不是空,并且ANTHROPIC_BASE_URL指向了 Router。如果仍然不行,可以尝试在环境变量里加上ANTHROPIC_AUTH_TOKEN,值设为和ANTHROPIC_API_KEY一样。有些版本的 Claude Code 会优先读取ANTHROPIC_AUTH_TOKEN。
最后,如果你在 VS Code 插件里看到模型名称显示为Sonnet 4.6,但 Router 日志里确实有glm-5的调用记录,这是正常的。Claude Code 的界面显示的是它自己认为的模型名,而不是真实的后端模型。判断是否成功,永远以 Router 日志和 TaoToken 控制台的调用记录为准。如果你需要长期在编码流程里使用 GLM-5,可以考虑把 Router 做成 systemd 服务,这样每次 WSL 启动时 Router 会自动运行。下面是一个 systemd 服务的示例:
[Unit] Description=CCR Service After=network-online.target Wants=network-online.target [Service] Type=simple User=你的用户名 WorkingDirectory=/home/你的用户名 Environment=HOME=/home/你的用户名 Environment=PATH=/home/你的用户名/.nvm/versions/node/v20.20.2/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ExecStart=/bin/bash -lc 'source /home/你的用户名/.nvm/nvm.sh && ccr start' Restart=always RestartSec=5 [Install] WantedBy=multi-user.target把这份文件保存到/etc/systemd/system/ccr.service,然后执行sudo systemctl daemon-reload、sudo systemctl enable ccr、sudo systemctl start ccr。这样 Router 就会在后台常驻,VS Code 插件随时都能连上。
6. 把 TaoToken 接入 Claude Code 的长期用法
配置完成后,你可能会想把这个通道用在更多场景里。除了在 VS Code 里用 Claude Code 写代码,你还可以把 TaoToken 的 API Key 用在其他支持自定义 Base URL 的工具里。TaoToken 提供的是统一的 API 通道,你可以在控制台里创建多个 Key,分别用于不同的项目或工具。如果你需要查看模型列表或测试模型对话,可以到模型对话页面直接体验。如果你打算长期用 Claude Code 做编码,或者想跑一些 Agent 任务,可以了解一下 Coding Plan,它可能更适合高频调用的场景。
回到本文的配置,核心思路其实很简单:Claude Code 需要一组看起来像 Claude 的配置才能启动,而 Claude Code Router 负责把真正的请求转发到 TaoToken 的 GLM-5 通道。所以不要只配ANTHROPIC_BASE_URL,还要保留ANTHROPIC_API_KEY、ANTHROPIC_MODEL和ANTHROPIC_DEFAULT_HAIKU_MODEL这些参数。虽然它们在最终请求里可能只是占位,但真正生效的是 Router 配置里的Router字段。判断是否成功,不要看 Claude Code 欢迎页显示的模型名,也不要问模型“你是谁”,而是看 Router 日志和 TaoToken 控制台的调用记录。只要日志里出现taotoken-glm和glm-5,就说明 VS Code Claude Code 已经通过 Router 成功指向了 TaoToken 的 GLM-5 模型。
如果你在配置过程中遇到其他报错,可以先检查 Router 的日志,里面通常会有详细的错误信息。TaoToken 的接入文档里也有关于 API 通道和 Key 的说明,可以作为参考。把 Router 做成 systemd 服务后,你每次打开 WSL 和 VS Code 就可以直接开始编码,不需要手动启动 Router。这套方案我在多个项目里试过,稳定性不错,切换模型也只需要改 Router 配置里的Router字段,Claude Code 侧不需要重新配置。