openai_models_handler.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package handler
  2. import (
  3. "errors"
  4. "net/http"
  5. infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
  6. "github.com/Wei-Shaw/sub2api/internal/service"
  7. "github.com/gin-gonic/gin"
  8. )
  9. func (h *GatewayHandler) pinnedOpenAIModels(c *gin.Context, group *service.Group) {
  10. if c.Request.Context().Err() != nil {
  11. return
  12. }
  13. if h.openAIGatewayService == nil {
  14. writeOpenAIModelsError(c, http.StatusInternalServerError, "api_error", "OpenAI model discovery is not configured")
  15. return
  16. }
  17. response, account, err := h.openAIGatewayService.FetchPinnedOpenAIModelsList(
  18. c.Request.Context(), group, h.maxAccountSwitches, c.GetHeader("If-None-Match"),
  19. )
  20. if c.Request.Context().Err() != nil {
  21. return
  22. }
  23. if err != nil {
  24. if errors.Is(err, service.ErrNoPinnedCodexModelsAccounts) {
  25. writeOpenAIModelsError(c, http.StatusServiceUnavailable, "upstream_error", "No available OpenAI model discovery accounts")
  26. return
  27. }
  28. writeOpenAIModelsError(c, infraerrors.Code(err), "upstream_error", infraerrors.Message(err))
  29. return
  30. }
  31. setOpsSelectedAccount(c, account.ID, account.Platform)
  32. writeOpenAIModelsResponse(c, response)
  33. }
  34. func writeOpenAIModelsError(c *gin.Context, status int, errorType, message string) {
  35. c.JSON(status, gin.H{"error": gin.H{"type": errorType, "message": message}})
  36. }
  37. func writeOpenAIModelsResponse(c *gin.Context, manifest *service.OpenAIModelsResponse) {
  38. if manifest.ETag != "" {
  39. c.Header("ETag", manifest.ETag)
  40. }
  41. if manifest.NotModified {
  42. c.Status(http.StatusNotModified)
  43. c.Writer.WriteHeaderNow()
  44. return
  45. }
  46. c.Data(http.StatusOK, "application/json", manifest.Body)
  47. }