手摸手给 Claude Code 换芯:GLM + Headroom + cc-switch 省钱接入指南

发布时间:2026/7/3 2:41:04

手摸手给 Claude Code 换芯:GLM + Headroom + cc-switch 省钱接入指南 手摸手给 Claude Code 换芯GLM Headroom cc-switch 省钱接入指南摘要把 Claude Code 的 API 调用链路换成国产智谱 GLM同时用 Headroom 压缩上下文进一步降低 token 消耗。本文记录完整的搭建过程与踩坑经验。为什么要这么折腾Claude Code 用起来确实爽但 Claude API 的价格摆在那里——尤其是长上下文对话token 跑得飞快。国内智谱 GLM 提供了 Anthropic 兼容接口可以完全替代 Claude 的模型层价格低了一大截。当然你想继续用 Claude 也可以这个方案同样兼容。但光替换模型还不够。Claude Code 默认会把完整对话历史每次都原封不动发上去如果能在中间加一层压缩代理把冗余上下文剪掉token 消耗还能再省一笔。所以最终的链路设计是这样的Claude Code → Headroom (:8787上下文压缩) → cc-switch (:15721注入 GLM key) → https://open.bigmodel.cn/api/anthropic (glm-5.2)三个组件各司其职HeadroomHTTP 代理负责压缩发往上游的上下文内容省 token。cc-switchGUI 应用本地代理:15721保管真实的 GLM API key并把 Claude 的各模型名映射成glm-5.2。GLM智谱开放平台提供的 Anthropic 兼容接口。前置条件macOSApple Silicon / Intel 均可已安装 cc-switch/Applications/CC Switch.app并配置好一个 GLM provider本文使用 Anthropic 兼容模式已有智谱 API key在 open.bigmodel.cn 获取系统自带 Python 3.9 不够用Headroom 需要 Python ≥ 3.10所以需要用uv单独建一个 Python 3.12 的虚拟环境第一步安装 uvHeadroom 通过uv安装。如果还没装 uvcurl-LsSfhttps://astral.sh/uv/install.sh|sh安装后 uv 在~/.local/bin/uv确认一下~/.local/bin/uv--version如果提示找不到命令把~/.local/bin加进PATH写入~/.zshrcexportPATH$HOME/.local/bin:$PATH第二步用 uv 创建 Python 3.12 环境并安装 Headroom系统自带的 Python 3.9 太旧了用 uv 自带的 Python 管理功能创建一个新环境uv venv ~/.headroom-venv--python3.12source~/.headroom-venv/bin/activate uv pipinstallheadroom验证安装~/.headroom-venv/bin/headroom--version# 期望输出类似headroom, version 0.28.0第三步配置 cc-switch打开 CC Switch.app添加一个 provider类型选Anthropic 兼容Base URLhttps://open.bigmodel.cn/api/anthropicAPI Key你的智谱 key模型映射把 Opus / Sonnet / Haiku / Fable 全部映射到glm-5.2然后开启本地代理enableLocalProxy: truecc-switch 会在127.0.0.1:15721启动一个代理。点应用后cc-switch 会写入~/.claude/settings.json内容大致长这样{env:{ANTHROPIC_AUTH_TOKEN:PROXY_MANAGED,ANTHROPIC_BASE_URL:http://127.0.0.1:15721,ANTHROPIC_DEFAULT_OPUS_MODEL:claude-opus-4-8,ANTHROPIC_DEFAULT_OPUS_MODEL_NAME:glm-5.2,ANTHROPIC_DEFAULT_SONNET_MODEL:claude-sonnet-4-6,ANTHROPIC_DEFAULT_SONNET_MODEL_NAME:glm-5.2,ANTHROPIC_DEFAULT_HAIKU_MODEL:claude-haiku-4-5,ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME:glm-5.2,ANTHROPIC_DEFAULT_FABLE_MODEL:glm-5.2,ANTHROPIC_DEFAULT_FABLE_MODEL_NAME:glm-5.2}}注意ANTHROPIC_AUTH_TOKEN: PROXY_MANAGED是 cc-switch 的占位符——真实的 key 存在 cc-switch 内部的 SQLite 数据库里~/.cc-switch/cc-switch.db不会以明文出现在 settings.json 中。此时链路已经是Claude Code → cc-switch → GLM了但还没有压缩。下一步把 Headroom 插到中间。第四步编写 Headroom 启动脚本新建~/.headroom-start.shcat~/.headroom-start.shEOF #!/usr/bin/env zsh source $HOME/.headroom-venv/bin/activate # Upstream cc-switch 的本地代理负责注入 GLM key export ANTHROPIC_TARGET_API_URLhttp://127.0.0.1:15721 export HEADROOM_HOST127.0.0.1 # 输出压缩默认关掉设为 1 启用 export HEADROOM_OUTPUT_SHAPER${HEADROOM_OUTPUT_SHAPER:-0} # 跳过上游可达性检查——cc-switch 是 loopback 代理 # Headroom 的 /readyz 探活可能误报 export HEADROOM_SKIP_UPSTREAM_CHECK1 exec headroom proxy --port 8787 --host 127.0.0.1 EOFchmodx ~/.headroom-start.sh几个重要的环境变量ANTHROPIC_TARGET_API_URL指向 cc-switch:15721而不是直连 GLM——key 注入仍由 cc-switch 负责Headroom 只管压缩和转发。HEADROOM_SKIP_UPSTREAM_CHECK1cc-switch 是 loopback 代理Headroom 对它做/readyz探活会误报关掉换手动验证。HEADROOM_OUTPUT_SHAPER默认0不压缩输出想连模型回包一起压缩就设1。先手动跑一次确认能起来~/.headroom-start.sh# 另开终端验证curl-shttp://127.0.0.1:8787/livez确认无误后CtrlC停掉下一步交给 launchd 托管。第五步用 launchd 设置开机自启创建~/Library/LaunchAgents/com.headroom.proxy.plistcat~/Library/LaunchAgents/com.headroom.proxy.plistEOF ?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyLabel/key stringcom.headroom.proxy/string keyProgramArguments/key array string/bin/zsh/string string__HOME__/.headroom-start.sh/string /array keyRunAtLoad/key true/ keyKeepAlive/key true/ keyThrottleInterval/key integer10/integer keyStandardOutPath/key string/tmp/headroom-proxy.log/string keyStandardErrorPath/key string/tmp/headroom-proxy.log/string keyProcessType/key stringBackground/string /dict /plist EOFsed-is|__HOME__|$HOME|~/Library/LaunchAgents/com.headroom.proxy.plist加载并启动launchctl load ~/Library/LaunchAgents/com.headroom.proxy.plist launchctl list|grepheadroom看到com.headroom.proxy出现在列表里就对了。plist 的几个关键配置说明配置项作用RunAtLoadtrue开机或加载时自动启动KeepAlivetrue进程意外退出自动拉起ThrottleInterval10崩溃重启最小间隔 10s防止重启风暴日志统一写到/tmp/headroom-proxy.log方便排查日常管理命令# 停止launchctl unload ~/Library/LaunchAgents/com.headroom.proxy.plist# 重启launchctl unload...launchctl load...# 看日志tail-f/tmp/headroom-proxy.log第六步把 Claude Code 的 base URL 指向 Headroomcc-switch 默认会把ANTHROPIC_BASE_URL写成http://127.0.0.1:15721直连 cc-switch。要插入 Headroom需要改成:8787python3 -EOF import json, pathlib p pathlib.Path.home() / .claude / settings.json cfg json.loads(p.read_text()) cfg.setdefault(env, {})[ANTHROPIC_BASE_URL] http://127.0.0.1:8787 p.write_text(json.dumps(cfg, indent2, ensure_asciiFalse)) print(p.read_text()) EOF改完后必须重启 Claude Code——当前会话用的还是改之前的 base URL不重启不生效。第七步验证整条链路直接请求 Headroom确认能拿到 GLM 的回复curl-s-XPOST http://127.0.0.1:8787/v1/messages\-Hx-api-key: PROXY_MANAGED\-Hanthropic-version: 2023-06-01\-Hcontent-type: application/json\-d{model:glm-5.2,max_tokens:16,messages:[{role:user,content:say ok}]}正常应该返回带msg_...id 的 JSONcontent 是 GLM 的回复内容。Headroom 自检~/.headroom-venv/bin/headroom doctor--port8787注意doctor的/livez探针对 Headroom 自己的端口有效不要让它去探 cc-switch 的15721。检查 launchd 状态launchctl list|grepheadroom第二列是0表示运行正常非零说明崩了去看/tmp/headroom-proxy.log排查。⚠️ 一个必踩的大坑cc-switch 有一个很坑的行为如果你在 GUI 里切换 provider或重新点「应用」它会重写~/.claude/settings.json把ANTHROPIC_BASE_URL改回http://127.0.0.1:15721直接绕过了 Headroom。解决办法每次在 cc-switch 里动过之后重新执行第六步把 base URL 改回:8787然后重启 Claude Code。或者干脆配好之后就不要再动 cc-switch只在 GLM key 过期需要更新时才进 GUI。文件清单路径作用~/.local/bin/uvuv 安装器~/.headroom-venv/Headroom 专用 Python 3.12 venv~/.headroom-start.shHeadroom 启动脚本~/Library/LaunchAgents/com.headroom.proxy.plistlaunchd 自启配置/tmp/headroom-proxy.logHeadroom 运行日志~/.claude/settings.jsonClaude Code 配置base URL 指向:8787~/.cc-switch/cc-switch 数据库与配置含真实 GLM key常见问题Q: Claude Code 启动报连接:8787失败A: Headroom 没起来。launchctl list | grep headroom看进程在不在不在就launchctl load在但崩了就看/tmp/headroom-proxy.log。Q: 改了 cc-switch 后 Claude Code 不压缩了A: 检查~/.claude/settings.json里ANTHROPIC_BASE_URL是不是被改回:15721了改回:8787并重启 Claude Code。Q: 想连模型输出也压缩A: 编辑~/.headroom-start.sh把HEADROOM_OUTPUT_SHAPER改成1然后launchctl unload load重启 Headroom。Q: 怎么临时停掉压缩直连 GLMA: 把ANTHROPIC_BASE_URL临时改回http://127.0.0.1:15721并重启 Claude Code用完再改回来。Headroom 进程本身不用停。最后的效果全部配好之后每次 Claude Code 发请求都会经过 Headroom 压缩再转发到 cc-switch最后由 cc-switch 注入 GLM key 送到智谱。实际使用下来上下文压缩能省掉相当可观的 token 量再加上 GLM 本身比 Claude 便宜很多这套链路长期用下来确实能省不少。唯一需要留意的就是那个 cc-switch 覆写 base URL 的坑记住每次动过 cc-switch 后改回来就行。如果只是稳定用同一个 GLM provider配好之后几乎不用再管它。关于作者本文作者 tenxiaodao专注 AI 工程化与开发者工具效率实践。更多技术文章可访问tenxiaodao.top

相关新闻