setupRoutes configures the API routes for the server. It defines the endpoints and associates them with their respective handlers.
()
| 418 | // setupRoutes configures the API routes for the server. |
| 419 | // It defines the endpoints and associates them with their respective handlers. |
| 420 | func (s *Server) setupRoutes() { |
| 421 | healthzHandler := func(c *gin.Context) { |
| 422 | if c.Request.Method == http.MethodHead { |
| 423 | c.Status(http.StatusOK) |
| 424 | return |
| 425 | } |
| 426 | |
| 427 | c.JSON(http.StatusOK, gin.H{"status": "ok"}) |
| 428 | } |
| 429 | s.engine.GET("/healthz", healthzHandler) |
| 430 | s.engine.HEAD("/healthz", healthzHandler) |
| 431 | |
| 432 | s.engine.GET("/management.html", s.serveManagementControlPanel) |
| 433 | openaiHandlers := openai.NewOpenAIAPIHandler(s.handlers) |
| 434 | geminiHandlers := gemini.NewGeminiAPIHandler(s.handlers) |
| 435 | claudeCodeHandlers := claude.NewClaudeCodeAPIHandler(s.handlers) |
| 436 | openaiResponsesHandlers := openai.NewOpenAIResponsesAPIHandler(s.handlers) |
| 437 | |
| 438 | // OpenAI compatible API routes |
| 439 | v1 := s.engine.Group("/v1") |
| 440 | v1.Use(AuthMiddleware(s.accessManager)) |
| 441 | { |
| 442 | v1.GET("/models", s.unifiedModelsHandler(openaiHandlers, claudeCodeHandlers)) |
| 443 | v1.POST("/chat/completions", openaiHandlers.ChatCompletions) |
| 444 | v1.POST("/completions", openaiHandlers.Completions) |
| 445 | v1.POST("/images/generations", openaiHandlers.ImagesGenerations) |
| 446 | v1.POST("/images/edits", openaiHandlers.ImagesEdits) |
| 447 | v1.POST("/videos", openaiHandlers.XAIVideosGenerations) |
| 448 | v1.POST("/videos/generations", openaiHandlers.XAIVideosGenerations) |
| 449 | v1.POST("/videos/edits", openaiHandlers.XAIVideosEdits) |
| 450 | v1.POST("/videos/extensions", openaiHandlers.XAIVideosExtensions) |
| 451 | v1.GET("/videos/:request_id", openaiHandlers.XAIVideosRetrieve) |
| 452 | v1.POST("/messages", claudeCodeHandlers.ClaudeMessages) |
| 453 | v1.POST("/messages/count_tokens", claudeCodeHandlers.ClaudeCountTokens) |
| 454 | v1.GET("/responses", openaiResponsesHandlers.ResponsesWebsocket) |
| 455 | v1.POST("/responses", openaiResponsesHandlers.Responses) |
| 456 | v1.POST("/responses/compact", openaiResponsesHandlers.Compact) |
| 457 | } |
| 458 | |
| 459 | openaiV1 := s.engine.Group("/openai/v1") |
| 460 | openaiV1.Use(AuthMiddleware(s.accessManager)) |
| 461 | { |
| 462 | openaiV1.POST("/videos", openaiHandlers.VideosCreate) |
| 463 | openaiV1.GET("/videos/:video_id/content", openaiHandlers.VideosContent) |
| 464 | openaiV1.GET("/videos/:video_id", openaiHandlers.VideosRetrieve) |
| 465 | } |
| 466 | |
| 467 | // Codex CLI direct route aliases (chatgpt_base_url compatible) |
| 468 | codexDirect := s.engine.Group("/backend-api/codex") |
| 469 | codexDirect.Use(AuthMiddleware(s.accessManager)) |
| 470 | { |
| 471 | codexDirect.GET("/responses", openaiResponsesHandlers.ResponsesWebsocket) |
| 472 | codexDirect.POST("/responses", openaiResponsesHandlers.Responses) |
| 473 | codexDirect.POST("/responses/compact", openaiResponsesHandlers.Compact) |
| 474 | } |
| 475 | |
| 476 | // Gemini compatible API routes |
| 477 | v1beta := s.engine.Group("/v1beta") |
no test coverage detected