diff --git a/internal/cmd/ml/cmd_serve.go b/internal/cmd/ml/cmd_serve.go index 740eba7c..9547f601 100644 --- a/internal/cmd/ml/cmd_serve.go +++ b/internal/cmd/ml/cmd_serve.go @@ -79,9 +79,12 @@ type usageInfo struct { } func runServe(cmd *cli.Command, args []string) error { - // Create a backend — use HTTP backend pointing to configured API URL. - // On macOS with MLX build tag, this will use the native MLX backend instead. - backend := ml.NewHTTPBackend(apiURL, modelName) + // Try native MLX backend first (macOS arm64 with mlx tag + model-path set), + // fall back to HTTP proxy backend. + backend, err := createServeBackend() + if err != nil { + return err + } mux := http.NewServeMux() diff --git a/internal/cmd/ml/serve_backend_default.go b/internal/cmd/ml/serve_backend_default.go new file mode 100644 index 00000000..69a1d942 --- /dev/null +++ b/internal/cmd/ml/serve_backend_default.go @@ -0,0 +1,9 @@ +//go:build !(darwin && arm64 && mlx) + +package ml + +import "forge.lthn.ai/core/cli/pkg/ml" + +func createServeBackend() (ml.Backend, error) { + return ml.NewHTTPBackend(apiURL, modelName), nil +} diff --git a/internal/cmd/ml/serve_backend_mlx.go b/internal/cmd/ml/serve_backend_mlx.go new file mode 100644 index 00000000..f48d1aab --- /dev/null +++ b/internal/cmd/ml/serve_backend_mlx.go @@ -0,0 +1,22 @@ +//go:build darwin && arm64 && mlx + +package ml + +import ( + "fmt" + "log/slog" + + "forge.lthn.ai/core/cli/pkg/ml" +) + +func createServeBackend() (ml.Backend, error) { + if serveModelPath != "" { + slog.Info("ml serve: loading native MLX backend", "path", serveModelPath) + b, err := ml.NewMLXBackend(serveModelPath) + if err != nil { + return nil, fmt.Errorf("mlx backend: %w", err) + } + return b, nil + } + return ml.NewHTTPBackend(apiURL, modelName), nil +}