Spaces:
Runtime error
Runtime error
| # 高级配置指南 | |
| 本文档介绍项目的高级配置选项和功能。 | |
| ## 代理配置管理 | |
| ### 代理配置优先级 | |
| 项目采用统一的代理配置管理系统,按以下优先级顺序确定代理设置: | |
| 1. **`--internal-camoufox-proxy` 命令行参数** (最高优先级) | |
| - 明确指定代理:`--internal-camoufox-proxy 'http://127.0.0.1:7890'` | |
| - 明确禁用代理:`--internal-camoufox-proxy ''` | |
| 2. **`UNIFIED_PROXY_CONFIG` 环境变量** (推荐,.env 文件配置) | |
| 3. **`HTTP_PROXY` 环境变量** | |
| 4. **`HTTPS_PROXY` 环境变量** | |
| 5. **系统代理设置** (Linux 下的 gsettings,最低优先级) | |
| **推荐配置方式**: | |
| ```env | |
| # .env 文件中统一配置代理 | |
| UNIFIED_PROXY_CONFIG=http://127.0.0.1:7890 | |
| # 或禁用代理 | |
| UNIFIED_PROXY_CONFIG= | |
| ``` | |
| ### 统一代理配置 | |
| 此代理配置会同时应用于 Camoufox 浏览器和流式代理服务的上游连接,确保整个系统的代理行为一致。 | |
| ## 响应获取模式配置 | |
| ### 模式1: 优先使用集成的流式代理 (默认推荐) | |
| **推荐使用 .env 配置方式**: | |
| ```env | |
| # .env 文件配置 | |
| DEFAULT_FASTAPI_PORT=2048 | |
| STREAM_PORT=3120 | |
| UNIFIED_PROXY_CONFIG= | |
| ``` | |
| ```bash | |
| # 简化启动命令 (推荐) | |
| python launch_camoufox.py --headless | |
| # 传统命令行方式 (仍然支持) | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 3120 --helper '' --internal-camoufox-proxy '' | |
| ``` | |
| # 启用统一代理配置(同时应用于浏览器和流式代理) | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 3120 --helper '' --internal-camoufox-proxy 'http://127.0.0.1:7890' | |
| ``` | |
| 在此模式下,主服务器会优先尝试通过端口 `3120` (或指定的 `--stream-port`) 上的集成流式代理获取响应。如果失败,则回退到 Playwright 页面交互。 | |
| ### 模式2: 优先使用外部 Helper 服务 (禁用集成流式代理) | |
| ```bash | |
| # 基本外部Helper模式,明确禁用代理 | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 0 --helper 'http://your-helper-service.com/api/getStreamResponse' --internal-camoufox-proxy '' | |
| # 外部Helper模式 + 统一代理配置 | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 0 --helper 'http://your-helper-service.com/api/getStreamResponse' --internal-camoufox-proxy 'http://127.0.0.1:7890' | |
| ``` | |
| 在此模式下,主服务器会优先尝试通过 `--helper` 指定的端点获取响应 (需要有效的 `auth_profiles/active/*.json` 以提取 `SAPISID`)。如果失败,则回退到 Playwright 页面交互。 | |
| ### 模式3: 仅使用 Playwright 页面交互 (禁用所有流式代理和 Helper) | |
| ```bash | |
| # 纯Playwright模式,明确禁用代理 | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 0 --helper '' --internal-camoufox-proxy '' | |
| # Playwright模式 + 统一代理配置 | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 0 --helper '' --internal-camoufox-proxy 'http://127.0.0.1:7890' | |
| ``` | |
| 在此模式下,主服务器将仅通过 Playwright 与 AI Studio 页面交互 (模拟点击"编辑"或"复制"按钮) 来获取响应。这是传统的后备方法。 | |
| ## 虚拟显示模式 (Linux) | |
| ### 关于 `--virtual-display` | |
| - **为什么使用**: 与标准的无头模式相比,虚拟显示模式通过创建一个完整的虚拟 X 服务器环境 (Xvfb) 来运行浏览器。这可以模拟一个更真实的桌面环境,从而可能进一步降低被网站检测为自动化脚本或机器人的风险 | |
| - **什么时候使用**: 当您在 Linux 环境下运行,并且希望以无头模式操作 | |
| - **如何使用**: | |
| 1. 确保您的 Linux 系统已安装 `xvfb` | |
| 2. 在运行时添加 `--virtual-display` 标志: | |
| ```bash | |
| python launch_camoufox.py --virtual-display --server-port 2048 --stream-port 3120 --internal-camoufox-proxy '' | |
| ``` | |
| ## 流式代理服务配置 | |
| ### 自签名证书管理 | |
| 集成的流式代理服务会在 `certs` 文件夹内生成自签名的根证书。 | |
| #### 证书删除与重新生成 | |
| - 可以删除 `certs` 目录下的根证书 (`ca.crt`, `ca.key`),代码会在下次启动时重新生成 | |
| - **重要**: 删除根证书时,**强烈建议同时删除 `certs` 目录下的所有其他文件**,避免信任链错误 | |
| #### 手动生成证书 | |
| 如果需要重新生成证书,可以使用以下命令: | |
| ```bash | |
| openssl genrsa -out certs/ca.key 2048 | |
| openssl req -new -x509 -days 3650 -key certs/ca.key -out certs/ca.crt -subj "/C=CN/ST=Shanghai/L=Shanghai/O=AiStudioProxyHelper/OU=CA/CN=AiStudioProxyHelper CA/emailAddress=ca@example.com" | |
| openssl rsa -in certs/ca.key -out certs/ca.key | |
| ``` | |
| ### 工作原理 | |
| 流式代理服务的特性: | |
| - 创建一个 HTTP 代理服务器(默认端口:3120) | |
| - 拦截针对 Google 域名的 HTTPS 请求 | |
| - 使用自签名 CA 证书动态自动生成服务器证书 | |
| - 将 AIStudio 响应解析为 OpenAI 兼容格式 | |
| ## 模型排除配置 | |
| ### excluded_models.txt | |
| 项目根目录下的 `excluded_models.txt` 文件可用于从 `/v1/models` 端点返回的列表中排除特定的模型 ID。 | |
| 每行一个模型ID,例如: | |
| ``` | |
| gemini-1.0-pro | |
| gemini-1.0-pro-vision | |
| deprecated-model-id | |
| ``` | |
| ## 脚本注入高级配置 🆕 | |
| ### 概述 | |
| 脚本注入功能允许您动态挂载油猴脚本来增强 AI Studio 的模型列表。该功能使用 Playwright 原生网络拦截技术,确保 100% 可靠性。 | |
| ### 工作原理 | |
| 1. **双重拦截机制**: | |
| - **Playwright 路由拦截**:在网络层面直接拦截和修改模型列表响应 | |
| - **JavaScript 脚本注入**:作为备用方案,确保万无一失 | |
| 2. **自动模型解析**: | |
| - 从油猴脚本中自动解析 `MODELS_TO_INJECT` 数组 | |
| - 前端和后端使用相同的模型数据源 | |
| - 无需手动维护模型配置文件 | |
| ### 高级配置选项 | |
| #### 自定义脚本路径 | |
| ```env | |
| # 使用自定义脚本文件 | |
| USERSCRIPT_PATH=custom_scripts/my_enhanced_script.js | |
| ``` | |
| #### 自定义脚本配置 | |
| ```env | |
| # 使用自定义脚本文件(模型数据直接从脚本解析) | |
| USERSCRIPT_PATH=configs/production_script.js | |
| ``` | |
| #### 调试模式 | |
| ```env | |
| # 启用详细的脚本注入日志 | |
| DEBUG_LOGS_ENABLED=true | |
| ENABLE_SCRIPT_INJECTION=true | |
| ``` | |
| ### 自定义脚本开发 | |
| #### 脚本格式要求 | |
| 您的自定义脚本必须包含 `MODELS_TO_INJECT` 数组: | |
| ```javascript | |
| const MODELS_TO_INJECT = [ | |
| { | |
| name: 'models/your-custom-model', | |
| displayName: '🚀 Your Custom Model', | |
| description: 'Custom model description' | |
| }, | |
| // 更多模型... | |
| ]; | |
| ``` | |
| #### 脚本模型数组格式 | |
| ```javascript | |
| const MODELS_TO_INJECT = [ | |
| { | |
| name: 'models/custom-model-1', | |
| displayName: `🎯 Custom Model 1 (Script ${SCRIPT_VERSION})`, | |
| description: `First custom model injected by script ${SCRIPT_VERSION}` | |
| }, | |
| { | |
| name: 'models/custom-model-2', | |
| displayName: `⚡ Custom Model 2 (Script ${SCRIPT_VERSION})`, | |
| description: `Second custom model injected by script ${SCRIPT_VERSION}` | |
| } | |
| ]; | |
| ``` | |
| ``` | |
| ### 网络拦截技术细节 | |
| #### Playwright 路由拦截 | |
| ```javascript | |
| // 系统会自动设置类似以下的路由拦截 | |
| await context.route("**/*", async (route) => { | |
| const request = route.request(); | |
| if (request.url().includes('alkalimakersuite') && | |
| request.url().includes('ListModels')) { | |
| // 拦截并修改模型列表响应 | |
| const response = await route.fetch(); | |
| const modifiedBody = await modifyModelListResponse(response); | |
| await route.fulfill({ response, body: modifiedBody }); | |
| } else { | |
| await route.continue_(); | |
| } | |
| }); | |
| ``` | |
| #### 响应修改流程 | |
| 1. **请求识别**:检测包含 `alkalimakersuite` 和 `ListModels` 的请求 | |
| 2. **响应获取**:获取原始模型列表响应 | |
| 3. **数据解析**:解析 JSON 响应并处理反劫持前缀 | |
| 4. **模型注入**:将自定义模型注入到响应中 | |
| 5. **响应返回**:返回修改后的响应给浏览器 | |
| ### 故障排除 | |
| #### 脚本注入失败 | |
| 1. **检查脚本文件**: | |
| ```bash | |
| # 验证脚本文件存在且可读 | |
| ls -la browser_utils/more_modles.js | |
| cat browser_utils/more_modles.js | head -20 | |
| ``` | |
| 2. **检查日志输出**: | |
| ```bash | |
| # 查看脚本注入相关日志 | |
| python launch_camoufox.py --debug | grep -i "script\|inject" | |
| ``` | |
| 3. **验证配置**: | |
| ```bash | |
| # 检查环境变量配置 | |
| grep SCRIPT .env | |
| ``` | |
| #### 模型未显示 | |
| 1. **前端检查**:在浏览器开发者工具中查看是否有 JavaScript 错误 | |
| 2. **后端检查**:查看 API 响应是否包含注入的模型 | |
| 3. **网络检查**:确认网络拦截是否正常工作 | |
| ### 性能优化 | |
| #### 脚本缓存 | |
| 系统会自动缓存解析的模型列表,避免重复解析: | |
| ```python | |
| # 系统内部缓存机制 | |
| if not hasattr(self, '_cached_models'): | |
| self._cached_models = parse_userscript_models(script_content) | |
| return self._cached_models | |
| ``` | |
| #### 网络拦截优化 | |
| - 只拦截必要的请求,其他请求直接通过 | |
| - 使用高效的 JSON 解析和序列化 | |
| - 最小化响应修改的开销 | |
| ### 安全考虑 | |
| #### 脚本安全 | |
| - 脚本在受控的浏览器环境中执行 | |
| - 不会影响主机系统安全 | |
| - 建议只使用可信的脚本源 | |
| #### 网络安全 | |
| - 网络拦截仅限于特定的模型列表请求 | |
| - 不会拦截或修改其他敏感请求 | |
| - 所有修改都在本地进行,不会发送到外部服务器 | |
| ## GUI 启动器高级功能 | |
| ### 本地LLM模拟服务 | |
| GUI 集成了启动和管理一个本地LLM模拟服务的功能: | |
| - **功能**: 监听 `11434` 端口,模拟部分 Ollama API 端点和 OpenAI 兼容的 `/v1/chat/completions` 端点 | |
| - **启动**: 在 GUI 的"启动选项"区域,点击"启动本地LLM模拟服务"按钮 | |
| - **依赖检测**: 启动前会自动检测 `localhost:2048` 端口是否可用 | |
| - **用途**: 主要用于测试客户端与 Ollama 或 OpenAI 兼容 API 的对接 | |
| ### 端口进程管理 | |
| GUI 提供端口进程管理功能: | |
| - 查询指定端口上当前正在运行的进程 | |
| - 选择并尝试停止在指定端口上找到的进程 | |
| - 手动输入 PID 终止进程 | |
| ## 环境变量配置 | |
| ### 代理配置 | |
| ```bash | |
| # 使用环境变量配置代理(不推荐,建议明确指定) | |
| export HTTP_PROXY=http://127.0.0.1:7890 | |
| export HTTPS_PROXY=http://127.0.0.1:7890 | |
| python launch_camoufox.py --headless --server-port 2048 --stream-port 3120 --helper '' | |
| ``` | |
| ### 日志控制 | |
| 详见 [日志控制指南](logging-control.md)。 | |
| ## 重要提示 | |
| ### 代理配置建议 | |
| **强烈建议在所有 `launch_camoufox.py` 命令中明确指定 `--internal-camoufox-proxy` 参数,即使其值为空字符串 (`''`),以避免意外使用系统环境变量中的代理设置。** | |
| ### 参数控制限制 | |
| API 请求中的模型参数(如 `temperature`, `max_output_tokens`, `top_p`, `stop`)**仅在通过 Playwright 页面交互获取响应时生效**。当使用集成的流式代理或外部 Helper 服务时,这些参数的传递和应用方式取决于这些服务自身的实现。 | |
| ### 首次访问性能 | |
| 当通过流式代理首次访问一个新的 HTTPS 主机时,服务需要为该主机动态生成并签署一个新的子证书。这个过程可能会比较耗时,导致对该新主机的首次连接请求响应较慢。一旦证书生成并缓存后,后续访问同一主机将会显著加快。 | |
| ## 下一步 | |
| 高级配置完成后,请参考: | |
| - [脚本注入指南](script_injection_guide.md) - 详细的脚本注入功能使用说明 | |
| - [日志控制指南](logging-control.md) | |
| - [故障排除指南](troubleshooting.md) | |