Skip to content

Commit fdfb089

Browse files
authored
Merge pull request #284 from NikkeTryHard/main
feat: Logging overhaul, UI selector robustness, and thinking mode support
2 parents 35ce21a + 4a006cb commit fdfb089

74 files changed

Lines changed: 8636 additions & 4166 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 103 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1,210 +1,180 @@
1-
# AI Studio Proxy API 配置文件示例
1+
# AI Studio Proxy API Configuration Template
22
# 复制此文件为 .env 并根据需要修改配置
3+
# Copy this file to .env and modify as needed
34

45
# =============================================================================
5-
# 服务端口配置
6+
# 1. 服务端口配置 (Server Port Configuration)
67
# =============================================================================
78

8-
# FastAPI 服务端口
9+
# FastAPI 主服务端口
10+
# The port where the main OpenAI-compatible API will listen.
911
PORT=2048
1012

11-
# GUI 启动器默认端口配置
13+
# GUI 启动器默认端口配置 (Launcher Defaults)
14+
# 这些值仅用于启动器显示的默认建议,实际运行端口由上面的 PORT 决定。
1215
DEFAULT_FASTAPI_PORT=2048
1316
DEFAULT_CAMOUFOX_PORT=9222
1417

15-
# Camoufox WebSocket 端点捕获超时(秒)
16-
ENDPOINT_CAPTURE_TIMEOUT=45
17-
18-
# 流式代理服务配置
19-
STREAM_PORT=3120
20-
# 设置为 0 禁用流式代理服务
21-
2218
# =============================================================================
23-
# 代理配置
19+
# 2. 认证配置 (Authentication Configuration)
2420
# =============================================================================
2521

26-
# HTTP/HTTPS 代理设置
27-
# HTTP_PROXY=http://127.0.0.1:7890
28-
# HTTPS_PROXY=http://127.0.0.1:7890
29-
30-
# 统一代理配置 (优先级高于 HTTP_PROXY/HTTPS_PROXY)
31-
UNIFIED_PROXY_CONFIG=http://127.0.0.1:7890
22+
# 自动保存认证信息 (Auto Save Auth)
23+
# 设置为 true 以在每次成功登录后自动保存认证状态 (cookies/localStorage),无需人工确认。
24+
# 强烈建议在 headless 模式下开启,以便长期运行。
25+
# Default: false
26+
AUTO_SAVE_AUTH=false
3227

33-
# 代理绕过列表 (用分号分隔)
34-
# NO_PROXY=localhost;127.0.0.1;*.local
28+
# 认证保存超时时间 (seconds)
29+
# 在 debug 模式下等待用户输入保存文件名的超时时间。超时后将使用默认文件名。
30+
# Default: 30
31+
AUTH_SAVE_TIMEOUT=30
3532

3633
# =============================================================================
37-
# 日志配置
34+
# 3. 浏览与启动配置 (Browser & Model Configuration)
3835
# =============================================================================
3936

40-
# 服务器日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
41-
SERVER_LOG_LEVEL=INFO
37+
# 启动模式 (Launch Mode)
38+
# 选项 (Options):
39+
# - normal: 标准模式,同 debug。
40+
# - debug: 显示浏览器窗口,允许交互。适合初次设置和调试。
41+
# - headless: 无头模式,无浏览器窗口。适合服务器部署。需先保存认证文件。
42+
# - virtual_display: (仅 Linux) 使用 Xvfb 虚拟显示。比纯 headless 更稳定被识别。
43+
# - direct_debug_no_browser: 不启动浏览器,仅用于调试 API 逻辑。
44+
LAUNCH_MODE=normal
4245

43-
# 是否重定向 print 输出到日志
44-
SERVER_REDIRECT_PRINT=false
46+
# Camoufox WebSocket 端点 (仅高级用户)
47+
# 如果您想连接到现有的外部 Camoufox/Chrome 实例。
48+
# CAMOUFOX_WS_ENDPOINT=ws://127.0.0.1:9222
4549

46-
# 启用调试日志
47-
DEBUG_LOGS_ENABLED=false
50+
# 快速启动 (Direct Launch)
51+
# 设置为 true 跳过启动器的交互式选择菜单,直接使用 .env 配置启动。
52+
DIRECT_LAUNCH=false
4853

