forsakenkraken/glm2api
GitHub: forsakenkraken/glm2api
将 chatglm.cn 网页接口转为 OpenAI 兼容 API 的本地代理服务,支持多账号轮换、流式对话、图片生成和游客模式。
Stars: 0 | Forks: 0
# ChatGLM 2 API
`glm2api` 是一个本地代理服务,用来把 `chatglm.cn` 的网页接口转换成 OpenAI 兼容接口,方便你直接接入 OpenAI SDK、Cherry Studio、Open WebUI、LobeChat 或其他兼容 OpenAI API 的工具。
支持的主要接口:
- `POST /v1/chat/completions`
- `POST /v1/responses`
- `POST /v1/images/generations`
- `GET /v1/models`
- `GET /health`
## 1. 使用前准备
启动前请确认:
- 你已经登录过 `https://chatglm.cn`
- 你能获取到有效的 `refresh_token`,或者接受游客模式的能力限制
- 本地已准备好 Python 虚拟环境
## 2. 获取 GLM Refresh Token / 游客模式
获取方式:
1. 打开 `https://chatglm.cn`
2. 登录你的账号
3. 按 `F12` 打开开发者工具
4. 进入 `Application`
5. 查看 `Local Storage` 或相关存储项
6. 找到 `chatglm_refresh_token`
拿到后,将它填入 `.env` 文件中的:
GLM_REFRESH_TOKEN=你的_refresh_token
如果你不想登录账号,也可以直接启用游客模式:
GLM_USE_GUEST_REFRESH_TOKEN=true
如果既没有配置 `token.txt`,也没有配置 `GLM_REFRESH_TOKEN`,程序也会自动退回游客模式,并在请求失败时自动重新获取新的游客 `refresh_token` 后重试。
## 3. 配置文件
先复制示例配置:
cp .env.example .env
如果当前目录没有 `.env`,程序启动时也会自动从 `.env.example` 复制一份默认配置再继续加载。
推荐优先准备 `token.txt`,每行一个账号的 `refresh_token`:
token-a
token-b
token-c
如果你暂时只有一个账号,也可以继续只改 `.env` 里的这一项:
GLM_REFRESH_TOKEN=你的_refresh_token
如果你想显式固定走游客模式,可以这样写:
GLM_USE_GUEST_REFRESH_TOKEN=true
GLM_GUEST_MAX_RETRIES=3
启用游客模式后,程序会按 `GLM_MAX_CONCURRENCY` 自动创建同等数量的游客账号槽位,让每个并发请求优先使用独立游客账号,避免多个并发长期挤在同一游客会话上。
常用配置说明:
- `HOST`
服务监听地址。只给本机使用时填 `127.0.0.1`,局域网访问可填 `0.0.0.0`
- `PORT`
服务端口,默认 `8000`
- `API_PREFIX`
OpenAI 兼容路径前缀,默认 `/v1`
- `DEBUG_DUMP_ALL`
调试狂暴模式。开启后会自动切到 `DEBUG`,并打印入站原始请求、转发给 GLM 的原始 body、上游原始响应和 SSE 分片、工具调用转换结果等几乎所有调试信息
当 LOG_LEVEL=DEBUG(或 DEBUG_DUMP_ALL=true)时,自动在 log/glm2api_debug.log 写入日志文件(LOG_LEVEL=INFO — 只有终端输出,不写文件)
- `GLM_ASSISTANT_ID`
普通对话使用的 assistant id
- `GLM_TOKEN_FILE`
多账号 token 文件路径,默认 `token.txt`,每行一个 `refresh_token`
- `GLM_IMAGE_ASSISTANT_ID`
图片生成使用的 assistant id
- `GLM_USE_GUEST_REFRESH_TOKEN`
显式启用游客 ck;开启后会忽略已配置的账号 token
- `GLM_GUEST_MAX_RETRIES`
游客 ck 请求失败时,最多自动重新拉取游客 token 并重试多少次
- `GLM_DELETE_CONVERSATION`
是否在请求结束后自动删除 GLM 会话记录
- `GLM_MAX_CONCURRENCY`
本地代理允许同时占用的上游执行槽位数量,默认 `3`
- `SERVER_API_KEYS`
如果你希望访问本地代理时也带 Bearer Token,可以在这里填写
说明:
- 如果存在 `token.txt`,程序会优先从这里加载多账号
- 如果显式设置了 `GLM_USE_GUEST_REFRESH_TOKEN=true`,程序会直接走游客模式
- 游客模式下会按 `GLM_MAX_CONCURRENCY` 自动扩展游客账号池,尽量做到每个并发槽位对应一个独立游客账号
- 当某个账号请求失败时,会自动切换到下一账号继续尝试
- 如果本轮所有账号都失败,下一次会从第一个账号重新开始
- 当上游返回新的 `refresh_token` 时,多账号模式会自动写回 `token.txt` 对应行
- 单账号兜底模式下,程序仍会自动写回 `.env`
- 游客模式下不会把临时游客 `refresh_token` 落盘到 `.env` 或 `token.txt`
- 如果完全没有配置账号 token,程序会自动获取游客 `refresh_token` 作为兜底
- 如果你的 `.env` 不存在,程序无法自动落盘新的 token
- `/v1/models` 返回的模型列表已经固定写在代码中,不再通过配置文件自定义
## 4. 启动服务
### 拉取源代码
git clone https://github.com/XxxXTeam/glm2api.git
### 安装依赖
uv sync
### 运行项目
uv run .\main.py
或者:
.\.venv\Scripts\python.exe main.py
启动成功后你会看到类似日志:
启动服务 host=127.0.0.1 port=8000 prefix=/v1 models=...
## 5. 健康检查
curl http://127.0.0.1:8000/health
返回示例:
{"status":"ok"}
## 6. 查询模型列表
curl http://127.0.0.1:8000/v1/models
返回的是当前配置里暴露的模型列表。
## 7. 聊天接口
### 7.1 Curl 示例
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d "{\"model\":\"glm-4\",\"messages\":[{\"role\":\"user\",\"content\":\"你好,介绍一下你自己\"}]}"
### 7.2 Python OpenAI SDK 示例
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="dummy",
)
resp = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": "你好,介绍一下你自己"}
],
)
print(resp.choices[0].message.content)
### 7.3 流式示例
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="dummy",
)
stream = client.chat.completions.create(
model="glm-4",
messages=[{"role": "user", "content": "写一首七言绝句"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if getattr(delta, "content", None):
print(delta.content, end="")
### 7.4 OpenAI Responses API 示例
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="dummy",
)
resp = client.responses.create(
model="glm-4",
input=[
{"role": "user", "content": "你好,介绍一下你自己"}
],
)
print(resp.output_text)
## 8. 图片生成接口
### 8.1 Curl 示例
curl http://127.0.0.1:8000/v1/images/generations \
-H "Content-Type: application/json" \
-d "{\"model\":\"glm-image-1\",\"prompt\":\"画个枫叶\",\"size\":\"1024x1024\"}"
### 8.2 Python OpenAI SDK 示例
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:8000/v1",
api_key="dummy",
)
image = client.images.generate(
model="glm-image-1",
prompt="画个枫叶",
size="1024x1024",
)
print(image.data[0].url)
### 8.3 当前支持的图片参数
- `prompt`
- `model`
- `n`
- `size`
- `response_format`
- `style`
- `scene`
说明:
- 默认返回图片 URL
- 如果 `response_format=b64_json`,会返回 base64 图片数据
- `size` 会自动映射到 GLM 所需的宽高比例
## 9. 鉴权方式
如果 `.env` 中 `SERVER_API_KEYS` 为空,则本地接口默认不校验 Bearer Token。
如果你配置了:
SERVER_API_KEYS=sk-local-1,sk-local-2
那么请求时需要带:
Authorization: Bearer sk-local-1
## 10. 日志说明
程序默认输出彩色日志,常见内容包括:
- 服务启动
- 请求进入队列
- 并发槽位获取/释放
- 上游请求转发
- 会话删除结果
- 错误原因
如果你想查看更多细节,可以把 `.env` 中的:
LOG_LEVEL=DEBUG
## 11. 常见问题
### 11.1 启动时报 `GLM_REFRESH_TOKEN` 缺失
新版本默认会自动退回游客模式;如果你仍想固定使用账号,请检查 `.env` 或 `token.txt` 里的 `refresh_token` 是否填写正确。
### 11.2 返回“请等待其他对话生成完毕”
说明同一账号在 GLM 侧存在并发限制。程序已经内置串行队列和自动等待重试。
### 11.3 返回“请登录后继续使用”
说明当前账号状态无效,或者 token 已失效,需要重新登录并更新 `refresh_token`
标签:API代理, AV绕过, ChatGLM, Docker, FastAPI, OpenAI兼容接口, 大语言模型(LLM), 安全防御评估, 请求拦截, 运行时操纵, 逆向工具