55 lines
2.2 KiB
Go
55 lines
2.2 KiB
Go
package localai
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
"github.com/mudler/LocalAI/core/config"
|
|
"github.com/mudler/LocalAI/core/services/galleryop"
|
|
"github.com/mudler/LocalAI/core/services/modeladmin"
|
|
"github.com/mudler/LocalAI/pkg/model"
|
|
)
|
|
|
|
// ToggleModelEndpoint handles enabling or disabling a model from being loaded on demand.
|
|
// When disabled, the model remains in the collection but will not be loaded when requested.
|
|
//
|
|
// @Summary Toggle model enabled/disabled status
|
|
// @Description Enable or disable a model from being loaded on demand. Disabled models remain installed but cannot be loaded.
|
|
// @Tags config
|
|
// @Param name path string true "Model name"
|
|
// @Param action path string true "Action: 'enable' or 'disable'"
|
|
// @Success 200 {object} ModelResponse
|
|
// @Failure 400 {object} ModelResponse
|
|
// @Failure 404 {object} ModelResponse
|
|
// @Failure 500 {object} ModelResponse
|
|
// @Router /api/models/{name}/{action} [put]
|
|
func ToggleStateModelEndpoint(cl *config.ModelConfigLoader, ml *model.ModelLoader, gs *galleryop.GalleryService, appConfig *config.ApplicationConfig) echo.HandlerFunc {
|
|
svc := modeladmin.NewConfigService(cl, appConfig)
|
|
return func(c echo.Context) error {
|
|
modelName := c.Param("name")
|
|
if decoded, err := url.PathUnescape(modelName); err == nil {
|
|
modelName = decoded
|
|
}
|
|
action := modeladmin.Action(c.Param("action"))
|
|
result, err := svc.ToggleState(c.Request().Context(), modelName, action, ml)
|
|
if err != nil {
|
|
return c.JSON(httpStatusForModelAdminError(err), ModelResponse{Success: false, Error: err.Error()})
|
|
}
|
|
|
|
// Enabling/disabling rewrites the config on disk and reloads only the
|
|
// local loader; tell peers to refresh so the model's availability is
|
|
// consistent across replicas. No-op in standalone mode.
|
|
if gs != nil {
|
|
gs.BroadcastModelsChanged(modelName, "install")
|
|
}
|
|
|
|
msg := fmt.Sprintf("Model '%s' has been %sd successfully.", modelName, action)
|
|
if action == modeladmin.ActionDisable {
|
|
msg += " The model will not be loaded on demand until re-enabled."
|
|
}
|
|
return c.JSON(http.StatusOK, ModelResponse{Success: true, Message: msg, Filename: result.Filename})
|
|
}
|
|
}
|