wdawdwa commited on
Commit
b301ff7
·
1 Parent(s): 7a80817

Add Docker SDK configuration to README

Browse files
Files changed (1) hide show
  1. README.md +6 -477
README.md CHANGED
@@ -1,478 +1,7 @@
1
- # Z.AI OpenAI API 代理服务
2
-
3
- ![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)
4
- ![Python: 3.8+](https://img.shields.io/badge/python-3.8+-green.svg)
5
- ![FastAPI](https://img.shields.io/badge/framework-FastAPI-009688.svg)
6
- ![Version: 1.2.0](https://img.shields.io/badge/version-1.2.0-brightgreen.svg)
7
-
8
- 轻量级 OpenAI API 兼容代理服务,通过 Claude Code Router 接入 Z.AI,支持 GLM-4.6 系列模型的完整功能。
9
-
10
- ## ✨ 核心特性
11
-
12
- - 🔌 **完全兼容 OpenAI API** - 无缝集成现有应用
13
- - 🤖 **Claude Code 支持** - 通过 Claude Code Router 接入 Claude Code (**CCR 工具请升级到 v1.0.47 以上**)
14
- - 🚀 **高性能流式响应** - Server-Sent Events (SSE) 支持
15
- - 🛠️ **增强工具调用** - 改进的 Function Call 实现
16
- - 🧠 **思考模式支持** - 智能处理模型推理过程
17
- - 🔍 **搜索模型集成** - GLM-4.5-Search 网络搜索能力
18
- - 🐳 **Docker 部署** - 一键容器化部署
19
- - 🛡️ **会话隔离** - 匿名模式保护隐私
20
- - 🔧 **灵活配置** - 环境变量灵活配置
21
- - 📊 **多模型映射** - 智能上游模型路由
22
-
23
- ## 🚀 快速开始
24
-
25
- ### 环境要求
26
-
27
- - Python 3.8+
28
- - pip 或 uv (推荐)
29
-
30
- ### 安装运行
31
-
32
- ```bash
33
- # 克隆项目
34
- git clone https://github.com/ZyphrZero/z.ai2api_python.git
35
- cd z.ai2api_python
36
-
37
- # 使用 uv (推荐)
38
- curl -LsSf https://astral.sh/uv/install.sh | sh
39
- uv sync
40
- uv run python main.py
41
-
42
- # 或使用 pip (推荐使用清华源)
43
- pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
44
- python main.py
45
- ```
46
-
47
- 服务启动后访问:http://localhost:8080/docs
48
-
49
- ### 基础使用
50
-
51
- #### OpenAI API 客户端
52
-
53
- ```python
54
- import openai
55
-
56
- # 初始化客户端
57
- client = openai.OpenAI(
58
- base_url="http://localhost:8080/v1",
59
- api_key="your-auth-token" # 替换为你的 AUTH_TOKEN
60
- )
61
-
62
- # 普通对话
63
- response = client.chat.completions.create(
64
- model="GLM-4.5",
65
- messages=[{"role": "user", "content": "你好,介绍一下 Python"}],
66
- stream=False
67
- )
68
-
69
- print(response.choices[0].message.content)
70
- ```
71
-
72
- ### Docker 部署
73
-
74
- ```bash
75
- cd deploy
76
- docker-compose up -d
77
- ```
78
-
79
- ## 📖 详细指南
80
-
81
- ### 支持的模型
82
-
83
- | 模型 | 上游 ID | 描述 | 特性 |
84
- | ------------------ | ------------- | ----------- | ---------------------- |
85
- | `GLM-4.5` | 0727-360B-API | 标准模型 | 通用对话,平衡性能 |
86
- | `GLM-4.5-Thinking` | 0727-360B-API | 思考模型 | 显示推理过程,透明度高 |
87
- | `GLM-4.5-Search` | 0727-360B-API | 搜索模型 | 实时网络搜索,信息更新 |
88
- | `GLM-4.5-Air` | 0727-106B-API | 轻量模型 | 快速响应,高效推理 |
89
- | `GLM-4.5V` | glm-4.5v | ❌ 暂不支持 | |
90
-
91
- ### Function Call 功能
92
-
93
- ```python
94
- # 定义工具
95
- tools = [{
96
- "type": "function",
97
- "function": {
98
- "name": "get_weather",
99
- "description": "获取天气信息",
100
- "parameters": {
101
- "type": "object",
102
- "properties": {
103
- "city": {"type": "string", "description": "城市名称"}
104
- },
105
- "required": ["city"]
106
- }
107
- }
108
- }]
109
-
110
- # 使用工具
111
- response = client.chat.completions.create(
112
- model="GLM-4.6",
113
- messages=[{"role": "user", "content": "北京天气怎么样?"}],
114
- tools=tools,
115
- tool_choice="auto"
116
- )
117
- ```
118
-
119
- ### 流式响应
120
-
121
- ```python
122
- response = client.chat.completions.create(
123
- model="GLM-4.6-Thinking",
124
- messages=[{"role": "user", "content": "解释量子计算"}],
125
- stream=True
126
- )
127
-
128
- for chunk in response:
129
- content = chunk.choices[0].delta.content
130
- reasoning = chunk.choices[0].delta.reasoning_content
131
-
132
- if content:
133
- print(content, end="")
134
- if reasoning:
135
- print(f"\n🤔 思考: {reasoning}\n")
136
- ```
137
-
138
- ## ⚙️ 配置说明
139
-
140
- ### 环境变量配置
141
-
142
- | 变量名 | 默认值 | 说明 |
143
- | --------------------- | ----------------------------------------- | ---------------------- |
144
- | `AUTH_TOKEN` | `sk-your-api-key` | 客户端认证密钥 |
145
- | `API_ENDPOINT` | `https://chat.z.ai/api/chat/completions` | 上游 API 地址 |
146
- | `LISTEN_PORT` | `8080` | 服务监听端口 |
147
- | `DEBUG_LOGGING` | `true` | 调试日志开关 |
148
- | `THINKING_PROCESSING` | `think` | 思考内容处理策略 |
149
- | `ANONYMOUS_MODE` | `true` | 匿名模式开关 |
150
- | `TOOL_SUPPORT` | `true` | Function Call 功能开关 |
151
- | `SKIP_AUTH_TOKEN` | `false` | 跳过认证令牌验证 |
152
- | `SCAN_LIMIT` | `200000` | 扫描限制 |
153
- | `BACKUP_TOKEN` | `eyJhbGciO...` | 固定访问令牌,多个以','分隔|
154
- | `TOKEN_FILE_PATH` | `./tokens.txt` | Token文件路径 |
155
- | `TOKEN_MAX_FAILURES` | `3` | Token最大失败次数 |
156
- | `TOKEN_RELOAD_INTERVAL`| `60` | Token重载间隔(秒) |
157
-
158
- ### 思考内容处理策略
159
-
160
- - `think` - 转换为 `<thinking>` 标签(OpenAI 兼容)
161
- - `strip` - 移除思考内容
162
- - `raw` - 保留原始格式
163
-
164
- ## 🔑 Token 轮询管理
165
-
166
- 系统支持智能 Token 轮询管理,可以在多个 Token 之间自动切换,实现负载均衡和容错处理。
167
-
168
- ### Token 来源
169
-
170
- 系统按以下优先级加载 Token:
171
-
172
- 1. **tokens.txt 文件** - 在项目根目录创建 `tokens.txt` 文件,每行一个 Token
173
- 2. **BACKUP_TOKEN 环境变量** - 支持多个 Token,以逗号分隔
174
-
175
- ### tokens.txt 文件格式
176
-
177
- ```
178
- # 这是注释,会被忽略
179
- sk-your-first-token-here
180
- sk-your-second-token-here
181
- sk-your-third-token-here
182
- ```
183
-
184
- ### BACKUP_TOKEN 环境变量格式
185
-
186
- ```bash
187
- # 单个 Token
188
- BACKUP_TOKEN=sk-your-token-here
189
-
190
- # 多个 Token(以逗号分隔)
191
- BACKUP_TOKEN=sk-first-token,sk-second-token,sk-third-token
192
- ```
193
-
194
- ### Token 轮询机制
195
-
196
- - **轮询策略**:采用轮询(Round-Robin)算法,依次使用每个可用 Token
197
- - **失败处理**:当 Token 失败时,系统会标记失败次数,达到最大失败次数后自动禁用
198
- - **自动恢复**:禁用的 Token 会在重新加载时重置状态
199
- - **去重机制**:自动去除重复的 Token,确保每个 Token 只使用一次
200
- - **状态保持**:保留已有 Token 的失败计数和使用状态
201
-
202
- ### Token 配置参数
203
-
204
- | 参数 | 默认值 | 说明 |
205
- | -------------------- | ------ | ---------------------------- |
206
- | `TOKEN_FILE_PATH` | `./tokens.txt` | Token 文件路径 |
207
- | `TOKEN_MAX_FAILURES` | `3` | Token 最大失败次数 |
208
- | `TOKEN_RELOAD_INTERVAL` | `60` | Token 重载间隔(秒) |
209
-
210
- ### 使用示例
211
-
212
- #### 1. 仅使用 tokens.txt
213
-
214
- 创建 `tokens.txt` 文件:
215
- ```
216
- sk-token-1
217
- sk-token-2
218
- sk-token-3
219
- ```
220
-
221
- #### 2. 仅使用 BACKUP_TOKEN
222
-
223
- 在 `.env` 文件中配置:
224
- ```env
225
- BACKUP_TOKEN=sk-token-1,sk-token-2,sk-token-3
226
- ```
227
-
228
- #### 3. 同时使用 tokens.txt 和 BACKUP_TOKEN
229
-
230
- 系统会合并两个来源的 Token,自动去重:
231
-
232
- - `tokens.txt` 包含:`sk-token-1`, `sk-token-2`
233
- - `BACKUP_TOKEN` 包含:`sk-token-2`, `sk-token-3`
234
- - 最终 Token 池:`sk-token-1`, `sk-token-2`, `sk-token-3`
235
-
236
- ### Token 状态监控
237
-
238
- 系统提供了 Token 状态统计接口,可以查看:
239
-
240
- - Token 总数
241
- - 活跃 Token 数量
242
- - 失败 Token 数量
243
- - 每个 Token 的详细信息(预览、状态、失败次数等)
244
-
245
- ### 最佳实践
246
-
247
- 1. **Token 分散**:将 Token 分散存储在 `tokens.txt` 和 `BACKUP_TOKEN` 中
248
- 2. **定期更新**:定期检查 Token 有效性,及时替换失效的 Token
249
- 3. **监控状态**:关注 Token 失败情况,及时调整配置
250
- 4. **合理设置**:根据 API 调用频率调整 `TOKEN_MAX_FAILURES` 和 `TOKEN_RELOAD_INTERVAL`
251
-
252
- ## 🎯 使用场景
253
-
254
- ### 1. AI 应用开发
255
-
256
- ```python
257
- # 集成到现有应用
258
- from openai import OpenAI
259
-
260
- client = OpenAI(
261
- base_url="http://localhost:8080/v1",
262
- api_key="your-token"
263
- )
264
-
265
- # 智能客服
266
- def chat_with_ai(message):
267
- response = client.chat.completions.create(
268
- model="GLM-4.6",
269
- messages=[{"role": "user", "content": message}]
270
- )
271
- return response.choices[0].message.content
272
- ```
273
-
274
- ### 2. 工具调用集成
275
-
276
- ```python
277
- # 结合外部 API
278
- def call_external_api(tool_name, arguments):
279
- # 执行实际工具调用
280
- return result
281
-
282
- # 处理工具调用
283
- if response.choices[0].message.tool_calls:
284
- for tool_call in response.choices[0].message.tool_calls:
285
- result = call_external_api(
286
- tool_call.function.name,
287
- json.loads(tool_call.function.arguments)
288
- )
289
- # 将结果返回给模型继续对话
290
- ```
291
-
292
- ## ❓ 常见问题
293
-
294
- **Q: 如何获取 AUTH_TOKEN?**
295
- A: `AUTH_TOKEN` 为自己自定义的 api key,在环境变量中配置,需要保证客户端与服务端一致。
296
-
297
- **Q: 如何通过 Claude Code 使用本服务?**
298
-
299
- A: 创建 [zai.js](https://gist.githubusercontent.com/musistudio/b35402d6f9c95c64269c7666b8405348/raw/f108d66fa050f308387938f149a2b14a295d29e9/gistfile1.txt) 这个 ccr 插件放在`./.claude-code-router/plugins`目录下,配置 `./.claude-code-router/config.json` 指向本服务地址,使用 `AUTH_TOKEN` 进行认证。
300
-
301
- 示例配置:
302
-
303
- ```json
304
- {
305
- "LOG": false,
306
- "LOG_LEVEL": "debug",
307
- "CLAUDE_PATH": "",
308
- "HOST": "127.0.0.1",
309
- "PORT": 3456,
310
- "APIKEY": "",
311
- "API_TIMEOUT_MS": "600000",
312
- "PROXY_URL": "",
313
- "transformers": [
314
- {
315
- "name": "zai",
316
- "path": "C:\\Users\\Administrator\\.claude-code-router\\plugins\\zai.js",
317
- "options": {}
318
- }
319
- ],
320
- "Providers": [
321
- {
322
- "name": "GLM",
323
- "api_base_url": "http://127.0.0.1:8080/v1/chat/completions",
324
- "api_key": "sk-your-api-key",
325
- "models": ["GLM-4.5", "GLM-4.5-Air"],
326
- "transformers": {
327
- "use": ["zai"]
328
- }
329
- }
330
- ],
331
- "StatusLine": {
332
- "enabled": false,
333
- "currentStyle": "default",
334
- "default": {
335
- "modules": []
336
- },
337
- "powerline": {
338
- "modules": []
339
- }
340
- },
341
- "Router": {
342
- "default": "GLM,GLM-4.5",
343
- "background": "GLM,GLM-4.5",
344
- "think": "GLM,GLM-4.5",
345
- "longContext": "GLM,GLM-4.5",
346
- "longContextThreshold": 60000,
347
- "webSearch": "GLM,GLM-4.5",
348
- "image": "GLM,GLM-4.5"
349
- },
350
- "CUSTOM_ROUTER_PATH": ""
351
- }
352
- ```
353
-
354
- **Q: 匿名模式是什么?**
355
- A: 匿名模式使用临时 token,避免对话历史共享,保护隐私。
356
-
357
- **Q: Function Call 如何工作?**
358
- A: 通过智能提示注入实现,将工具定义转换为系统提示。
359
-
360
- **Q: 支持哪些 OpenAI 功能?**
361
- A: 支持聊天完成、模型列表、流式响应、工具调用等核心功能。
362
-
363
- **Q: Function Call 如何优化?**
364
- A: 改进了工具调用的请求响应结构,支持更复杂的工具链调用和并行执行。
365
-
366
- **Q: 如何选择合适的模型?**
367
- A:
368
-
369
- - **GLM-4.5**: 通用场景,性能和效果平衡
370
- - **GLM-4.5-Thinking**: 需要了解推理过程的场景
371
- - **GLM-4.5-Search**: 需要实时信息的场景
372
- - **GLM-4.5-Air**: 高并发、低延迟要求的场景
373
- - **GLM-4.6**: 最新模型,性能和效果最佳
374
- - **GLM-4.6-Thinking**: 模型推理过程
375
-
376
-
377
- **Q: 如何自定义配置?**
378
- A: 通过环境变量配置,推荐使用 `.env` 文件。
379
-
380
- ## 🔑 获取 Z.ai API Token
381
-
382
- 要使用完整的多模态功能,需要获取正式的 Z.ai API Token:
383
-
384
- ### 方式 1: 通过 Z.ai 网站
385
-
386
- 1. 访问 [Z.ai 官网](https://chat.z.ai)
387
- 2. 注册账户并登录,进入 [Z.ai API Keys](https://z.ai/manage-apikey/apikey-list) 设置页面,在该页面设置 _**个人 API Token**_
388
- 3. 将 Token 放置在 `BACKUP_TOKEN` 环境变量中
389
-
390
- ### 方式 2: 浏览器开发者工具(临时方案)
391
-
392
- 1. 打开 [Z.ai 聊天界面](https://chat.z.ai)
393
- 2. 按 F12 打开开发者工具
394
- 3. 切换到 "Application" 或 "存储" 标签
395
- 4. 查看 Local Storage 中的认证 token
396
- 5. 复制 token 值设置为环境变量
397
-
398
- > ⚠️ **注意**: 方式 2 获取的 token 可能有时效性,建议使用方式 1 获取长期有效的 API Token。
399
- > ❗ **重要提示**: 多模态模型需要**官方 Z.ai API 非匿名 Token**,匿名 token 不支持多媒体处理。
400
-
401
- ## 🛠️ 技术栈
402
-
403
- | 组件 | 技术 | 版本 | 说明 |
404
- | --------------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------ |
405
- | **Web 框架** | [FastAPI](https://fastapi.tiangolo.com/) | 0.104.1 | 高性能异步 Web 框架,支持自动 API 文档生成 |
406
- | **ASGI 服务器** | [Granian](https://github.com/emmett-framework/granian) | 2.5.2 | 基于 Rust 的高性能 ASGI 服务器,支持热重载 |
407
- | **HTTP 客户端** | [Requests](https://requests.readthedocs.io/) | 2.32.5 | 简洁易用的 HTTP 库,用于上游 API 调用 |
408
- | **数据验证** | [Pydantic](https://pydantic.dev/) | 2.11.7 | 类型安全的数据验证与序列化 |
409
- | **配置管理** | [Pydantic Settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) | 2.10.1 | 基于 Pydantic 的配置管理 |
410
-
411
- ## 🏗️ 技术架构
412
-
413
- ```
414
- ┌──────────────┐ ┌─────────────────────────┐ ┌─────────────────┐
415
- │ OpenAI │ │ │ │ │
416
- │ Client │────▶│ FastAPI Server │────▶│ Z.AI API │
417
- └──────────────┘ │ │ │ │
418
- ┌──────────────┐ │ ┌─────────────────────┐ │ │ ┌─────────────┐ │
419
- │ Claude Code │ │ │ /v1/chat/completions│ │ │ │0727-360B-API│ │
420
- │ Router │────▶│ └─────────────────────┘ │ │ └─────────────┘ │
421
- └──────────────┘ │ ┌─────────────────────┐ │ │ ┌─────────────┐ │
422
- ��� │ /v1/models │ │────▶│ │0727-106B-API│ │
423
- │ └─────────────────────┘ │ │ └─────────────┘ │
424
- │ ┌─────────────────────┐ │ │ │
425
- │ │ Enhanced Tools │ │ └─────────────────┘
426
- │ └─────────────────────┘ │
427
- └─────────────────────────┘
428
- OpenAI Compatible API
429
- ```
430
-
431
- ### 项目结构
432
-
433
- ```
434
- z.ai2api_python/
435
- ├── app/
436
- │ ├── core/
437
- │ │ ├── __init__.py
438
- │ │ ├── config.py # 配置管理
439
- │ │ ├── openai.py # OpenAI API 实现
440
- │ │ └── response_handlers.py # 响应处理器
441
- │ ├── models/
442
- │ │ ├── __init__.py
443
- │ │ └── schemas.py # Pydantic 模型定义
444
- │ ├── utils/
445
- │ │ ├── __init__.py
446
- │ │ ├── helpers.py # 辅助函数
447
- │ │ ├── tools.py # 增强工具调用处理
448
- │ │ └── sse_parser.py # SSE 流式解析器
449
- │ └── __init__.py
450
- ├── tests/ # 单元测试
451
- ├── deploy/ # Docker 部署配置
452
- ├── main.py # FastAPI 应用入口
453
- ├── requirements.txt # Python 依赖
454
- ├── .env.example # 环境变量示例
455
- └── README.md # 项目文档
456
- ```
457
-
458
- ## 🤝 贡献指南
459
-
460
- 我们欢迎所有形式的贡献!
461
- 请确保代码符合 PEP 8 规范,并更新相关文档。
462
-
463
- ## 📄 许可证
464
-
465
- 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
466
-
467
- ## ⚠️ 免责声明
468
-
469
- - 本项目与 Z.AI 官方无关
470
- - 使用前请确保遵守 Z.AI 服务条款
471
- - 请勿用于商业用途或违反使用条款的场景
472
- - 项目仅供学习和研究使用
473
-
474
  ---
475
-
476
- <div align="center">
477
- Made with ❤️ by the community
478
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Z.AI API
3
+ emoji: 🚀
4
+ colorFrom: blue
5
+ colorTo: green
6
+ sdk: docker
7
+ ---