将智谱清言(chatglm.cn)网页端私有 API 转换为标准大模型服务接口,支持 OpenAI / Claude / Gemini 三种协议,可对接 claude-code、open-code、NextChat 等任何兼容客户端。
- 三协议兼容 — OpenAI
/v1/chat/completions、Claude/v1/messages、Gemini/v1beta/models/... - 流式输出 — 完整 SSE 流式对话,支持
reasoning_content(思考过程/联网搜索) - 工具调用 — Function Calling,兼容 OpenAI
tool_calls和 Claudetool_use格式,适配 claude-code / open-code - AI 绘图 / 视频生成 — 文生图、文生视频、图生视频
- Token 池轮转 — 多
refresh_token组成池子,轮询调度 + 过期自动移除 + 自动切换 - 双部署模式 — VPS(Node.js + Puppeteer 全自动)或 Cloudflare Workers(免费,无需服务器)
┌──────────────┐ ┌───────────────────────┐ ┌─────────────┐
│ claude-code │ │ VPS (Node.js) │ │ │
│ NextChat │────▶│ 或 CF Workers (V8) │────▶│ chatglm.cn │
│ LobeChat │ │ │ │ 私有 API │
└──────────────┘ │ • Token 池轮转 │ └─────────────┘
│ • 协议适配层 │
│ • 签名算法 │
│ • SSE 流式转换 │
└───────────────────────┘
请求流程:客户端发请求 → 服务端从 Token 池轮询选一个 refresh_token → 换取 access_token → 构造签名调用智谱流式接口 → 实时转换为对应协议格式返回。若 Token 过期,自动移除并尝试下一个。
docker run -d \
--name glm-free-api \
--restart always \
-p 38412:38412 \
-e ADMIN_KEY=your-strong-password \
-v glm-data:/app \
glm-free-api或者用 docker-compose:
docker compose up -d服务启动后:
- 自动检测容器内
tokens.json是否有可用 Token - 若为空,自动通过 Chromium 访问 chatglm.cn 获取
chatglm_refresh_token - 每 30 分钟自动刷新 Token 池
- 访问
http://your-server:38412/token/fetch-helper管理页面添加/查看 Token
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT |
38412 |
监听端口 |
CHROME_PATH |
/usr/bin/chromium |
Chrome 路径(容器内已内置) |
SIGN_SECRET |
8a1317a7468aa3ad86e997d08f3f31cb |
签名密钥 |
ADMIN_KEY |
changeme |
管理员密钥,用于管理面板登录和所有 /admin/*、/token/* 接口的鉴权 |
默认密钥是
changeme。Docker 部署时通过-e ADMIN_KEY=你的密码修改,裸机部署通过环境变量修改。生产环境务必修改为强密码,否则任何人知道默认值即可管理你的 Token。
不需要 Docker 时也可以直接运行:
cd HelloGML
npm install
npm run server需自行安装 Node.js 18+ 和 Chrome。后台运行用 systemd:
# /etc/systemd/system/glm-free-api.service
[Unit]
Description=GLM Free API
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/HelloGML
ExecStart=/usr/bin/npx tsx server.ts
Restart=always
RestartSec=5
Environment=PORT=38412
Environment=ADMIN_KEY=your-strong-password
[Install]
WantedBy=multi-user.targetsudo systemctl enable glm-free-api
sudo systemctl start glm-free-apinpx wrangler kv:namespace create GLM_TOKENS将输出的 id 填入 wrangler.toml:
[[kv_namespaces]]
binding = "GLM_TOKENS"
id = "<你的-namespace-id>"编辑 wrangler.toml:
[vars]
SIGN_SECRET = "8a1317a7468aa3ad86e997d08f3f31cb"
ADMIN_KEY = "your-random-strong-password" # 生产环境务必修改npx wrangler deploy部署后输出 Worker 访问地址。.workers.dev 域名在中国大陆可能被拦截,建议绑定自定义域名。
npx wrangler dev --local本地运行在 http://localhost:8787。
chatglm_refresh_token 是智谱清言的认证凭证。本项目将多个 Token 组成池子,按轮询策略自动调度,过期自动移除。请求时传入的 api_key 仅用于身份认证(证明调用方有权使用),与 Token 池完全分离。
方式一:浏览器手动获取
- 打开 chatglm.cn
- F12 → Application → Cookies
- 复制
chatglm_refresh_token的值
方式二:VPS 自动获取
安装 Chrome 后,服务启动时自动通过 Puppeteer 获取。也可在管理页面点击「自动获取」按钮。
方式三:浏览器控制台一键提交
在 chatglm.cn 页面 F12 控制台运行(地址替换为你的服务地址):
fetch("http://your-server:38412/token/auto-fetch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:document.cookie.match(/chatglm_refresh_token=([^;]+)/)?.[1]||""})}).then(r=>r.json()).then(d=>alert(d.success?"添加成功":"失败: "+d.message))部署后可通过以下地址访问管理界面:
| 地址 | 说明 |
|---|---|
http://your-server:38412/admin |
完整管理面板 — API Key 管理、Token 池管理、Token 有效性检测 |
http://your-server:38412/token/fetch-helper |
简易 Token 管理 — 手动添加、一键提取、自动获取 |
http://your-server:38412/ |
首页,显示 Token 池状态和链接 |
管理面板登录:首次访问管理面板需要输入 ADMIN_KEY(默认 changeme),输入后自动保存到浏览器。所有管理操作(添加/删除 Token、管理 API Key)都需要此密钥。API 调用接口则使用独立的 API Key 认证。
管理面板功能:
- API Key 管理 — 添加/查看/删除调用密钥,未配置 Key 时任意非空字符串均可认证
- Token 池管理 — 添加/查看/删除 refresh_token,检测 Token 有效性
- Token 状态概览 — 查看 Token 数量、失败次数、最后使用时间
简易 Token 管理页面(/token/fetch-helper)提供更直观的 Token 获取引导:
- 手动粘贴添加(推荐)
- 浏览器控制台一键提取脚本(推荐)
- 自动获取(Docker 环境,容器内已内置 Chromium)
API Key 用于调用 /v1/chat/completions 等对话接口的身份认证。与 ADMIN_KEY(管理员密钥)是独立的。
初始状态:未配置任何 API Key 时,请求中传入任意非空字符串即可通过认证(如 Authorization: Bearer any-key)。
配置后:只有白名单内的 Key 才能调用 API。
# 添加
curl -X POST http://your-server:38412/admin/apikey \
-H "Content-Type: application/json" \
-H "X-Admin-Key: your-admin-key" \
-d '{"api_key":"sk-my-key"}'
# 查看
curl http://your-server:38412/admin/apikey -H "X-Admin-Key: your-admin-key"
# 删除
curl -X DELETE http://your-server:38412/admin/apikey \
-H "Content-Type: application/json" \
-H "X-Admin-Key: your-admin-key" \
-d '{"api_key":"sk-my-key"}'# 添加 Token
curl -X POST http://your-server:38412/admin/token \
-H "Content-Type: application/json" \
-H "X-Admin-Key: your-admin-key" \
-d '{"refresh_token":"eyJhbG..."}'
# 查看池
curl http://your-server:38412/admin/token -H "X-Admin-Key: your-admin-key"
# 删除
curl -X DELETE http://your-server:38412/admin/token \
-H "Content-Type: application/json" \
-H "X-Admin-Key: your-admin-key" \
-d '{"id":"tk_xxx"}'
# 检测 Token 有效性
curl -X POST http://your-server:38412/admin/token/check \
-H "Content-Type: application/json" \
-H "X-Admin-Key: your-admin-key" \
-d '{"id":"tk_xxx"}'
# 立即自动获取
curl -X POST http://your-server:38412/token/auto-fetch-now- 系统按轮询(Round Robin)策略从池中选择 Token
- Token 过期(上游返回 40102)时自动从池中移除,切换下一个
- Token 连续失败 3 次会被暂时跳过
- 池中 Token 全部耗尽时返回错误,需补充新 Token
所有 API 接口均需认证。未在管理面板配置 API Key 时,传入任意非空字符串即可(如 Bearer any-key);配置后需传入白名单内的 Key。管理接口使用 ADMIN_KEY(默认 changeme),对话接口使用 API Key,两者独立。
当前支持:glm5
curl http://your-server:38412/v1/models -H "Authorization: Bearer any-key"POST /v1/chat/completions
curl -X POST http://your-server:38412/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any-key" \
-d '{
"model": "glm5",
"messages": [
{ "role": "system", "content": "你是一个助手" },
{ "role": "user", "content": "你好" }
],
"stream": true
}'参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
model |
string | 模型名,如 glm5 |
messages |
array | 消息列表,支持 system/user/assistant/tool |
stream |
boolean | 是否流式,默认 false |
tools |
array | OpenAI 格式工具定义 |
conversation_id |
string | 多轮对话的会话 ID(可选) |
curl -X POST http://your-server:38412/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any-key" \
-d '{
"model": "glm5",
"messages": [{"role":"user","content":"北京天气如何?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取城市天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}
}]
}'返回:
{
"choices": [{
"message": {
"role": "assistant",
"tool_calls": [{
"id": "call_xxx",
"function": {"name": "get_weather", "arguments": "{\"city\":\"北京\"}"}
}]
},
"finish_reason": "tool_calls"
}]
}多轮工具反馈:
{"role": "assistant", "tool_calls": [{"id":"call_xxx","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"北京\"}"}}]},
{"role": "tool", "tool_call_id": "call_xxx", "content": "晴朗,25°C"},
{"role": "user", "content": "上海呢?"}POST /v1/messages
curl -X POST http://your-server:38412/v1/messages \
-H "Content-Type: application/json" \
-H "X-API-Key: any-key" \
-d '{
"model": "glm5",
"messages": [{"role":"user","content":"你好"}],
"stream": true,
"max_tokens": 4096
}'Claude 格式的工具调用:
curl -X POST http://your-server:38412/v1/messages \
-H "Content-Type: application/json" \
-H "X-API-Key: any-key" \
-d '{
"model": "glm5",
"messages": [{"role":"user","content":"查北京天气"}],
"tools": [{
"name": "get_weather",
"description": "获取城市天气",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}],
"stream": false
}'返回:
{
"type": "message",
"content": [{
"type": "tool_use",
"id": "call_xxx",
"name": "get_weather",
"input": {"city": "北京"}
}],
"stop_reason": "tool_use"
}多轮工具反馈(Claude 格式):
{"role": "assistant", "content": [{"type":"tool_use","id":"call_xxx","name":"get_weather","input":{"city":"北京"}}]},
{"role": "user", "content": [{"type":"tool_result","tool_use_id":"call_xxx","content":"晴朗,25°C"}]},
{"role": "user", "content": "上海呢?"}POST /v1beta/models/:model:streamGenerateContent
curl -X POST "http://your-server:38412/v1beta/models/glm5:streamGenerateContent" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: any-key" \
-d '{"contents":[{"role":"user","parts":[{"text":"你好"}]}]}'POST /v1/images/generations
curl -X POST http://your-server:38412/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any-key" \
-d '{"prompt":"一只穿宇航服的猫在月球散步","model":"glm5","response_format":"url"}'| 参数 | 类型 | 说明 |
|---|---|---|
prompt |
string | 图像描述 |
model |
string | 智能体 ID,留空用默认绘图智能体 |
response_format |
string | url 或 b64_json |
POST /v1/videos/generations
curl -X POST http://your-server:38412/v1/videos/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any-key" \
-d '{"model":"glm5","prompt":"金毛犬在海边奔跑","video_style":"电影感"}'| 参数 | 可选值 |
|---|---|
video_style |
卡通3D / 黑白老照片 / 油画 / 电影感 |
emotional_atmosphere |
温馨和谐 / 生动活泼 / 紧张刺激 / 凄凉寂寞 |
mirror_mode |
水平 / 垂直 / 推近 / 拉远 |
image_url |
图生视频参考图片 URL |
# 设置 API Base URL 指向你的服务
export ANTHROPIC_BASE_URL=http://your-server:38412
export ANTHROPIC_API_KEY=any-key
claudeclaude-code 会以 Claude 协议(
/v1/messages)通信,自动使用tool_use格式。
from openai import OpenAI
client = OpenAI(api_key="any-key", base_url="http://your-server:38412/v1")
response = client.chat.completions.create(
model="glm5",
messages=[{"role": "user", "content": "你好"}],
stream=True,
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")import OpenAI from "openai";
const client = new OpenAI({ apiKey: "any-key", baseURL: "http://your-server:38412/v1" });
const stream = await client.chat.completions.create({
model: "glm5", messages: [{ role: "user", content: "你好" }], stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}export GEMINI_API_KEY=any-key
export GEMINI_BASE_URL=http://your-server:38412/v1beta
gemini -m glm5| 客户端 | 配置 |
|---|---|
| NextChat | 接口地址填 http://your-server:38412/v1,API Key 随意填 |
| LobeChat | 添加自定义服务商,OpenAI 兼容模式,Base URL 同上 |
| Dify | 模型供应商选 OpenAI API Compatible,填入 base_url |
refresh_token 池 + Round Robin 轮询。当上游返回 40102 时,TokenExpiredError 被抛出,服务端自动:
- 从池中移除过期 Token
- 选择下一个 Token 重试
- 所有 Token 耗尽时返回错误
智谱清言网页版 API 不原生支持 Function Calling,本项目通过 Prompt Engineering 实现:
- 请求前将工具定义以结构化英文指令注入
system消息 - 流式输出时智能缓冲,检测并解析工具调用 JSON
- Claude 协议的
tool_use/tool_result自动双向转换
三种协议共享同一套上游调用逻辑,通过 adapter 层转换:
- OpenAI → 直接透传
- Claude →
adapters.ts的convertClaudeToGLM/convertGLMToClaude - Gemini →
adapters.ts的convertGeminiToGLM/convertGLMToGemini
- 运行时 — Cloudflare Workers (V8) / Node.js (VPS)
- 语言 — TypeScript
- 存储 — Cloudflare KV / 本地
tokens.json - 自动化 — Puppeteer-core(VPS 自动获取 Token)
- 流式处理 — Web Streams API + SSE 解析器
本项目仅供学习研究交流使用,不提供任何担保。使用本服务产生的任何法律责任由使用者自行承担。请遵守智谱清言的用户协议及相关法律法规。