49-
# 启用跟踪日志
50-
TRACE_LOGS_ENABLED=false
54+
# 仅收集当前用户消息中的附件
55+
# 设置为 true 则只处理当前请求中的附件,忽略历史消息中的附件(节省带宽)。
56+
ONLY_COLLECT_CURRENT_USER_ATTACHMENTS=false
5157

5258
# =============================================================================
53-
# 认证配置
59+
# 4. 代理配置 (Proxy Configuration)
5460
# =============================================================================
5561

56-
# 自动保存认证信息
57-
AUTO_SAVE_AUTH=false
58-
59-
# 认证保存超时时间 (秒)
60-
AUTH_SAVE_TIMEOUT=30
62+
# 统一代理配置 (Unified Proxy)
63+
# 推荐使用此设置。它会同时配置 HTTP_PROXY, HTTPS_PROXY 以及浏览器内部代理。
64+
# 支持 http:// 和 socks5:// 协议。
65+
UNIFIED_PROXY_CONFIG=http://127.0.0.1:7890
6166

62-
# 自动确认登录
63-
AUTO_CONFIRM_LOGIN=true
67+
# 传统代理设置 (Legacy Proxy Settings)
68+
# 仅在未设置 UNIFIED_PROXY_CONFIG 时生效。
69+
# HTTP_PROXY=http://127.0.0.1:7890
70+
# HTTPS_PROXY=http://127.0.0.1:7890
6471

65-
# 仅收集当前用户消息中的附件(true/false)
66-
ONLY_COLLECT_CURRENT_USER_ATTACHMENTS=false
72+
# 代理绕过列表
73+
# NO_PROXY=localhost,127.0.0.1,::1
6774

6875
# =============================================================================
69-
# 浏览器配置
76+
# 5. 日志与调试 (Logging & Debugging)
7077
# =============================================================================
7178

72-
# Camoufox WebSocket 端点
73-
# CAMOUFOX_WS_ENDPOINT=ws://127.0.0.1:9222
79+
# 服务器日志级别
80+
# Options: DEBUG, INFO, WARNING, ERROR, CRITICAL
81+
SERVER_LOG_LEVEL=INFO
7482

75-
# 启动模式 (normal, headless, virtual_display, direct_debug_no_browser)
76-
LAUNCH_MODE=normal
83+
# 打印重定向
84+
# 设置为 true 将 server.py 的所有 print 输出重定向到日志文件。
85+
# 生产环境建议开启,调试时建议关闭以在控制台查看实时输出。
86+
SERVER_REDIRECT_PRINT=false
7787

78-
# 快速启动
79-
DIRECT_LAUNCH=false
88+
# 扩展日志开关
89+
# 启用详细的调试日志 (可能会包含敏感信息)
90+
DEBUG_LOGS_ENABLED=false
91+
# 启用极详细的追踪日志 (会产生大量日志)
92+
TRACE_LOGS_ENABLED=false
93+
94+
# JSON 结构化日志 (Structured JSON Logging)
95+
# 设置为 true 以输出 JSON 格式日志,适用于 ELK/Datadog 等日志聚合工具。
96+
# Default: false
97+
JSON_LOGS=false
98+
99+
# 日志文件轮换配置 (Log Rotation Configuration)
100+
# 单个日志文件最大字节数 (默认 10MB)
101+
LOG_FILE_MAX_BYTES=10485760
102+
# 保留的日志备份文件数量 (默认 5 个)
103+
LOG_FILE_BACKUP_COUNT=5
80104

81105
# =============================================================================
82-
# API 默认参数配置
106+
# 6. API 默认参数 (API Defaults)
83107
# =============================================================================
108+
# 当 API 请求未明确指定参数时使用的默认值。
84109

85-
# 默认温度值 (0.0-2.0)
110+
# 采样温度 (越高越随机)
86111
DEFAULT_TEMPERATURE=1.0
87-
88-
# 默认最大输出令牌数
112+
# 最大输出 Token 数
89113
DEFAULT_MAX_OUTPUT_TOKENS=65536
90-
91-
# 默认 Top-P 值 (0.0-1.0)
114+
# Top-P 采样 (核采样)
92115
DEFAULT_TOP_P=0.95
93-
94-
# 默认停止序列 (JSON 数组格式)
116+
# 停止序列 (JSON 数组格式)
95117
DEFAULT_STOP_SEQUENCES=["用户:"]
96118

