一个高性能的 Gemini API 代理服务器,提供 OpenAI 兼容的接口格式,支持图片处理和流式响应。
git clone <repository-url>
cd gemini-proxy
go mod tidy
go run main.go
服务将在 http://localhost:8080 启动。
# 构建镜像
docker build -t gemini-proxy .
# 运行容器
docker run -d -p 8080:8080 -v $(pwd)/logs:/app/logs gemini-proxy
gemini-proxy/
├── api/ # API 处理器
│ ├── chat.go # 聊天接口处理
│ └── index.go # 首页接口
├── core/ # 核心模块
│ ├── gine/ # 自定义 Gin 扩展
│ │ ├── context.go # 上下文封装
│ │ ├── engine.go # 引擎封装
│ │ └── routergroup.go # 路由组封装
│ ├── logger/ # 日志模块
│ │ ├── logger.go # 日志器定义
│ │ └── message.go # 日志消息
│ ├── router/ # 路由配置
│ │ └── route.go # 路由注册
│ └── setting.go # 全局设置
├── library/ # 工具库
│ ├── constant/ # 常量定义
│ │ ├── code/ # 常量代码
│ │ └── errno/ # 错误码
│ ├── http/ # HTTP 工具
│ │ ├── event.go # SSE 事件
│ │ └── http.go # HTTP 请求处理
│ └── utils/ # 通用工具
│ ├── file.go # 文件工具
│ ├── http.go # HTTP 工具
│ └── unique_id.go # 唯一 ID 生成
├── middleware/ # 中间件
│ ├── cors_middleware.go # CORS 中间件
│ └── log_middleware.go # 日志中间件
├── models/ # 数据模型
│ ├── request.go # 请求模型
│ └── response.go # 响应模型
├── initialize/ # 初始化模块
│ └── logger.go # 日志初始化
├── main.go # 程序入口
├── Dockerfile # Docker 配置
├── go.mod # Go 模块文件
└── README.md # 项目文档
请求
GET /
响应
{
"message": "Welcome to the Gemini Proxy API! This server proxies requests to Google Gemini API."
}
请求
POST /v1/chat/completions
请求头
Content-Type: application/json
Authorization: Bearer YOUR_GEMINI_API_KEY
请求体示例
{
"model": "gemini-pro",
"messages": [
{
"role": "user",
"content": "Hello, how are you?"
}
],
"stream": false
}
响应
服务器将请求转发到 Gemini API 并返回响应。
{
"role": "user",
"content": [
{
"type": "text",
"text": "请描述这张图片"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}
{
"role": "user",
"content": [
{
"type": "input_image",
"image_url": "https://example.com/image.jpg"
}
]
}
{
"role": "user",
"content": [
{
"type": "input_text",
"input_text": "文本内容"
}
]
}
{
"input": [
{
"role": "user",
"content": "消息内容"
}
]
}
服务器会自动将 input 字段转换为 messages 字段。
data:image/jpeg;base64,/9j/4AAQ...当前版本配置硬编码在代码中,未来版本将支持环境变量配置。
文件: library/constant/code/const_code.go
// 最大上传内存限制
MaxMultipart = 100 << 20 // 100MB
// 图片大小限制
ImageMaxSize = 100 * 1024 * 1024 // 100MB
// Gemini API 地址
GeminiApiUrl = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions"
文件: initialize/logger.go
// 日志文件配置
accessLogs := &lumberjack.Logger{
Filename: "logs/gemini-proxy.log",
MaxSize: 100, // MB
MaxBackups: 30, // 保留文件数
MaxAge: 30, // 天
LocalTime: true,
}
创建 docker-compose.yml:
version: '3.8'
services:
gemini-proxy:
image: gemini-proxy:latest
ports:
- "8080:8080"
volumes:
- ./logs:/app/logs
environment:
- PUID=1000
- PGID=1000
- UMASK=022
restart: unless-stopped
运行:
docker-compose up -d
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# SSE 支持
proxy_buffering off;
proxy_cache off;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
}
}
models/ 中定义数据模型type YourRequest struct {
Field string `json:"field"`
}
api/ 中创建处理器func YourHandler(ctx *gine.Context) {
// 处理逻辑
}
core/router/route.go 中注册路由r.POST("/your-endpoint", api.YourHandler)
在 middleware/ 目录下创建中间件文件:
func YourMiddleware() gine.HandlerFunc {
return func(ctx *gine.Context) {
// 前置处理
ctx.Next()
// 后置处理
}
}
在 core/setting.go 中注册:
r.Use(middleware.YourMiddleware())
# 启动开发服务器
go run main.go
# 运行测试
go test ./...
# 代码格式化
go fmt ./...
# 代码检查
go vet ./...
| 错误码 | 说明 |
|---|---|
| 0 | 成功 |
| 1 | 失败 |
| 10001 | 请求参数错误 |
| 10002 | 转化消息错误 |
| 10003 | 序列化消息失败 |
| 10004 | 代理 Gemini 请求失败 |
logs/gemini-proxy.log: 所有日志logs/gemini-proxy.log.wf: 警告和错误日志LEVEL 2024-01-01 12:00:00 logid[xxx] uri[/v1/chat/completions] method[POST] ip[127.0.0.1] cost[100ms]
Access-Control-Allow-Origin: *欢迎提交 Issue 和 Pull Request 来改进项目!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)本项目采用 MIT 许可证 - 详见 LICENSE 文件
如有问题或建议,请通过以下方式联系:
注意: 本项目仅用于学习和研究目的,使用前请确保遵守 Google Gemini API 的使用条款。
Content type
Image
Digest
sha256:805bdbc2a…
Size
18.5 MB
Last updated
12 months ago
docker pull yilee01/gemini-proxy