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