97-
# 是否在处理请求时自动打开并使用 "URL Context" 功能,此工具功能详情可参考:https://ai.google.dev/gemini-api/docs/url-context
98-
ENABLE_URL_CONTEXT=false
119+
# 思考模型配置 (Thinking Models)
120+
# 适用于 gemini-2.0-flash-thinking 等支持思考过程的模型
99121

100-
# 是否默认启用 "指定思考预算" 功能 (true/false),不启用时模型一般将自行决定思考预算
101-
# 当 API 请求中未提供 reasoning_effort 参数时将使用此值。
122+
# 是否默认启用 "Thinking Budget"
102123
ENABLE_THINKING_BUDGET=false
103124

104-
# "指定思考预算量" 的默认值 (token)
105-
# 当 API 请求中未提供 reasoning_effort 参数时,将使用此值。
125+
# 默认思考预算 (Token count)
106126
DEFAULT_THINKING_BUDGET=8192
107127

108-
# "指定思考等级" 的默认值 (high/low)
109-
# 仅适用于 gemini-3-pro-preview 等使用思考等级的模型。
110-
# 当 API 请求中未提供 reasoning_effort 参数时,将使用此值。
128+
# 默认思考等级 (Thinking Level)
129+
# Options: high, low (仅特定模型支持)
111130
DEFAULT_THINKING_LEVEL=high
112131

113-
# 是否默认启用 "Google Search" 功能 (true/false)
114-
# 当 API 请求中未提供 tools 参数时,将使用此设置作为 Google Search 的默认开关状态。
132+
# 工具配置
133+
# 是否默认启用 Google Search
115134
ENABLE_GOOGLE_SEARCH=false
135+
# 是否默认启用 URL Context 分析
136+
ENABLE_URL_CONTEXT=false
116137

117138
# =============================================================================
118-
# 超时配置 (毫秒)
139+
# 7. 高级超时配置 (Advanced Timeouts)
119140
# =============================================================================
141+
# 单位均为毫秒 (ms),除非另有说明。仅供高级调优,一般无需修改。
120142

121-
# 响应完成总超时时间
143+
# 响应总超时 (5分钟)
122144
RESPONSE_COMPLETION_TIMEOUT=300000
123145

124-
# 初始等待时间
125-
INITIAL_WAIT_MS_BEFORE_POLLING=500
126-
127146
# 轮询间隔
128147
POLLING_INTERVAL=300
129148
POLLING_INTERVAL_STREAM=180
130149

131-
# 静默超时
150+
# 静默超时 (60秒无响应则断开)
132151
SILENCE_TIMEOUT_MS=60000
133152

134-
# 页面操作超时
135-
POST_SPINNER_CHECK_DELAY_MS=500
136-
FINAL_STATE_CHECK_TIMEOUT_MS=1500
137-
POST_COMPLETION_BUFFER=700
138-
139-
# 清理聊天相关超时
140-
CLEAR_CHAT_VERIFY_TIMEOUT_MS=5000
141-
CLEAR_CHAT_VERIFY_INTERVAL_MS=2000
142-
143-
# 点击和剪贴板操作超时
153+
# 页面交互超时
144154
CLICK_TIMEOUT_MS=3000
145-
CLIPBOARD_READ_TIMEOUT_MS=3000
146-
147-
# 元素等待超时
148155
WAIT_FOR_ELEMENT_TIMEOUT_MS=10000
149156

150-
# 流相关配置
151-
PSEUDO_STREAM_DELAY=0.01
152-
153157
# =============================================================================
154-
# GUI 启动器配置
158+
# 8. 其他系统配置 (Misc System Config)
155159
# =============================================================================
156160

