--- 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