上个月,我的一个朋友在凌晨两点给我打电话,说他的Gemini API又炸了。这已经是这周第三次。他做了个小工具,用Gemini API给用户提供AI对话服务,结果流量一上来,API就开始各种报错、超时、限流。"有没有什么办法能让我不用半夜爬起来切换API Key?"他在电话里问我。我说有,开源社区早就有人想到这个问题了。
当API成为生产力工具时,稳定性就成了刚需
说实话,Google的Gemini API本身挺好用的。模型能力强,价格也不算离谱,对于个人开发者和小团队来说是个不错的选择。但问题在于,任何API服务都有限流、都有配额、都可能出错。
当你只是写个Demo玩玩,这些都不是问题。但一旦你把它用到了真实业务场景——哪怕只是一个小小的Chrome插件,或者一个几百人用的Telegram Bot——这些"偶尔出现"的问题就会变成"经常困扰"你的麻烦。
用户可不管你是不是超配额了,他们只知道:我点了按钮,你没给我响应 😤
这就是gemini-balance这个项目存在的意义。它不是要重新发明轮子,而是在Google官方API的基础上,加了一层更聪明的代理层。
它到底解决了什么问题?
让我用最直白的话说:
- 多个API Key自动轮询:你有5个Key,它会自动帮你轮流用,一个不行换下一个
- 失败自动重试:请求失败了?没关系,它会重试,还会自动禁用坏掉的Key
- 双协议兼容:既支持Gemini原生格式,也支持OpenAI格式,你的老代码不用改
- 可视化管理界面:不用改配置文件,网页上点几下就能管理所有Key
- 详细的监控日志:每个Key的状态、请求成功率,一目了然
这些功能听起来很基础,但恰恰是最实用的那种基础。就像你买车,ABS和安全气囊看起来不起眼,但真遇到事儿的时候,能救命。
从安装到运行:没有你想象的那么复杂
我知道,很多开发者一看到"需要部署"、"需要配置环境"这些字眼就头大。但这个项目的部署流程,真的算是我见过最友好的那一批了。
Docker一键启动(推荐)
如果你用Docker,整个过程不超过五分钟:
# 拉取镜像
docker pull ghcr.io/snailyp/gemini-balance:latest
# 准备配置文件
cp .env.example .env
# 编辑.env,填入你的API Keys和Token
# 启动容器
docker run -d -p 8000:8000 \
--name gemini-balance \
-v ./data:/app/data \
--env-file .env \
ghcr.io/snailyp/gemini-balance:latest
三条命令,服务就跑起来了。访问http://localhost:8000
,你就能看到管理界面。
项目同时支持AMD64和ARM架构,也就是说无论你是用X86服务器还是树莓派,都能跑。这点很贴心,因为现在越来越多人开始用ARM架构的云服务器(便宜啊)💰
本地开发部署
如果你想自己折腾源码,也很简单:
git clone https://github.com/snailyp/gemini-balance.git
cd gemini-balance
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
整个项目是用Python + FastAPI写的,代码结构很清晰。如果你想二次开发,完全可以。
配置文件里的学问:每一项都有存在的理由
.env
配置文件看起来选项很多,但分类其实很明确。我挑几个最关键的说说:
核心配置
配置项 | 说明 | 为什么重要 |
---|---|---|
API_KEYS |
Gemini API密钥列表 | 这是整个系统的弹药库,支持批量添加 |
ALLOWED_TOKENS |
访问令牌列表 | 防止你的代理被别人白嫖 🔒 |
AUTH_TOKEN |
超级管理员令牌 | 管理后台的钥匙 |
MAX_FAILURES |
单个Key最大失败次数 | 默认3次,超过就自动禁用 |
MAX_RETRIES |
请求失败最大重试次数 | 默认3次,提高成功率 |
重点说说API_KEYS
这一项。项目支持用正则表达式批量添加密钥,而且会自动去重。这意味着你可以直接把一堆Key扔进去,不用担心重复或者格式问题。
数据库选择
项目支持两种数据库:
- SQLite:适合个人使用,零配置
- MySQL:适合多用户场景,性能更好
如果你只是自己用,SQLite完全够了。但如果你要给团队用,或者请求量比较大,建议用MySQL。配置也很简单,就是填几个连接参数而已。
高级功能
这个项目不只是个简单的代理,它还集成了一些很实用的功能:
图片生成和上传 🎨
配置CREATE_IMAGE_MODEL
和上传服务提供商(SM.MS、PicGo或CloudFlare),就能让Gemini生成的图片自动上传到图床,返回外链。这对做聊天机器人的场景特别有用。
Web搜索增强 🔍
通过SEARCH_MODELS
配置,可以让指定的模型具备联网搜索能力。调用时只需在模型名后加-search
后缀,比如gemini-2.0-flash-exp-search
。
TTS语音合成 🎤
项目甚至还支持文字转语音功能,可以配置语音模型、说话人和语速。这个功能很多人可能不知道Gemini也能做。
流式输出优化 ⚡
开启STREAM_OPTIMIZER_ENABLED
后,可以让流式响应更平滑。这对用户体验很重要——没人喜欢看到文字一次性蹦出来或者卡顿。
两套API格式:老项目不用改代码
这是我最欣赏这个项目的一点:完全兼容OpenAI的API格式。
什么意思呢?假设你之前写了一个调用OpenAI API的项目,现在想换成Gemini来省钱或者试试新模型,你需要改多少代码?
答案是:只需要改Base URL。
# 原来的OpenAI调用
client = OpenAI(
base_url="https://api.openai.com/v1",
api_key="sk-..."
)
# 换成Gemini Balance,其他代码一行不改
client = OpenAI(
base_url="http://localhost:8000/openai/v1",
api_key="你的ALLOWED_TOKEN"
)
项目提供了三套路由:
Gemini原生格式:
/v1beta/models
HuggingFace格式:/hf/v1
OpenAI格式:/openai/v1
(推荐)
最常用的几个API都支持:
GET /models
– 列出可用模型POST /chat/completions
– 对话补全POST /embeddings
– 文本向量化POST /images/generations
– 图片生成
而且,项目会自动同步最新的模型列表。Gemini每次发布新模型,你不用手动更新配置,系统会自己去拉取。这个细节很贴心,因为Google最近发新模型的频率还挺高的。
监控和管理:你需要知道系统在干什么
生产环境最怕的是什么?是出了问题你不知道,或者知道了但找不到原因。
gemini-balance在这方面做得很细致:
密钥状态页面
访问/keys_status
(需要认证),你能看到:
- 每个API Key的状态(启用/禁用)
- 累计使用次数
- 失败次数
- 最后使用时间
- 当前限流状态
这个页面是实时更新的。如果某个Key突然失效了,你一眼就能看出来。
日志系统
项目的日志分两类:
- 请求日志:记录每次API调用的详细信息
- 错误日志:记录所有异常和失败
而且可以配置自动删除过期日志,默认错误日志保留7天,请求日志保留30天。这样不会让磁盘被日志撑爆,又能保留足够长的追溯期。
如果你想排查问题,可以把LOG_LEVEL
调成DEBUG
,会输出更详细的信息。
定时任务
系统有个后台定时任务,每隔一定时间(默认1小时)会重新检查被禁用的Key。
为什么要这么做?因为有些错误是暂时性的——比如超过配额上限,过了一个小时配额刷新了,Key就又能用了。自动重试机制能让系统具备一定的"自愈"能力。
性能和稳定性:经得起实战检验
说了这么多功能,但最终还是要回到最本质的问题:它靠谱吗?
我自己测试了一段时间,也看了GitHub上其他用户的反馈,可以说几点:
并发处理能力不错 👍
FastAPI本身就是为高并发设计的异步框架,再加上负载均衡机制,处理几百个并发请求没什么压力。当然,最终瓶颈还是在Gemini API那边。
失败恢复很快
如果一个Key暂时不可用,系统会立即切换到下一个,整个过程用户几乎感知不到。而且重试机制比较激进(默认最多3次),大部分暂时性错误都能被自动处理掉。
资源占用低
我在一台1核2G的VPS上跑过,CPU和内存占用都很低。如果用SQLite,磁盘IO也不会成为瓶颈。
错误提示清晰
遇到问题时,日志会明确告诉你是哪个Key、什么请求、什么错误。这对于快速定位问题非常重要。
不过也有些需要注意的地方:
- 如果你的Key都被Google限流了,代理也救不了你 😅
- 图片上传功能依赖第三方图床,稳定性取决于图床本身
- 大流量场景建议用MySQL,SQLite可能会出现锁等待
代码质量和社区氛围
从GitHub仓库来看,这个项目维护得还不错:
- 代码结构清晰:按照FastAPI的标准项目结构组织,router、service、domain分层明确
- 文档比较详细:README写得很用心,配置项都有说明
- 持续更新:作者一直在修bug和加新功能
- 开源协议合理:使用CC BY-NC 4.0协议,允许非商业使用和修改
作者在README里明确声明禁止商业转售服务,这个态度我挺赞同的。开源是为了让更多人受益,而不是让某些人拿去做生意却不回馈社区。
项目也提供了赞助链接(爱发电),如果你觉得好用,可以请作者喝杯咖啡 ☕
谁适合用这个项目?
在我看来,以下几类人会觉得这东西很有用:
1. 个人开发者
你有好几个Gemini API Key(可能是不同账号的),想统一管理和负载均衡,同时希望兼容OpenAI的客户端代码。
2. 小团队
团队里多个人都要用Gemini API,但不想每个人都管理自己的Key,希望有统一的入口和使用统计。
3. 做聊天机器人的
需要Gemini的多模态能力(文本+图片),又需要稳定性保障,不能让用户看到各种错误信息。
4. 想省API费用的
通过负载均衡机制,可以更充分地利用每个Key的免费额度,延迟达到付费阈值的时间。
5. 有二次开发需求的
代码写得挺规范的,如果你想加点自己的业务逻辑,改起来不会太痛苦。
当然,如果你只是偶尔调用几次API,或者流量非常小,直接用官方API就行了,不用搞这么复杂。
可能的改进方向
没有什么项目是完美的,这个也一样。如果我是作者,可能会考虑加这些功能:
更智能的负载均衡策略
现在是简单的轮询,可以考虑根据每个Key的响应时间、成功率来动态调整权重,让快的Key多干活。
Key的使用配额统计
能看到每个Key还剩多少配额就更好了,这样可以提前知道什么时候需要加新Key。
Webhook通知
当Key失效或者系统出现严重错误时,能通过Webhook或者邮件通知管理员。现在只能靠你主动去看监控页面。
前端管理界面优化
现在的管理界面比较简陋,如果能做得更友好一些,加点图表什么的,体验会更好。
更多图床支持
目前只支持三种图床,可以再加点阿里云OSS、七牛云这种大厂的对象存储服务。
不过话说回来,这些都是锦上添花的东西。就现在的功能,已经能满足大部分场景了。
我那个朋友后来用上了这个项目,现在晚上能睡个安稳觉了。他说最大的感受就是省心——以前每次API出问题都要手动处理,现在系统自己就搞定了。
这可能就是好工具的标准:它不会让你感到它的存在,但少了它你会很痛苦。
如果你也有类似的需求,不妨试试这个项目。开源世界最美好的地方就在于,总有人会想到和你一样的痛点,并且把解决方案免费分享出来。而你需要做的,就是站在巨人的肩膀上,继续往前走。
或者,如果你有更好的想法,也可以给项目提PR。这才是开源精神该有的样子 🚀