package handler import ( "errors" "net/http" infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/gin-gonic/gin" ) func (h *GatewayHandler) pinnedOpenAIModels(c *gin.Context, group *service.Group) { if c.Request.Context().Err() != nil { return } if h.openAIGatewayService == nil { writeOpenAIModelsError(c, http.StatusInternalServerError, "api_error", "OpenAI model discovery is not configured") return } response, account, err := h.openAIGatewayService.FetchPinnedOpenAIModelsList( c.Request.Context(), group, h.maxAccountSwitches, c.GetHeader("If-None-Match"), ) if c.Request.Context().Err() != nil { return } if err != nil { if errors.Is(err, service.ErrNoPinnedCodexModelsAccounts) { writeOpenAIModelsError(c, http.StatusServiceUnavailable, "upstream_error", "No available OpenAI model discovery accounts") return } writeOpenAIModelsError(c, infraerrors.Code(err), "upstream_error", infraerrors.Message(err)) return } setOpsSelectedAccount(c, account.ID, account.Platform) writeOpenAIModelsResponse(c, response) } func writeOpenAIModelsError(c *gin.Context, status int, errorType, message string) { c.JSON(status, gin.H{"error": gin.H{"type": errorType, "message": message}}) } func writeOpenAIModelsResponse(c *gin.Context, manifest *service.OpenAIModelsResponse) { if manifest.ETag != "" { c.Header("ETag", manifest.ETag) } if manifest.NotModified { c.Status(http.StatusNotModified) c.Writer.WriteHeaderNow() return } c.Data(http.StatusOK, "application/json", manifest.Body) }