Gemini Gateway 是一个高性能、高可用的 Gemini API 代理和负载均衡解决方案。它旨在通过集中管理和动态调度一组 API 密钥,为您的应用程序提供稳定、可靠的 Gemini 模型访问服务。
该项目通过智能的密钥轮换、自动测试和状态监控机制,最大限度地提高 API 请求的成功率,并在正确认证后绕过速率限制。
- 🚀 高性能代理: 基于 Flask 构建的轻量级代理服务器,支持并发请求和流式响应 (SSE),确保低延迟和高吞吐量。
- ⚖️ 动态负载均衡: 动态从可用密钥池中为每个请求选择一个健康的密钥(优先选择状态为 200 的密钥)。
- 🔄 智能重试机制: 当一个密钥请求失败(例如,HTTP 状态码非 200、请求异常或收到空的 SSE 响应)时,会自动切换到下一个可用密钥,最多重试5次。
- 💧 熔断机制: 当可用密钥数量低于预设阈值时,会根据概率拒绝新请求,防止因大量无效密钥导致的服务雪崩。
- 🔑 集中式密钥管理:
- 自动从
keys/
目录下的所有文件中读取 API 密钥。 - 支持多种格式:每个文件可以包含一个或多个以换行符、空格或逗号分隔的密钥。
- 自动格式化源文件,确保每个密钥独占一行,便于维护。
- 将所有密钥同步到 SQLite 数据库中,进行统一管理。
- 自动从
- 🔬 自动化健康检查:
- 定期对每个密钥在所有支持的 Gemini 模型上进行可用性测试。
- 根据 HTTP 状态码(200, 403, 4xx, 5xx)智能调整密钥的下一次测试时间。
- 🛡️ 安全认证与特权:
- 支持通过
AUTH_KEY
对代理服务进行认证。 - 使用有效
AUTH_KEY
的请求将自动绕过 IP 速率限制和熔断机制,确保授权访问的最高可用性。
- 支持通过
- ✋ IP 速率限制: 内置基于 IP 的速率限制器,可配置分钟级和小时级的请求限制,自动封禁恶意 IP。
- 📊 状态监控与日志:
- 定期将按模型聚合的密钥健康状态和请求统计输出到
status.txt
文件。 - 记录详细的请求日志,包括使用的密钥、模型、响应状态和延迟。
- 自动清理旧的日志记录。
- 定期将按模型聚合的密钥健康状态和请求统计输出到
- ⚙️ 灵活配置:
- 所有关键参数(如端口、调度间隔、重试次数、代理设置等)都可通过
config.py
文件进行配置。 - 支持通过 SOCKS5 代理转发所有出站请求。
- 所有关键参数(如端口、调度间隔、重试次数、代理设置等)都可通过
- Python 3.7+
- 安装依赖:
pip install -r requirements.txt
- 将您的 Gemini API 密钥放入
keys/
目录下的一个或多个文本文件中。- 您可以将多个密钥放在同一个文件中,用换行、空格或逗号分隔。脚本会自动读取并格式化。
- 根据您的需求修改
config.py
文件中的配置项。
python main.py
服务启动后,main.py
会在后台启动四个独立的线程:
- 密钥同步服务: 定期从
keys/
目录同步密钥到数据库。 - 密钥测试服务: 定期测试数据库中密钥的有效性。
- 状态打印服务: 定期将服务状态写入
status.txt
。 - 日志清理服务: 定期清理旧的请求日志。
最后,主线程会启动 Flask 代理服务,监听指定端口。
.
├── main.py # 主程序入口,启动所有后台服务和代理
├── proxy_service.py # Flask 代理服务核心逻辑
├── key_sync.py # 将文件中的密钥同步到数据库
├── key_reader.py # 从文件中读取并格式化密钥
├── key_tester.py # 定期测试密钥可用性
├── key_status_printer.py # 定期将密钥状态输出到文件
├── database.py # 数据库初始化和操作
├── config.py # 所有配置项
├── rate_limiter.py # 基于 IP 的请求速率限制器
├── keys/ # 存放 API 密钥文件的目录
│ ├── my_keys.txt
│ └── other_keys.txt
└── README.md # 项目说明文档
将您原来请求 Google API 的地址 https://generativelanguage.googleapis.com
替换为 Gemini Gateway 的服务地址即可。
示例 (curl):
curl -X POST "http://127.0.0.1:55200/v1beta/models/gemini-1.5-flash:generateContent" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"parts":[{
"text": "你好,世界!"
}]
}]
}'