157-
# GUI 默认代理地址
158-
GUI_DEFAULT_PROXY_ADDRESS=http://127.0.0.1:7890
159-
160-
# GUI 默认流式代理端口
161-
GUI_DEFAULT_STREAM_PORT=3120
162-
163-
# GUI 默认 Helper 端点
164-
GUI_DEFAULT_HELPER_ENDPOINT=
165-
166-
# =============================================================================
167-
# 脚本注入配置
168-
# =============================================================================
161+
# 流式代理服务端口 (Stream Proxy)
162+
# 用于处理流式响应的内部代理服务。设置为 0 可禁用(不推荐)。
163+
STREAM_PORT=3120
169164

170-
# 是否启用油猴脚本注入功能
165+
# 脚本注入 (Userscript Injection)
166+
# 允许加载自定义 JavaScript 以扩展页面功能(如加载额外模型列表)。
171167
ENABLE_SCRIPT_INJECTION=false
172-
173-
# 油猴脚本文件路径(相对于项目根目录)
174-
# 模型数据直接从此脚本文件中解析,无需额外配置文件
175168
USERSCRIPT_PATH=browser_utils/more_models.js
176169

177-
# =============================================================================
178-
# 其他配置
179-
# =============================================================================
170+
# Camoufox WebSocket 捕获超时 (秒)
171+
ENDPOINT_CAPTURE_TIMEOUT=45
180172

181-
# 模型名称
173+
# 模型配置
182174
MODEL_NAME=AI-Studio_Proxy_API
183-
184-
# 聊天完成 ID 前缀
185175
CHAT_COMPLETION_ID_PREFIX=chatcmpl-
186-
187-
# 默认回退模型 ID
188-
DEFAULT_FALLBACK_MODEL_ID=no model list
189-
190-
# 排除模型文件名
191-
EXCLUDED_MODELS_FILENAME=excluded_models.txt
192-
193-
# AI Studio URL 模式
194176
AI_STUDIO_URL_PATTERN=aistudio.google.com/
195177

196-
# 模型端点 URL 包含字符串
197-
MODELS_ENDPOINT_URL_CONTAINS=MakerSuiteService/ListModels
198-
199-
# 用户输入标记符
200-
USER_INPUT_START_MARKER_SERVER=__USER_INPUT_START__
201-
USER_INPUT_END_MARKER_SERVER=__USER_INPUT_END__
202-
203-
# =============================================================================
204-
# 流状态配置
205-
# =============================================================================
206-
207-
# 流超时日志状态配置
208-
STREAM_MAX_INITIAL_ERRORS=3
209-
STREAM_WARNING_INTERVAL_AFTER_SUPPRESS=60.0
210-
STREAM_SUPPRESS_DURATION_AFTER_INITIAL_BURST=400.0
178+
# 排除模型列表文件 (相对于项目根目录)
179+
# 此文件中列出的模型将不会在 /v1/models 端点中返回
180+
EXCLUDED_MODELS_FILENAME=excluded_models.txt

api_utils/app.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,19 @@ async def _shutdown_resources() -> None:
172172

173173
if state.STREAM_PROCESS:
174174
state.STREAM_PROCESS.terminate()
175+
# Wait for process to terminate with timeout to avoid atexit hang
176+
state.STREAM_PROCESS.join(timeout=3)
177+
if state.STREAM_PROCESS.is_alive():
178+
logger.warning("STREAM proxy did not terminate, killing...")
179+
state.STREAM_PROCESS.kill()
180+
state.STREAM_PROCESS.join(timeout=1)
181+
# Close the queue to prevent resource leaks
182+
if state.STREAM_QUEUE:
183+
try:
184+
state.STREAM_QUEUE.close()
185+
state.STREAM_QUEUE.join_thread()
186+
except Exception:
187+
pass
175188
logger.info("STREAM proxy terminated.")
176189

177190
if state.worker_task and not state.worker_task.done():

api_utils/queue_worker.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
from fastapi.responses import JSONResponse, StreamingResponse
1414
from playwright.async_api import Locator
1515

16+
from api_utils.context_types import QueueItem
1617
from logging_utils import set_request_id, set_source
1718
from models import ChatCompletionRequest
1819

19-
from api_utils.context_types import QueueItem
20-
2120
from .error_utils import (
2221
client_cancelled,
2322
client_disconnected,

0 commit comments

Comments
 (0)