1. 本地跑通 GLM-4-9B 之后,为什么还要接一层统一 Key
GLM-4-9B 是清华智谱开源的大模型,属于 GLM-4 系列的开源版本,9B 参数规模,支持多轮对话、代码执行、工具调用和长文本推理,官方还放出了 1M 上下文版本。很多人第一次接触它,都是冲着“本地部署 + 开源大模型”这两个关键词去的:模型权重能下载到自己的机器上,推理过程不依赖外部服务,数据不出本地,听起来很踏实。
但真正把 GLM-4-9B 跑起来之后,问题往往不在模型本身,而在“怎么用”。本地服务默认只监听 127.0.0.1,端口是 8000 或者你自己改的端口,接口格式是 OpenAI 兼容的/v1/chat/completions。这时候你如果同时还在用别的模型——比如云端某个更强的模型做兜底、或者团队里有人用 Claude Code、Cline 这类工具——就会遇到一个很现实的问题:每个模型一套 Base URL、一套 Key、一套模型名,配置散落在各个客户端里,换台机器就要重新配一遍。
我试过把本地 GLM-4-9B 和几个云端模型混着用,最开始的方案是每个工具单独填地址。结果 Cline 里填一个、Claude Code 里填一个、自己写的脚本里再填一个,时间一长自己都记不清哪个 Key 对应哪个服务。更麻烦的是,本地服务重启后端口变了,所有配置都要跟着改。
所以这篇的重点不是“怎么把 GLM-4-9B 下载下来”——那部分网上教程很多——而是本地服务跑起来之后,怎么用 TaoToken 的统一 Key 把本地 GLM-4-9B 和云端模型放在同一套配置体系里管理。这样你换模型只需要改一个 Model ID,Base URL 和 Key 都不用动。对于想用统一 Key 管理多模型的开发者来说,这一步能省掉大量重复配置的时间。
下面我会先给 TaoToken 的前置准备,再给可复制的配置片段,然后是三轮对话验证动作,最后是常见报错排查。全程按“能跟着做”的标准写,命令和参数都尽量给全。
2. TaoToken 前置准备:拿 Key、认地址、分清两种接入方式
在动手改配置之前,先把 TaoToken 这边需要的东西准备好。这一步不复杂,但顺序别搞反,否则后面填配置的时候容易找不到对应字段。
首先打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册并登录。登录之后进控制台,地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。在控制台里找到 API Keys 页面,新建一个 Key。这个 Key 就是你后面所有客户端里要填的那一串,建议命名成“本地GLM4测试”之类的,方便区分。
拿到 Key 之后,记住两个地址:
- 官网首页:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- API 基础地址:https://taotoken.net/api
注意 API 地址后面不要加 UTM 参数,直接就是https://taotoken.net/api。这个地址是 OpenAI 兼容格式的,也就是说任何支持自定义 Base URL 的客户端,都可以把地址填成它,然后把 Key 填进去。
这里要分清两种接入方式,很多人第一次会搞混:
第一种是“本地 GLM-4-9B 直连”。你的本地服务跑在http://127.0.0.1:8000/v1,客户端直接连本地,不经过 TaoToken。这种方式适合纯本地、不联网的场景,但缺点就是前面说的,多模型管理麻烦。
第二种是“本地 GLM-4-9B 通过 TaoToken 统一接入”。你在 TaoToken 侧配置好本地服务的映射,客户端只认 TaoToken 的 Base URL 和 Key,具体请求转发到本地还是云端,由 TaoToken 侧决定。这样客户端配置只有一套,换模型只改 Model ID。
这篇主要讲第二种。如果你只是想先验证本地服务本身能不能跑,可以先按第一种直连测一下,确认本地 GLM-4-9B 正常返回,再切到第二种。
另外,如果你后面要用 Claude Code 这类工具做长期编码,可以了解一下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它和按量调用的 API Key 是两条线,按自己的使用频率选就行。
模型对话的在线体验入口在这里:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。这两个地址后面排障的时候会用到。
3. 可复制配置:本地 GLM-4-9B 服务 + TaoToken 统一 Key 对接
这一节是核心,给的是可以直接复制粘贴的配置片段。分三部分:本地 GLM-4-9B 服务启动、TaoToken 侧配置、客户端配置。
3.1 本地 GLM-4-9B 服务启动
假设你已经把模型权重下载到本地,路径是/data/models/glm-4-9b-chat。用官方仓库的 OpenAI 兼容接口启动,命令大概是这样:
cd GLM-4/basic_demo python openai_api_server.py \ --model_path /data/models/glm-4-9b-chat \ --host 0.0.0.0 \ --port 8000 \ --device cuda:0启动成功后,本地会监听http://0.0.0.0:8000,OpenAI 兼容端点是http://127.0.0.1:8000/v1/chat/completions。先用 curl 确认一下本地服务是通的:
curl http://127.0.0.1:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-chat", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 64 }'如果返回里有choices字段和内容,说明本地服务正常。这一步不通的话,后面接 TaoToken 也没意义,先把本地跑通。
3.2 TaoToken 侧配置本地模型映射
登录 TaoToken 控制台,进入模型配置或者接入配置页面。这里的目标是让 TaoToken 知道“有一个叫 glm-4-9b-local 的模型,实际请求发到 http://127.0.0.1:8000/v1”。
配置片段(JSON 格式,字段名以控制台实际为准,下面给的是通用结构):
{ "model_id": "glm-4-9b-local", "display_name": "GLM-4-9B 本地版", "provider": "openai-compatible", "base_url": "http://127.0.0.1:8000/v1", "api_key": "local-no-key", "upstream_model": "glm-4-9b-chat", "timeout": 120 }几个字段说明:
model_id:你在客户端里填的模型名,建议用glm-4-9b-local,和云端模型区分开。base_url:本地服务的 OpenAI 兼容地址,注意要带/v1。api_key:本地服务一般不需要鉴权,随便填一个占位就行,但不能留空。upstream_model:本地服务实际认的模型名,通常是glm-4-9b-chat。timeout:本地 9B 模型推理慢,超时给大一点,120 秒起步。
如果你用的是 TOML 格式的配置文件(比如某些网关工具),等价写法:
[[models]] model_id = "glm-4-9b-local" display_name = "GLM-4-9B 本地版" provider = "openai-compatible" base_url = "http://127.0.0.1:8000/v1" api_key = "local-no-key" upstream_model = "glm-4-9b-chat" timeout = 120保存之后,TaoToken 侧就多了一个glm-4-9b-local的模型入口。
3.3 客户端配置:Base URL + Key + Model ID 三件套
不管你用的是 Cline、Claude Code 还是自己写的脚本,配置都是三件套:
- Base URL:
https://taotoken.net/api - API Key:你在控制台新建的那串 Key
- Model ID:
glm-4-9b-local
以 Cline 为例,在设置里选 OpenAI Compatible,然后填:
{ "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "modelId": "glm-4-9b-local" }如果你用的是 Claude Code,配置在~/.claude/settings.json或者项目级的.claude/settings.json里,结构类似:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "glm-4-9b-local" } }注意 Claude Code 用的是 Anthropic 格式的环境变量名,但 Base URL 指向 TaoToken 的 API 地址,由 TaoToken 侧做格式转换。如果你用的是 Codex,配置在~/.codex/auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "glm-4-9b-local" }三件套里最容易错的是 Model ID。一定要和控制台里配的model_id完全一致,大小写敏感。填错了会报模型不存在的错。
4. 验证请求:三轮对话效果对比与成功结果
配置填完之后,不要急着上生产,先用三轮对话验证一下。这三轮分别测基础对话、代码能力、长文本,能比较全面地看出本地 GLM-4-9B 通过 TaoToken 接入后的实际表现。
4.1 第一轮:基础对话,确认链路通
用 curl 直接打 TaoToken 的接口:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-local", "messages": [{"role": "user", "content": "用三句话介绍一下你自己"}], "max_tokens": 128 }'预期返回结构:
{ "id": "chatcmpl-xxx", "object": "chat.completion", "model": "glm-4-9b-local", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "我是一个人工智能助手..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 15, "completion_tokens": 60, "total_tokens": 75 } }看到choices[0].message.content有内容,说明链路通了。这一轮主要确认三件事:TaoToken 的 Key 有效、本地服务可达、模型名匹配。
4.2 第二轮:代码能力,看输出质量
GLM-4-9B 在代码数据集上表现不错,用一道简单的算法题测:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-local", "messages": [{"role": "user", "content": "用 Python 写一个快速排序,要求带注释"}], "max_tokens": 512, "temperature": 0.3 }'本地 9B 模型这一轮会比较慢,如果显卡一般,可能要等十几秒甚至更久。返回的代码如果结构完整、注释合理,说明模型本身能力在线。如果返回被截断,把max_tokens调大。
4.3 第三轮:长文本,测上下文保持
第三轮测多轮对话的上下文保持。先发一条设定,再追问:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "glm-4-9b-local", "messages": [ {"role": "user", "content": "记住一个数字:42"}, {"role": "assistant", "content": "好的,我记住了数字 42。"}, {"role": "user", "content": "我刚才让你记的数字是多少?"} ], "max_tokens": 64 }'如果返回里出现 42,说明多轮上下文正常。这一轮同时也在验证 TaoToken 侧有没有正确透传 messages 数组。
三轮跑完,你对本地 GLM-4-9B 通过统一 Key 接入的效果就有底了。实测下来,基础对话和上下文保持没问题,代码生成质量也够用,主要瓶颈在速度——9B 模型在消费级显卡上输出确实偏慢,这一点要有心理预期。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易撞到四类报错,逐个说。
5.1 401 Unauthorized
报错长这样:
{ "error": { "message": "Invalid API key", "type": "invalid_request_error", "code": "401" } }原因通常是 Key 填错、Key 前后有空格、或者 Key 已经失效。排查顺序:先确认Authorization: Bearer sk-xxx里的 Key 和控制台里复制的一致;再确认没有多余换行;最后去控制台看这个 Key 是不是被删了或者超额了。如果是 Claude Code 报 401,检查ANTHROPIC_API_KEY是不是写成了ANTHROPIC_AUTH_TOKEN,两个变量名不一样。
5.2 local proxy failed
这个报错一般出现在客户端侧,意思是客户端连不上你填的 Base URL。如果你填的是https://taotoken.net/api,检查网络能不能通;如果你填的是本地地址,检查本地服务是不是没启动、端口是不是被占。用curl -v https://taotoken.net/api/v1/models看一下握手过程,能定位到是 DNS 问题还是连接被拒。
5.3 reading choices 相关报错
报错类似:
Error: Cannot read properties of undefined (reading 'choices')这是客户端在解析返回时,没找到choices字段。原因通常是 TaoToken 侧返回了错误结构,而客户端按成功结构去解析。先看原始返回是什么,如果返回里是error字段而不是choices,说明请求本身失败了,往上找根因。常见根因是 Model ID 填错,TaoToken 侧找不到对应模型,返回了错误对象。
5.4 OAuth 相关报错
如果你用的是 Claude Code,可能会看到 OAuth 相关的提示。Claude Code 默认走 Anthropic 的 OAuth 流程,如果你要用自定义 Base URL,需要在 settings 里显式配置环境变量,并且确认没有同时启用 OAuth 登录态。配置片段参考 3.3 节。如果还是报 OAuth 错,检查是不是有全局的~/.claude.json覆盖了项目级配置。
排障的时候,接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里有各客户端的完整配置示例,对着抄一遍通常能解决大部分问题。如果确认是 Key 的问题,直接去 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 重新生成一个。
6. 统一 Key 之后,多模型切换的实际用法
把本地 GLM-4-9B 接进 TaoToken 之后,最大的变化是客户端配置只有一套。你可以在 TaoToken 控制台里同时配好几个模型:glm-4-9b-local指向本地,glm-4-plus指向云端,claude-sonnet指向另一个。客户端里只改 Model ID 就能切换。
实际用的时候,我的习惯是:日常简单问答走本地 GLM-4-9B,省额度;遇到复杂推理或者代码重构,切到云端模型。切换动作就是改一个字符串,不用动 Base URL 和 Key。
如果你要长期做编码或者 Agent 类任务,可以看看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它和按量 API 是互补的。只是想快速验证某个模型效果,用模型对话页面 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 更直接,不用配客户端。
最后提醒一点:本地 GLM-4-9B 的速度受硬件影响很大,如果你在 CPU 上跑,输出会非常慢,建议至少有一张显存 16GB 以上的显卡。速度慢的时候,把max_tokens调小、temperature调低,能稍微缓解等待感。配置改完之后,记得重启客户端,有些工具不会热加载配置。