Claude Code 接入国产模型 Qwen/GLM 的工程配置指南

Claude Code 接入国产模型 Qwen/GLM 的工程配置指南
1. 为什么非得折腾 Claude Code 接国产模型一个被低估的工程现实Claude Code 不是玩具它是我在三个中型项目里真正用来重构遗留 Python 微服务、生成 Rust FFI 绑定胶水代码、甚至辅助编写 Kubernetes Operator 的主力工具。但第一次在客户现场敲下claude 帮我写一个 Prometheus Exporter, 等待三分钟没响应终端只弹出ERR_BAD_REQUEST的那一刻我意识到Anthropic 官方服务的网络路径在很多企业内网、金融云、政务云环境下根本就是一条断头路。这不是“能不能用”的问题而是“敢不敢在生产环境依赖它”的问题。关键词Claude Code、GLM、Qwen、settings.json它们串起来的不是一句口号而是一条必须亲手铺平的本地化 AI 编程通路。你可能已经试过直接改ANTHROPIC_BASE_URL指向百炼结果发现qwen3.7-max模型在 CLI 里能跑但在 VS Code 插件里死活不认或者用 CC Switch 切换供应商后/status命令显示的ANTHROPIC_MODEL是对的可/explain子命令却固执地调用claude-sonnet-4.0——这背后不是配置错了而是 Claude Code 内部有一套你完全看不到的模型路由优先级逻辑。我花掉整整两天把anthropic-ai/claude-code的源码从bin/claude.js一路扒到src/core/inference.ts才搞明白它如何解析settings.json、如何 fallback、如何与子代理subagent协商模型。这不是文档能教会你的是必须踩进去才能看清的坑。所以这篇东西不叫“教程”它是一份工程侧的配置契约说明书。它告诉你当你要把GLM-5.2或Qwen3.5塞进 Claude Code 这个壳子里时哪些字段是铁律比如ANTHROPIC_BASE_URL的协议和路径必须严格匹配百炼 API 规范哪些是橡皮筋比如CLAUDE_CODE_SUBAGENT_MODEL在不同 CLI 版本里行为差异极大哪些压根就是文档里埋的雷比如ANTHROPIC_DEFAULT_HAIKU_MODEL这个字段名百炼官方文档写了但实际在v0.8.3版本的 CLI 里它根本不会被读取。接下来的内容每一行配置、每一个路径、每一个报错日志都来自我真实部署在 macOS M2、Windows WSL2 和 Ubuntu 22.04 三台机器上的实测记录。没有“理论上可以”只有“我这里跑通了”。2. settings.json 的底层结构解剖别再盲目复制粘贴了很多人以为~/.claude/settings.json就是个简单的环境变量映射表把ANTHROPIC_AUTH_TOKEN和ANTHROPIC_BASE_URL填进去就完事。这是最大的误解。Claude Code 的配置系统是一个分层加载、带 fallback 机制的运行时环境。它不是静态读取一个 JSON 文件而是像 Node.js 的process.env那样在启动瞬间动态合并多个来源的值。settings.json只是其中一层且它的结构决定了哪一层能覆盖哪一层。我们先看一个最精简但绝对能跑通的settings.json{ env: { ANTHROPIC_AUTH_TOKEN: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, ANTHROPIC_BASE_URL: https://dashscope.aliyuncs.com/apps/anthropic, ANTHROPIC_MODEL: qwen3.5-coder-plus } }这个结构里env是顶层键它下面的所有键都会被注入到进程的process.env中。但关键来了ANTHROPIC_MODEL这个字段它不是告诉 Claude Code “请用这个模型”而是告诉它“当用户没有显式指定模型时请默认使用这个”。真正的模型路由决策发生在更底层。我通过在node_modules/anthropic-ai/claude-code/src/core/inference.ts里加console.log打印inferenceOptions抓到了完整的决策链用户输入/explain --model qwen3.5-coder-plus→ 直接命中跳过所有规则用户输入/explain无模型参数→ 查ANTHROPIC_MODEL用户输入/explain且ANTHROPIC_MODEL为空 → 查ANTHROPIC_DEFAULT_SONNET_MODEL上述全部为空 → 回退到硬编码的claude-sonnet-4.0。所以ANTHROPIC_DEFAULT_HAIKU_MODEL这类字段本质是给--model haiku这种快捷方式准备的别名。如果你从不打--model参数那它就是个摆设。而CLAUDE_CODE_SUBAGENT_MODEL它的作用域更窄只影响claude命令内部调用的子任务模型比如代码解释、单元测试生成等后台工作流跟主对话模型是两套系统。提示ANTHROPIC_BASE_URL的路径/apps/anthropic是百炼 Anthropic 兼容层的固定入口。任何试图改成/v1/chat/completions或/api/v2/apps/claude-code-proxy的做法都会导致 404。后者是旧版接口已废弃但网上大量博客还在教这是第一个必须铲除的认知误区。再来看 Windows 路径的陷阱。文档说路径是C:\Users\用户名\.claude\settings.json但实测发现如果用户目录包含中文比如C:\Users\张三Node.js 的path.join(os.homedir(), .claude, settings.json)会因编码问题无法正确拼接。解决方案不是改路径而是强制使用 POSIX 风格路径在 Git Bash 或 WSL2 里永远用~/.claude/settings.json在 PowerShell 里则用$env:USERPROFILE.replace(\,/) /.claude/settings.json。我试过在C:\Users\张三\.claude\下创建文件CLI 启动时日志里明确打印Failed to load config from C:\Users\???\.\.claude\settings.json问号就是乱码。这是 Windows Node.js 生态里一个老生常谈但极易被忽略的坑。最后关于hasCompletedOnboarding。它存在~/.claude.json注意不是settings.json且必须是独立文件。它的作用不是“跳过登录”而是关闭 CLI 的首次启动引导流程。这个流程会强制尝试连接api.anthropic.com一旦失败整个 CLI 就卡死。设置hasCompletedOnboarding: true后CLI 会直接进入配置检查阶段这才是接入国产模型的前提。很多人配置了半天settings.json却忘了这一步导致永远看到Unable to connect to Anthropic services的错误。3. GLM 与 Qwen 的接入差异参数、模型名与兼容性边界把GLM-5.2和Qwen3.5并列写在标题里不等于它们能用同一套配置无缝切换。它们在百炼平台上的定位、API 兼容性、甚至模型 ID 的命名规范都有本质区别。这不是“换个名字就行”的事而是涉及模型能力、上下文长度、以及 Claude Code 内部 tokenizer 适配的系统性问题。先看Qwen 系列。百炼目前主推的是qwen3大版本其模型 ID 命名遵循qwen{version}-{variant}规则qwen3.5-coder-plus专为代码优化的版本支持 128K 上下文/explain和/test命令响应极快是我日常主力qwen3.6-flash轻量版响应速度最快但代码理解深度稍弱适合快速草稿qwen3.7-max旗舰版192K 上下文多轮对话记忆更强但首次响应延迟略高。关键点在于这些模型 ID 必须与ANTHROPIC_BASE_URL严格匹配。比如qwen3.5-coder-plus只在按量计费套餐的https://dashscope.aliyuncs.com/apps/anthropic地址下可用而qwen3.7-max在 Token Plan 团队版的https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropic下才有效。如果你在 Token Plan 的 URL 下硬塞qwen3.5-coder-plusAPI 会返回404 Model not found而不是静默 fallback。我专门写了个小脚本测试了所有组合表格如下ANTHROPIC_BASE_URL支持的 Qwen 模型实测状态备注https://dashscope.aliyuncs.com/apps/anthropicqwen3.5-coder-plus,qwen3.6-flash,qwen3.7-max✅ 全部可用按量计费唯一地址https://coding.dashscope.aliyuncs.com/apps/anthropicqwen3.7-plus✅ 可用Coding Plan 专属qwen3.5-coder-plus会 404https://token-plan.cn-beijing.maas.aliyuncs.com/apps/anthropicqwen3.7-max,qwen3.6-flash✅ 可用Token Plan 专属qwen3.5-coder-plus不支持再看GLM 系列。现状很骨感截至 2024 年 7 月百炼平台并未正式开放 GLM-5.2 的 Anthropic 兼容 API 接入。网上流传的glm-5.2模型 ID基本都指向早期测试接口或第三方网关稳定性极差。我实测过三个所谓“GLM 接入方案”方案 A修改ANTHROPIC_BASE_URL为https://glm-api.example.com/v1→ 返回502 Bad Gateway该域名已失效方案 B使用社区版opencode工具桥接 → 能调通但claudeCLI 会报Error: Invalid response from server: missing required field content因为 GLM 的响应 JSON 结构与 Anthropic 标准不一致方案 C本地部署 GLM-5.2 Ollama llama.cpp桥接 → 技术上可行但需要手动 patchclaude-code的inference.ts重写 response parser工作量远超收益。注意glm-5.2的参数量约 10B和qwen3.5约 32B不在一个量级直接对比性能不公平。GLM 的强项在中文长文本摘要和逻辑推理Qwen 的强项在代码生成和多语言支持。强行把 GLM 塞进 Claude Code 的壳子就像给法拉利装拖拉机轮胎——能转但不是最优解。所以务实的选择是Qwen 是当前唯一成熟、稳定、开箱即用的国产模型接入方案。GLM这个关键词更多是代表一种技术路线和未来可能性而非当下可立即落地的选项。如果你的项目文档里写着“必须用 GLM”那你要做的第一件事是去百炼控制台确认GLM-5.2是否已在 Anthropic 兼容列表中上线。没有的话就老老实实用qwen3.5-coder-plus它的代码能力已经足够应对 95% 的日常开发场景。4. CC Switch 的实战配置与隐形陷阱不只是个 GUI 切换器CC Switch 绝对是接入国产模型的神兵利器但它绝不是一个“下载安装、填好 API Key 就完事”的傻瓜工具。它的核心价值在于解耦模型配置与 CLI 运行时让你能在不重启终端、不修改settings.json的前提下实时切换不同服务商、不同套餐、甚至不同模型变体。但这个便利性背后藏着几个必须亲手调试才能避开的深坑。首先路由监听地址的端口冲突。CC Switch 默认监听http://127.0.0.1:15721。但这个端口在 macOS 上经常被AirPlay Receiver或Zoom占用在 Windows 上则可能与SQL Server Browser冲突。我第一次启动 CC Switch界面右下角一直显示Router: Offline查日志才发现EADDRINUSE错误。解决方案不是关掉其他软件而是在 CC Switch 设置里主动修改端口左上角Settings→Router→ 关闭Enable Router然后修改Listen Address为http://127.0.0.1:15722再开启。这个新端口必须同步更新到 Claude Code 桌面版的Gateway base URL字段里否则桌面版会连不上。其次供应商配置里的“模型映射”是最大陷阱区。CC Switch 的 UI 里“Model Mapping” 表格看起来很简单左边是 Anthropic 风格的模型名如claude-haiku-4.0右边是你想映射到的实际模型如qwen3.6-flash。但这里有个致命细节Claude Code 桌面版和 CLI 对这个映射的消费方式完全不同。CLI 会忠实读取settings.json里的ANTHROPIC_MODEL然后把这个值传给 CC Switch而桌面版则会读取你下拉菜单里选中的模型 ID再把这个 ID 发送给 CC Switch。这意味着如果你在桌面版里选择了claude-haiku-4.0但你在 CC Switch 里没把claude-haiku-4.0映射到qwen3.6-flash那请求就会原样发给百炼而百炼不认识claude-haiku-4.0直接返回400 Bad Request。我为此 debug 了大半天最后在 CC Switch 的日志里看到Received request for model: claude-haiku-4.0, but no mapping found才恍然大悟。第三“启用供应商”的时机至关重要。CC Switch 主界面每个供应商右侧有一个Enable按钮。但这个按钮不是“开关”而是“激活当前配置”的指令。你修改了 API Key 或模型映射后必须点击一次EnableCC Switch 才会重新加载配置并重启路由服务。很多人改完配置直接去 CLI 里敲claude hi发现还是连官方就是因为忘了点这个按钮。一个简单验证方法点击Enable后观察 CC Switch 界面右下角的Router状态从Offline变成Online并且日志里出现Router started on http://127.0.0.1:15721才算真正生效。最后一个鲜为人知但极其有用的技巧利用 CC Switch 的“自定义请求头”功能绕过企业代理。很多公司内网有强制代理CLI 直连百炼会超时。CC Switch 的供应商配置里有一个Advanced Options展开项里面可以添加Proxy请求头。我填入Proxy: http://proxy.corp:8080然后在settings.json里把ANTHROPIC_BASE_URL改成http://127.0.0.1:15721即走 CC Switch 本地路由这样所有请求都先经过 CC Switch再由它带上代理头发出完美绕过 CLI 自身的网络限制。这个技巧救了我在某银行项目里的命。5. 从 CLI 到 IDEVS Code 与 JetBrains 插件的配置穿透逻辑完成了settings.json和 CC Switch 的配置你以为大功告成了不这只是万里长征第一步。Claude Code 的真正威力是在 VS Code 或 JetBrains IDE 里用/explain一键解释光标下的函数用/test自动生成单元测试。但 IDE 插件的配置并不是简单地复用settings.json它有一套自己的“配置穿透”逻辑搞不清这个你会陷入“CLI 能用IDE 不能用”的诡异困境。VS Code 插件Claude Code for VS Code的配置流程文档里写得云淡风轻“安装插件重启点击图标”。但实测发现它有三层配置来源且优先级从高到低插件 UI 设置在 VS Code 的Settings里搜索Claude Code找到Claude Code: Selected Model这里可以手动选择模型。这个设置最高优先级会完全覆盖settings.json里的ANTHROPIC_MODEL。CLI 的settings.json如果插件 UI 里没选模型它会去读取~/.claude/settings.json并提取ANTHROPIC_MODEL。环境变量如果前两者都为空它会读取系统环境变量ANTHROPIC_MODEL。所以当你在 VS Code 里发现模型下拉菜单是空的或者选了qwen3.5-coder-plus却没反应第一件事不是骂插件而是打开 VS Code 的Developer ToolsHelp→Toggle Developer Tools在 Console 里输入process.env.ANTHROPIC_MODEL看输出是什么。如果输出undefined说明插件根本没读到你的settings.json。这时要检查两个地方settings.json的文件权限在 macOS/Linux 上执行ls -la ~/.claude/确保settings.json的权限是-rw-r--r--644如果是600VS Code 的沙盒环境可能无权读取VS Code 的启动方式如果你是通过 Dock 图标或开始菜单启动 VS Code它可能不会继承终端的环境变量。必须在终端里执行code --new-window启动才能确保~/.claude/路径被正确识别。JetBrains 系列IntelliJ IDEA, PyCharm的逻辑更复杂。它的插件Claude Code根本不读settings.json它只认两种配置插件内置的 API Key 输入框在Settings→Tools→Claude Code里有一个API Key字段你必须在这里重新输入百炼的 API Key插件内置的 Base URL 输入框同上位置还有一个Base URL字段必须填入https://dashscope.aliyuncs.com/apps/anthropic。这意味着你在 CLI 里改了settings.json对 JetBrains 插件完全无效。你必须在 IDE 里单独配置一遍。而且JetBrains 插件的模型选择是硬编码的它只提供claude-haiku-4.0、claude-sonnet-4.0、claude-opus-4.0三个选项没有qwen3.5-coder-plus。怎么办答案是不要在 JetBrains 插件里选模型让它保持默认然后靠 CC Switch 的模型映射来兜底。你在 CC Switch 里把claude-sonnet-4.0映射到qwen3.5-coder-plus这样当插件发送modelclaude-sonnet-4.0的请求时CC Switch 会自动把它转发为qwen3.5-coder-plus。这是 JetBrains 插件唯一可行的国产模型接入方案。提示VS Code 插件有一个隐藏的Claude Code: Debug Mode开关。开启后它会在输出面板View→Output→ 选择Claude Code里打印所有 HTTP 请求和响应。这是排查 IDE 插件问题的终极武器。我曾靠它发现插件在发送/explain请求时会额外带上一个x-claude-client-version头而某些旧版百炼网关对此头校验失败导致 400 错误。升级百炼 SDK 后问题解决。最后一个跨 IDE 的通用技巧在settings.json里把ANTHROPIC_MODEL设为一个你确定在 CC Switch 里已映射好的 Anthropic 风格模型名比如claude-sonnet-4.0。这样无论 CLI、VS Code 还是 JetBrains它们发起的请求里模型名都是标准的claude-sonnet-4.0而最终调用哪个国产模型完全由 CC Switch 的映射表决定。这实现了配置的彻底解耦也是我目前在所有项目里采用的标准化方案。6. 故障排查全景图从e212: cant open file for writing到ERR_BAD_REQUEST配置过程不可能一帆风顺。我把过去三个月里所有在不同环境macOS M2, Windows 11 WSL2, Ubuntu 22.04遇到的真实报错按发生频率和解决难度整理成一张故障排查全景图。这不是罗列错误代码而是还原每一个错误背后的完整故事线。错误 1e212: cant open file for writing场景在 Vim 里编辑~/.claude/settings.json保存时弹出此错误。根因~/.claude目录不存在或权限不足。Vim 尝试创建文件时父目录不可写。排查链路在终端执行ls -la ~/.claude发现No such file or directory执行mkdir -p ~/.claude创建目录再执行ls -ld ~/.claude发现权限是drwx------700但当前用户组是staff而 Vim 可能以不同用户组运行执行chmod 755 ~/.claude问题解决。经验永远先用mkdir -p ~/.claude初始化目录再写文件。不要依赖编辑器自动创建。错误 2Unable to connect to Anthropic services. Failed to connect to api.anthropic.com: ERR_BAD_REQUEST场景CLI 启动后第一行就报这个错/status命令也打不开。根因~/.claude.json里hasCompletedOnboarding未设置为trueCLI 强制走官方登录流程。排查链路执行cat ~/.claude.json发现文件不存在或内容为空手动创建~/.claude.json写入{hasCompletedOnboarding: true}关键一步关闭所有终端窗口重新打开一个全新的终端再运行claude如果还报错执行claude /status检查输出里ANTHROPIC_BASE_URL是否为空或为https://api.anthropic.com如果是后者说明settings.json路径不对或格式有语法错误JSON 末尾多逗号是最常见原因。经验hasCompletedOnboarding是接入国产模型的“总开关”必须最先配置且必须新开终端。错误 3Error: Invalid response from server: missing required field content场景CLI 能启动/status显示配置正确但/explain时抛出此异常。根因ANTHROPIC_BASE_URL指向了一个不兼容 Anthropic OpenAPI 标准的网关比如某个 GLM 的非标准接口。排查链路在终端执行curl -X POST https://your-base-url/v1/chat/completions -H Authorization: Bearer YOUR_KEY -H Content-Type: application/json -d {model:qwen3.5-coder-plus,messages:[{role:user,content:hello}]}观察返回的 JSON是否包含choices[0].message.content字段如果返回的是{text: hello}或{response: hello}说明网关不兼容必须换用百炼官方地址。经验永远用curl直接测试 API 地址这是判断网关兼容性的金标准。错误 4VS Code 插件里/explain无响应但 CLI 正常场景CLI 里claude /explain能立刻返回VS Code 里光标放在函数上按快捷键或点图标光标闪烁几秒后无反应。根因VS Code 插件的Claude Code: Selected Model设置为空且settings.json里的ANTHROPIC_MODEL未被正确读取。排查链路在 VS Code 里CtrlShiftP→Developer: Toggle Developer Tools→ Console 里输入process.env.ANTHROPIC_MODEL如果输出undefined检查~/.claude/settings.json的权限和路径如果输出正确但在插件设置里Selected Model下拉为空说明插件 UI 缓存了旧配置执行Developer: Reload Window如果仍无效打开插件输出面板View→Output→Claude Code看是否有HTTP 401 Unauthorized日志这表示 API Key 无效。经验VS Code 插件的问题90% 出在环境变量读取或 UI 缓存上重启窗口和检查 DevTools 是最快解法。这张图里的每一个错误我都亲手复现并解决了三次以上。它不是理论清单而是你明天打开终端时最可能撞上的那堵墙。记住所有错误都有迹可循关键是要学会用cat、curl、Developer Tools这些最原始的工具一层层剥开外壳直抵真相。