diff --git a/backend/go/acestep-cpp/acestepcpp_test.go b/backend/go/acestep-cpp/acestepcpp_test.go index f9dd86f563a2..2abe24805a6e 100644 --- a/backend/go/acestep-cpp/acestepcpp_test.go +++ b/backend/go/acestep-cpp/acestepcpp_test.go @@ -106,12 +106,16 @@ func TestLoadModel(t *testing.T) { defer conn.Close() client := pb.NewBackendClient(conn) + + // Get base directory from main model file for relative paths + mainModelPath := filepath.Join(modelDir, "acestep-5Hz-lm-0.6B-Q8_0.gguf") + resp, err := client.LoadModel(context.Background(), &pb.ModelOptions{ - ModelFile: filepath.Join(modelDir, "acestep-5Hz-lm-0.6B-Q8_0.gguf"), + ModelFile: mainModelPath, Options: []string{ - "text_encoder_model:" + filepath.Join(modelDir, "Qwen3-Embedding-0.6B-Q8_0.gguf"), - "dit_model:" + filepath.Join(modelDir, "acestep-v15-turbo-Q8_0.gguf"), - "vae_model:" + filepath.Join(modelDir, "vae-BF16.gguf"), + "text_encoder_model:Qwen3-Embedding-0.6B-Q8_0.gguf", + "dit_model:acestep-v15-turbo-Q8_0.gguf", + "vae_model:vae-BF16.gguf", }, }) if err != nil { @@ -141,13 +145,16 @@ func TestSoundGeneration(t *testing.T) { client := pb.NewBackendClient(conn) + // Get base directory from main model file for relative paths + mainModelPath := filepath.Join(modelDir, "acestep-5Hz-lm-0.6B-Q8_0.gguf") + // Load models loadResp, err := client.LoadModel(context.Background(), &pb.ModelOptions{ - ModelFile: filepath.Join(modelDir, "acestep-5Hz-lm-0.6B-Q8_0.gguf"), + ModelFile: mainModelPath, Options: []string{ - "text_encoder_model:" + filepath.Join(modelDir, "Qwen3-Embedding-0.6B-Q8_0.gguf"), - "dit_model:" + filepath.Join(modelDir, "acestep-v15-turbo-Q8_0.gguf"), - "vae_model:" + filepath.Join(modelDir, "vae-BF16.gguf"), + "text_encoder_model:Qwen3-Embedding-0.6B-Q8_0.gguf", + "dit_model:acestep-v15-turbo-Q8_0.gguf", + "vae_model:vae-BF16.gguf", }, }) if err != nil { diff --git a/backend/go/acestep-cpp/goacestepcpp.go b/backend/go/acestep-cpp/goacestepcpp.go index e1243c3e9fad..bde8a428c347 100644 --- a/backend/go/acestep-cpp/goacestepcpp.go +++ b/backend/go/acestep-cpp/goacestepcpp.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "path/filepath" "strings" "github.com/mudler/LocalAI/pkg/grpc/base" @@ -22,6 +23,9 @@ func (a *AceStepCpp) Load(opts *pb.ModelOptions) error { // ModelFile is the LM model path lmModel := opts.ModelFile + // Get the base directory from ModelFile for resolving relative paths + baseDir := filepath.Dir(lmModel) + var textEncoderModel, ditModel, vaeModel string for _, oo := range opts.Options { @@ -52,6 +56,29 @@ func (a *AceStepCpp) Load(opts *pb.ModelOptions) error { return fmt.Errorf("vae_model option is required") } + // Resolve relative paths to the base directory + // If the path doesn't start with "/" it's relative + if !filepath.IsAbs(textEncoderModel) { + textEncoderModel = filepath.Join(baseDir, textEncoderModel) + } + if !filepath.IsAbs(ditModel) { + ditModel = filepath.Join(baseDir, ditModel) + } + if !filepath.IsAbs(vaeModel) { + vaeModel = filepath.Join(baseDir, vaeModel) + } + + // Also resolve the lmModel if it's relative + if !filepath.IsAbs(lmModel) { + lmModel = filepath.Join(baseDir, lmModel) + } + + fmt.Fprintf(os.Stderr, "[acestep-cpp] Resolved paths:\n") + fmt.Fprintf(os.Stderr, " LM Model: %s\n", lmModel) + fmt.Fprintf(os.Stderr, " Text Encoder: %s\n", textEncoderModel) + fmt.Fprintf(os.Stderr, " DiT Model: %s\n", ditModel) + fmt.Fprintf(os.Stderr, " VAE Model: %s\n", vaeModel) + if ret := CppLoadModel(lmModel, textEncoderModel, ditModel, vaeModel); ret != 0 { return fmt.Errorf("failed to load acestep models (error code: %d)", ret) }