初衷
虽然谷歌大善人提供了免费的 Gemini APi ,但是有很大的速率限制,甚至在我日常开发中都遇到过很多次超过速率限制的报错。阅读文档之后,发现速率的限制只针对 project ,于是打算做一个 Gemini APi 的代理,去更好的管理和使用 key 。
方案
因为想要零成本代理,所以想到了另一个大善人 cloudflare ,可以利用他提供的 Workers 服务做一个简单的代理和转发,下面是我实践的大概思路
key 的获取
因为 key 的使用限制,所以需要创建多个 project ,得到一个 key 池,当然你有其他渠道啥也可以
创建 D1 数据库
根据文档去官网的仪表盘或者用命令行创建 D1 数据库,这个主要是持久化记录 key 的一些状态,免费的额度感觉够用。我的数据库的结构是这样
-- API Key 管理表CREATE TABLE IF NOT EXISTS api_keys ( id INTEGER PRIMARY KEY AUTOINCREMENT, api_key TEXT UNIQUE NOT NULL, -- API 密钥 name TEXT, -- 密钥名称/备注 priority INTEGER DEFAULT 100, -- 优先级权重 (数值越高优先级越高) status INTEGER DEFAULT 1, -- 状态: 1=有效, 2=暂时失效, 0=完全失效 consecutive_failures INTEGER DEFAULT 0, -- 连续失败次数 total_calls INTEGER DEFAULT 0, -- 总调用次数 success_calls INTEGER DEFAULT 0, -- 成功调用次数 last_used_at DATETIME, -- 最后使用时间 last_success_at DATETIME, -- 最后成功时间 last_failure_at DATETIME, -- 最后失败时间 disabled_until DATETIME, -- 禁用截止时间 created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);
创建 worker
1. 绑定之前创建好的 D1 数据库
2. 初始化数据库
3. 写主程序
我主要是让 AI 写的负载均衡的逻辑,这块代码我自己也没怎么看过,就不贴了,然后用 openai 的范式接收请求
//目录结构└─src index.js keyManager.js
如何使用 worker
配置环境变量
在主程序中会用的主要是我们收集的 key 池,还有一个代理之后我们自己的 key ,配置在环境变量
// 我们收集的 key ,需要是不同项目GEMINI_API_KEY=k1,k2,k3// 我们自定义的 KEY,放在 header 里面,openai 的规则MY_API_KEY=
1. 内部使用
page 或者 worker 内部调用,需要绑定然后用环境变量请求,没试过
2. 外部接口调用
直接用绑定的域名访问即可,和调用其他 openai 类的 api 一样,前端直接调用的话注意 MY_API_TOKEN 不要泄露
需要注意的事情
- cloudflare 的 workers 我没查过,是不是允许这么用谷歌的 project 创建多个,可能有被风控的风险
这个目前就是我自己当玩具用,没有经过啥实践的验证,大佬们觉得这个有可行性吗