Gemini CLI OpenAI Worker借助Cloudflare Workers,可以将谷歌的Gemini模型转换为兼容OpenAI的端点,通过熟悉的OpenAI API模式,就能访问谷歌最先进的AI模型,背后依托OAuth2认证,以及驱动官方Gemini CLI的同一套基础设施。
🔐 OAuth2认证:无需API密钥,使用谷歌账号即可
🎯 兼容OpenAI API:可直接替代OpenAI端点
📚 支持OpenAI SDK:能与官方OpenAI SDK及库配合使用
🖼️ 视觉支持:支持图像(base64格式及URL)的多模态对话
🌐 第三方集成:兼容Open WebUI、ChatGPT客户端等
⚡ Cloudflare Workers:全球边缘部署,延迟低
🔄 智能令牌缓存:借助KV存储实现智能令牌管理
🆓 免费层级访问:通过Code Assist API利用谷歌的免费层级
📡 实时流传输:基于服务器发送事件的实时响应
🎭 多模型支持:可访问最新Gemini模型,包括实验性模型
模型ID | 上下文窗口 | 最大令牌数 | 思维支持 | 描述 |
---|---|---|---|---|
gemini-2.5-pro |
100万 | 6.5万 | ✅ | 最新Gemini 2.5 Pro模型,具备推理能力 |
gemini-2.5-flash |
100万 | 6.5万 | ✅ | 快速的Gemini 2.5 Flash模型,具备推理能力 |
注:思维支持需要设置环境变量ENABLE_FAKE_THINKING=true
。启用后,这些模型会在给出最终答案前展示推理过程。
该Worker充当转换层,将OpenAI API调用转换为谷歌Code Assist API格式,同时自动管理OAuth2认证。
流程如下:
1、客户端请求发送至Cloudflare Worker
2、检查KV缓存中是否有令牌
• 有:使用缓存的令牌
• 无:检查环境令牌
• 令牌有效:缓存并使用该令牌
• 令牌无效:刷新令牌,缓存新令牌
3、调用Gemini API
4、流传输响应,并转换为OpenAI格式
5、向客户端返回响应
• 有权访问Gemini的谷歌账号
• 启用Workers的Cloudflare账号
• 已安装Wrangler CLI(npm install -g wrangler
)
需要从已访问过Gemini的谷歌账号获取OAuth2凭证。最简单的方式是通过官方Gemini CLI。
使用Gemini CLI: 1、安装Gemini CLI:
npm install -g @google/gemini-cli
2、启动Gemini CLI:
gemini
3、通过谷歌认证:
选择● Login with Google
。此时会打开浏览器窗口,提示用谷歌账号登录。
4、找到凭证文件:
• Windows:
C:\Users\USERNAME\.gemini\oauth_creds.json
• macOS/Linux:
~/.gemini/oauth_creds.json
```
5、复制凭证:文件包含如下格式的JSON:
```json
{
"access_token": "ya29.a0AS3H6Nx...",
"refresh_token": "1//09FtpJYpxOd...",
"scope": "https://www.googleapis.com/auth/cloud-platform ...",
"token_type": "Bearer",
"id_token": "eyJhbGciOiJSUzI1NiIs...",
"expiry_date": 1750927763467
}
# 为令牌缓存创建KV命名空间
wrangler kv:namespace create "GEMINI_CLI_KV"
记录返回的命名空间ID,在wrangler.toml
中更新KV命名空间ID:
kv_namespaces = [
{ binding = "GEMINI_CLI_KV", id = "your-kv-namespace-id" }
]
创建.dev.vars
文件:
# 必需:来自Gemini CLI认证的OAuth2凭证JSON
GCP_SERVICE_ACCOUNT={"access_token":"ya29...","refresh_token":"1//...","scope":"...","token_type":"Bearer","id_token":"eyJ...","expiry_date":1750927763467}
# 可选:谷歌云项目ID(未设置则自动发现)
# GEMINI_PROJECT_ID=your-project-id
# 可选:用于认证的API密钥(未设置则API公开)
# 设置后,客户端必须包含"Authorization: Bearer <your-api-key>"头
# 示例:sk-1234567890abcdef1234567890abcdef
OPENAI_API_KEY=sk-your-secret-api-key-here
对于生产环境,设置密钥:
wrangler secret put GCP_SERVICE_ACCOUNT
wrangler secret put OPENAI_API_KEY # 可选,仅在需要认证时设置
# 安装依赖
npm install
# 部署到Cloudflare Workers
npm run deploy
# 或在本地运行以进行开发
npm run dev
https://your-worker.your-subdomain.workers.dev
GET /v1/models
响应:
{
"object": "list",
"data": [
{
"id": "gemini-2.5-pro",
"object": "model",
"created": 1708976947,
"owned_by": "google-gemini-cli"
}
]
}
POST /v1/chat/completions
Content-Type: application/json
{
"model": "gemini-2.5-flash",
"messages": [
{
"role": "system",
"content": "你是一个有帮助的助手。"
},
{
"role": "user",
"content": "你好!最近怎么样?"
}
]
}
响应(流传输):
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1708976947,"model":"gemini-2.5-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"你好"},"finish_reason":null}]}
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1708976947,"model":"gemini-2.5-flash","choices":[{"index":0,"delta":{"content":"!我"},"finish_reason":null}]}
data: [DONE]
• 检查令牌缓存:GET /v1/debug/cache
• 测试认证:POST /v1/token-test
• 测试:POST /v1/test
from openai import OpenAI
# 用你的worker端点初始化
client = OpenAI(
base_url="https://your-worker.workers.dev/v1",
api_key="sk-your-secret-api-key-here" # 若启用认证,使用你的OPENAI_API_KEY
)
# 聊天补全
response = client.chat.completions.create(
model="gemini-2.5-flash",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "用简单的语言解释机器学习"}
],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
import OpenAI from 'openai';
const openai = new OpenAI({
baseURL: 'https://your-worker.workers.dev/v1',
apiKey: 'sk-your-secret-api-key-here', // 若启用认证,使用你的OPENAI_API_KEY
});
const stream = await openai.chat.completions.create({
model: 'gemini-2.5-flash',
messages: [
{ role: 'user', content: '写一首关于编程的俳句' }
],
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || '';
process.stdout.write(content);
}
添加为兼容OpenAI的端点:
• 基础URL:https://your-worker.workers.dev/v1
• API密钥:sk-your-secret-api-key-here
(若启用认证,使用你的OPENAI_API_KEY)
配置模型:Open WebUI会通过/v1/models
端点自动发现可用的Gemini模型。
开始聊天:像使用OpenAI模型一样使用任何Gemini模型!
curl -X POST https://your-worker.workers.dev/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-secret-api-key-here" \
-d '{
"model": "gemini-2.5-flash",
"messages": [
{"role": "user", "content": "解释量子计算"}
]
}'
const response = await fetch('https://your-worker.workers.dev/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gemini-2.5-flash',
messages: [
{ role: 'user', content: '你好,世界!' }
]
})
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ') && line !== 'data: [DONE]') {
const data = JSON.parse(line.substring(6));
const content = data.choices[0]?.delta?.content;
if (content) {
console.log(content);
}
}
}
}
import requests
import json
url = "https://your-worker.workers.dev/v1/chat/completions"
data = {
"model": "gemini-2.5-flash",
"messages": [
{"role": "user", "content": "写一个计算斐波那契数列的Python函数"}
]
}
response = requests.post(url, json=data, stream=True)
for line in response.iter_lines():
if line and line.startswith(b'data: '):
try:
chunk = json.loads(line[6:].decode())
content = chunk['choices'][0]['delta'].get('content', '')
if content:
print(content, end='')
except json.JSONDecodeError:
continue
Worker支持具有视觉能力的模型进行多模态对话。图像可提供为base64编码的数据URL或外部URL。
支持的图像格式:
• JPEG、PNG、GIF、WebP
• base64编码(推荐,更可靠)
• 外部URL(部分服务可能有限制)
具备视觉能力的模型:
• gemini-2.5-pro
• gemini-2.5-flash
• gemini-2.0-flash-001
• gemini-2.0-flash-lite-preview-02-05
• gemini-2.0-pro-exp-02-05
from openai import OpenAI
import base64
# 编码图像
with open("image.jpg", "rb") as image_file:
base64_image = base64.b64encode(image_file.read()).decode('utf-8')
client = OpenAI(
base_url="https://your-worker.workers.dev/v1",
api_key="sk-your-secret-api-key-here"
)
response = client.chat.completions.create(
model="gemini-2.5-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "这张图片里有什么?"
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}"
}
}
]
}
]
)
print(response.choices[0].message.content)
curl -X POST https://your-worker.workers.dev/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-secret-api-key-here" \
-d '{
"model": "gemini-2.5-pro",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "详细描述这张图片。"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg",
"detail": "high"
}
}
]
}
]
}'
可在单条消息中包含多个图像:
{
"model": "gemini-2.5-pro",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "比较这两张图片。"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,..."
}
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,..."
}
}
]
}
]
}
变量 | 必需 | 描述 |
---|---|---|
GCP_SERVICE_ACCOUNT |
✅ | OAuth2凭证JSON字符串 |
GEMINI_PROJECT_ID |
❌ | 谷歌云项目ID(未设置则自动发现) |
OPENAI_API_KEY |
❌ | 用于认证的API密钥(未设置则API公开) |
ENABLE_FAKE_THINKING |
❌ | 为思维模型启用合成思维输出(设为"true"启用) |
认证安全:
• 当设置OPENAI_API_KEY
后,所有/v1/*
端点都需要认证
• 客户端必须包含头:Authorization: Bearer <your-api-key>
• 没有该环境变量时,API可公开访问
• 推荐格式:sk-
后跟随机字符串(例如sk-1234567890abcdef...
)
思维模型:
• 当ENABLE_FAKE_THINKING
设为"true"时,标记为thinking: true
的模型会在实际响应前生成合成推理文本
• 这模拟类似OpenAI o3模型的思维过程,展示模型的推理步骤
• 推理输出会在兼容OpenAI的响应格式中以reasoning
块的形式流传输
• 未设置或设为"true"以外的值时,思维模型的行为与普通模型相同
绑定 | 用途 |
---|---|
GEMINI_CLI_KV |
令牌缓存和会话管理 |
401认证错误
• 检查OAuth2凭证是否有效
• 确保刷新令牌可用
• 验证凭证格式完全匹配
令牌刷新失败
• 凭证可能来自错误的OAuth2客户端
• 刷新令牌可能已过期或被撤销
• 检查调试缓存端点的令牌状态
项目ID发现失败
• 手动设置GEMINI_PROJECT_ID
环境变量
• 确保谷歌账号有权访问Gemini
# 检查KV缓存状态
curl https://your-worker.workers.dev/v1/debug/cache
# 仅测试认证
curl -X POST https://your-worker.workers.dev/v1/token-test
# 测试完整流程
curl -X POST https://your-worker.workers.dev/v1/test