mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
53 lines
1.6 KiB
Go
53 lines
1.6 KiB
Go
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)
|
|
}
|