这是一个为Z.ai GLM-4.6模型提供OpenAI兼容API接口的代理服务器。它允许你使用标准的OpenAI API格式与Z.ai的GLM-4.6模型进行交互,支持流式和非流式响应。
注意: 本项目来自fork OpenAI-Compatible-API-Proxy-for-Z二次开发
✅ 成功修复426客户端版本错误
Z.ai在2025年9月30日更新了客户端验证机制,本项目已完成适配:
- ✅ 更新前端版本号至 1.0.94
- ✅ 更新User-Agent至Chrome 140
- ✅ 实现X-Signature签名验证(SHA-256)
- ✅ 非流式和流式响应均正常工作
详细修复说明请查看:FIX_426_ERROR.md
- 🔄 OpenAI API兼容: 完全兼容OpenAI的API格式,无需修改客户端代码
- 🌊 流式响应支持: 支持实时流式输出,提供更好的用户体验
- 🔐 身份验证: 支持API密钥验证,确保服务安全
- 🛠️ 灵活配置: 通过环境变量进行灵活配置
- 🐳 Docker支持: 提供Docker镜像,便于部署
- 🌍 CORS支持: 支持跨域请求,便于前端集成
- 📝 思考过程展示: 智能处理并展示模型的思考过程
- 📊 实时监控仪表板: 提供Web仪表板,实时显示API转发情况和统计信息
- Go 1.23 或更高版本
- Z.ai 的访问令牌(可选,支持匿名模式)
-
克隆仓库
git clone https://github.com/your-username/ZtoApi.git cd ZtoApi -
配置环境变量
# 复制配置模板 cp .env.example .env.local # 编辑 .env.local 文件,根据需要修改配置 nano .env.local
-
启动服务
# 使用启动脚本(推荐) ./start.sh # 或直接运行 go run main.go
-
测试服务
curl http://localhost:9090/v1/models
-
访问API文档
启动服务后,可以通过浏览器访问以下地址查看完整的API文档:
http://localhost:9090/docsAPI文档提供了以下功能:
- 详细的API端点说明
- 请求参数和响应格式
- 多种编程语言的使用示例(Python、cURL、JavaScript)
- 错误处理说明
-
访问Dashboard
启动服务后,可以通过浏览器访问以下地址查看实时监控仪表板:
http://localhost:9090/dashboardDashboard提供了以下功能:
- 实时显示API请求统计信息(总请求数、成功请求数、失败请求数、平均响应时间)
- 显示最近100条请求的详细信息(时间、方法、路径、状态码、耗时、客户端IP)
- 数据每5秒自动刷新一次
-
构建镜像
docker build -t zto-api . -
运行容器
docker run -p 9090:9090 \ -e ZAI_TOKEN=your_z_ai_token \ -e DEFAULT_KEY=your_api_key \ zto-api
-
Fork这个仓库到你的GitHub账户
-
在Render上创建新的Web Service:
- 连接你的GitHub仓库
- 选择Docker作为环境
- 设置以下环境变量:
ZAI_TOKEN: Z.ai 的访问令牌 (可选,不提供将自动获取随机匿名token)DEFAULT_KEY: 客户端API密钥 (可选,默认: sk-your-key)MODEL_NAME: 显示的模型名称 (可选,默认: GLM-4.6)PORT: 服务监听端口 (Render会自动设置)
-
部署完成后,使用Render提供的URL作为OpenAI API的base_url
本项目支持通过环境变量进行配置,提供灵活的部署和运行选项。
macOS/Linux:
./start.shWindows:
start.batmacOS/Linux:
export ZAI_TOKEN="your_z_ai_token_here"
export DEFAULT_KEY="sk-your-custom-key"
export PORT="9090"
go run main.goWindows:
set ZAI_TOKEN=your_z_ai_token_here
set DEFAULT_KEY=sk-your-custom-key
set PORT=9090
go run main.godocker run -p 9090:9090 \
-e ZAI_TOKEN=your_z_ai_token_here \
-e DEFAULT_KEY=sk-your-custom-key \
-e PORT=9090 \
zto-api无必需配置。所有配置都有合理的默认值。
| 变量名 | 说明 | 默认值 | 示例 |
|---|---|---|---|
ZAI_TOKEN |
Z.ai 访问令牌 | 空(自动获取随机匿名token) | eyJhbGciOiJFUzI1NiIs... |
| 变量名 | 说明 | 默认值 | 示例 |
|---|---|---|---|
DEFAULT_KEY |
客户端API密钥 | sk-your-key |
sk-my-api-key |
MODEL_NAME |
显示模型名称 | GLM-4.6 |
GLM-4.6-Pro |
PORT |
服务监听端口 | 9090 |
9000 |
DEBUG_MODE |
调试模式开关 | true |
false |
DEFAULT_STREAM |
默认流式响应 | true |
false |
DASHBOARD_ENABLED |
Dashboard功能开关 | true |
false |
ENABLE_THINKING |
思考功能开关 | false |
true |
| 变量名 | 说明 | 默认值 | 示例 |
|---|---|---|---|
UPSTREAM_URL |
上游API地址 | https://chat.z.ai/api/chat/completions |
自定义URL |
- 系统环境变量 - 最高优先级
.env.local- 本地环境配置(推荐,已自动加载).env- 标准环境配置(已自动加载).env.example- 配置模板(仅供参考)
💡 新功能: 项目现在会自动加载
.env.local和.env文件,无需手动设置环境变量!
# 复制配置模板
cp .env.example .env.local
# 编辑配置文件
nano .env.local
# 启动服务(会自动加载 .env.local)
./start.sh- 系统首先尝试加载
.env.local文件(优先级更高) - 然后加载
.env文件 - 最后读取系统环境变量(如果已设置,会覆盖文件中的配置)
- 未配置的选项使用默认值
- 登录 Z.ai
- 打开浏览器开发者工具(F12)
- 切换到 Network 标签页
- 发送一条消息
- 在请求中找到
Authorization头部的 Bearer token
- 登录 Z.ai 后,在开发者工具中查看 Cookies
- 找到包含认证信息的 cookie
本项目支持自动获取匿名token,无需手动配置。当 ZAI_TOKEN 环境变量未设置时,系统会自动为每次对话获取不同的随机匿名token,避免共享记忆。这种机制使得项目即使用户没有提供 Z.ai 的访问令牌也能正常工作。
# .env.local
ZAI_TOKEN=eyJhbGciOiJFUzI1NiIs...
DEFAULT_KEY=sk-my-secret-key
MODEL_NAME=GLM-4.6-Pro
PORT=9000
DEBUG_MODE=false# .env.production
ZAI_TOKEN=your_production_token
DEFAULT_KEY=sk-production-key
MODEL_NAME=GLM-4.6
PORT=9090
DEBUG_MODE=false
DEFAULT_STREAM=true# .env.development
ZAI_TOKEN=your_dev_token
DEFAULT_KEY=sk-dev-key
MODEL_NAME=GLM-4.6-Dev
PORT=8080
DEBUG_MODE=true
DEFAULT_STREAM=true
DASHBOARD_ENABLED=true本项目提供了一个Web仪表板,用于实时监控API转发情况和统计信息。
- 实时显示API请求统计信息(总请求数、成功请求数、失败请求数、平均响应时间)
- 显示最近100条请求的详细信息(时间、方法、路径、状态码、耗时、客户端IP)
- 数据每5秒自动刷新一次
- 响应式设计,支持各种设备访问
启动服务后,通过浏览器访问以下地址:
http://localhost:9090/dashboard
通过 DASHBOARD_ENABLED 环境变量控制Dashboard功能的开启和关闭:
# 启用Dashboard(默认)
DASHBOARD_ENABLED=true
# 禁用Dashboard
DASHBOARD_ENABLED=false- 开发调试: 实时查看API请求情况,便于调试和问题排查
- 性能监控: 监控API响应时间和成功率,评估系统性能
- 安全审计: 查看请求来源和频率,发现异常访问模式
修改环境变量后,需要重启服务使配置生效:
# 停止当前服务
Ctrl+C
# 重新启动
./start.sh- Token 安全: 不要将真实的 Z.ai token 提交到代码仓库
- 配置文件: 建议将
.env.local添加到.gitignore - 权限设置: 确保启动脚本有执行权限 (
chmod +x start.sh) - 端口冲突: 确保配置的端口没有被其他服务占用
- 匿名Token: 当未设置
ZAI_TOKEN时,系统会自动获取随机匿名token,每次对话都会有独立的上下文,无需手动配置即可使用 - 思考过程: 项目会自动处理模型的思考过程,可通过
ENABLE_THINKING环境变量或请求参数enable_thinking控制是否启用
import openai
# 配置客户端
client = openai.OpenAI(
api_key="your-api-key", # 对应 DEFAULT_KEY
base_url="http://localhost:9090/v1"
)
# 非流式请求
response = client.chat.completions.create(
model="GLM-4.6",
messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.choices[0].message.content)
# 流式请求
response = client.chat.completions.create(
model="GLM-4.6",
messages=[{"role": "user", "content": "请写一首关于春天的诗"}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
# 启用思考功能的请求
response = client.chat.completions.create(
model="GLM-4.6",
messages=[{"role": "user", "content": "请分析一下这个问题"}],
enable_thinking=True
)
print(response.choices[0].message.content)# 非流式请求
curl -X POST http://localhost:9090/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"model": "GLM-4.6",
"messages": [{"role": "user", "content": "你好"}],
"stream": false
}'
# 流式请求
curl -X POST http://localhost:9090/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"model": "GLM-4.6",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'
# 启用思考功能的请求
curl -X POST http://localhost:9090/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"model": "GLM-4.6",
"messages": [{"role": "user", "content": "请分析一下这个问题"}],
"enable_thinking": true
}'const fetch = require('node-fetch');
async function chatWithGLM(message, stream = false, enableThinking = null) {
const requestBody = {
model: 'GLM-4.6',
messages: [{ role: 'user', content: message }],
stream: stream
};
// 如果指定了思考功能参数,则添加到请求中
if (enableThinking !== null) {
requestBody.enable_thinking = enableThinking;
}
const response = await fetch('http://localhost:9090/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify(requestBody)
});
if (stream) {
// 处理流式响应
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.slice(6);
if (data === '[DONE]') {
console.log('\n流式响应完成');
return;
}
try {
const parsed = JSON.parse(data);
const content = parsed.choices[0]?.delta?.content;
if (content) {
process.stdout.write(content);
}
} catch (e) {
// 忽略解析错误
}
}
}
}
} else {
// 处理非流式响应
const data = await response.json();
console.log(data.choices[0].message.content);
}
}
// 使用示例
chatWithGLM('你好,请介绍一下JavaScript', false);
// 启用思考功能的示例
chatWithGLM('请分析一下这个问题', false, true);-
426错误 (Your client version check is failed)
- ✅ 已修复: 项目已更新至最新版本
- 如果仍然出现此错误,请确保:
- 代码已更新到最新版本
- 服务已重新编译和启动
- 详情请查看:FIX_426_ERROR.md
-
连接失败
- 检查服务是否正常运行:
curl http://localhost:9090/v1/models - 访问API文档:
http://localhost:9090/docs - 确认端口配置正确
- 检查服务是否正常运行:
-
认证失败
- 检查
DEFAULT_KEY环境变量设置 - 确认请求头中的
Authorization格式正确
- 检查
-
Z.ai Token无效
- 检查
ZAI_TOKEN环境变量设置 - 确认Token未过期
- 检查
-
思考过程显示异常
- 检查
DEBUG_MODE是否启用 - 查看服务日志获取详细信息
- 检查
-
端口被占用: 修改
PORT环境变量或停止占用端口的服务 -
权限不足: 确保启动脚本有执行权限
-
配置未生效: 重启服务或检查配置文件语法
-
流式响应问题: 确认
DEFAULT_STREAM设置正确,检查客户端是否支持流式响应
启用调试模式以获取详细日志:
export DEBUG_MODE=true
go run main.go如果遇到网络连接问题,可以尝试:
- 检查防火墙设置
- 确认
UPSTREAM_URL可访问 - 测试网络连通性:
curl https://chat.z.ai/api/chat/completions
- 减少日志输出: 设置
DEBUG_MODE=false - 调整超时时间: 修改代码中的
http.Client超时设置 - 使用反向代理: 在生产环境中建议使用 Nginx 等反向代理
欢迎提交 Issue 和 Pull Request!请确保:
- 代码符合 Go 的代码风格
- 提交前运行测试
- 更新相关文档
- 遵循项目的代码结构和命名规范
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/new-feature - 提交更改:
git commit -am 'Add new feature' - 推送分支:
git push origin feature/new-feature - 提交 Pull Request
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。
- FIX_426_ERROR.md - 426错误修复详细说明
本项目与 Z.ai 官方无关,使用前请确保遵守 Z.ai 的服务条款。开发者不对因使用本项目而产生的任何问题负责。
如有问题或建议,请通过以下方式联系:
- 提交 Issue