using System.Linq; using System.Text.Json.Serialization; using CommunityToolkit.Mvvm.ComponentModel; using StabilityMatrix.Avalonia.Controls; using StabilityMatrix.Avalonia.Models; using StabilityMatrix.Avalonia.Services; using StabilityMatrix.Avalonia.ViewModels.Base; using StabilityMatrix.Avalonia.ViewModels.Inference.Modules; using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Models; using StabilityMatrix.Core.Models.Api.Comfy; namespace StabilityMatrix.Avalonia.ViewModels.Inference; [View(typeof(SamplerCard))] [ManagedService] [Transient] public partial class SamplerCardViewModel : LoadableViewModelBase, IParametersLoadableState { public const string ModuleKey = "Sampler"; [ObservableProperty] private bool isRefinerStepsEnabled; [ObservableProperty] private int steps = 20; [ObservableProperty] private int refinerSteps = 10; [ObservableProperty] private bool isDenoiseStrengthEnabled; [ObservableProperty] private double denoiseStrength = 1; [ObservableProperty] private bool isCfgScaleEnabled; [ObservableProperty] private double cfgScale = 7; [ObservableProperty] private bool isDimensionsEnabled; [ObservableProperty] private int width = 512; [ObservableProperty] private int height = 512; [ObservableProperty] private bool isSamplerSelectionEnabled; [ObservableProperty] private ComfySampler? selectedSampler = ComfySampler.EulerAncestral; [ObservableProperty] private bool isSchedulerSelectionEnabled; [ObservableProperty] private ComfyScheduler? selectedScheduler = ComfyScheduler.Normal; public StackEditableCardViewModel StackEditableCardViewModel { get; } [JsonIgnore] public IInferenceClientManager ClientManager { get; } public SamplerCardViewModel( IInferenceClientManager clientManager, ServiceManager vmFactory ) { ClientManager = clientManager; StackEditableCardViewModel = vmFactory.Get(modulesCard => { modulesCard.Title = "Addons"; modulesCard.AvailableModules = new[] { typeof(ControlNetModule) }; modulesCard.InitializeDefaults(); }); } /// public void LoadStateFromParameters(GenerationParameters parameters) { Width = parameters.Width; Height = parameters.Height; Steps = parameters.Steps; CfgScale = parameters.CfgScale; if ( !string.IsNullOrEmpty(parameters.Sampler) && GenerationParametersConverter.TryGetSamplerScheduler( parameters.Sampler, out var samplerScheduler ) ) { SelectedSampler = ClientManager.Samplers.FirstOrDefault( s => s == samplerScheduler.Sampler ); SelectedScheduler = ClientManager.Schedulers.FirstOrDefault( s => s == samplerScheduler.Scheduler ); } } /// public GenerationParameters SaveStateToParameters(GenerationParameters parameters) { var sampler = GenerationParametersConverter.TryGetParameters( new ComfySamplerScheduler(SelectedSampler ?? default, SelectedScheduler ?? default), out var res ) ? res : null; return parameters with { Width = Width, Height = Height, Steps = Steps, CfgScale = CfgScale, Sampler = sampler, }; } }