Spaces:
Runtime error
Runtime error
File size: 13,550 Bytes
927965d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 |
# API 使用指南
本指南详细介绍如何使用 AI Studio Proxy API 的各种功能和端点。
## 服务器配置
代理服务器默认监听在 `http://127.0.0.1:2048`。端口可以通过以下方式配置:
- **环境变量**: 在 `.env` 文件中设置 `PORT=2048` 或 `DEFAULT_FASTAPI_PORT=2048`
- **命令行参数**: 使用 `--server-port` 参数
- **GUI 启动器**: 在图形界面中直接配置端口
推荐使用 `.env` 文件进行配置管理,详见 [环境变量配置指南](environment-configuration.md)。
## API 密钥配置
### key.txt 文件配置
项目使用 `auth_profiles/key.txt` 文件来管理 API 密钥:
**文件位置**: 项目根目录下的 `key.txt` 文件
**文件格式**: 每行一个 API 密钥,支持空行和注释
```
your-api-key-1
your-api-key-2
# 这是注释行,会被忽略
another-api-key
```
**自动创建**: 如果 `key.txt` 文件不存在,系统会自动创建一个空文件
### 密钥管理方法
#### 手动编辑文件
直接编辑 `key.txt` 文件添加或删除密钥:
```bash
# 添加密钥
echo "your-new-api-key" >> key.txt
# 查看当前密钥(注意安全)
cat key.txt
```
#### 通过 Web UI 管理
在 Web UI 的"设置"标签页中可以:
- 验证密钥有效性
- 查看服务器上配置的密钥列表(需要先验证)
- 测试特定密钥
### 密钥验证机制
**验证逻辑**:
- 如果 `key.txt` 为空或不存在,则不需要 API 密钥验证
- 如果配置了密钥,则所有 API 请求都需要提供有效的密钥
- 密钥验证支持两种认证头格式
**安全特性**:
- 密钥在日志中会被打码显示(如:`abcd****efgh`)
- Web UI 中的密钥列表也会打码显示
- 支持最小长度验证(至少 8 个字符)
## API 认证流程
### Bearer Token 认证
项目支持标准的 OpenAI 兼容认证方式:
**主要认证方式** (推荐):
```bash
Authorization: Bearer your-api-key
```
**备用认证方式** (向后兼容):
```bash
X-API-Key: your-api-key
```
### 认证行为
**无密钥配置时**:
- 所有 API 请求都不需要认证
- `/api/info` 端点会显示 `"api_key_required": false`
**有密钥配置时**:
- 所有 `/v1/*` 路径的 API 请求都需要有效的密钥
- 除外路径:`/v1/models`, `/health`, `/docs` 等公开端点
- 认证失败返回 `401 Unauthorized` 错误
### 客户端配置示例
#### curl 示例
```bash
# 使用 Bearer token
curl -X POST http://127.0.0.1:2048/v1/chat/completions \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello"}]}'
# 使用 X-API-Key 头
curl -X POST http://127.0.0.1:2048/v1/chat/completions \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello"}]}'
```
#### Python requests 示例
```python
import requests
headers = {
"Authorization": "Bearer your-api-key",
"Content-Type": "application/json"
}
data = {
"messages": [{"role": "user", "content": "Hello"}]
}
response = requests.post(
"http://127.0.0.1:2048/v1/chat/completions",
headers=headers,
json=data
)
```
## API 端点
### 聊天接口
**端点**: `POST /v1/chat/completions`
- 请求体与 OpenAI API 兼容,需要 `messages` 数组。
- `model` 字段现在用于指定目标模型,代理会尝试在 AI Studio 页面切换到该模型。如果为空或为代理的默认模型名,则使用 AI Studio 当前激活的模型。
- `stream` 字段控制流式 (`true`) 或非流式 (`false`) 输出。
- 现在支持 `temperature`, `max_output_tokens`, `top_p`, `stop` 等参数,代理会尝试在 AI Studio 页面上应用它们。
- **需要认证**: 如果配置了 API 密钥,此端点需要有效的认证头。
#### 示例 (curl, 非流式, 带参数)
```bash
curl -X POST http://127.0.0.1:2048/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-1.5-pro-latest",
"messages": [
{"role": "system", "content": "Be concise."},
{"role": "user", "content": "What is the capital of France?"}
],
"stream": false,
"temperature": 0.7,
"max_output_tokens": 150,
"top_p": 0.9,
"stop": ["\n\nUser:"]
}'
```
#### 示例 (curl, 流式, 带参数)
```bash
curl -X POST http://127.0.0.1:2048/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-pro",
"messages": [
{"role": "user", "content": "Write a short story about a cat."}
],
"stream": true,
"temperature": 0.9,
"top_p": 0.95,
"stop": []
}' --no-buffer
```
#### 示例 (Python requests)
```python
import requests
import json
API_URL = "http://127.0.0.1:2048/v1/chat/completions"
headers = {"Content-Type": "application/json"}
data = {
"model": "gemini-1.5-flash-latest",
"messages": [
{"role": "user", "content": "Translate 'hello' to Spanish."}
],
"stream": False, # or True for streaming
"temperature": 0.5,
"max_output_tokens": 100,
"top_p": 0.9,
"stop": ["\n\nHuman:"]
}
response = requests.post(API_URL, headers=headers, json=data, stream=data["stream"])
if data["stream"]:
for line in response.iter_lines():
if line:
decoded_line = line.decode('utf-8')
if decoded_line.startswith('data: '):
content = decoded_line[len('data: '):]
if content.strip() == '[DONE]':
print("\nStream finished.")
break
try:
chunk = json.loads(content)
delta = chunk.get('choices', [{}])[0].get('delta', {})
print(delta.get('content', ''), end='', flush=True)
except json.JSONDecodeError:
print(f"\nError decoding JSON: {content}")
elif decoded_line.startswith('data: {'): # Handle potential error JSON
try:
error_data = json.loads(decoded_line[len('data: '):])
if 'error' in error_data:
print(f"\nError from server: {error_data['error']}")
break
except json.JSONDecodeError:
print(f"\nError decoding error JSON: {decoded_line}")
else:
if response.status_code == 200:
print(json.dumps(response.json(), indent=2))
else:
print(f"Error: {response.status_code}\n{response.text}")
```
### 模型列表
**端点**: `GET /v1/models`
- 返回 AI Studio 页面上检测到的可用模型列表,以及一个代理本身的默认模型条目。
- 现在会尝试从 AI Studio 动态获取模型列表。如果获取失败,会返回一个后备模型。
- 支持 [`excluded_models.txt`](../excluded_models.txt) 文件,用于从列表中排除特定的模型 ID。
- **🆕 脚本注入模型**: 如果启用了脚本注入功能,列表中还会包含通过油猴脚本注入的自定义模型,这些模型会标记为 `"injected": true`。
**脚本注入模型特点**:
- 模型 ID 格式:注入的模型会自动移除 `models/` 前缀,如 `models/kingfall-ab-test` 变为 `kingfall-ab-test`
- 标识字段:包含 `"injected": true` 字段用于识别
- 所有者标识:`"owned_by": "ai_studio_injected"`
- 完全兼容:可以像普通模型一样通过 API 调用
**示例响应**:
```json
{
"object": "list",
"data": [
{
"id": "kingfall-ab-test",
"object": "model",
"created": 1703123456,
"owned_by": "ai_studio_injected",
"display_name": "👑 Kingfall",
"description": "Kingfall model - Advanced reasoning capabilities",
"injected": true
}
]
}
```
### API 信息
**端点**: `GET /api/info`
- 返回 API 配置信息,如基础 URL 和模型名称。
### 健康检查
**端点**: `GET /health`
- 返回服务器运行状态(Playwright, 浏览器连接, 页面状态, Worker 状态, 队列长度)。
### 队列状态
**端点**: `GET /v1/queue`
- 返回当前请求队列的详细信息。
### 取消请求
**端点**: `POST /v1/cancel/{req_id}`
- 尝试取消仍在队列中等待处理的请求。
### API 密钥管理端点
#### 获取密钥列表
**端点**: `GET /api/keys`
- 返回服务器上配置的所有 API 密钥列表
- **注意**: 服务器返回完整密钥,打码显示由 Web UI 前端处理
- **无需认证**: 此端点不需要 API 密钥认证
#### 测试密钥
**端点**: `POST /api/keys/test`
- 验证指定的 API 密钥是否有效
- 请求体:`{"key": "your-api-key"}`
- 返回:`{"success": true, "valid": true/false, "message": "..."}`
- **无需认证**: 此端点不需要 API 密钥认证
#### 添加密钥
**端点**: `POST /api/keys`
- 向服务器添加新的 API 密钥
- 请求体:`{"key": "your-new-api-key"}`
- 密钥要求:至少 8 个字符,不能重复
- **无需认证**: 此端点不需要 API 密钥认证
#### 删除密钥
**端点**: `DELETE /api/keys`
- 从服务器删除指定的 API 密钥
- 请求体:`{"key": "key-to-delete"}`
- **无需认证**: 此端点不需要 API 密钥认证
## 配置客户端 (以 Open WebUI 为例)
1. 打开 Open WebUI。
2. 进入 "设置" -> "连接"。
3. 在 "模型" 部分,点击 "添加模型"。
4. **模型名称**: 输入你想要的名字,例如 `aistudio-gemini-py`。
5. **API 基础 URL**: 输入代理服务器的地址,例如 `http://127.0.0.1:2048/v1` (如果服务器在另一台机器,用其 IP 替换 `127.0.0.1`,并确保端口可访问)。
6. **API 密钥**: 留空或输入任意字符 (服务器不验证)。
7. 保存设置。
8. 现在,你应该可以在 Open WebUI 中选择你在第一步中配置的模型名称并开始聊天了。如果之前配置过,可能需要刷新或重新选择模型以应用新的 API 基地址。
## 重要提示
### 三层响应获取机制与参数控制
- **响应获取优先级**: 项目采用三层响应获取机制,确保高可用性和最佳性能:
1. **集成流式代理服务 (Stream Proxy)**:
- 默认启用,监听端口 `3120` (可通过 `.env` 文件的 `STREAM_PORT` 配置)
- 提供最佳性能和稳定性,直接处理 AI Studio 请求
- 支持基础参数传递,无需浏览器交互
2. **外部 Helper 服务**:
- 可选配置,通过 `--helper <endpoint_url>` 参数或 `.env` 配置启用
- 需要有效的认证文件 (`auth_profiles/active/*.json`) 提取 `SAPISID` Cookie
- 作为流式代理的备用方案
3. **Playwright 页面交互**:
- 最终后备方案,通过浏览器自动化获取响应
- 支持完整的参数控制和模型切换
- 通过模拟用户操作(编辑/复制按钮)获取响应
- **参数控制详解**:
- **流式代理模式**: 支持基础参数 (`model`, `temperature`, `max_tokens` 等),性能最优
- **Helper 服务模式**: 参数支持取决于外部 Helper 服务的具体实现
- **Playwright 模式**: 完整支持所有参数,包括 `temperature`, `max_output_tokens`, `top_p`, `stop`, `reasoning_effort`, `tools` 等
- **模型管理**:
- API 请求中的 `model` 字段用于在 AI Studio 页面切换模型
- 支持动态模型列表获取和模型 ID 验证
- [`excluded_models.txt`](../excluded_models.txt) 文件可排除特定模型 ID
- **🆕 脚本注入功能 v3.0**:
- 使用 Playwright 原生网络拦截,100% 可靠性
- 直接从油猴脚本解析模型数据,无需配置文件维护
- 前后端模型数据完全同步,注入模型标记为 `"injected": true`
- 详见 [脚本注入指南](script_injection_guide.md)
### 客户端管理历史
**客户端管理历史,代理不支持 UI 内编辑**: 客户端负责维护完整的聊天记录并将其发送给代理。代理服务器本身不支持在 AI Studio 界面中对历史消息进行编辑或分叉操作;它总是处理客户端发送的完整消息列表,然后将其发送到 AI Studio 页面。
## 兼容性说明
### Python 版本兼容性
- **推荐版本**: Python 3.10+ 或 3.11+ (生产环境推荐)
- **最低要求**: Python 3.9 (所有功能完全支持)
- **Docker 环境**: Python 3.10 (容器内默认版本)
- **完全支持**: Python 3.9, 3.10, 3.11, 3.12, 3.13
- **依赖管理**: 使用 Poetry 管理,确保版本一致性
### API 兼容性
- **OpenAI API**: 完全兼容 OpenAI v1 API 标准,支持所有主流客户端
- **FastAPI**: 基于 0.115.12 版本,包含最新性能优化和功能增强
- **HTTP 协议**: 支持 HTTP/1.1 和 HTTP/2,完整的异步处理
- **认证方式**: 支持 Bearer Token 和 X-API-Key 头部认证,OpenAI 标准兼容
- **流式响应**: 完整支持 Server-Sent Events (SSE) 流式输出
- **FastAPI**: 基于 0.111.0 版本,支持现代异步特性
- **HTTP 协议**: 支持 HTTP/1.1 和 HTTP/2
- **认证方式**: 支持 Bearer Token 和 X-API-Key 头部认证
## 下一步
API 使用配置完成后,请参考:
- [Web UI 使用指南](webui-guide.md)
- [故障排除指南](troubleshooting.md)
- [日志控制指南](logging-control.md)
|