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)