English | 简体中文
Gateyes 是一个用 Go 编写的 LLM API Gateway,定位是应用和上游模型提供商之间的统一接入层。
当前版本以中文 README 为准,重点已经从内存原型推进到可持久化、可管理的早期可运行版本,核心方向是:
Responses API作为主入口Chat Completions作为兼容层保留- 多租户隔离
- 固定角色 RBAC
- 运行时数据库鉴权
- provider-native adapter(当前内置 OpenAI / Anthropic)
GET /healthGET /readyGET /metricsPOST /v1/responsesGET /v1/responses/:idPOST /v1/chat/completionsGET /v1/modelsGET /admin/dashboardGET /admin/providersGET /admin/providers/:nameGET /admin/providers/:name/statsGET /admin/usersPOST /admin/usersGET /admin/users/:idPUT /admin/users/:idDELETE /admin/users/:idPOST /admin/users/:id/resetGET /admin/users/:id/usageGET /admin/tenantsPOST /admin/tenantsGET /admin/tenants/:idPUT /admin/tenants/:idPOST /admin/tenants/:id/providers
- 运行时鉴权从数据库读取
api_key -> user -> tenant - 支持 SQLite / PostgreSQL / MySQL 三种
database/sql驱动 - 启动时自动执行 migration
- 配置中的
apiKeys会作为 bootstrap 数据写入数据库 - 启动时自动确保默认 tenant,并回填历史无 tenant 数据
- 启动时可自动创建 bootstrap
super_admin - admin 创建用户时会生成
api_key和api_secret /admin/*和/v1/*统一使用 Bearer 鉴权,不再区分X-Admin-Key- 多租户隔离已经覆盖:
- user
- api key
- usage
- responses
- tenant 可见 provider 列表
- 固定角色 RBAC:
super_admintenant_admintenant_user
- middleware 已接管横切能力:
- 鉴权
- 角色校验
- 模型白名单校验
- 配额预检查
- 基础限流
POST /v1/responses是内部主链路POST /v1/chat/completions仅做 compatibility shim,内部会转换到 responses serviceGET /v1/responses/:id可读取已持久化 response- provider 抽象已改为 response-first
- 当前内置 provider adapter:
openai(支持chat和responses两种端点)anthropic
- 基础路由策略:
round_robinrandomleast_loadcost_basedsticky
- 支持非流式内存缓存
- 支持 SSE 流式输出
- 请求 usage 会写入数据库
- provider 统计可通过 admin API 查看
- 增强缓存:
- LRU 淘汰策略(按访问时间)
- 命中率/淘汰次数统计
- 后台定时清理过期数据
- Token 管理:
- 用户使用量趋势查询
- Tenant 使用量趋势查询
- 配额告警 webhook(HMAC 签名 + 24h 去重)
- TDD 测试覆盖:
- cache、alert、router、limiter
补充机制文档:
docs/runtime-mechanisms.md:缓存、鉴权、限流、路由、权限模型的当前实现说明
当前链路已经调整为:
- HTTP 请求进入 Gin router
internal/middleware处理鉴权、角色校验、模型/配额预检查、限流internal/handler只负责:- 请求绑定
- compatibility 转换
- HTTP / SSE 编码
internal/service/responses负责主业务编排:- 选择 tenant 可用 provider
- 创建 / 更新 response 持久化记录
- 调用 provider
- 写入 usage
- 处理缓存与流式收尾
internal/service/provider负责把统一 response 请求映射成上游协议internal/repository/internal/repository/sqlstore负责数据库访问
cmd/gateway:程序入口与装配internal/config:配置结构internal/db:数据库连接与 migrationinternal/middleware:鉴权(Auth)、角色(RBAC)、请求守卫(模型白名单 + 配额 + 限流)internal/handler:HTTP handler 和 admin APIinternal/service/responses:responses 主业务编排internal/service/provider:provider interface + OpenAI / Anthropic adapterinternal/service/router:路由策略internal/service/cache:内存缓存(LRU + 统计 + 后台清理)internal/service/limiter:基础限流器internal/service/alert:配额告警 webhookinternal/repository:领域接口internal/repository/sqlstore:database/sql实现
- Go 1.25+
go build -o ./bin/gateway ./cmd/gateway最小示例:
server:
listenAddr: ":8080"
database:
driver: sqlite
dsn: gateyes.db
autoMigrate: true
providers:
- name: openai-primary
type: openai
baseURL: https://api.openai.com/v1
endpoint: chat
apiKey: ${OPENAI_API_KEY}
model: gpt-4o-mini
maxTokens: 4096
timeout: 60
enabled: true
- name: anthropic-primary
type: anthropic
baseURL: https://api.anthropic.com
apiKey: ${ANTHROPIC_API_KEY}
model: claude-3-5-sonnet-latest
maxTokens: 4096
timeout: 60
enabled: true
- name: longcat-primary
type: openai
baseURL: https://api.longcat.chat/openai
endpoint: chat
apiKey: ${LONGCAT_API_KEY}
model: LongCat-Flash-Chat
weight: 10
enabled: true
apiKeys:
- key: test-key-001
secret: test-secret
quota: 1000000
qps: 100
models: []
admin:
defaultTenant: default
bootstrapKey: admin-key-001
bootstrapSecret: admin-secret-001Provider endpoint 配置说明:
chat:使用/v1/chat/completions端点(OpenAI 兼容)responses:使用/responses端点(OpenAI 新版 Responses API)- 默认:
chat
数据库支持:
sqlitepostgresmysql
./bin/gateway -config configs/config.yaml运行时和管理端统一使用:
Authorization: Bearer <api_key>:<api_secret>
固定角色:
super_admin:跨 tenant 管理,拥有 tenant 管理能力tenant_admin:管理本 tenant 的用户、provider 绑定和统计tenant_user:访问/v1/*
curl -X POST http://localhost:8080/v1/responses \
-H "Authorization: Bearer test-key-001:test-secret" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"input": [
{"role": "user", "content": "hello"}
]
}'当前也兼容旧写法:
curl -X POST http://localhost:8080/v1/responses \
-H "Authorization: Bearer test-key-001:test-secret" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{"role": "user", "content": "hello"}
]
}'curl -X POST http://localhost:8080/v1/chat/completions \
-H "Authorization: Bearer test-key-001:test-secret" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [
{"role": "user", "content": "hello"}
]
}'curl http://localhost:8080/v1/responses/<response_id> \
-H "Authorization: Bearer test-key-001:test-secret"curl -X POST http://localhost:8080/admin/tenants \
-H "Authorization: Bearer admin-key-001:admin-secret-001" \
-H "Content-Type: application/json" \
-d '{
"slug": "demo",
"name": "Demo Tenant"
}'curl -X POST http://localhost:8080/admin/tenants/demo/providers \
-H "Authorization: Bearer admin-key-001:admin-secret-001" \
-H "Content-Type: application/json" \
-d '{
"providers": ["openai-primary", "anthropic-primary"]
}'这版已经是可运行网关,但还不是完整平台。当前已知边界:
Responses API仍是”收敛后的统一实现”,不是完整覆盖 OpenAI 全量 Responses 协议字段POST /v1/chat/completions保留为兼容接口,不再作为内部主链路- provider 目前仍从配置加载,不是数据库动态管理
- billing、预算、熔断、重试、主动健康检查还没接上
- cache 仍然是内存实现,不是分布式缓存
- 流式 usage 在依赖上游事件完整度时可以精确回填;上游不给完整信息时会回退到近似估算
- 限流器测试部分用例仍有待完善
- 更完整的 OpenAI Responses 协议兼容层
- provider 动态管理与热更新
- 更细粒度 RBAC / 审计日志
- 预算、账单、告警
- 熔断、重试、健康检查
- 分布式缓存
- 更多 provider adapter(除 OpenAI / Anthropic 外继续扩展)