一个基于 Go 的高性能代理服务
将 Google AI Studio 网页协议转换为 OpenAI、Responses、Anthropic 和 Gemini 兼容 API
多账户轮询 •
Nano Banana 图片生成 •
Google 工具
Veo 视频生成 •
Gemini TTS 语音生成
- 四套 API 协议: 支持 OpenAI Chat Completions、OpenAI Responses、Anthropic Messages 和 Gemini GenerateContent
- 多账户运行: 支持账户轮询、模型能力筛选、限流冷却、请求故障切换和资源账户粘性
- 原生流式响应: 实时输出正文、思考摘要、函数调用、Google 工具、媒体和 usage
- TTS 语音生成: 支持 Gemini TTS 模型的单/多说话人音频生成
- 图片生成: 支持 Nano Banana 图片生成
- 视频生成: 支持 Veo 视频生成和图片转视频
- YouTube 输入: 粘贴视频 URL 即可作为外部视频附件读取
- 智能模型切换: 从 AI Studio 实时发现模型并按
model字段路由 - Google 工具: 支持 Search、Image Search、URL Context、Code Execution 和 Maps
- 反指纹检测: 使用 Camoufox 持有官方 WAA 生命周期,并为每个账户固定浏览器指纹与出口
- 图形界面启动器: 通过网页管理账户、服务启停、实时日志、模型、请求和配置
- 模块化架构: Go 负责协议、调度、API 与管理端,Camoufox 负责 WAA 运行时和隔离登录
此版本在上游基础上重点修复了以下问题:
- Gemini 思考 + Tool Call:保留 Google 返回的
thoughtSignature,并在 OpenAI Chat Completions 中通过reasoning_details与tool_calls[].extra_content.google.thought_signature往返;同时兼容常见的 snake_case/camelCase 变体。 - 独立签名 Part:Google 将签名单独放在空 Part 时,服务会将它重新关联到前一个函数调用。
- 跨请求签名恢复:如果下游客户端丢弃未知扩展字段,服务会在当前进程内按 tool-call ID 暂存签名作为后备恢复机制。
- Camoufox 版本定位:支持从运行时父目录查找
version.json,并在缺失时回退到application.ini。 - Cookie SameSite:兼容 Firefox 的
default/unspecified和 Chromium 的no_restriction,避免导入时报SameSite 无效。 - Reasoning effort 关闭值:将 OpenAI 客户端常用的
off、none、disabled、disable视为“不发送显式思考档位”,避免 DeepSeek Harness 关闭思考时收到参数无效。模型仍可能采用 AI Studio 默认思考行为;其他未知值继续严格报错。 - 上游限流:按服务进程聚合所有 Google 账号和本地 API key,默认每 1 分钟最多 8 次,并保证请求间隔至少 8 秒。WAA 预热和认证重放也计入预算;限流只会排队等待,不会自动重试 429。
- 闲置会话恢复:隔离 Camoufox 账号首次遇到 401/403 时,会清理旧 WAA runtime 和动态公共头,并在同一账号上只重放一次请求;Chrome 导入账号仍优先使用 OAuth 续签。
- 手动解除冷却:管理页“冷却与请求”可解除指定账号的全部模型/全局冷却,并同步删除
runtime-state.json中的持久化冷却。403 也可能表示真实权限限制;若自动恢复后仍失败,解除冷却只允许再次尝试,不等于修复上游权限。
先启动 AIStudio2API,并在管理页面点击“启动服务”。然后在
%USERPROFILE%\.dsh\settings.yaml 中配置 OpenAI 兼容路由:
agent-default-model:
provider: aistudio2api
model: gemini-3.7-flash
reasoningEffort: low
llm-pi-ai:
providers:
aistudio2api:
apiKeyEnv: AISTUDIO2API_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:2048/v1
models:
- id: gemini-3.7-flash
name: Gemini 3.7 Flash
contextWindow: 1048576
maxTokens: 65536
input: [text, image]
reasoningEfforts:
off:
low: low
medium: medium
high: highPowerShell 中设置与 .env 的 PROXY_API_KEY 相同的本地 API key:
$env:AISTUDIO2API_API_KEY = "<same value as PROXY_API_KEY>"
npx @deepseek-ai/dsh web在 Harness 中选择 aistudio2api / gemini-3.7-flash,即可使用思考和工具调用。
thoughtSignature 是 Gemini/AI Studio 的供应商状态字段,不属于标准 OpenAI Chat Completions。执行工具调用后,下一次请求必须保留原始:
- assistant 的
tool_calls[].id - 函数名称和参数
reasoning_details或extra_content.google.thought_signature
DeepSeek Harness 的 pi-ai 已支持将该字段保存到 replay state 并在下一轮发回。其他 OpenAI 客户端、中转层或日志清洗程序可能会丢弃这些未知字段;丢失后,启用思考的工具调用通常会收到 Function call is missing a thought signature。
建议一个会话按“模型响应 → 执行工具 → 返回工具结果 → 下一次请求”顺序运行。多个并发会话不要重写或复用 tool-call ID,也不要把不同会话的历史混合。服务端的 ID→签名缓存只是当前进程内的后备机制,进程重启会清空,重复 ID 还可能覆盖签名;最可靠的方式是由客户端原样保存并回传 reasoning_details。
当前服务使用 AI Studio 网页私有接口。Google Gemini API 的 Paid Tier 或 Vertex AI Billing 不会直接提高该网页端点的配额;UPSTREAM_* 只能降低突发请求,不能改变 Google 上游配额。
- Release 运行: Windows 10 或更高版本、
aistudio2api.exe和start.bat - 源码运行: Go 1.26、Node.js 24 和 npm
- 操作系统: Windows、macOS、Linux
- 内存: 单账户建议 2GB+ 可用内存,每个常驻预热账户约增加 0.6GB
- 网络: 稳定的互联网连接访问 Google AI Studio
git clone https://github.com/Mag1cFall/AIStudio2API.git
cd AIStudio2API
copy .env.example .env然后双击运行 start.bat。Windows PowerShell 也可以直接执行:
.\start.bat已有 aistudio2api.exe 时脚本立即运行;源码目录缺少可执行文件时,脚本自动安装前端依赖并构建前端与 Go 程序。
首次启动会自动下载当前平台的 Camoufox 到 runtime/camoufox/。也可以通过环境变量 CAMOUFOX_PATH 指定已有可执行文件。
- Go 1.26
- Node.js 24 与 npm
git clone https://github.com/Mag1cFall/AIStudio2API.git
cd AIStudio2APIcd web
npm ci
npm run build
cd ..
go build -o aistudio2api ./cmd/aistudio2api
chmod +x ./aistudio2api
./aistudio2apiLinux 与 macOS 首次运行同样会自动准备对应平台的 Camoufox。
-
导入本机 Chrome 账户:
start.bat setup扫描结果会列出可导入的 Chrome 登录态,账户保存到
.env中AISTUDIO_AUTH_STATES指向的目录。 -
启动图形界面:
- 双击
start.bat - 浏览器自动打开
http://127.0.0.1:2048 - 页面初始状态为
STOPPED,默认显示“日志”页面
- 双击
-
添加其他账户:
- 打开“账户”页面并点击“新增账户”
- 填写账户名称、代理、语言和时区
- 提交后会打开独立 Camoufox 窗口,在其中登录 Google 并进入 AI Studio
- 登录完成后账户自动保存
-
启动 API:
- 点击“启动服务”启动数据面
- 在“日志”页面确认账户、模型和请求状态
- API 默认监听
http://127.0.0.1:2048
账户操作随状态显示:
| 账户状态 | 可用操作 |
|---|---|
ready |
编辑、停用、验证、删除 |
disabled |
编辑、启用、删除 |
auth_required |
编辑、停用、重新登录、验证、删除 |
“重新登录”只在账户状态为 auth_required 时显示。
- 双击
start.bat打开管理页面 - 点击“启动服务”启用 API
- 点击“停止服务”会取消活动请求并关闭 WAA Worker,管理页面与日志保持可用
- 再次点击“启动服务”即可恢复 API
在启动窗口按 Ctrl+C 或关闭窗口会退出整个管理进程。关闭浏览器标签页不会停止管理进程。
start.bat:启动管理进程并自动打开网页。
start.bat -open-ui=false:启动管理进程但不自动打开网页。
start.bat setup:扫描本机 Chrome 账户;也可使用 --email、--profile、--login 或 --storage-state 选择明确的认证入口。
服务启动后,可以直接使用 OpenAI Chat Completions:
curl http://127.0.0.1:2048/v1/chat/completions \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.7-flash",
"messages": [{"role": "user", "content": "Hello, world!"}],
"stream": true
}'| 协议 | Base URL | API key |
|---|---|---|
| OpenAI Chat / Responses | http://127.0.0.1:2048/v1 |
.env 中的 PROXY_API_KEY |
| Anthropic Messages | http://127.0.0.1:2048 |
.env 中的 PROXY_API_KEY |
| Gemini | http://127.0.0.1:2048 |
.env 中的 PROXY_API_KEY |
模型名称从 GET /v1/models 或 GET /v1beta/models 读取。
以 Cherry Studio 为例:
- 打开 Cherry Studio 设置
- 新增 OpenAI 兼容提供商
- API 主机地址填写
http://127.0.0.1:2048/v1 - API 密钥填写
.env中的PROXY_API_KEY - 从
/v1/models获取模型,或手动添加gemini-3.6-flash、gemini-3.7-flash
主要端点:
| 能力 | 端点 |
|---|---|
| 模型 | GET /v1/models、GET /v1beta/models |
| OpenAI Chat | POST /v1/chat/completions |
| OpenAI Responses | POST /v1/responses |
| Anthropic | POST /v1/messages、POST /v1/messages/count_tokens |
| Gemini | POST /v1beta/models/{model}:generateContent、:streamGenerateContent、:countTokens |
| 图片 | POST /v1/images/generations |
| 语音 | POST /v1/audio/speech |
| 音乐 | Gemini generateContent + responseModalities: ["AUDIO"] |
| 视频 | POST /v1/videos、GET /v1/videos/{id}、GET /v1/videos/{id}/content |
curl http://127.0.0.1:2048/v1/audio/speech \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-tts-preview",
"input": "Hello, this is a test.",
"voice": "Kore",
"response_format": "wav"
}' \
--output speech.wav多说话人语音可以通过 Gemini generateContent 的 multiSpeakerVoiceConfig 配置。
curl http://127.0.0.1:2048/v1beta/models/gemini-2.5-flash-preview-tts:generateContent \
-H "x-goog-api-key: 123" \
-H "Content-Type: application/json" \
-d '{
"contents": [{"parts": [{"text": "Joe: How are you?\nJane: I am fine, thanks!"}]}],
"generationConfig": {
"responseModalities": ["AUDIO"],
"speechConfig": {
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{"speaker": "Joe", "voiceConfig": {"prebuiltVoiceConfig": {"voiceName": "Kore"}}},
{"speaker": "Jane", "voiceConfig": {"prebuiltVoiceConfig": {"voiceName": "Puck"}}}
]
}
}
}
}' --output speech.json可用语音由实时模型目录中的 capability_options.voices 返回。
curl http://127.0.0.1:2048/v1/images/generations \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3.1-flash-image",
"prompt": "A cute cat wearing a tiny hat",
"n": 1,
"size": "1024x1024"
}'curl http://127.0.0.1:2048/v1/videos \
-H "Authorization: Bearer 123" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1-fast-generate-preview",
"prompt": "A drone flying over a forest"
}'创建操作后通过 GET /v1/videos/{id} 查询状态,通过 GET /v1/videos/{id}/content 下载结果。
模型目录会随 AI Studio 更新,客户端可以从 /v1/models 或 /v1beta/models 读取。当前目录包含:
| Model ID | Display name | Input | Output | Methods |
|---|---|---|---|---|
antigravity-preview-05-2026 |
Antigravity Agent Preview | 131072 | 65536 | countTokens, generateContent |
gemini-2.5-flash |
Gemini 2.5 Flash | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-2.5-flash-image |
Nano Banana | 32768 | 32768 | batchGenerateContent, countTokens, generateContent |
gemini-2.5-flash-lite |
Gemini 2.5 Flash-Lite | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-2.5-flash-preview-tts |
Gemini 2.5 Flash Preview TTS | 8192 | 16384 | countTokens, generateContent |
gemini-2.5-pro |
Gemini 2.5 Pro | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-2.5-pro-preview-tts |
Gemini 2.5 Pro Preview TTS | 8192 | 16384 | batchGenerateContent, countTokens, generateContent |
gemini-3-flash-preview |
Gemini 3 Flash Preview | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3-pro-image |
Nano Banana Pro | 131072 | 32768 | batchGenerateContent, countTokens, generateContent |
gemini-3.1-flash-image |
Nano Banana 2 | 65536 | 65536 | batchGenerateContent, countTokens, generateContent |
gemini-3.1-flash-lite |
Gemini 3.1 Flash Lite | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3.1-flash-lite-image |
Nano Banana 2 Lite | 65536 | 65536 | batchGenerateContent, countTokens, generateContent |
gemini-3.1-flash-tts-preview |
Gemini 3.1 Flash TTS Preview | 8192 | 16384 | batchGenerateContent, countTokens, generateContent |
gemini-3.1-pro-preview |
Gemini 3.1 Pro Preview | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3.5-flash |
Gemini 3.5 Flash | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3.5-flash-lite |
Gemini 3.5 Flash Lite | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3.6-flash |
Gemini 3.6 Flash | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-3.7-flash |
Gemini 3.7 Flash | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-flash-latest |
Gemini Flash Latest | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-flash-lite-latest |
Gemini Flash-Lite Latest | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-omni-flash-preview |
Gemini Omni Flash Preview | 131072 | 65536 | countTokens, generateContent |
gemini-pro-latest |
Gemini Pro Latest | 1048576 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-robotics-er-1.6-preview |
Gemini Robotics-ER 1.6 Preview | 131072 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemini-robotics-er-2-preview |
Gemini Robotics-ER 2 Preview | 131072 | 65536 | batchGenerateContent, countTokens, createCachedContent, generateContent |
gemma-4-26b-a4b-it |
Gemma 4 26B A4B IT | 262144 | 32768 | countTokens, generateContent |
gemma-4-31b-it |
Gemma 4 31B IT | 262144 | 32768 | countTokens, generateContent |
lyria-3-clip-preview |
Lyria 3 Clip Preview | 1048576 | 65536 | countTokens, generateContent |
lyria-3-pro-preview |
Lyria 3 Pro Preview | 1048576 | 65536 | countTokens, generateContent |
veo-3.1-fast-generate-preview |
Veo 3.1 fast | 480 | 8192 | predictLongRunning |
veo-3.1-generate-preview |
Veo 3.1 | 480 | 8192 | predictLongRunning |
veo-3.1-lite-generate-preview |
Veo 3.1 lite | 480 | 8192 | predictLongRunning |
公开端点实现标准 generateContent、countTokens 和 predictLongRunning。batchGenerateContent 和 createCachedContent 只保留实时模型元数据,bidi-only 与 private Interaction 模型不进入公开模型列表。
AIStudio2API/
├── cmd/aistudio2api/ # 程序入口、管理端与运行时
├── internal/aistudio/ # AI Studio 协议、认证、模型与媒体
├── internal/api/ # OpenAI、Responses、Anthropic 与 Gemini 适配
├── internal/chromeauth/ # Windows Chrome 与 DBSC 导入
├── internal/camoufoxnative/ # Camoufox BiDi、登录与 WAA Worker
├── internal/webui/ # 内嵌前端产物
├── web/ # Vue 3 + TypeScript 管理页面
├── docs/ # 开发文档与协议规范
└── start.bat # Windows 一键启动入口
复制并编辑环境配置文件:
cp .env.example .env| 变量 | 默认值 | 作用 |
|---|---|---|
AISTUDIO_AUTH_STATES |
auth |
账户文件、目录或多个逗号分隔路径 |
LISTEN_ADDR |
127.0.0.1:2048 |
管理页面与 API 监听地址 |
PROXY_API_KEY |
空 | 公开 API key |
PROXY |
空 | Chrome 导入、登录和账户默认使用的 HTTP、HTTPS 或 SOCKS5 代理 |
INIT_TIMEOUT |
2m |
单账户 WAA 初始化超时 |
REQUEST_TIMEOUT |
5m |
单次请求最大执行时间 |
UPSTREAM_REQUESTS_PER_WINDOW |
8 |
单个滑动窗口允许发送到 Google AI Studio 的 GenerateContent 请求数;设为 0 可关闭 |
UPSTREAM_REQUEST_WINDOW |
1m |
GenerateContent 请求数的滑动窗口长度 |
UPSTREAM_REQUEST_MIN_INTERVAL |
8s |
两次 GenerateContent 请求之间的最小间隔;设为 0s 可关闭 |
WARM_WORKER_LIMIT |
5 |
常驻预热账户数 |
WARM_STARTUP_CONCURRENCY |
2 |
同时初始化的预热账户数 |
PER_ACCOUNT_CONCURRENCY |
2 |
单账号同时执行的请求数 |
TEMPORARY_CHAT |
false |
WAA 预热页是否使用临时对话 |
UPSTREAM_* 限流按服务进程聚合所有账户和本地 API key,只控制 GenerateContent 请求发出前的等待,不会自动重试上游 429。
默认的 8s 最小间隔用于平滑单个 Google 账号的滚动窗口;WAA 预热请求和认证重放也会计入该预算。若账号还在其他 AI Studio 页面使用,建议把窗口请求数调低。
- 管理页面与 API: 默认端口
2048 - Camoufox: 由程序动态分配本机端口
支持通过无认证信息的 HTTP、HTTPS 或 SOCKS5 代理访问 AI Studio:
- 在“服务配置”中设置全局代理
- 在“账户”页面编辑单个账户时可以设置账户专用代理
- 账户代理同时用于登录、WAA 与业务请求
- 认证文件默认存储在
auth/目录 - 新增账户会直接启动隔离 Camoufox 登录
ready账户可以编辑、停用、验证和删除auth_required账户可以重新登录
本项目使用 Camoufox 浏览器来降低被检测为自动化脚本的风险。Camoufox 基于 Firefox,通过修改底层实现来保持真实的设备指纹。
Go 直接处理业务请求,业务传输使用与 Camoufox 对齐的 Firefox TLS/HTTP2 配置;Camoufox 用于官方 WAA 初始化、fresh proof 和隔离账户登录。
- 客户端管理历史: Chat、Anthropic 和 Gemini 请求由客户端提交完整对话上下文
- AI Studio 历史: API 请求不保存到官网历史;
TEMPORARY_CHAT=true还会关闭 WAA 预热页的自动保存 - Responses 会话:
previous_response_id仅在当前进程内保存,重启后不会保留 - 认证有效期: Chrome 导入账户保留 DBSC 续签材料;隔离登录账户失效后在账户页重新登录
如果启动时提示 LISTEN_ADDR 配置的端口被占用,任务管理器中又找不到占用进程,可能是 Hyper-V、WSL2 或 Docker 的 NAT 服务保留了端口段。
以下命令需要在管理员权限的 PowerShell 或 CMD 中运行。
netsh interface ipv4 show excludedportrange protocol=tcp如果 2048 落在输出的 Start Port 和 End Port 范围内,可以修改 LISTEN_ADDR,或重启 WinNAT 服务后再次检查:
net stop winnat
net start winnat端口空闲后,也可以将 2048 加入持久保留:
netsh int ipv4 add excludedportrange protocol=tcp startport=2048 numberofports=1 store=persistent常见运行状态:
| 状态 | 处理方法 |
|---|---|
| 页面未自动打开 | 手动打开 .env 中 LISTEN_ADDR 对应的地址 |
service_stopped |
在管理页面点击“启动服务” |
| 没有可用账户 | 在账户页新增、启用或重新登录账户 |
| Camoufox 准备失败 | 检查 GitHub Release 访问,或设置 CAMOUFOX_PATH |
欢迎提交 Issue 和 Pull Request!
- ✅ TTS 支持: 已适配
gemini-2.5-flash/pro-preview-tts语音生成模型 - ✅ 媒体生成: 已支持 Imagen 3、Veo 2、Nano Banana 图片/视频生成
- ✅ 文档完善: 更新并优化
docs/目录下的详细使用文档与 API 规范 - 一键部署: 提供 Windows/Linux/macOS 的全自动化安装与启动脚本
- Docker 支持: 提供标准 Dockerfile 及 Docker Compose 编排文件,简化部署流程
- ✅ Go 语言重构: 将核心代理服务迁移至 Go 以提升并发性能与降低资源占用
- ✅ 多Worker负载均衡: 支持多 Google 账号轮询池,提高并发限额与稳定性