package httpapi import ( "net/http" "sort" "github.com/easyai/easyai-ai-gateway/apps/api/internal/auth" ) // listLegacyPlayableModels godoc // @Summary 列出可调用平台模型(已弃用) // @Description 兼容期 rich 平台来源明细;新客户端应改用 /api/v1/platform-models,OpenAI 客户端使用 /v1/models。 // @Tags playground // @Produce json // @Security BearerAuth // @Deprecated // @Success 200 {object} PlatformModelListResponse // @Failure 401 {object} ErrorEnvelope // @Failure 500 {object} ErrorEnvelope // @Router /api/v1/models [get] func (s *Server) listLegacyPlayableModels(w http.ResponseWriter, r *http.Request) { w.Header().Set("Deprecation", "true") w.Header().Set("Link", "; rel=\"successor-version\"") s.listPlayableModels(w, r) } // listOpenAIModels godoc // @Summary 列出 OpenAI 兼容模型 // @Description 按全局启用、租户、用户组、用户、当前 API Key 分层白名单及 scope 的交集返回去重后的逻辑模型列表;其他主体规则不参与求值。 // @Tags openai-compatible // @Produce json // @Security BearerAuth // @Success 200 {object} OpenAIModelListResponse // @Failure 401 {object} ErrorEnvelope // @Failure 500 {object} ErrorEnvelope // @Router /v1/models [get] func (s *Server) listOpenAIModels(w http.ResponseWriter, r *http.Request) { user, _ := auth.UserFromContext(r.Context()) models, err := s.store.ListAccessiblePlatformModels(r.Context(), user) if err != nil { s.logger.Error("list openai models failed", "error", err) writeError(w, http.StatusInternalServerError, "list models failed") return } byID := map[string]OpenAIModel{} for _, model := range models { id := model.ModelName if id == "" { continue } created := model.CreatedAt.Unix() current, exists := byID[id] if !exists || created < current.Created { byID[id] = OpenAIModel{ID: id, Object: "model", Created: created, OwnedBy: "easyai"} } } data := make([]OpenAIModel, 0, len(byID)) for _, model := range byID { data = append(data, model) } sort.Slice(data, func(i, j int) bool { return data[i].ID < data[j].ID }) writeJSON(w, http.StatusOK, OpenAIModelListResponse{Object: "list", Data: data}) }