Sign inSign up

yilee01/gemini-proxy

By yilee01

•Updated 12 months ago

Image
0

1.2K

yilee01/gemini-proxy repository overview

⁠Gemini Proxy

一个高性能的 Gemini API 代理服务器,提供 OpenAI 兼容的接口格式,支持图片处理和流式响应。

⁠✨ 特性

  • 🚀 高性能: 基于 Gin 框架构建,支持高并发请求
  • 🔄 格式兼容: 支持 OpenAI 和自定义消息格式自动转换
  • 🖼️ 图片处理: 自动下载网络图片并转换为 Base64 编码
  • 📡 流式传输: 支持 SSE (Server-Sent Events) 流式响应
  • 🌐 CORS 支持: 内置跨域资源共享支持
  • 📝 完善日志: 结构化日志记录,支持日志分级和滚动
  • 🐳 容器化: 提供 Docker 镜像,一键部署
  • 🛡️ 错误处理: 统一的错误码和异常处理机制

⁠📋 目录

⁠🚀 快速开始

⁠环境要求
  • Go 1.21 或更高版本
  • Docker (可选)
  • 有效的 Google Gemini API Key
⁠本地运行
  1. 克隆项目
git clone <repository-url>
cd gemini-proxy
  1. 安装依赖
go mod tidy
  1. 运行服务
go run main.go

服务将在 http://localhost:8080 启动。

⁠Docker 部署
# 构建镜像
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                # 项目文档

⁠🔌 API 接口

⁠1. 首页接口

请求

GET /

响应

{
  "message": "Welcome to the Gemini Proxy API! This server proxies requests to Google Gemini API."
}
⁠2. 聊天完成接口

请求

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 并返回响应。

⁠📝 消息格式

⁠OpenAI 标准格式
{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "请描述这张图片"
    },
    {
      "type": "image_url",
      "image_url": {
        "url": "https://example.com/image.jpg"
      }
    }
  ]
}
⁠自定义格式
⁠1. 简化图片格式
{
  "role": "user",
  "content": [
    {
      "type": "input_image",
      "image_url": "https://example.com/image.jpg"
    }
  ]
}
⁠2. 自定义文本格式
{
  "role": "user",
  "content": [
    {
      "type": "input_text",
      "input_text": "文本内容"
    }
  ]
}
⁠3. Input 字段兼容
{
  "input": [
    {
      "role": "user",
      "content": "消息内容"
    }
  ]
}

服务器会自动将 input 字段转换为 messages 字段。

⁠图片支持
  • HTTP/HTTPS URL: 自动下载并转换为 Base64
  • Base64 格式: data:image/jpeg;base64,/9j/4AAQ...
  • 支持的图片格式: JPEG, PNG, GIF, WebP
  • 大小限制: 100MB

⁠⚙️ 配置说明

⁠环境变量

当前版本配置硬编码在代码中,未来版本将支持环境变量配置。

⁠常量配置

文件: 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 部署

创建 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
⁠Nginx 反向代理
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;
    }
}

⁠🛠️ 开发指南

⁠添加新的 API 接口
  1. 在 models/ 中定义数据模型
type YourRequest struct {
    Field string `json:"field"`
}
  1. 在 api/ 中创建处理器
func YourHandler(ctx *gine.Context) {
    // 处理逻辑
}
  1. 在 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]

⁠🔒 安全建议

  1. API Key 管理: 确保 Gemini API Key 通过请求头传递,不要硬编码在代码中
  2. CORS 配置: 生产环境建议在 Nginx 层面配置 CORS,而不是使用 Access-Control-Allow-Origin: *
  3. HTTPS: 生产环境必须使用 HTTPS
  4. 速率限制: 建议在 Nginx 层面添加速率限制
  5. 日志脱敏: 避免在日志中记录敏感信息(如 API Key)

⁠🤝 贡献

欢迎提交 Issue 和 Pull Request 来改进项目!

⁠贡献流程
  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

⁠📄 许可证

本项目采用 MIT 许可证 - 详见 LICENSE 文件

⁠📞 联系方式

如有问题或建议,请通过以下方式联系:

⁠🙏 致谢


注意: 本项目仅用于学习和研究目的,使用前请确保遵守 Google Gemini API 的使用条款。

Tag summary

Content type

Image

Digest

sha256:805bdbc2a…

Size

18.5 MB

Last updated

12 months ago

docker pull yilee01/gemini-proxy