package backend import ( "time" "github.com/mudler/LocalAI/core/config" "github.com/mudler/LocalAI/core/trace" "github.com/mudler/LocalAI/pkg/grpc/proto" model "github.com/mudler/LocalAI/pkg/model" ) func ImageGeneration(height, width, step, seed int, positive_prompt, negative_prompt, src, dst string, loader *model.ModelLoader, modelConfig config.ModelConfig, appConfig *config.ApplicationConfig, refImages []string) (func() error, error) { opts := ModelOptions(modelConfig, appConfig) inferenceModel, err := loader.Load( opts..., ) if err != nil { return nil, err } fn := func() error { _, err := inferenceModel.GenerateImage( appConfig.Context, &proto.GenerateImageRequest{ Height: int32(height), Width: int32(width), Step: int32(step), Seed: int32(seed), CLIPSkip: int32(modelConfig.Diffusers.ClipSkip), PositivePrompt: positive_prompt, NegativePrompt: negative_prompt, Dst: dst, Src: src, EnableParameters: modelConfig.Diffusers.EnableParameters, RefImages: refImages, }) return err } if appConfig.EnableTracing { trace.InitBackendTracingIfEnabled(appConfig.TracingMaxItems) traceData := map[string]any{ "positive_prompt": positive_prompt, "negative_prompt": negative_prompt, "height": height, "width": width, "step": step, "seed": seed, "source_image": src, "destination": dst, } startTime := time.Now() originalFn := fn fn = func() error { err := originalFn() duration := time.Since(startTime) errStr := "" if err != nil { errStr = err.Error() } trace.RecordBackendTrace(trace.BackendTrace{ Timestamp: startTime, Duration: duration, Type: trace.BackendTraceImageGeneration, ModelName: modelConfig.Name, Backend: modelConfig.Backend, Summary: trace.TruncateString(positive_prompt, 200), Error: errStr, Data: traceData, }) return err } } return fn, nil } // ImageGenerationFunc is a test-friendly indirection to call image generation logic. // Tests can override this variable to provide a stub implementation. var ImageGenerationFunc = ImageGeneration