一个 Gemini 代理项目,支持流式(SSE)响应、内部重试机制以及对上游错误的标准化处理。
简单来说,就是 截断(以及发现 key 失效)后自动重试。
- Vercel Function 要求在 25 秒内发送初始响应,此后若不截断,可保持长时间流式输出。
- 若有截断,则单次请求不断重试直至 300 秒用尽(默认启用 Fluid compute 时,未启用则仅 60s)
- 末尾会固定输出
[done] - Vercel 限制请求体大小应小于 4.5 MB,故大于该体积的图片等文件将无法传输。
您可以在部署或本地运行前设置下列环境变量(可在 Vercel 仪表盘或本地 shell 中设置):
UPSTREAM_URL_BASE:上游 API 基础 URL,默认https://generativelanguage.googleapis.comMAX_CONSECUTIVE_RETRIES:最大连续重试次数(默认100)DEBUG_MODE:开启调试日志(true/false,默认关闭)RETRY_DELAY_MS:重试间隔毫秒数(默认750)SWALLOW_THOUGHTS_AFTER_RETRY:重试后是否吞掉模型的“思考(thought)”片段(true/false,默认为true)KEYPOOL_MODE:号池模式,是否对 429, 400, 403 等因 key 无效导致的错误进行重试(true/false,默认为false)
另外,客户端需要在请求头中传递 Authorization(或 X-Goog-Api-Key)用于上游认证。
先安装 Vercel CLI(若未安装)并登录:
npm i -g vercel
vercel login在项目根目录启动开发服务器:
npm run dev默认监听 3000,您可以用 curl 或浏览器访问:
# 非流式 GET 示例
curl "http://localhost:3000/v1/models" -H "X-Goog-Api-Key: YOUR_KEY"
# 流式 POST 示例(SSE)
curl -N "http://localhost:3000/v1/models:streamGenerateContent?alt=sse" \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: YOUR_KEY" \
-d '{"messages":[{"role":"user","content":"hello"}]}'注意:
vercel dev会自动加载.env文件中的环境变量,但为了在 PowerShell 中正确读取,请确保变量格式为NAME=value(或者使用setx永久设置)。
- 在 Vercel 仪表盘新建项目并连接到您的仓库,或在本地使用:
vercel --prod-
在 Vercel 项目设置中配置上面的环境变量(
UPSTREAM_URL_BASE、MAX_CONSECUTIVE_RETRIES等)。 -
vercel.json已配置了所有路径都重写到api/proxy,这样您可以直接将任意请求代理到上游服务。
项目已配置为不在香港地域运行,以避免区域报错。如需修改执行区域,请编辑 config.regions 配置:
regions: = [
'sin1',
'icn1',
'hnd1',
'kix1',
'bom1',
'cpt1',
'pdx1',
'cle1',
'syd1',
'iad1',
'sfo1',
'gru1',
];提示:选择离用户最近的区域可减少延迟。如果不设置
regions,Vercel 会在所有可用区域部署。(包括香港)