5分钟搞定 Claude Code 接入本地大模型:TaoToken 统一 Key 配置实战
1. 为什么要在本地跑 Claude CodeClaude Code 是目前终端里体验最顺手的编码 Agent 之一但直接连官方服务有两个现实问题一是网络链路不稳定二是长会话的 Token 消耗很快。如果你手上正好有一台带 GPU 的机器或者像 GB10 这类小盒子把模型放到本地跑再让 Claude Code 指过去就能把这两件事一起解决。核心思路其实就一句话Claude Code 认的是ANTHROPIC_BASE_URL这个环境变量只要有一个能说 Anthropic 协议的网关顶在前面后面接什么模型都行。本地大模型比如 Qwen3-Coder-30B通常只暴露 OpenAI 风格的/v1/chat/completions而 Claude Code 会发一些 OpenAI 风格不支持的字段所以中间需要一个转换层。LiteLLM 就是干这个的它能把 Anthropic 请求翻译成 OpenAI 请求再转发给 TensorRT-LLM 或 vLLM 起的推理服务。这篇面向的是已经能在本地把模型跑起来、但卡在 Claude Code 接入这一步的开发者。我会给出可复制的settings.json骨架、LiteLLM 的config.yaml、连通性验证命令以及几个我实际踩过的报错。如果你本地模型还没部署先把推理服务跑通再回来后面的配置才有意义。另外提一句如果你不想维护本地网关或者想先用一个统一 Key 把链路跑通再决定要不要本地化TaoToken 提供了一个兼容 Anthropic 协议的入口配置方式和本地 LiteLLM 完全一致只是把ANTHROPIC_BASE_URL换成它的地址即可。下面会分别给出两种写法。2. TaoToken 前置统一 Key 与地址准备在动手改配置之前先把「Key 从哪来、地址填什么」这件事定下来。Claude Code 需要两个环境变量ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN。前者是网关地址后者是鉴权令牌。如果你走 TaoToken 这条线先去控制台创建一个 API Key。地址是https://taotoken.net/api-keys登录后在密钥管理页新建一个复制出来形如sk-开头的字符串。这个 Key 就是后面ANTHROPIC_AUTH_TOKEN的值。对应的ANTHROPIC_BASE_URL填https://taotoken.net/api注意这里不要带任何查询参数Claude Code 会自己在后面拼/v1/messages。如果你走本地 LiteLLM 这条线ANTHROPIC_AUTH_TOKEN可以随便填一个占位符比如internal因为 LiteLLM 默认不校验这个字段除非你在 config 里开了 master_key。ANTHROPIC_BASE_URL填http://localhost:4000端口和你启动 LiteLLM 时指定的保持一致。两条线的区别只在于地址和 Key 的来源Claude Code 侧的配置结构完全一样。我建议你先用 TaoToken 把 Claude Code 的配置跑通确认settings.json写对了再把地址切到本地 LiteLLM这样排错时能明确知道问题出在客户端配置还是网关。有一点要注意TaoToken 的 Key 和本地 LiteLLM 的占位符不要混用。如果你在settings.json里写了 TaoToken 的 Key但ANTHROPIC_BASE_URL指向localhost:4000LiteLLM 会把这个 Key 当成无效凭证透传给后端报 401。反过来也一样。配置切换时两个变量一起改。3. 可复制配置settings.json 与 LiteLLM config.yamlClaude Code 的配置分两层一层是 Claude Code 自己的settings.json决定它往哪个地址发请求另一层是 LiteLLM 的config.yaml决定请求怎么翻译、转发给哪个模型。先把 LiteLLM 这层配好。3.1 LiteLLM config.yaml 骨架在 Windows 上我习惯把配置放在C:\Users\你\.litellm\config.yaml。核心是model_list里把 Claude Code 会请求的模型名映射到本地推理服务的真实模型名。Claude Code 默认会请求claude-sonnet-4-5这类名字所以你要么在启动时用--model指定要么在 config 里把这些名字都映射一遍。model_list: - model_name: qwen3-coder-30b litellm_params: model: openai/Qwen3-Coder-30B-A3B-Instruct api_base: http://192.168.8.20:8100/v1 api_key: internal drop_params: true max_tokens: 66912 - model_name: claude-sonnet-4-5 litellm_params: model: openai/Qwen3-Coder-30B-A3B-Instruct api_base: http://192.168.8.20:8100/v1 api_key: internal drop_params: true max_tokens: 66912 litellm_settings: drop_params: true truncate_prompt_tokens: 66912 suppress_error_logs: true strict_param_validation: false几个参数值得单独说。drop_params: true是关键Claude Code 会发thinking、metadata这类 OpenAI 不认的字段不丢弃就会 400。truncate_prompt_tokens设成和推理服务的max_num_tokens一致避免超长上下文被后端直接拒绝。strict_param_validation: false让 LiteLLM 对未知参数宽容一点减少调试期的噪音。api_base指向你本地推理服务的地址。TensorRT-LLM 或 vLLM 起服务时通常会暴露http://ip:8100/v1端口按你实际启动参数改。api_key填internal是因为本地服务一般不校验但 LiteLLM 要求这个字段非空。3.2 启动 LiteLLMWindows 下先激活虚拟环境再启动。命令如下C:\Users\nicex\.litellm\litellm-env\Scripts\Activate.ps1 pip install litellm[proxy] litellm --config C:\Users\nicex\.litellm\config.yaml --port 4000启动后终端会打印一行Uvicorn running on http://0.0.0.0:4000看到这行说明网关起来了。如果报Address already in use换个端口比如--port 4001同时记得改ANTHROPIC_BASE_URL。3.3 Claude Code settings.json 骨架Claude Code 的配置文件在用户目录下的.claude/settings.json。如果你只想临时试用环境变量也行但写进settings.json更稳重启终端不丢。{ env: { ANTHROPIC_BASE_URL: http://localhost:4000, ANTHROPIC_AUTH_TOKEN: internal, ANTHROPIC_MODEL: qwen3-coder-30b } }如果你走 TaoToken把ANTHROPIC_BASE_URL换成https://taotoken.net/apiANTHROPIC_AUTH_TOKEN换成你在控制台创建的 KeyANTHROPIC_MODEL换成你想用的模型名。ANTHROPIC_MODEL这一项是可选的不写的话启动时用--model指定也行但写进去省事。注意settings.json里的env字段是 Claude Code 启动时注入的环境变量优先级高于系统环境变量。如果你之前用$env:ANTHROPIC_BASE_URL设过记得清掉否则可能互相覆盖。4. 验证请求与成功结果配置写完别急着开 Claude Code先用 curl 打一下 LiteLLM 的 Anthropic 端点确认网关能正常翻译。这一步能省掉大量「到底是客户端问题还是网关问题」的纠结。4.1 验证 LiteLLM 网关LiteLLM 暴露的 Anthropic 兼容端点是/v1/messages。用 curl 发一个最小请求curl -X POST http://localhost:4000/v1/messages \ -H Content-Type: application/json \ -H x-api-key: internal \ -H anthropic-version: 2023-06-01 \ -d { model: qwen3-coder-30b, max_tokens: 64, messages: [{role: user, content: 只回复两个字通了}] }如果返回体里有content: [{type: text, text: 通了}]这样的结构说明 LiteLLM 到本地模型的链路是通的。如果返回 400 且提示Unsupported parameter回去检查drop_params有没有生效。如果返回 500 且提示连接超时说明api_base填错了或者本地推理服务没起来。4.2 验证 Claude Code 侧网关通了之后在终端里直接启动 Claude Codeclaude --model qwen3-coder-30b进去之后随便问一句「当前目录有哪些文件」看它能不能正常调用工具、返回结果。如果 Claude Code 卡在Connecting...不动多半是ANTHROPIC_BASE_URL没生效用claude --debug启动能看到它实际请求的地址。成功的话你会看到 Claude Code 正常输出并且本地推理服务的日志里能看到请求进来。这时候可以试着让它改一个小文件验证工具调用链路也是通的。我实测下来Qwen3-Coder-30B 在 66912 上下文下跑常规编码任务够用但如果你要它读大文件上下文还是容易吃紧truncate_prompt_tokens设小了会截断设大了后端可能 OOM这个值要按你显存调。5. 本篇常见报错排查下面这几个是我在配 Claude Code LiteLLM TensorRT-LLM 时实际撞到的按出现频率排序。5.1 400 Unsupported parameter: thinkingClaude Code 会发thinking字段OpenAI 风格后端不认。解决方式是确保config.yaml里drop_params: true同时出现在litellm_params和litellm_settings两处。只写一处有时候不生效这是 LiteLLM 的已知行为。5.2 401 Invalid API key分两种情况。如果你走本地 LiteLLM检查ANTHROPIC_AUTH_TOKEN是不是和 config 里的api_key一致或者干脆都填internal。如果你走 TaoToken检查 Key 有没有复制完整、有没有多余空格。还有一种情况是ANTHROPIC_BASE_URL和 Key 来源不匹配比如地址指向 localhost 但 Key 是 TaoToken 的这种必报 401。5.3 上下文截断导致回答不完整现象是 Claude Code 读到一半突然说「文件太长」或者回答明显被切断。这是truncate_prompt_tokens设得比实际需求小。把它调到和推理服务max_num_tokens一致比如 66912。但要注意这个值受显存限制调太大后端会 OOM需要你在显存和上下文之间找平衡。5.4 Connection refusedcurl http://localhost:4000/v1/messages直接连不上说明 LiteLLM 没起来或者端口不对。先确认终端里Uvicorn running on那行还在如果进程挂了看报错日志。Windows 上还有一种情况是防火墙拦了 4000 端口换端口或者放行即可。5.5 Claude Code 忽略 settings.json如果你改了settings.json但 Claude Code 行为没变先确认文件路径对不对。用户级配置在~/.claude/settings.json项目级在项目根目录的.claude/settings.json。项目级优先级更高如果你在项目里也放了一份会覆盖用户级。用claude --debug能看到它加载了哪个文件。6. 后续怎么用从本地到统一 Key链路跑通之后日常使用其实就两种模式。一种是纯本地ANTHROPIC_BASE_URL指向localhost:4000适合对数据不出内网有要求的场景缺点是模型能力受本地硬件限制。另一种是切到 TaoToken把地址换成https://taotoken.net/apiKey 换成控制台创建的这样 Claude Code 的配置结构不变但背后可以用到更强的模型适合本地模型搞不定的复杂任务。切换的时候只改settings.json里那两个字段就行LiteLLM 那层可以留着不动需要本地的时候再切回来。如果你还没决定要不要长期本地化建议先用 TaoToken 把 Claude Code 的配置和验证流程走一遍确认客户端没问题再花时间调本地推理服务。接入文档在https://taotoken.net/doc里面有各语言的调用示例配置卡住的时候对着看比猜快。最后留一个实用习惯每次改完settings.json先用claude --debug启动一次看它打印的 base URL 和 model 是不是你期望的。这个动作花不了十秒但能省掉很多「明明改了却没生效」的困惑。