Simulates Gemini CLI, Antigravity, Codex, Grok, and Kiro client requests, compat
| .gitignore | ||
| gemini-api-server.js | ||
| gemini-core.js | ||
| LICENSE | ||
| openai-api-server.js | ||
| package-lock.json | ||
| package.json | ||
| README-EN.md | ||
| README.md | ||
GeminiCli2API
该项目包含两个 Node.js HTTP 服务器。它们作为 Google Cloud Code Assist API 的本地代理。其中一个服务器还提供了与 OpenAI API 兼容的接口。可以抛弃终端界面,通过API的形式接入到任意客户端。
项目概述
gemini-api-server.js: 这是一个独立的 Node.js HTTP 服务器。它作为 Google Cloud Code Assist API 的本地代理。该服务器提供所有功能和错误修复。它的设计稳健、灵活。通过全面可控的日志系统,可以方便地进行监控。openai-api-server.js: 这个脚本基于gemini-api-server.js。它创建了一个独立的 Node.js HTTP 服务器。此服务器也是 Google Cloud Code Assist API 的本地代理。但是,它对外提供了与 OpenAI API 兼容的接口。因此,任何支持 OpenAI API 的客户端可以直接使用它。gemini-core.js: 这个文件包含两个服务器共享的核心逻辑。例如,认证、API 调用、请求/响应处理以及日志记录功能。
功能说明
解决的问题
- 解决了 Gemini 官方免费额度减少的问题。现在,用户可以使用 Gemini CLI 账号授权,每天进行 1000 次请求。
- 提供了与 OpenAI API 的兼容性,方便现有 OpenAI 客户端使用。
目前的局限
- 不能使用原版 Gemini CLI 的内置功能。
- 不支持多模态能力。(todo)
主要功能
Gemini API Server (gemini-api-server.js)
- 自动认证与令牌续期: 首次运行,脚本会引导用户通过浏览器完成 Google 账号手动授权。它将获取 OAuth 令牌。此令牌会安全地存储在本地,并在过期前自动刷新。这确保了服务的持续运行,无需手动干预。
- 手动授权流程:
- 复制授权链接: 终端会输出一个 Google 授权 URL。请复制此 URL。
- 在浏览器中打开链接: 在任何有图形界面的设备上 (例如你的本地电脑) 的浏览器中打开该 URL。
- 完成授权: 登录你的 Google 账号并授予权限。
- 复制重定向后的 URL: 授权后,浏览器会尝试重定向到一个URL,提取授权码,完成认证,并正常启动服务。
- 灵活的 API 密钥校验: 用户可以在 URL 查询参数 (
?key=...) 或x-goog-api-key请求头中提供密钥。只要密钥正确,请求即可通过授权。密钥可以通过--api-key启动参数设置。 - 角色规范化修复: 服务器会自动为请求体添加必要的 'user'/'model' 角色。同时,它会正确保留
systemInstruction(或system_instruction)。 - 固定的模型列表: 服务器专门提供并使用
gemini-2.5-pro和gemini-2.5-flash模型。 - 完整的 Gemini API 端点支持: 实现了
listModels,generateContent,streamGenerateContent。 - 全面可控的日志系统: 包括令牌剩余有效期。它可以输出到控制台或文件的带时间戳的提示词日志。支持日志打印。
OpenAI 兼容 API Server (openai-api-server.js)
- OpenAI API 兼容性: 实现了
/v1/models和/v1/chat/completions端点。 - 格式转换: 自动将 OpenAI 格式的请求/响应与内部 Gemini 格式进行转换。
- 流式传输支持: 完全支持 OpenAI 的流式响应 (
"stream": true)。 - 灵活的认证: 支持通过
Authorization: Bearer <key>请求头、URL 查询参数 (?key=...) 或x-goog-api-key请求头进行 API 密钥校验。 - 可配置性: 可以通过命令行参数配置监听地址、端口、API 密钥和提示词日志模式。
- 重用核心逻辑: 底层仍使用
gemini-core.js与 Google 服务通信。
安装
-
环境设置: 在项目根目录创建一个
package.json文件,内容为:{"type": "module"}。这是为了避免模块类型警告。 (本项目已提供package.json文件,无需手动创建) -
安装依赖:
npm install这将安装
google-auth-library和uuid。
使用说明 与 命令行示例
1. Gemini API Server (gemini-api-server.js)
启动服务 (可以组合使用以下参数):
- 默认启动: 监听
localhost:3000,不打印提示词node gemini-api-server.js - 指定监听 IP: 监听所有网络接口 (例如,用于 Docker 或局域网访问)
node gemini-api-server.js 0.0.0.0 - 打印提示词到控制台: 监听
localhost,并在控制台输出提示词详情node gemini-api-server.js --log-prompts console - 打印提示词到文件: 监听
localhost,并将提示词详情保存到一个带启动时间戳的新文件中 (例如:prompts-20231027-153055.log)node gemini-api-server.js --log-prompts file - 组合使用参数 (参数顺序无关):
- 在指定 IP 上运行,并打印提示词到控制台
node gemini-api-server.js 192.168.1.100 --log-prompts console - 在所有网络接口上运行,并打印提示词到文件
node gemini-api-server.js --log-prompts file 0.0.0.0 - 指定 API Key 和端口
node gemini-api-server.js --api-key your_secret_key --port 3001
- 在指定 IP 上运行,并打印提示词到控制台
调用 API 接口 (默认 API Key: 123456):
- a) 列出可用模型 (GET 请求,密钥在 URL 参数中)
curl "http://localhost:3000/v1beta/models?key=123456" - b) 生成内容 - 单轮对话 (POST 请求,密钥在请求头中)
curl "http://localhost:3000/v1beta/models/gemini-2.5-pro:generateContent" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: 123456" \ -d '{"contents":[{"parts":[{"text":"用一句话解释什么是代理服务器"}]}]}' - c) 生成内容 - 带系统提示词 (POST 请求,密钥在请求头中,注意
system_instruction)curl "http://localhost:3000/v1beta/models/gemini-2.5-pro:generateContent" \ -H "Content-Type: application/json" \ -H "x-goog-api-key: 123456" \ -d '{ "system_instruction": { "parts": [{ "text": "你是一只名叫 Neko 的猫。" }] }, "contents": [{ "parts": [{ "text": "你好,你叫什么名字?" }] }] }' - d) 流式生成内容 (POST 请求,密钥在 URL 参数中)
curl "http://localhost:3000/v1beta/models/gemini-2.5-flash:streamGenerateContent?key=123456" \ -H "Content-Type: application/json" \ -d '{"contents":[{"parts":[{"text":"写一首关于宇宙的五行短诗"}]}]}'
2. OpenAI 兼容 API Server (openai-api-server.js)
启动服务 :
- 同Gemini API Server 保持一致:
调用 API 接口 (假设 API Key: your_secret_key, 服务运行在 localhost:8000):
- a) 列出可用模型:
curl http://localhost:8000/v1/models \ -H "Authorization: Bearer your_secret_key" - b) 生成内容 - 带系统提示词 (非流式):
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_secret_key" \ -d '{ "model": "gemini-2.5-pro", "messages": [ {"role": "system", "content": "你是一只名叫 Neko 的猫。"}, {"role": "user", "content": "你好,你叫什么名字?"} ] }' - c) 生成内容 - 流式:
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_secret_key" \ -d '{ "model": "gemini-2.5-flash", "messages": [ {"role": "user", "content": "写一首关于宇宙的五行短诗"} ], "stream": true }'