1. 这个组合到底解决了什么问题
过去一个月我基本把 Claude Code 当成了日常主力编码工具,但有个问题一直很别扭:官方订阅配额有限,聊不了几句就提示额度不够,换模型又要单独付费。后来我把模型后端整个换成了 DeepSeek,用一套本地协议转换层把 DeepSeek V4 Pro(标题里的叫法,实际控制台里请以当前可用模型 ID 为准)接进了 Claude Code,跑通了一套不订阅 Claude 官方付费套餐的 AI 编码工作流。这个组合最大的价值不是"白嫖",而是把 Agent 型编码工具的体验和按量计费的模型成本解耦了。
Claude Code 这个工具本身值得先聊清楚。它不是普通的 AI 聊天窗口,而是一个真正能落地的编码 Agent:它能看到你的项目文件树,能读取文件内容,能直接修改代码,还能在终端里跑命令。你给它一个任务,比如"给这个模块加上单元测试",它会自己规划步骤、读取相关文件、写测试代码、运行测试、根据失败信息再修复。整个过程你只需要在关键节点确认一下。这种"会动手"的体验,和传统问答式 AI 编码工具有本质区别。
但 Claude Code 默认绑定的模型订阅成本不低,而且对一些开发者来说,为偶尔的编码辅助订阅一个付费套餐并不划算。DeepSeek 这边则恰好补上了这个位置:API 价格低、中文代码理解能力不错、开放接口标准。两边一结合,就形成了一个性价比很高的 AI 编码工作流——你保留 Claude Code 的 Agent 能力,同时把大脑换成便宜好用的第三方模型。
这篇文章适合谁?想用 Claude Code 但不想订阅官方套餐的人,手里有 DeepSeek / Qwen / GLM 等第三方 API Key 的人,以及单纯想搞明白"Claude Code 到底能不能接外部模型"的折腾型开发者。我会从原理讲到实操,再给你排查列表,照着抄就能用。
2. 接入方案选型:为什么不能直接把地址改成 DeepSeek
2.1 协议不通:Anthropic 格式与 OpenAI 格式
很多人第一个想法是:既然 Claude Code 支持配置 API 地址,那把地址改成 DeepSeek 不就行了?我第一次也是这么干的,然后把 Key 填进去,启动后直接报格式错误。
原因在于两个平台说话用的不是同一种协议。Claude Code 原生只跟 Anthropic 的 Messages API 打交道,请求和响应的数据结构是 Anthropic 定义的,包括anthropic_version头、消息格式、流式事件类型,都带着 Anthropic 的烙印。而 DeepSeek 开放的是 OpenAI 兼容格式,字段结构、认证方式、流式返回格式完全另一套。你让 Claude Code 直接拿 Anthropic 格式去请求 DeepSeek 的地址,对方根本不知道你在说什么,返回的内容它也不认识。
这就像是让一个只说英语的人和只说中文的人直接对话,中间必须有个翻译。所以正确的思路不是改一个地址,而是插一个本地协议转换层,把 Anthropic 格式翻译成 OpenAI 格式,再转给 DeepSeek,返回时再翻译回来。
2.2 方案一:claude-code-router 本地协议转换层
我最常用也最推荐的是 claude-code-router 这个开源项目。它的工作方式是在你本地跑一个轻量 HTTP 服务,Claude Code 把请求发给这个本地服务,它负责做协议转换,然后转发到你配置的模型供应商。
选它而不是自己写脚本的原因很朴素:第一,它已经把 Anthropic 的流式响应转换做完了,自己写要处理各种事件类型,非常容易漏;第二,它支持多供应商配置,DeepSeek、Qwen、GLM 这些都可以写进去,随时切换;第三,它对 Claude Code 的感知更好,可以直接用/router这类内置命令看当前路由状态。
安装方式很简单,基于 npm 全局安装,装完初始化配置就能跑。后面的实操章节我会给完整步骤。
2.3 方案二:CC Switch 做供应商管理与一键切换
如果你手上有好几家模型的 API Key,只想有个界面点来点去切换供应商,那 CC Switch 是个不错的补充工具。它本质是个 GUI 管理器,负责帮你改 Claude Code 的配置文件,把 ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL 这些环境变量一键切换。
要理解 CC Switch 的边界:它做的是"配置管理"和"供应商切换",本身不负责协议转换。如果你的目标供应商不提供 Anthropic 兼容端点,光用它是不够的,还是需要搭配 claude-code-router 这样的转换层。我实际使用中把两者配合起来了:CC Switch 管理多套 Key 和供应商配置,claude-code-router 负责把请求翻译成 OpenAI 格式。日常切换模型时,我通常直接在 Claude Code 会话里用/model命令,比切到桌面应用更快。
2.4 方案三:本地模型实现真正零成本
如果你连 API 按量付费都不想花,还有一条完全免费的路:本地模型。LM Studio 或 Ollama 都可以在本地起一个 OpenAI 兼容的服务端,加载 Qwen、Llama 这类开源模型。然后让 claude-code-router 把请求路由到http://127.0.0.1:1234这样的本地地址,Claude Code 照样能工作。
我试过用 LM Studio 加载量化后的 Qwen 系列模型跑 Claude Code,确实能跑通,整个链路是:Claude Code → 本地转换层 → LM Studio → 本地模型。好处很明显:数据不出机器、没有 token 费用、断网也能用。代价也很现实:推理速度取决于你的显卡,上下文窗口普遍偏小,做大型代码重构时会明显感觉模型脑容量不够。我的建议是,本地模型适合文档总结、代码解释、写测试这类轻量任务;正经的重构和跨文件修改,还是用 DeepSeek API 更靠谱。
3. 完整实操:从零把 Claude Code 接到 DeepSeek
3.1 环境准备:Node.js、Claude Code、转换层
第一步先检查基础环境。Claude Code 和 claude-code-router 都依赖 Node.js,建议版本 18 以上。打开终端先看版本:
node -v npm -v版本太低的话去 Node 官网装最新的 LTS 版本,避免后面装包时踩权限坑。
然后安装两个核心工具:
npm install -g @anthropic-ai/claude-code npm install -g @musistudio/claude-code-router第二个包的安装命令可能因版本更新而变化,装完跑一下claude-code-router --help确认命令名和可用参数。如果因为网络原因 npm 装不动,可以换国内镜像源,但注意镜像源的环境变量只影响 npm 下载,不影响后续 Claude Code 连接 DeepSeek。
Windows 用户这里有个常见坑:npm 全局安装路径如果没加入 PATH,装完会提示"不是内部或外部命令"。解决方案是用管理员身份打开 PowerShell,执行npm config get prefix看全局路径,然后把它加进系统 PATH。另外 PowerShell 执行脚本策略如果锁死,装完原生安装器也会报错,建议直接用 npm 方式,问题最少。
3.2 配置 DeepSeek 供应商与模型映射
转换层安装好后,需要初始化配置。不同版本的初始化方式略有差异,有的装完会自动生成一个配置模板,有的需要手动创建。以我常用的版本为例,配置文件在用户目录下的.claude-code-router/config.json,最小配置长这样:
{ "provider": "deepseek", "providers": { "deepseek": { "baseUrl": "https://api.deepseek.com", "apiKey": "sk-你的key", "models": { "deepseek-chat": { "name": "DeepSeek Chat", "maxTokens": 8192 } } } } }几个关键字段说明一下。baseUrl是 DeepSeek 官方接口地址,按官方文档填即可,如果请求时碰到 404 再尝试补/v1后缀。apiKey去 DeepSeek 控制台申请,注意不要泄露到代码仓库里。models下面的deepseek-chat是模型 ID,name是显示名称,maxTokens控制单次生成的最大长度。
这里有个需要留意的细节:Claude Code 默认会请求像claude-sonnet-4-xxxx这样的模型名,你的转换层必须能把这些请求映射到你配置的deepseek-chat上。上面这个配置里,我把 provider 设为 deepseek,并给了明确的 models 映射,转换层收到 Claude Code 发来的模型名后就知道该往 DeepSeek 的哪个模型转发。
配置完先启动转换层服务,确认它正常监听本地端口后再启动 Claude Code。我用的时候端口默认是 3456,具体以工具启动日志为准。
3.3 让 Claude Code 走转换层的三种方式
场景不同,配置环境变量的方式也不同。最简单粗暴的方式是直接写在 shell 配置里:
export ANTHROPIC_BASE_URL="http://127.0.0.1:3456" export ANTHROPIC_AUTH_TOKEN="local-token" export ANTHROPIC_MODEL="deepseek-chat" export ANTHROPIC_SMALL_FAST_MODEL="deepseek-chat"Windows PowerShell 对应写成:
$env:ANTHROPIC_BASE_URL="http://127.0.0.1:3456" $env:ANTHROPIC_AUTH_TOKEN="local-token" $env:ANTHROPIC_MODEL="deepseek-chat" $env:ANTHROPIC_SMALL_FAST_MODEL="deepseek-chat"第二种方式是把环境变量写进 Claude Code 的项目级配置文件.claude/settings.json,好处是跟着项目走,换机器不丢配置:
{ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:3456", "ANTHROPIC_AUTH_TOKEN": "local-token", "ANTHROPIC_MODEL": "deepseek-chat", "ANTHROPIC_SMALL_FAST_MODEL": "deepseek-chat" } }第三种方式是让 claude-code-router 自己接管,它会自动写入或修改 Claude Code 的配置。这种方式最省心,适合不想手动改配置的人。
这里有个环境变量优先级的问题必须提醒:shell 里 export 的变量会覆盖settings.json里的配置。你排查问题的时候如果发现改了配置文件不起作用,先检查是不是 shell 里已经 export 了同名变量。
另外,ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY是两个不同的东西。走本地转换层时,ANTHROPIC_AUTH_TOKEN填一个非空字符串即可,转换层不做真实校验;但如果你同时保留了官方登录的凭据和自定义 token,Claude Code 可能会优先尝试官方认证,导致一系列权限报错。最干净的办法是备份并删除~/.claude下的官方凭据文件,只保留第三方配置。
3.4 启动验证与第一轮真实对话
全部配置完成后就可以启动验证了。先确保转换层服务在运行,然后终端里执行:
claude进入交互界面后,先敲/status或工具内置的路由状态命令,确认当前连接的 base URL 是不是本地转换层地址。然后敲/model查看当前模型是不是已经切到了 DeepSeek。
验证成功的标准不是界面显示什么,而是实际对话能不能得到回复。我建议第一轮不要问复杂问题,就让它做一件最简单的事:在项目根目录执行ls或者让它总结当前目录结构。如果它能正常列出文件并给出中文分析,说明整条链路已经通了。
我自己的第一轮测试是让它看一个 Python 项目的 README 并总结项目架构。正常情况下它会先读文件,然后用 DeepSeek 的模型能力给出结构化总结。如果你能看到输出内容里有明显的 DeepSeek 风格推理痕迹,说明请求确实走到了 DeepSeek,而不是还在走官方模型。
如果这一步报 401 或 404,先别慌,大概率是 Key 填错了或者模型 ID 不匹配,后面第五章有完整排查表。
3.5 VS Code 里的使用姿势
日常写代码不可能一直泡在终端里,所以我强烈建议把 Claude Code 装进 VS Code。官方为 VS Code 提供了 Claude Code 扩展,安装后在侧边栏就能直接呼出编码 Agent 面板。
扩展的使用逻辑和命令行完全一致,它会复用你已经配置好的环境变量和登录态。也就是说,你在终端里配置好 DeepSeek 接入后,VS Code 里打开扩展就是同样的配置,不需要二次设置。快捷键方面,macOS 是Ctrl+Cmd+C呼出面板,Windows 对应的是Ctrl+Alt+C。
在 VS Code 里我常用的工作流是:选中一段代码 → 呼出面板 → 直接输入"给这段代码补充类型标注"或"重构成函数式风格"。模型会基于当前选中的代码和项目上下文操作,而不是像聊天窗口那样脱离项目空谈。这种选代码再提问的模式,比手动在提示词里贴代码体验好得多。
4. 配置细节与工作流调优
4.1 maxTokens 与上下文窗口的取舍
接第三方模型后,最容易遇到的问题就是输出被截断。Claude Code 默认按 Anthropic 模型的能力请求输出长度,但 DeepSeek 的最大输出长度参数不一样,如果转换层没做映射或者映射的值偏大,就会看到模型回答到一半突然断掉。
解决方法是在 config.json 的模型配置里明确设置maxTokens。我实际用的值是 8192,覆盖大多数代码生成场景。如果你经常让它写大文件或长文档,可以按当前 DeepSeek 官方支持的输出上限往上调,但要注意设置得过高时,部分模型会忽略这个值并回退到自己的上限。
上下文窗口方面,DeepSeek 官方 API 的上下文长度以文档为准,一般足够容纳中小型项目的多个文件。需要注意的是,Claude Code 会把你的项目文件内容、终端输出、历史对话都塞进上下文,项目大了之后会达到模型上限。表现就是它开始"忘记"前面读过的文件内容,或者在总结时遗漏关键信息。我的应对方法是:大项目拆成小任务,每次聚焦一个模块;把无关文件从工作目录排除,减少上下文污染。
4.2 模型映射与 API Key 的优先级陷阱
Claude Code 与转换层的模型映射关系,是这套工作流里最值得理解的部分。你在 Claude Code 里看到的模型名,可能仍然是claude-sonnet-4-xxx这类名字,但实际后端已经被转换层转发到了 DeepSeek。这不代表你在白嫖官方模型,只是转换层把名字"翻译"了一遍,真正的推理发生在你的第三方 API 账户上。
所以排查问题时,不要看界面显示,要看路由状态。claude-code-router 会输出当前路由到哪个供应商哪个模型,这个信息最可靠。
API Key 优先级的坑也要说清楚。Claude Code 读取认证信息的顺序,ANTHROPIC_AUTH_TOKEN优先于ANTHROPIC_API_KEY。如果你同时设置了两个,会优先用前者。在第三方模型接入场景里,这个优先级是好事,因为转换层只认AUTH_TOKEN这个字段。但如果你某天想切回官方模型,忘了删掉这个 token,就会发现一直连接不上官方账户,因为请求全被转发到本地转换层了。
4.3 不同任务下的模型选择(DeepSeek / Qwen / GLM)
转换层最大的优势是模型供应商可切换。我实际常驻 DeepSeek,但会根据任务类型换用不同模型,这里给一份我的参考表:
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 大型重构、跨文件改动 | DeepSeek | 推理能力强、上下文大、代码理解稳定 |
| 写单元测试、脚本 | Qwen | 速度快、中文理解好、成本更低 |
| 代码解释、文档生成 | GLM | 中文文档能力强、风格更符合中文团队习惯 |
| 离线轻量任务 | 本地 Qwen 量化版 | 免费、私密、断网可用 |
切换方式在 Claude Code 会话内执行/model命令,输入目标模型 ID 即可。注意切换后最好重新开始一个会话,因为之前的上下文是按上一个模型的格式组织的,强行续聊偶尔会出现格式错乱。
4.4 安全使用习惯
这套工作流让你绕过了官方订阅,但也意味着代码数据会发往第三方 API。我的建议是:公司项目或涉及敏感数据的代码,优先用本地模型方案或官方企业版;个人开源项目可以用第三方 API。不要在配置里硬编码 API Key,统一走环境变量;.claude/settings.json如果会提交到仓库,记得把含 Key 的字段用环境变量引用替代。
另外,Claude Code 有自动执行终端命令的能力,权限控制默认是会逐条询问你。不要为了省事直接开--dangerously-skip-permissions,尤其是在接第三方模型时,模型的输出不可控性比官方模型更高。我看过一些翻车案例,模型建议执行rm -rf类危险命令时有人直接点了允许,后果很严重。正确的做法是:让它提交改动前先展示 diff,你人工 review 后再确认执行。
5. 常见问题与排查实录
5.1 登录与权限类报错
那是我第一次接入第三方模型时最头疼的报错。your organization has disabled claude subscription access for claude code这种提示,表面看是组织策略限制,实际原因往往是你残留了官方登录凭据,Claude Code 优先走了官方认证路径,然后被官方拦截。
排查顺序:先删掉~/.claude目录下的.credentials.json等凭据文件,再确认环境变量里只有ANTHROPIC_AUTH_TOKEN而没有ANTHROPIC_API_KEY,最后重启 Claude Code 重新进入会话。记住,第三方模型接入场景下,官方登录态是多余且有害的。
还有一类报错是claude subscription access相关,处理思路同上。只要确认请求是发给本地转换层的,这类权限报错基本不会再出现。
5.2 网络与连接类报错
Windows 上常见的internetopenurl() failed 0x800xxxxx报错,出现在 Claude Code 尝试调用系统 URL 协议启动器的时候,通常和系统代理配置或默认浏览器关联异常有关。解决办法是重置系统默认浏览器关联,或者在系统代理设置里把127.0.0.1:3456加入绕过列表,确保本地转换层不会被系统代理截走。
连接超时和connection refused的问题更常见:本地转换层服务没启动,或者端口不对。先确认转换层进程还在,再看它监听的端口和你环境变量里的ANTHROPIC_BASE_URL是否一致。本地服务多开时会抢占端口,如果同时起了多个转换层实例,后面的会报端口占用,其实不影响使用,但容易混淆你连的是哪个。
5.3 Windows 环境专项问题
搜索里很多人遇到"Claude Code 与 64 位 Windows 不兼容"的报错,这类问题大多出在安装包阶段。优先用 npm 安装方式而不是 exe 安装包,npm 方式不依赖安装架构匹配。如果一定要用安装包,下载时确认是 x64 版本而不是 ARM 版本。
npm 全局路径问题在 Windows 上也很常见。装完命令找不到,大概率是 npm 全局 bin 目录没在系统 PATH 里。设置一下全局路径并重开终端即可。PowerShell 执行策略限制时,改用管理员身份运行一次Set-ExecutionPolicy RemoteSigned,再执行安装命令。
5.4 模型响应异常类问题
响应截断在前面聊过,核心是maxTokens映射。如果模型经常答一半就停,去 config.json 里把对应模型的maxTokens调大,并确认转换层版本支持这个字段。
404 或model not found报错,说明模型 ID 没匹配上。DeepSeek 官方模型 ID 以控制台为准,常见的是deepseek-chat和deepseek-reasoner系列。确认你配置里的模型 ID 和官方文档一致。
还有一种情况是两个不同的模型供应商都写了"name": "default",转换层分不清该路由到谁。给每个模型的name起唯一的名字,并在 config 里显式指定provider字段。
最后补充一个排查技巧:遇到任何看不懂的报错,先去转换层的终端看日志。它会打印收到的请求和转发到上游的响应状态码,比 Claude Code 的报错信息有用得多。我遇到过几次 Claude Code 侧只显示"请求失败",实际上是上游 DeepSeek 返回了 402 余额不足,日志里一眼就能看出来。
6. 最后:我对这套工作流的几点真实体会
折腾完这套接入后,我自己日常的编码习惯发生了一些变化。以前碰到不熟悉的库或框架,第一反应是去翻文档、查示例、跑 demo,现在更多是直接打开 Claude Code,让它先读项目依赖和现有代码,再给我一个改造方案。模型能力不是万能的,但在这个工作流里,它确实承担了大量体力活——写重复代码、补测试、解释历史遗留模块的逻辑,这些都干得有模有样。
有一点需要诚实地说:DeepSeek 的模型跟 Claude 官方最新模型的巅峰水平还是有差距,尤其在极其复杂的多文件架构调整上,偶尔会给出不够优雅的方案。但对我个人而言,这个成本方案的优势太明显了:不需要固定订阅费,按实际使用量付费,高峰期也不用心疼额度。预算敏感型开发者,这套组合拳值得一试。
最后再提一个我踩过几次坑后总结的小技巧:接入第三方模型后,把.claude/settings.json里的配置视为纯净的"项目环境变量",不要在仓库里提交含敏感 Key 的版本;同时给ANTHROPIC_BASE_URL写死本地地址,防止某天环境变量被全局配置覆盖后,Claude Code 偷偷去请求官方服务,然后给你弹一堆看不懂的订阅提示。工作流这东西,跑通是一回事,跑稳是另一回事,希望这篇文章能帮你少走点弯路。