- 更新路由器注册 ops 监控路由 - 添加 ops 管理路由(dashboard, alerts, realtime, settings, ws) - 更新 gateway 路由支持请求追踪 - 集成 ops 服务到 HTTP 服务器
86 lines
3.2 KiB
Go
86 lines
3.2 KiB
Go
package routes
|
||
|
||
import (
|
||
"github.com/Wei-Shaw/sub2api/internal/config"
|
||
"github.com/Wei-Shaw/sub2api/internal/handler"
|
||
"github.com/Wei-Shaw/sub2api/internal/server/middleware"
|
||
"github.com/Wei-Shaw/sub2api/internal/service"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// RegisterGatewayRoutes 注册 API 网关路由(Claude/OpenAI/Gemini 兼容)
|
||
func RegisterGatewayRoutes(
|
||
r *gin.Engine,
|
||
h *handler.Handlers,
|
||
apiKeyAuth middleware.APIKeyAuthMiddleware,
|
||
apiKeyService *service.APIKeyService,
|
||
subscriptionService *service.SubscriptionService,
|
||
opsService *service.OpsService,
|
||
cfg *config.Config,
|
||
) {
|
||
bodyLimit := middleware.RequestBodyLimit(cfg.Gateway.MaxBodySize)
|
||
clientRequestID := middleware.ClientRequestID()
|
||
opsErrorLogger := handler.OpsErrorLoggerMiddleware(opsService)
|
||
|
||
// API网关(Claude API兼容)
|
||
gateway := r.Group("/v1")
|
||
gateway.Use(bodyLimit)
|
||
gateway.Use(clientRequestID)
|
||
gateway.Use(opsErrorLogger)
|
||
gateway.Use(gin.HandlerFunc(apiKeyAuth))
|
||
{
|
||
gateway.POST("/messages", h.Gateway.Messages)
|
||
gateway.POST("/messages/count_tokens", h.Gateway.CountTokens)
|
||
gateway.GET("/models", h.Gateway.Models)
|
||
gateway.GET("/usage", h.Gateway.Usage)
|
||
// OpenAI Responses API
|
||
gateway.POST("/responses", h.OpenAIGateway.Responses)
|
||
}
|
||
|
||
// Gemini 原生 API 兼容层(Gemini SDK/CLI 直连)
|
||
gemini := r.Group("/v1beta")
|
||
gemini.Use(bodyLimit)
|
||
gemini.Use(clientRequestID)
|
||
gemini.Use(opsErrorLogger)
|
||
gemini.Use(middleware.APIKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg))
|
||
{
|
||
gemini.GET("/models", h.Gateway.GeminiV1BetaListModels)
|
||
gemini.GET("/models/:model", h.Gateway.GeminiV1BetaGetModel)
|
||
// Gin treats ":" as a param marker, but Gemini uses "{model}:{action}" in the same segment.
|
||
gemini.POST("/models/*modelAction", h.Gateway.GeminiV1BetaModels)
|
||
}
|
||
|
||
// OpenAI Responses API(不带v1前缀的别名)
|
||
r.POST("/responses", bodyLimit, clientRequestID, opsErrorLogger, gin.HandlerFunc(apiKeyAuth), h.OpenAIGateway.Responses)
|
||
|
||
// Antigravity 模型列表
|
||
r.GET("/antigravity/models", gin.HandlerFunc(apiKeyAuth), h.Gateway.AntigravityModels)
|
||
|
||
// Antigravity 专用路由(仅使用 antigravity 账户,不混合调度)
|
||
antigravityV1 := r.Group("/antigravity/v1")
|
||
antigravityV1.Use(bodyLimit)
|
||
antigravityV1.Use(clientRequestID)
|
||
antigravityV1.Use(opsErrorLogger)
|
||
antigravityV1.Use(middleware.ForcePlatform(service.PlatformAntigravity))
|
||
antigravityV1.Use(gin.HandlerFunc(apiKeyAuth))
|
||
{
|
||
antigravityV1.POST("/messages", h.Gateway.Messages)
|
||
antigravityV1.POST("/messages/count_tokens", h.Gateway.CountTokens)
|
||
antigravityV1.GET("/models", h.Gateway.AntigravityModels)
|
||
antigravityV1.GET("/usage", h.Gateway.Usage)
|
||
}
|
||
|
||
antigravityV1Beta := r.Group("/antigravity/v1beta")
|
||
antigravityV1Beta.Use(bodyLimit)
|
||
antigravityV1Beta.Use(clientRequestID)
|
||
antigravityV1Beta.Use(opsErrorLogger)
|
||
antigravityV1Beta.Use(middleware.ForcePlatform(service.PlatformAntigravity))
|
||
antigravityV1Beta.Use(middleware.APIKeyAuthWithSubscriptionGoogle(apiKeyService, subscriptionService, cfg))
|
||
{
|
||
antigravityV1Beta.GET("/models", h.Gateway.GeminiV1BetaListModels)
|
||
antigravityV1Beta.GET("/models/:model", h.Gateway.GeminiV1BetaGetModel)
|
||
antigravityV1Beta.POST("/models/*modelAction", h.Gateway.GeminiV1BetaModels)
|
||
}
|
||
}
|