feat: implement AI gateway phase one runtime
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
package httpapi
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
|
||||
)
|
||||
|
||||
func (s *Server) listCatalogProviders(w http.ResponseWriter, r *http.Request) {
|
||||
items, err := s.store.ListCatalogProviders(r.Context())
|
||||
if err != nil {
|
||||
s.logger.Error("list catalog providers failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "list catalog providers failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, map[string]any{"items": items})
|
||||
}
|
||||
|
||||
func (s *Server) createCatalogProvider(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.CatalogProviderInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if strings.TrimSpace(input.ProviderKey) == "" || strings.TrimSpace(input.DisplayName) == "" {
|
||||
writeError(w, http.StatusBadRequest, "providerKey and displayName are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.CreateCatalogProvider(r.Context(), input)
|
||||
if err != nil {
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "provider key or code already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("create catalog provider failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "create catalog provider failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusCreated, item)
|
||||
}
|
||||
|
||||
func (s *Server) updateCatalogProvider(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.CatalogProviderInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if strings.TrimSpace(input.ProviderKey) == "" || strings.TrimSpace(input.DisplayName) == "" {
|
||||
writeError(w, http.StatusBadRequest, "providerKey and displayName are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.UpdateCatalogProvider(r.Context(), r.PathValue("providerID"), input)
|
||||
if err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "catalog provider not found")
|
||||
return
|
||||
}
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "provider key or code already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("update catalog provider failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "update catalog provider failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, item)
|
||||
}
|
||||
|
||||
func (s *Server) deleteCatalogProvider(w http.ResponseWriter, r *http.Request) {
|
||||
if err := s.store.DeleteCatalogProvider(r.Context(), r.PathValue("providerID")); err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "catalog provider not found")
|
||||
return
|
||||
}
|
||||
s.logger.Error("delete catalog provider failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "delete catalog provider failed")
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func (s *Server) listBaseModels(w http.ResponseWriter, r *http.Request) {
|
||||
items, err := s.store.ListBaseModels(r.Context())
|
||||
if err != nil {
|
||||
s.logger.Error("list base models failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "list base models failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, map[string]any{"items": items})
|
||||
}
|
||||
|
||||
func (s *Server) createBaseModel(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.BaseModelInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if !validBaseModelInput(input) {
|
||||
writeError(w, http.StatusBadRequest, "providerKey, providerModelName and modelType are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.CreateBaseModel(r.Context(), input)
|
||||
if err != nil {
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "canonical model key already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("create base model failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "create base model failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusCreated, item)
|
||||
}
|
||||
|
||||
func (s *Server) updateBaseModel(w http.ResponseWriter, r *http.Request) {
|
||||
var input store.BaseModelInput
|
||||
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid json body")
|
||||
return
|
||||
}
|
||||
if !validBaseModelInput(input) {
|
||||
writeError(w, http.StatusBadRequest, "providerKey, providerModelName and modelType are required")
|
||||
return
|
||||
}
|
||||
item, err := s.store.UpdateBaseModel(r.Context(), r.PathValue("baseModelID"), input)
|
||||
if err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "base model not found")
|
||||
return
|
||||
}
|
||||
if store.IsUniqueViolation(err) {
|
||||
writeError(w, http.StatusConflict, "canonical model key already exists")
|
||||
return
|
||||
}
|
||||
s.logger.Error("update base model failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "update base model failed")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, item)
|
||||
}
|
||||
|
||||
func (s *Server) deleteBaseModel(w http.ResponseWriter, r *http.Request) {
|
||||
if err := s.store.DeleteBaseModel(r.Context(), r.PathValue("baseModelID")); err != nil {
|
||||
if store.IsNotFound(err) {
|
||||
writeError(w, http.StatusNotFound, "base model not found")
|
||||
return
|
||||
}
|
||||
s.logger.Error("delete base model failed", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "delete base model failed")
|
||||
return
|
||||
}
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
|
||||
func validBaseModelInput(input store.BaseModelInput) bool {
|
||||
return strings.TrimSpace(input.ProviderKey) != "" &&
|
||||
strings.TrimSpace(input.ProviderModelName) != "" &&
|
||||
strings.TrimSpace(input.ModelType) != ""
|
||||
}
|
||||
Reference in New Issue
Block a user