|
Download README.md from ASEM12345/anti_api: direct link, hf CLI and curl.
- Browser
- Download file 26.8 kB
-
https://huggingface.co/spaces/ASEM12345/anti_api/resolve/main/README.md
- Command line
-
hf download hf://spaces/ASEM12345/anti_api/README.md
-
curl -L -o README.md https://huggingface.co/spaces/ASEM12345/anti_api/resolve/main/README.md
26.8 kB
| title: Antigravity API Proxy | |
| emoji: 🚀 | |
| colorFrom: blue | |
| colorTo: purple | |
| sdk: docker | |
| pinned: false | |
| # Antigravity to OpenAI API 代理服务 | |
| 将 Google Antigravity API 转换为 OpenAI 兼容格式的代理服务,支持流式响应、工具调用和多账号管理。 | |
| ## 功能特性 | |
| - ✅ OpenAI API 兼容格式 | |
| - ✅ 流式和非流式响应 | |
| - ✅ 工具调用(Function Calling)支持 | |
| - ✅ 多账号自动轮换(支持多种轮询策略) | |
| - ✅ Token 自动刷新 | |
| - ✅ API Key 认证 | |
| - ✅ 思维链(Thinking)输出,兼容 OpenAI reasoning_effort 参数和 DeepSeek reasoning_content 格式 | |
| - ✅ 图片输入支持(Base64 编码) | |
| - ✅ 图片生成支持(gemini-3-pro-image 模型) | |
| - ✅ Pro 账号随机 ProjectId 支持 | |
| - ✅ 模型额度查看(实时显示剩余额度和重置时间) | |
| - ✅ SD WebUI API 兼容(支持 txt2img/img2img) | |
| - ✅ 心跳机制(防止 Cloudflare 超时断连) | |
| - ✅ 模型列表缓存(减少 API 请求) | |
| - ✅ 资格校验自动回退(无资格时自动生成随机 ProjectId) | |
| - ✅ 真 System 消息合并(开头连续多条 system 与 SystemInstruction 合并) | |
| - ✅ 隐私模式(自动隐藏敏感信息) | |
| - ✅ 内存优化(从 8+ 进程减少为 2 个进程,内存占用从 100MB+ 降为 50MB+) | |
| - ✅ 对象池复用(减少 50%+ 临时对象创建,降低 GC 频率) | |
| - ✅ 签名透传控制(可配置是否将 thoughtSignature 透传到客户端) | |
| - ✅ 预编译二进制文件(支持 Windows/Linux/Android,无需 Node.js 环境) | |
| - ✅ 多 API 格式支持(OpenAI、Gemini、Claude 三种格式) | |
| - ✅ 转换器代码复用(公共模块提取,减少重复代码) | |
| - ✅ 动态内存阈值(根据用户配置自动计算各级别阈值) | |
| ## 环境要求 | |
| - Node.js >= 18.0.0 | |
| ## 快速开始 | |
| ### 1. 安装依赖 | |
| ```bash | |
| npm install | |
| ``` | |
| ### 2. 配置环境变量 | |
| 复制 `.env.example` 为 `.env` 并编辑配置: | |
| ```bash | |
| cp .env.example .env | |
| ``` | |
| 编辑 `.env` 文件配置必要参数: | |
| ```env | |
| # 必填配置 | |
| API_KEY=sk-text | |
| ADMIN_USERNAME=admin | |
| ADMIN_PASSWORD=admin123 | |
| JWT_SECRET=your-jwt-secret-key-change-this-in-production | |
| # 可选配置 | |
| # PROXY=http://127.0.0.1:7890 | |
| # SYSTEM_INSTRUCTION=你是聊天机器人 | |
| # IMAGE_BASE_URL=http://your-domain.com | |
| ``` | |
| ### 3. 登录获取 Token | |
| ```bash | |
| npm run login | |
| ``` | |
| 浏览器会自动打开 Google 授权页面,授权后 Token 会保存到 `data/accounts.json`。 | |
| ### 4. 启动服务 | |
| ```bash | |
| npm start | |
| ``` | |
| 服务将在 `http://localhost:8045` 启动。 | |
| ## 二进制文件部署(推荐) | |
| 无需安装 Node.js,直接下载预编译的二进制文件即可运行。 | |
| ### 下载二进制文件 | |
| 从 [GitHub Releases](https://github.com/ZhaoShanGeng/antigravity2api-nodejs/releases) 下载对应平台的二进制文件: | |
| | 平台 | 文件名 | | |
| |------|--------| | |
| | Windows x64 | `antigravity2api-win-x64.exe` | | |
| | Linux x64 | `antigravity2api-linux-x64` | | |
| | Linux ARM64 | `antigravity2api-linux-arm64` | | |
| | macOS x64 | `antigravity2api-macos-x64` | | |
| | macOS ARM64 | `antigravity2api-macos-arm64` | | |
| ### 准备配置文件 | |
| 将以下文件放在二进制文件同目录下: | |
| ``` | |
| ├── antigravity2api-win-x64.exe # 二进制文件 | |
| ├── .env # 环境变量配置(必需) | |
| ├── config.json # 基础配置(必需) | |
| ├── public/ # 静态文件目录(必需) | |
| │ ├── index.html | |
| │ ├── style.css | |
| │ ├── assets/ | |
| │ │ └── bg.jpg | |
| │ └── js/ | |
| │ ├── auth.js | |
| │ ├── config.js | |
| │ ├── main.js | |
| │ ├── quota.js | |
| │ ├── tokens.js | |
| │ ├── ui.js | |
| │ └── utils.js | |
| └── data/ # 数据目录(自动创建) | |
| └── accounts.json | |
| ``` | |
| ### 配置环境变量 | |
| 创建 `.env` 文件: | |
| ```env | |
| API_KEY=sk-your-api-key | |
| ADMIN_USERNAME=admin | |
| ADMIN_PASSWORD=admin123 | |
| JWT_SECRET=your-jwt-secret-key-change-this-in-production | |
| # IMAGE_BASE_URL=http://your-domain.com | |
| # PROXY=http://127.0.0.1:7890 | |
| ``` | |
| ### 运行 | |
| **Windows**: | |
| ```bash | |
| # 直接双击运行,或在命令行执行 | |
| antigravity2api-win-x64.exe | |
| ``` | |
| **Linux/macOS**: | |
| ```bash | |
| # 添加执行权限 | |
| chmod +x antigravity2api-linux-x64 | |
| # 运行 | |
| ./antigravity2api-linux-x64 | |
| ``` | |
| ### 二进制部署说明 | |
| - **无需 Node.js**:二进制文件已包含 Node.js 运行时 | |
| - **配置文件**:`.env` 和 `config.json` 必须与二进制文件在同一目录 | |
| - **静态文件**:`public/` 目录必须与二进制文件在同一目录 | |
| - **数据持久化**:`data/` 目录会自动创建,用于存储 Token 数据 | |
| - **跨平台**:支持 Windows、Linux、macOS(x64 和 ARM64) | |
| ### 作为系统服务运行(Linux) | |
| 创建 systemd 服务文件 `/etc/systemd/system/antigravity2api.service`: | |
| ```ini | |
| [Unit] | |
| Description=Antigravity2API Service | |
| After=network.target | |
| [Service] | |
| Type=simple | |
| User=www-data | |
| WorkingDirectory=/opt/antigravity2api | |
| ExecStart=/opt/antigravity2api/antigravity2api-linux-x64 | |
| Restart=always | |
| RestartSec=10 | |
| [Install] | |
| WantedBy=multi-user.target | |
| ``` | |
| 启动服务: | |
| ```bash | |
| sudo systemctl daemon-reload | |
| sudo systemctl enable antigravity2api | |
| sudo systemctl start antigravity2api | |
| ``` | |
| ## Docker 部署 | |
| ### 使用 Docker Compose(推荐) | |
| 1. **配置环境变量** | |
| 创建 `.env` 文件: | |
| ```bash | |
| cp .env.example .env | |
| ``` | |
| 编辑 `.env` 文件配置必要参数。 | |
| 2. **启动服务** | |
| ```bash | |
| docker-compose up -d | |
| ``` | |
| 3. **查看日志** | |
| ```bash | |
| docker-compose logs -f | |
| ``` | |
| 4. **停止服务** | |
| ```bash | |
| docker-compose down | |
| ``` | |
| ### 使用 Docker | |
| 1. **构建镜像** | |
| ```bash | |
| docker build -t antigravity2api . | |
| ``` | |
| 2. **运行容器** | |
| ```bash | |
| docker run -d \ | |
| --name antigravity2api \ | |
| -p 8045:8045 \ | |
| -e API_KEY=sk-text \ | |
| -e ADMIN_USERNAME=admin \ | |
| -e ADMIN_PASSWORD=admin123 \ | |
| -e JWT_SECRET=your-jwt-secret-key \ | |
| -e IMAGE_BASE_URL=http://your-domain.com \ | |
| -v $(pwd)/data:/app/data \ | |
| -v $(pwd)/public/images:/app/public/images \ | |
| -v $(pwd)/.env:/app/.env \ | |
| -v $(pwd)/config.json:/app/config.json \ | |
| antigravity2api | |
| ``` | |
| 3. **查看日志** | |
| ```bash | |
| docker logs -f antigravity2api | |
| ``` | |
| ### Docker 部署说明 | |
| - 数据持久化:`data/` 目录挂载到容器,保存 Token 数据 | |
| - 图片存储:`public/images/` 目录挂载到容器,保存生成的图片 | |
| - 配置文件:`.env` 和 `config.json` 挂载到容器,支持热更新 | |
| - 端口映射:默认映射 8045 端口,可根据需要修改 | |
| - 自动重启:容器异常退出会自动重启 | |
| ## Zeabur 部署 | |
| ### 使用预构建镜像部署 | |
| 1. **创建服务** | |
| 在 Zeabur 控制台创建新服务,使用以下镜像: | |
| ``` | |
| ghcr.io/liuw1535/antigravity2api-nodejs | |
| ``` | |
| 2. **配置环境变量** | |
| 在服务设置中添加以下环境变量: | |
| | 环境变量 | 说明 | 示例值 | | |
| |--------|------|--------| | |
| | `API_KEY` | API 认证密钥 | `sk-your-api-key` | | |
| | `ADMIN_USERNAME` | 管理员用户名 | `admin` | | |
| | `ADMIN_PASSWORD` | 管理员密码 | `your-secure-password` | | |
| | `JWT_SECRET` | JWT 密钥 | `your-jwt-secret-key` | | |
| | `IMAGE_BASE_URL` | 图片服务基础 URL | `https://your-domain.zeabur.app` | | |
| 可选环境变量: | |
| - `PROXY`:代理地址 | |
| - `SYSTEM_INSTRUCTION`:系统提示词 | |
| 3. **配置持久化存储** | |
| 在服务的「Volumes」设置中添加以下挂载点: | |
| | 挂载路径 | 说明 | | |
| |---------|------| | |
| | `/app/data` | Token 数据存储 | | |
| | `/app/public/images` | 生成的图片存储 | | |
| ⚠️ **重要提示**: | |
| - 只挂载 `/app/data` 和 `/app/public/images` 这两个目录 | |
| - 不要挂载其他目录(如 `/app/.env`、`/app/config.json` 等),否则会导致必要配置文件被清空,项目无法启动 | |
| 4. **绑定域名** | |
| 在服务的「Networking」设置中绑定域名,然后将该域名设置到 `IMAGE_BASE_URL` 环境变量中。 | |
| 5. **启动服务** | |
| 保存配置后,Zeabur 会自动拉取镜像并启动服务。访问绑定的域名即可使用。 | |
| ### Zeabur 部署说明 | |
| - 使用预构建的 Docker 镜像,无需手动构建 | |
| - 通过环境变量配置所有必要参数 | |
| - 持久化存储确保 Token 和图片数据不丢失 | |
| ## Web 管理界面 | |
| 服务启动后,访问 `http://localhost:8045` 即可打开 Web 管理界面。 | |
| ### 功能特性 | |
| - 🔐 **安全登录**:JWT Token 认证,保护管理接口 | |
| - 📊 **实时统计**:显示总 Token 数、启用/禁用状态统计 | |
| - ➕ **多种添加方式**: | |
| - OAuth 授权登录(推荐):自动完成 Google 授权流程 | |
| - 手动填入:直接输入 Access Token 和 Refresh Token | |
| - 🎯 **Token 管理**: | |
| - 查看所有 Token 的详细信息(Access Token 后缀、Project ID、过期时间) | |
| - 📊 查看模型额度:按类型分组显示(Claude/Gemini/其他),实时查看剩余额度和重置时间 | |
| - 一键启用/禁用 Token | |
| - 删除无效 Token | |
| - 实时刷新 Token 列表 | |
| - ⚙️ **配置管理**: | |
| - 在线编辑服务器配置(端口、监听地址) | |
| - 调整默认参数(温度、Top P/K、最大 Token 数) | |
| - 修改安全配置(API 密钥、请求大小限制) | |
| - 配置代理、系统提示词等可选项 | |
| - 热重载配置(部分配置需重启生效) | |
| ### 使用流程 | |
| 1. **登录系统** | |
| - 使用 `.env` 中配置的 `ADMIN_USERNAME` 和 `ADMIN_PASSWORD` 登录 | |
| - 登录成功后会自动保存 JWT Token 到浏览器 | |
| 2. **添加 Token** | |
| - **OAuth 方式**(推荐): | |
| 1. 点击「OAuth登录」按钮 | |
| 2. 在弹窗中点击「打开授权页面」 | |
| 3. 在新窗口完成 Google 授权 | |
| 4. 复制浏览器地址栏的完整回调 URL | |
| 5. 粘贴到输入框并提交 | |
| - **手动方式**: | |
| 1. 点击「手动填入」按钮 | |
| 2. 填写 Access Token、Refresh Token 和过期时间 | |
| 3. 提交保存 | |
| 3. **管理 Token** | |
| - 查看 Token 卡片显示的状态和信息 | |
| - 点击「📊 查看额度」按钮查看该账号的模型额度信息 | |
| - 自动按模型类型分组(Claude/Gemini/其他) | |
| - 显示剩余额度百分比和进度条 | |
| - 显示额度重置时间(北京时间) | |
| - 支持「立即刷新」强制更新额度数据 | |
| - 使用「启用/禁用」按钮控制 Token 状态 | |
| - 使用「删除」按钮移除无效 Token | |
| - 点击「刷新」按钮更新列表 | |
| 4. **隐私模式** | |
| - 默认开启,自动隐藏 Token、Project ID 等敏感信息 | |
| - 点击「显示敏感信息」切换显示/隐藏状态 | |
| - 支持逐个查看或批量显示 | |
| 5. **配置轮询策略** | |
| - 支持三种轮询策略: | |
| - `round_robin`:均衡负载,每次请求切换 Token | |
| - `quota_exhausted`:额度耗尽才切换 | |
| - `request_count`:自定义请求次数后切换 | |
| - 可在「设置」页面配置 | |
| 6. **修改配置** | |
| - 切换到「设置」标签页 | |
| - 修改需要调整的配置项 | |
| - 点击「保存配置」按钮应用更改 | |
| - 注意:端口和监听地址修改需要重启服务 | |
| - 支持的设置项: | |
| - 编辑 Token 信息(Access Token、Refresh Token) | |
| - 思考预算(1024-32000) | |
| - 图片访问地址 | |
| - 轮询策略 | |
| - 内存阈值 | |
| - 心跳间隔 | |
| - 字体大小 | |
| ### 界面预览 | |
| - **Token 管理页面**:卡片式展示所有 Token,支持快速操作 | |
| - **设置页面**:分类展示所有配置项,支持在线编辑 | |
| - **响应式设计**:支持桌面和移动设备访问 | |
| - **字体优化**:采用 MiSans + Ubuntu Mono 字体,增强可读性 | |
| ## API 使用 | |
| 服务提供 OpenAI 兼容的 API 接口,详细使用说明请查看 [API.md](API.md)。 | |
| ### 快速测试 | |
| ```bash | |
| curl http://localhost:8045/v1/chat/completions \ | |
| -H "Content-Type: application/json" \ | |
| -H "Authorization: Bearer sk-text" \ | |
| -d '{ | |
| "model": "gemini-2.0-flash-exp", | |
| "messages": [{"role": "user", "content": "你好"}] | |
| }' | |
| ``` | |
| ## 多账号管理 | |
| `data/accounts.json` 支持多个账号,服务会自动轮换使用: | |
| ```json | |
| [ | |
| { | |
| "access_token": "ya29.xxx", | |
| "refresh_token": "1//xxx", | |
| "expires_in": 3599, | |
| "timestamp": 1234567890000, | |
| "enable": true | |
| }, | |
| { | |
| "access_token": "ya29.yyy", | |
| "refresh_token": "1//yyy", | |
| "expires_in": 3599, | |
| "timestamp": 1234567890000, | |
| "enable": true | |
| } | |
| ] | |
| ``` | |
| - `enable: false` 可禁用某个账号 | |
| - Token 过期会自动刷新 | |
| - 刷新失败(403)会自动禁用并切换下一个账号 | |
| ## 配置说明 | |
| 项目配置分为两部分: | |
| ### 1. config.json(基础配置) | |
| 基础配置文件,包含服务器、API 和默认参数设置: | |
| ```json | |
| { | |
| "server": { | |
| "port": 8045, // 服务端口 | |
| "host": "0.0.0.0", // 监听地址 | |
| "maxRequestSize": "500mb", // 最大请求体大小 | |
| "heartbeatInterval": 15000,// 心跳间隔(毫秒),防止 Cloudflare 超时 | |
| "memoryThreshold": 100 // 内存阈值(MB),超过时触发 GC | |
| }, | |
| "rotation": { | |
| "strategy": "round_robin", // 轮询策略:round_robin/quota_exhausted/request_count | |
| "requestCount": 50 // request_count 策略下每个 Token 的请求次数 | |
| }, | |
| "defaults": { | |
| "temperature": 1, // 默认温度参数 | |
| "topP": 1, // 默认 top_p | |
| "topK": 50, // 默认 top_k | |
| "maxTokens": 32000, // 默认最大 token 数 | |
| "thinkingBudget": 1024 // 默认思考预算(仅对思考模型生效,范围 1024-32000) | |
| }, | |
| "cache": { | |
| "modelListTTL": 3600000 // 模型列表缓存时间(毫秒),默认 1 小时 | |
| }, | |
| "other": { | |
| "timeout": 300000, // 请求超时时间(毫秒) | |
| "skipProjectIdFetch": false,// 跳过 ProjectId 获取,直接随机生成(仅 Pro 账号有效) | |
| "useNativeAxios": false, // 使用原生 axios 而非 AntigravityRequester | |
| "useContextSystemPrompt": false, // 是否将请求中的 system 消息合并到 SystemInstruction | |
| "passSignatureToClient": false // 是否将 thoughtSignature 透传到客户端 | |
| } | |
| } | |
| ``` | |
| ### 轮询策略说明 | |
| | 策略 | 说明 | | |
| |------|------| | |
| | `round_robin` | 均衡负载:每次请求后切换到下一个 Token | | |
| | `quota_exhausted` | 额度耗尽才切换:持续使用当前 Token 直到额度用完(高性能优化) | | |
| | `request_count` | 自定义次数:每个 Token 使用指定次数后切换(默认策略) | | |
| ### 2. .env(敏感配置) | |
| 环境变量配置文件,包含敏感信息和可选配置: | |
| | 环境变量 | 说明 | 必填 | | |
| |--------|------|------| | |
| | `API_KEY` | API 认证密钥 | ✅ | | |
| | `ADMIN_USERNAME` | 管理员用户名 | ✅ | | |
| | `ADMIN_PASSWORD` | 管理员密码 | ✅ | | |
| | `JWT_SECRET` | JWT 密钥 | ✅ | | |
| | `PROXY` | 代理地址(如:http://127.0.0.1:7890),也支持系统代理环境变量 | |
| |`HTTP_PROXY`/`HTTPS_PROXY` | ❌ | | |
| | `SYSTEM_INSTRUCTION` | 系统提示词 | ❌ | | |
| | `IMAGE_BASE_URL` | 图片服务基础 URL | ❌ | | |
| 完整配置示例请参考 `.env.example` 文件。 | |
| ## 开发命令 | |
| ```bash | |
| # 启动服务 | |
| npm start | |
| # 开发模式(自动重启) | |
| npm run dev | |
| # 登录获取 Token | |
| npm run login | |
| ``` | |
| ## 项目结构 | |
| ``` | |
| . | |
| ├── data/ | |
| │ ├── accounts.json # Token 存储(自动生成) | |
| │ └── quotas.json # 额度缓存(自动生成) | |
| ├── public/ | |
| │ ├── index.html # Web 管理界面 | |
| │ ├── app.js # 前端逻辑 | |
| │ ├── style.css # 界面样式 | |
| │ └── images/ # 生成的图片存储目录 | |
| ├── scripts/ | |
| │ ├── oauth-server.js # OAuth 登录服务 | |
| │ └── refresh-tokens.js # Token 刷新脚本 | |
| ├── src/ | |
| │ ├── api/ | |
| │ │ ├── client.js # API 调用逻辑(含模型列表缓存) | |
| │ │ └── stream_parser.js # 流式响应解析(对象池优化) | |
| │ ├── auth/ | |
| │ │ ├── jwt.js # JWT 认证 | |
| │ │ ├── token_manager.js # Token 管理(含轮询策略) | |
| │ │ ├── token_store.js # Token 文件存储(异步读写) | |
| │ │ └── quota_manager.js # 额度缓存管理 | |
| │ ├── routes/ | |
| │ │ ├── admin.js # 管理接口路由 | |
| │ │ └── sd.js # SD WebUI 兼容接口 | |
| │ ├── bin/ | |
| │ │ ├── antigravity_requester_android_arm64 # Android ARM64 TLS 请求器 | |
| │ │ ├── antigravity_requester_linux_amd64 # Linux AMD64 TLS 请求器 | |
| │ │ └── antigravity_requester_windows_amd64.exe # Windows AMD64 TLS 请求器 | |
| │ ├── config/ | |
| │ │ ├── config.js # 配置加载 | |
| │ │ └── init-env.js # 环境变量初始化 | |
| │ ├── constants/ | |
| │ │ ├── index.js # 应用常量定义 | |
| │ │ └── oauth.js # OAuth 常量 | |
| │ ├── server/ | |
| │ │ └── index.js # 主服务器(含内存管理和心跳) | |
| │ ├── utils/ | |
| │ │ ├── configReloader.js # 配置热重载 | |
| │ │ ├── deepMerge.js # 深度合并工具 | |
| │ │ ├── envParser.js # 环境变量解析 | |
| │ │ ├── errors.js # 统一错误处理 | |
| │ │ ├── idGenerator.js # ID 生成器 | |
| │ │ ├── imageStorage.js # 图片存储 | |
| │ │ ├── logger.js # 日志模块 | |
| │ │ ├── memoryManager.js # 智能内存管理 | |
| │ │ ├── parameterNormalizer.js # 统一参数处理 | |
| │ │ ├── paths.js # 路径工具(支持 pkg 打包) | |
| │ │ ├── thoughtSignatureCache.js # 签名缓存 | |
| │ │ ├── toolConverter.js # 工具定义转换 | |
| │ │ ├── toolNameCache.js # 工具名称缓存 | |
| │ │ └── utils.js # 工具函数(重导出) | |
| │ │ └── converters/ # 格式转换器 | |
| │ │ ├── common.js # 公共函数 | |
| │ │ ├── openai.js # OpenAI 格式 | |
| │ │ ├── claude.js # Claude 格式 | |
| │ │ └── gemini.js # Gemini 格式 | |
| │ └── AntigravityRequester.js # TLS 指纹请求器封装 | |
| ├── test/ | |
| │ ├── test-request.js # 请求测试 | |
| │ ├── test-image-generation.js # 图片生成测试 | |
| │ ├── test-token-rotation.js # Token 轮换测试 | |
| │ └── test-transform.js # 转换测试 | |
| ├── .env # 环境变量配置(敏感信息) | |
| ├── .env.example # 环境变量配置示例 | |
| ├── config.json # 基础配置文件 | |
| ├── Dockerfile # Docker 构建文件 | |
| ├── docker-compose.yml # Docker Compose 配置 | |
| └── package.json # 项目配置 | |
| ``` | |
| ## Pro 账号随机 ProjectId | |
| 对于 Pro 订阅账号,可以跳过 API 验证直接使用随机生成的 ProjectId: | |
| 1. 在 `config.json` 文件中设置: | |
| ```json | |
| { | |
| "other": { | |
| "skipProjectIdFetch": true | |
| } | |
| } | |
| ``` | |
| 2. 运行 `npm run login` 登录时会自动使用随机生成的 ProjectId | |
| 3. 已有账号也会在使用时自动生成随机 ProjectId | |
| 注意:此功能仅适用于 Pro 订阅账号。官方已修复免费账号使用随机 ProjectId 的漏洞。 | |
| ## 资格校验自动回退 | |
| 当 OAuth 登录或添加 Token 时,系统会自动检测账号的订阅资格: | |
| 1. **有资格的账号**:正常使用 API 返回的 ProjectId | |
| 2. **无资格的账号**:自动生成随机 ProjectId,避免添加失败 | |
| 这一机制确保了: | |
| - 无论账号是否有 Pro 订阅,都能成功添加 Token | |
| - 自动降级处理,无需手动干预 | |
| - 不会因为资格校验失败而阻止登录流程 | |
| ## 真 System 消息合并 | |
| 本服务支持将开头连续的多条 system 消息与全局 SystemInstruction 合并: | |
| ``` | |
| 请求消息: | |
| [system] 你是助手 | |
| [system] 请使用中文回答 | |
| [user] 你好 | |
| 合并后: | |
| SystemInstruction = 全局配置的系统提示词 + "\n\n" + "你是助手\n\n请使用中文回答" | |
| messages = [{role: user, content: 你好}] | |
| ``` | |
| 这一设计: | |
| - 兼容 OpenAI 的多 system 消息格式 | |
| - 充分利用 Antigravity 的 SystemInstruction 功能 | |
| - 确保系统提示词的完整性和优先级 | |
| ## 多 API 格式支持 | |
| 本服务支持三种 API 格式,每种格式都有完整的参数支持: | |
| ### OpenAI 格式 (`/v1/chat/completions`) | |
| ```json | |
| { | |
| "model": "gemini-2.0-flash-thinking-exp", | |
| "max_tokens": 16000, | |
| "temperature": 0.7, | |
| "top_p": 0.9, | |
| "top_k": 40, | |
| "thinking_budget": 10000, | |
| "reasoning_effort": "high", | |
| "messages": [...] | |
| } | |
| ``` | |
| | 参数 | 说明 | 默认值 | | |
| |------|------|--------| | |
| | `max_tokens` | 最大输出 token 数 | 32000 | | |
| | `temperature` | 温度 (0.0-1.0) | 1 | | |
| | `top_p` | Top-P 采样 | 1 | | |
| | `top_k` | Top-K 采样 | 50 | | |
| | `thinking_budget` | 思考预算 (1024-32000) | 1024 | | |
| | `reasoning_effort` | 思考强度 (`low`/`medium`/`high`) | - | | |
| ### Claude 格式 (`/v1/messages`) | |
| ```json | |
| { | |
| "model": "claude-sonnet-4-5-thinking", | |
| "max_tokens": 16000, | |
| "temperature": 0.7, | |
| "top_p": 0.9, | |
| "top_k": 40, | |
| "thinking": { | |
| "type": "enabled", | |
| "budget_tokens": 10000 | |
| }, | |
| "messages": [...] | |
| } | |
| ``` | |
| | 参数 | 说明 | 默认值 | | |
| |------|------|--------| | |
| | `max_tokens` | 最大输出 token 数 | 32000 | | |
| | `temperature` | 温度 (0.0-1.0) | 1 | | |
| | `top_p` | Top-P 采样 | 1 | | |
| | `top_k` | Top-K 采样 | 50 | | |
| | `thinking.type` | 思考开关 (`enabled`/`disabled`) | - | | |
| | `thinking.budget_tokens` | 思考预算 (1024-32000) | 1024 | | |
| ### Gemini 格式 (`/v1beta/models/:model:generateContent`) | |
| ```json | |
| { | |
| "contents": [...], | |
| "generationConfig": { | |
| "maxOutputTokens": 16000, | |
| "temperature": 0.7, | |
| "topP": 0.9, | |
| "topK": 40, | |
| "thinkingConfig": { | |
| "includeThoughts": true, | |
| "thinkingBudget": 10000 | |
| } | |
| } | |
| } | |
| ``` | |
| | 参数 | 说明 | 默认值 | | |
| |------|------|--------| | |
| | `maxOutputTokens` | 最大输出 token 数 | 32000 | | |
| | `temperature` | 温度 (0.0-1.0) | 1 | | |
| | `topP` | Top-P 采样 | 1 | | |
| | `topK` | Top-K 采样 | 50 | | |
| | `thinkingConfig.includeThoughts` | 是否包含思考内容 | true | | |
| | `thinkingConfig.thinkingBudget` | 思考预算 (1024-32000) | 1024 | | |
| ### 统一参数处理 | |
| 所有三种格式的参数都会被统一规范化处理,确保一致的行为: | |
| 1. **参数优先级**:请求参数 > 配置文件默认值 | |
| 2. **思考预算优先级**:`thinking_budget`/`budget_tokens`/`thinkingBudget` > `reasoning_effort` > 配置文件默认值 | |
| 3. **禁用思考**:设置 `thinking_budget=0` 或 `thinking.type="disabled"` 或 `thinkingConfig.includeThoughts=false` | |
| ### DeepSeek 思考格式兼容 | |
| 本服务自动适配 DeepSeek 的 `reasoning_content` 格式,将思维链内容单独输出,避免与正常内容混淆: | |
| ```json | |
| { | |
| "choices": [{ | |
| "message": { | |
| "content": "最终答案", | |
| "reasoning_content": "这是思考过程..." | |
| } | |
| }] | |
| } | |
| ``` | |
| ### reasoning_effort 映射 | |
| | 值 | 思考 Token 预算 | | |
| |---|----------------| | |
| | `low` | 1024 | | |
| | `medium` | 16000 | | |
| | `high` | 32000 | | |
| ## 内存优化 | |
| 本服务经过深度内存优化: | |
| ### 优化效果 | |
| | 指标 | 优化前 | 优化后 | | |
| |------|--------|--------| | |
| | 进程数 | 8+ | 2 | | |
| | 内存占用 | 100MB+ | 50MB+ | | |
| | GC 频率 | 高 | 低 | | |
| ### 优化手段 | |
| 1. **对象池复用**:流式响应对象通过对象池复用,减少 50%+ 临时对象创建 | |
| 2. **预编译常量**:正则表达式、格式字符串等预编译,避免重复创建 | |
| 3. **LineBuffer 优化**:高效的流式行分割,避免频繁字符串操作 | |
| 4. **自动内存清理**:堆内存超过阈值时自动触发 GC | |
| 5. **进程精简**:移除不必要的子进程,统一在主进程处理 | |
| ### 动态内存阈值 | |
| 内存压力阈值根据用户配置的 `memoryThreshold`(MB)动态计算: | |
| | 压力级别 | 阈值比例 | 默认值(100MB 配置) | 行为 | | |
| |---------|---------|---------------------|------| | |
| | LOW | 30% | 30MB | 正常运行 | | |
| | MEDIUM | 60% | 60MB | 轻度清理 | | |
| | HIGH | 100% | 100MB | 积极清理 + GC | | |
| | CRITICAL | >100% | >100MB | 紧急清理 + 强制 GC | | |
| ### 配置 | |
| ```json | |
| { | |
| "server": { | |
| "memoryThreshold": 100 | |
| } | |
| } | |
| ``` | |
| - `memoryThreshold`:高压力阈值(MB),其他级别按比例自动计算 | |
| ## 心跳机制 | |
| 为防止 Cloudflare 等 CDN 因长时间无响应而断开连接,本服务实现了 SSE 心跳机制: | |
| - 在流式响应期间,定期发送心跳包(`: heartbeat\n\n`) | |
| - 默认间隔 15 秒,可配置 | |
| - 心跳包符合 SSE 规范,客户端会自动忽略 | |
| ### 配置 | |
| ```json | |
| { | |
| "server": { | |
| "heartbeatInterval": 15000 | |
| } | |
| } | |
| ``` | |
| - `heartbeatInterval`:心跳间隔(毫秒),设为 0 禁用心跳 | |
| ## 代码架构 | |
| ### 转换器模块 | |
| 项目支持三种 API 格式(OpenAI、Gemini、Claude),转换器代码经过优化,提取了公共模块: | |
| ``` | |
| src/utils/converters/ | |
| ├── common.js # 公共函数(签名处理、消息构建、请求体构建等) | |
| ├── openai.js # OpenAI 格式转换器 | |
| ├── claude.js # Claude 格式转换器 | |
| └── gemini.js # Gemini 格式转换器 | |
| ``` | |
| #### 公共函数 | |
| | 函数 | 说明 | | |
| |------|------| | |
| | `getSignatureContext()` | 获取思维签名和工具签名 | | |
| | `pushUserMessage()` | 添加用户消息到消息数组 | | |
| | `findFunctionNameById()` | 根据工具调用 ID 查找函数名 | | |
| | `pushFunctionResponse()` | 添加函数响应到消息数组 | | |
| | `createThoughtPart()` | 创建带签名的思维 part | | |
| | `createFunctionCallPart()` | 创建带签名的函数调用 part | | |
| | `processToolName()` | 处理工具名称映射 | | |
| | `pushModelMessage()` | 添加模型消息到消息数组 | | |
| | `buildRequestBody()` | 构建 Antigravity 请求体 | | |
| | `mergeSystemInstruction()` | 合并系统指令 | | |
| ### 参数规范化模块 | |
| ``` | |
| src/utils/parameterNormalizer.js # 统一参数处理 | |
| ``` | |
| 将 OpenAI、Claude、Gemini 三种格式的参数统一转换为内部格式: | |
| | 函数 | 说明 | | |
| |------|------| | |
| | `normalizeOpenAIParameters()` | 规范化 OpenAI 格式参数 | | |
| | `normalizeClaudeParameters()` | 规范化 Claude 格式参数 | | |
| | `normalizeGeminiParameters()` | 规范化 Gemini 格式参数 | | |
| | `toGenerationConfig()` | 转换为上游 API 格式 | | |
| ### 工具转换模块 | |
| ``` | |
| src/utils/toolConverter.js # 统一的工具定义转换 | |
| ``` | |
| 支持将 OpenAI、Claude、Gemini 三种格式的工具定义转换为 Antigravity 格式。 | |
| ## 注意事项 | |
| 1. 首次使用需要复制 `.env.example` 为 `.env` 并配置 | |
| 2. 运行 `npm run login` 获取 Token | |
| 3. `.env` 和 `data/accounts.json` 包含敏感信息,请勿泄露 | |
| 4. 支持多账号轮换,提高可用性 | |
| 5. Token 会自动刷新,无需手动维护 | |
| ## License | |
| MIT | |