TFAI / README.md
zhaoxiaozhao07's picture
feat(core): ้‡ๆž„้…็ฝฎๆจกๅ—ๅนถๆทปๅŠ ๆ–ฐๅŠŸ่ƒฝ
962759f
|
Raw
History Blame
14.1 kB
# Z.AI OpenAI API ไปฃ็†ๆœๅŠก
![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)
![Python: 3.8+](https://img.shields.io/badge/python-3.8+-green.svg)
![FastAPI](https://img.shields.io/badge/framework-FastAPI-009688.svg)
![Version: 1.2.0](https://img.shields.io/badge/version-1.2.0-brightgreen.svg)
่ฝป้‡็บง OpenAI API ๅ…ผๅฎนไปฃ็†ๆœๅŠก๏ผŒ้€š่ฟ‡ Claude Code Router ๆŽฅๅ…ฅ Z.AI๏ผŒๆ”ฏๆŒ GLM-4.5 ็ณปๅˆ—ๆจกๅž‹็š„ๅฎŒๆ•ดๅŠŸ่ƒฝใ€‚
## โœจ ๆ ธๅฟƒ็‰นๆ€ง
- ๐Ÿ”Œ **ๅฎŒๅ…จๅ…ผๅฎน OpenAI API** - ๆ— ็ผ้›†ๆˆ็Žฐๆœ‰ๅบ”็”จ
- ๐Ÿค– **Claude Code ๆ”ฏๆŒ** - ้€š่ฟ‡ Claude Code Router ๆŽฅๅ…ฅ Claude Code (**CCR ๅทฅๅ…ท่ฏทๅ‡็บงๅˆฐ v1.0.47 ไปฅไธŠ**)
- ๐Ÿš€ **้ซ˜ๆ€ง่ƒฝๆตๅผๅ“ๅบ”** - Server-Sent Events (SSE) ๆ”ฏๆŒ
- ๐Ÿ› ๏ธ **ๅขžๅผบๅทฅๅ…ท่ฐƒ็”จ** - ๆ”น่ฟ›็š„ Function Call ๅฎž็Žฐ
- ๐Ÿง  **ๆ€่€ƒๆจกๅผๆ”ฏๆŒ** - ๆ™บ่ƒฝๅค„็†ๆจกๅž‹ๆŽจ็†่ฟ‡็จ‹
- ๐Ÿ” **ๆœ็ดขๆจกๅž‹้›†ๆˆ** - GLM-4.5-Search ็ฝ‘็ปœๆœ็ดข่ƒฝๅŠ›
- ๐Ÿณ **Docker ้ƒจ็ฝฒ** - ไธ€้”ฎๅฎนๅ™จๅŒ–้ƒจ็ฝฒ
- ๐Ÿ›ก๏ธ **ไผš่ฏ้š”็ฆป** - ๅŒฟๅๆจกๅผไฟๆŠค้š็ง
- ๐Ÿ”ง **็ตๆดป้…็ฝฎ** - ็Žฏๅขƒๅ˜้‡็ตๆดป้…็ฝฎ
- ๐Ÿ“Š **ๅคšๆจกๅž‹ๆ˜ ๅฐ„** - ๆ™บ่ƒฝไธŠๆธธๆจกๅž‹่ทฏ็”ฑ
## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹
### ็Žฏๅขƒ่ฆๆฑ‚
- Python 3.8+
- pip ๆˆ– uv (ๆŽจ่)
### ๅฎ‰่ฃ…่ฟ่กŒ
```bash
# ๅ…‹้š†้กน็›ฎ
git clone https://github.com/ZyphrZero/z.ai2api_python.git
cd z.ai2api_python
# ไฝฟ็”จ uv (ๆŽจ่)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv sync
uv run python main.py
# ๆˆ–ไฝฟ็”จ pip (ๆŽจ่ไฝฟ็”จๆธ…ๅŽๆบ)
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python main.py
```
ๆœๅŠกๅฏๅŠจๅŽ่ฎฟ้—ฎ๏ผšhttp://localhost:8080/docs
### ๅŸบ็ก€ไฝฟ็”จ
#### OpenAI API ๅฎขๆˆท็ซฏ
```python
import openai
# ๅˆๅง‹ๅŒ–ๅฎขๆˆท็ซฏ
client = openai.OpenAI(
base_url="http://localhost:8080/v1",
api_key="your-auth-token" # ๆ›ฟๆขไธบไฝ ็š„ AUTH_TOKEN
)
# ๆ™ฎ้€šๅฏน่ฏ
response = client.chat.completions.create(
model="GLM-4.5",
messages=[{"role": "user", "content": "ไฝ ๅฅฝ๏ผŒไป‹็ปไธ€ไธ‹ Python"}],
stream=False
)
print(response.choices[0].message.content)
```
### Docker ้ƒจ็ฝฒ
```bash
cd deploy
docker-compose up -d
```
## ๐Ÿ“– ่ฏฆ็ป†ๆŒ‡ๅ—
### ๆ”ฏๆŒ็š„ๆจกๅž‹
| ๆจกๅž‹ | ไธŠๆธธ ID | ๆ่ฟฐ | ็‰นๆ€ง |
| ------------------ | ------------- | ----------- | ---------------------- |
| `GLM-4.5` | 0727-360B-API | ๆ ‡ๅ‡†ๆจกๅž‹ | ้€š็”จๅฏน่ฏ๏ผŒๅนณ่กกๆ€ง่ƒฝ |
| `GLM-4.5-Thinking` | 0727-360B-API | ๆ€่€ƒๆจกๅž‹ | ๆ˜พ็คบๆŽจ็†่ฟ‡็จ‹๏ผŒ้€ๆ˜Žๅบฆ้ซ˜ |
| `GLM-4.5-Search` | 0727-360B-API | ๆœ็ดขๆจกๅž‹ | ๅฎžๆ—ถ็ฝ‘็ปœๆœ็ดข๏ผŒไฟกๆฏๆ›ดๆ–ฐ |
| `GLM-4.5-Air` | 0727-106B-API | ่ฝป้‡ๆจกๅž‹ | ๅฟซ้€Ÿๅ“ๅบ”๏ผŒ้ซ˜ๆ•ˆๆŽจ็† |
| `GLM-4.5V` | glm-4.5v | โŒ ๆš‚ไธๆ”ฏๆŒ | |
### Function Call ๅŠŸ่ƒฝ
```python
# ๅฎšไน‰ๅทฅๅ…ท
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "่Žทๅ–ๅคฉๆฐ”ไฟกๆฏ",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "ๅŸŽๅธ‚ๅ็งฐ"}
},
"required": ["city"]
}
}
}]
# ไฝฟ็”จๅทฅๅ…ท
response = client.chat.completions.create(
model="GLM-4.5",
messages=[{"role": "user", "content": "ๅŒ—ไบฌๅคฉๆฐ”ๆ€Žไนˆๆ ท๏ผŸ"}],
tools=tools,
tool_choice="auto"
)
```
### ๆตๅผๅ“ๅบ”
```python
response = client.chat.completions.create(
model="GLM-4.5-Thinking",
messages=[{"role": "user", "content": "่งฃ้‡Š้‡ๅญ่ฎก็ฎ—"}],
stream=True
)
for chunk in response:
content = chunk.choices[0].delta.content
reasoning = chunk.choices[0].delta.reasoning_content
if content:
print(content, end="")
if reasoning:
print(f"\n๐Ÿค” ๆ€่€ƒ: {reasoning}\n")
```
## โš™๏ธ ้…็ฝฎ่ฏดๆ˜Ž
### ็Žฏๅขƒๅ˜้‡้…็ฝฎ
| ๅ˜้‡ๅ | ้ป˜่ฎคๅ€ผ | ่ฏดๆ˜Ž |
| --------------------- | ----------------------------------------- | ---------------------- |
| `AUTH_TOKEN` | `sk-your-api-key` | ๅฎขๆˆท็ซฏ่ฎค่ฏๅฏ†้’ฅ |
| `API_ENDPOINT` | `https://chat.z.ai/api/chat/completions` | ไธŠๆธธ API ๅœฐๅ€ |
| `LISTEN_PORT` | `8080` | ๆœๅŠก็›‘ๅฌ็ซฏๅฃ |
| `DEBUG_LOGGING` | `true` | ่ฐƒ่ฏ•ๆ—ฅๅฟ—ๅผ€ๅ…ณ |
| `THINKING_PROCESSING` | `think` | ๆ€่€ƒๅ†…ๅฎนๅค„็†็ญ–็•ฅ |
| `ANONYMOUS_MODE` | `true` | ๅŒฟๅๆจกๅผๅผ€ๅ…ณ |
| `TOOL_SUPPORT` | `true` | Function Call ๅŠŸ่ƒฝๅผ€ๅ…ณ |
| `SKIP_AUTH_TOKEN` | `false` | ่ทณ่ฟ‡่ฎค่ฏไปค็‰Œ้ชŒ่ฏ |
| `SCAN_LIMIT` | `200000` | ๆ‰ซๆ้™ๅˆถ |
| `BACKUP_TOKEN` | `eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9...` | Z.ai ๅ›บๅฎš่ฎฟ้—ฎไปค็‰Œ |
### ๆ€่€ƒๅ†…ๅฎนๅค„็†็ญ–็•ฅ
- `think` - ่ฝฌๆขไธบ `<thinking>` ๆ ‡็ญพ๏ผˆOpenAI ๅ…ผๅฎน๏ผ‰
- `strip` - ็งป้™คๆ€่€ƒๅ†…ๅฎน
- `raw` - ไฟ็•™ๅŽŸๅง‹ๆ ผๅผ
## ๐ŸŽฏ ไฝฟ็”จๅœบๆ™ฏ
### 1. AI ๅบ”็”จๅผ€ๅ‘
```python
# ้›†ๆˆๅˆฐ็Žฐๆœ‰ๅบ”็”จ
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="your-token"
)
# ๆ™บ่ƒฝๅฎขๆœ
def chat_with_ai(message):
response = client.chat.completions.create(
model="GLM-4.5",
messages=[{"role": "user", "content": message}]
)
return response.choices[0].message.content
```
### 2. ๅทฅๅ…ท่ฐƒ็”จ้›†ๆˆ
```python
# ็ป“ๅˆๅค–้ƒจ API
def call_external_api(tool_name, arguments):
# ๆ‰ง่กŒๅฎž้™…ๅทฅๅ…ท่ฐƒ็”จ
return result
# ๅค„็†ๅทฅๅ…ท่ฐƒ็”จ
if response.choices[0].message.tool_calls:
for tool_call in response.choices[0].message.tool_calls:
result = call_external_api(
tool_call.function.name,
json.loads(tool_call.function.arguments)
)
# ๅฐ†็ป“ๆžœ่ฟ”ๅ›ž็ป™ๆจกๅž‹็ปง็ปญๅฏน่ฏ
```
## โ“ ๅธธ่ง้—ฎ้ข˜
**Q: ๅฆ‚ไฝ•่Žทๅ– AUTH_TOKEN๏ผŸ**
A: `AUTH_TOKEN` ไธบ่‡ชๅทฑ่‡ชๅฎšไน‰็š„ api key๏ผŒๅœจ็Žฏๅขƒๅ˜้‡ไธญ้…็ฝฎ๏ผŒ้œ€่ฆไฟ่ฏๅฎขๆˆท็ซฏไธŽๆœๅŠก็ซฏไธ€่‡ดใ€‚
**Q: ๅฆ‚ไฝ•้€š่ฟ‡ Claude Code ไฝฟ็”จๆœฌๆœๅŠก๏ผŸ**
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` ่ฟ›่กŒ่ฎค่ฏใ€‚
็คบไพ‹้…็ฝฎ๏ผš
```json
{
"LOG": false,
"LOG_LEVEL": "debug",
"CLAUDE_PATH": "",
"HOST": "127.0.0.1",
"PORT": 3456,
"APIKEY": "",
"API_TIMEOUT_MS": "600000",
"PROXY_URL": "",
"transformers": [
{
"name": "zai",
"path": "C:\\Users\\Administrator\\.claude-code-router\\plugins\\zai.js",
"options": {}
}
],
"Providers": [
{
"name": "GLM",
"api_base_url": "http://127.0.0.1:8080/v1/chat/completions",
"api_key": "sk-your-api-key",
"models": ["GLM-4.5", "GLM-4.5-Air"],
"transformers": {
"use": ["zai"]
}
}
],
"StatusLine": {
"enabled": false,
"currentStyle": "default",
"default": {
"modules": []
},
"powerline": {
"modules": []
}
},
"Router": {
"default": "GLM,GLM-4.5",
"background": "GLM,GLM-4.5",
"think": "GLM,GLM-4.5",
"longContext": "GLM,GLM-4.5",
"longContextThreshold": 60000,
"webSearch": "GLM,GLM-4.5",
"image": "GLM,GLM-4.5"
},
"CUSTOM_ROUTER_PATH": ""
}
```
**Q: ๅŒฟๅๆจกๅผๆ˜ฏไป€ไนˆ๏ผŸ**
A: ๅŒฟๅๆจกๅผไฝฟ็”จไธดๆ—ถ token๏ผŒ้ฟๅ…ๅฏน่ฏๅކๅฒๅ…ฑไบซ๏ผŒไฟๆŠค้š็งใ€‚
**Q: Function Call ๅฆ‚ไฝ•ๅทฅไฝœ๏ผŸ**
A: ้€š่ฟ‡ๆ™บ่ƒฝๆ็คบๆณจๅ…ฅๅฎž็Žฐ๏ผŒๅฐ†ๅทฅๅ…ทๅฎšไน‰่ฝฌๆขไธบ็ณป็ปŸๆ็คบใ€‚
**Q: ๆ”ฏๆŒๅ“ชไบ› OpenAI ๅŠŸ่ƒฝ๏ผŸ**
A: ๆ”ฏๆŒ่ŠๅคฉๅฎŒๆˆใ€ๆจกๅž‹ๅˆ—่กจใ€ๆตๅผๅ“ๅบ”ใ€ๅทฅๅ…ท่ฐƒ็”จ็ญ‰ๆ ธๅฟƒๅŠŸ่ƒฝใ€‚
**Q: Function Call ๅฆ‚ไฝ•ไผ˜ๅŒ–๏ผŸ**
A: ๆ”น่ฟ›ไบ†ๅทฅๅ…ท่ฐƒ็”จ็š„่ฏทๆฑ‚ๅ“ๅบ”็ป“ๆž„๏ผŒๆ”ฏๆŒๆ›ดๅคๆ‚็š„ๅทฅๅ…ท้“พ่ฐƒ็”จๅ’Œๅนถ่กŒๆ‰ง่กŒใ€‚
**Q: ๅฆ‚ไฝ•้€‰ๆ‹ฉๅˆ้€‚็š„ๆจกๅž‹๏ผŸ**
A:
- **GLM-4.5**: ้€š็”จๅœบๆ™ฏ๏ผŒๆ€ง่ƒฝๅ’Œๆ•ˆๆžœๅนณ่กก
- **GLM-4.5-Thinking**: ้œ€่ฆไบ†่งฃๆŽจ็†่ฟ‡็จ‹็š„ๅœบๆ™ฏ
- **GLM-4.5-Search**: ้œ€่ฆๅฎžๆ—ถไฟกๆฏ็š„ๅœบๆ™ฏ
- **GLM-4.5-Air**: ้ซ˜ๅนถๅ‘ใ€ไฝŽๅปถ่ฟŸ่ฆๆฑ‚็š„ๅœบๆ™ฏ
**Q: ๅฆ‚ไฝ•่‡ชๅฎšไน‰้…็ฝฎ๏ผŸ**
A: ้€š่ฟ‡็Žฏๅขƒๅ˜้‡้…็ฝฎ๏ผŒๆŽจ่ไฝฟ็”จ `.env` ๆ–‡ไปถใ€‚
## ๐Ÿ”‘ ่Žทๅ– Z.ai API Token
่ฆไฝฟ็”จๅฎŒๆ•ด็š„ๅคšๆจกๆ€ๅŠŸ่ƒฝ๏ผŒ้œ€่ฆ่Žทๅ–ๆญฃๅผ็š„ Z.ai API Token๏ผš
### ๆ–นๅผ 1: ้€š่ฟ‡ Z.ai ็ฝ‘็ซ™
1. ่ฎฟ้—ฎ [Z.ai ๅฎ˜็ฝ‘](https://chat.z.ai)
2. ๆณจๅ†Œ่ดฆๆˆทๅนถ็™ปๅฝ•๏ผŒ่ฟ›ๅ…ฅ [Z.ai API Keys](https://z.ai/manage-apikey/apikey-list) ่ฎพ็ฝฎ้กต้ข๏ผŒๅœจ่ฏฅ้กต้ข่ฎพ็ฝฎ _**ไธชไบบ API Token**_
3. ๅฐ† Token ๆ”พ็ฝฎๅœจ `BACKUP_TOKEN` ็Žฏๅขƒๅ˜้‡ไธญ
### ๆ–นๅผ 2: ๆต่งˆๅ™จๅผ€ๅ‘่€…ๅทฅๅ…ท๏ผˆไธดๆ—ถๆ–นๆกˆ๏ผ‰
1. ๆ‰“ๅผ€ [Z.ai ่Šๅคฉ็•Œ้ข](https://chat.z.ai)
2. ๆŒ‰ F12 ๆ‰“ๅผ€ๅผ€ๅ‘่€…ๅทฅๅ…ท
3. ๅˆ‡ๆขๅˆฐ "Application" ๆˆ– "ๅญ˜ๅ‚จ" ๆ ‡็ญพ
4. ๆŸฅ็œ‹ Local Storage ไธญ็š„่ฎค่ฏ token
5. ๅคๅˆถ token ๅ€ผ่ฎพ็ฝฎไธบ็Žฏๅขƒๅ˜้‡
> โš ๏ธ **ๆณจๆ„**: ๆ–นๅผ 2 ่Žทๅ–็š„ token ๅฏ่ƒฝๆœ‰ๆ—ถๆ•ˆๆ€ง๏ผŒๅปบ่ฎฎไฝฟ็”จๆ–นๅผ 1 ่Žทๅ–้•ฟๆœŸๆœ‰ๆ•ˆ็š„ API Tokenใ€‚
> โ— **้‡่ฆๆ็คบ**: ๅคšๆจกๆ€ๆจกๅž‹้œ€่ฆ**ๅฎ˜ๆ–น Z.ai API ้žๅŒฟๅ Token**๏ผŒๅŒฟๅ token ไธๆ”ฏๆŒๅคšๅช’ไฝ“ๅค„็†ใ€‚
## ๐Ÿ› ๏ธ ๆŠ€ๆœฏๆ ˆ
| ็ป„ไปถ | ๆŠ€ๆœฏ | ็‰ˆๆœฌ | ่ฏดๆ˜Ž |
| --------------- | --------------------------------------------------------------------------------- | ------- | ------------------------------------------ |
| **Web ๆก†ๆžถ** | [FastAPI](https://fastapi.tiangolo.com/) | 0.104.1 | ้ซ˜ๆ€ง่ƒฝๅผ‚ๆญฅ Web ๆก†ๆžถ๏ผŒๆ”ฏๆŒ่‡ชๅŠจ API ๆ–‡ๆกฃ็”Ÿๆˆ |
| **ASGI ๆœๅŠกๅ™จ** | [Granian](https://github.com/emmett-framework/granian) | 2.5.2 | ๅŸบไบŽ Rust ็š„้ซ˜ๆ€ง่ƒฝ ASGI ๆœๅŠกๅ™จ๏ผŒๆ”ฏๆŒ็ƒญ้‡่ฝฝ |
| **HTTP ๅฎขๆˆท็ซฏ** | [Requests](https://requests.readthedocs.io/) | 2.32.5 | ็ฎ€ๆดๆ˜“็”จ็š„ HTTP ๅบ“๏ผŒ็”จไบŽไธŠๆธธ API ่ฐƒ็”จ |
| **ๆ•ฐๆฎ้ชŒ่ฏ** | [Pydantic](https://pydantic.dev/) | 2.11.7 | ็ฑปๅž‹ๅฎ‰ๅ…จ็š„ๆ•ฐๆฎ้ชŒ่ฏไธŽๅบๅˆ—ๅŒ– |
| **้…็ฝฎ็ฎก็†** | [Pydantic Settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) | 2.10.1 | ๅŸบไบŽ Pydantic ็š„้…็ฝฎ็ฎก็† |
## ๐Ÿ—๏ธ ๆŠ€ๆœฏๆžถๆž„
```
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ OpenAI โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ Client โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ FastAPI Server โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ Z.AI API โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ Claude Code โ”‚ โ”‚ โ”‚ /v1/chat/completionsโ”‚ โ”‚ โ”‚ โ”‚0727-360B-APIโ”‚ โ”‚
โ”‚ Router โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ /v1/models โ”‚ โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚ โ”‚0727-106B-APIโ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ Enhanced Tools โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
OpenAI Compatible API
```
### ้กน็›ฎ็ป“ๆž„
```
z.ai2api_python/
โ”œโ”€โ”€ app/
โ”‚ โ”œโ”€โ”€ core/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ config.py # ้…็ฝฎ็ฎก็†
โ”‚ โ”‚ โ”œโ”€โ”€ openai.py # OpenAI API ๅฎž็Žฐ
โ”‚ โ”‚ โ””โ”€โ”€ response_handlers.py # ๅ“ๅบ”ๅค„็†ๅ™จ
โ”‚ โ”œโ”€โ”€ models/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ””โ”€โ”€ schemas.py # Pydantic ๆจกๅž‹ๅฎšไน‰
โ”‚ โ”œโ”€โ”€ utils/
โ”‚ โ”‚ โ”œโ”€โ”€ __init__.py
โ”‚ โ”‚ โ”œโ”€โ”€ helpers.py # ่พ…ๅŠฉๅ‡ฝๆ•ฐ
โ”‚ โ”‚ โ”œโ”€โ”€ tools.py # ๅขžๅผบๅทฅๅ…ท่ฐƒ็”จๅค„็†
โ”‚ โ”‚ โ””โ”€โ”€ sse_parser.py # SSE ๆตๅผ่งฃๆžๅ™จ
โ”‚ โ””โ”€โ”€ __init__.py
โ”œโ”€โ”€ tests/ # ๅ•ๅ…ƒๆต‹่ฏ•
โ”œโ”€โ”€ deploy/ # Docker ้ƒจ็ฝฒ้…็ฝฎ
โ”œโ”€โ”€ main.py # FastAPI ๅบ”็”จๅ…ฅๅฃ
โ”œโ”€โ”€ requirements.txt # Python ไพ่ต–
โ”œโ”€โ”€ .env.example # ็Žฏๅขƒๅ˜้‡็คบไพ‹
โ””โ”€โ”€ README.md # ้กน็›ฎๆ–‡ๆกฃ
```
## ๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—
ๆˆ‘ไปฌๆฌข่ฟŽๆ‰€ๆœ‰ๅฝขๅผ็š„่ดก็Œฎ๏ผ
่ฏท็กฎไฟไปฃ็ ็ฌฆๅˆ PEP 8 ่ง„่Œƒ๏ผŒๅนถๆ›ดๆ–ฐ็›ธๅ…ณๆ–‡ๆกฃใ€‚
## ๐Ÿ“„ ่ฎธๅฏ่ฏ
ๆœฌ้กน็›ฎ้‡‡็”จ MIT ่ฎธๅฏ่ฏ - ๆŸฅ็œ‹ [LICENSE](LICENSE) ๆ–‡ไปถไบ†่งฃ่ฏฆๆƒ…ใ€‚
## โš ๏ธ ๅ…่ดฃๅฃฐๆ˜Ž
- ๆœฌ้กน็›ฎไธŽ Z.AI ๅฎ˜ๆ–นๆ— ๅ…ณ
- ไฝฟ็”จๅ‰่ฏท็กฎไฟ้ตๅฎˆ Z.AI ๆœๅŠกๆกๆฌพ
- ่ฏทๅ‹ฟ็”จไบŽๅ•†ไธš็”จ้€”ๆˆ–่ฟๅไฝฟ็”จๆกๆฌพ็š„ๅœบๆ™ฏ
- ้กน็›ฎไป…ไพ›ๅญฆไน ๅ’Œ็ ”็ฉถไฝฟ็”จ
---
<div align="center">
Made with โค๏ธ by the community
</div>