using System.Linq; using System.Threading.Tasks; using AsyncAwaitBestPractices; using CommunityToolkit.Mvvm.ComponentModel; using StabilityMatrix.Avalonia.Styles; using StabilityMatrix.Avalonia.ViewModels.Base; using StabilityMatrix.Avalonia.Views; using StabilityMatrix.Core.Attributes; using StabilityMatrix.Core.Helper; using StabilityMatrix.Core.Helper.HardwareInfo; namespace StabilityMatrix.Avalonia.ViewModels; [View(typeof(FirstLaunchSetupWindow))] [ManagedService] [Singleton] public partial class FirstLaunchSetupViewModel : ViewModelBase { [ObservableProperty] private bool eulaAccepted; [ObservableProperty] private string gpuInfoText = string.Empty; [ObservableProperty] private RefreshBadgeViewModel checkHardwareBadge = new() { WorkingToolTipText = "We're checking some hardware specifications to determine compatibility.", SuccessToolTipText = "Everything looks good!", FailToolTipText = "We recommend a GPU with CUDA support for the best experience. " + "You can continue without one, but some packages may not work, and inference may be slower.", FailColorBrush = ThemeColors.ThemeYellow, }; public FirstLaunchSetupViewModel() { CheckHardwareBadge.RefreshFunc = SetGpuInfo; } private async Task SetGpuInfo() { GpuInfo[] gpuInfo; await using (new MinimumDelay(800, 1200)) { // Query GPU info gpuInfo = await Task.Run(() => HardwareHelper.IterGpuInfo().ToArray()); } // First Nvidia GPU var activeGpu = gpuInfo.FirstOrDefault(gpu => gpu.Name?.ToLowerInvariant().Contains("nvidia") ?? false); var isNvidia = activeGpu is not null; // Otherwise first GPU activeGpu ??= gpuInfo.FirstOrDefault(); GpuInfoText = activeGpu is null ? "No GPU detected" : $"{activeGpu.Name} ({Size.FormatBytes(activeGpu.MemoryBytes)})"; return isNvidia; } public override void OnLoaded() { base.OnLoaded(); CheckHardwareBadge.RefreshCommand.ExecuteAsync(null).SafeFireAndForget(); } }