From f8d8bd6556d0a8ac61cac74d36b9147dc70ffb3d Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 16 Feb 2026 02:01:52 +0000 Subject: [PATCH] feat: use native MLX backend when --model-path is set on Apple Silicon Build-tagged backend selection: MLX on darwin/arm64/mlx, HTTP elsewhere. Co-Authored-By: Claude Opus 4.6 --- internal/cmd/ml/cmd_serve.go | 9 ++++++--- internal/cmd/ml/serve_backend_default.go | 9 +++++++++ internal/cmd/ml/serve_backend_mlx.go | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 internal/cmd/ml/serve_backend_default.go create mode 100644 internal/cmd/ml/serve_backend_mlx.go diff --git a/internal/cmd/ml/cmd_serve.go b/internal/cmd/ml/cmd_serve.go index 740eba7..9547f60 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 0000000..69a1d94 --- /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 0000000..f48d1aa --- /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 +}