Skip to content

Commit 8351c03

Browse files
authored
Merge pull request LykosAI#995 from ionite34/backport/main/pr-993
[dev to main] backport: update to avalonia 11.2.5 and some packages fixes n stuff (993)
2 parents 8b5fde1 + ee005c0 commit 8351c03

File tree

11 files changed

+208
-22
lines changed

11 files changed

+208
-22
lines changed

CHANGELOG.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,22 @@ and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2
77

88
## v2.13.4
99
### Added
10-
- Added support for RTX 5000-series GPUs in ComfyUI
10+
- Added support for RTX 5000-series GPUs in ComfyUI, Forge, and reForge
11+
- Added "Rebuild .NET Project" command to SwarmUI installs - available via the 3-dots menu -> Package Commands -> Rebuild .NET Project
1112
### Changed
1213
- Upgraded ComfyUI CUDA torch to 12.6
13-
- Upgraded Lykos account connection to use OAuth 2.0 device flow
14+
- Upgraded Lykos account connection to use OAuth 2.0 device flow
15+
- (Internal) Updated Avalonia to 11.2.5
1416
### Fixed
1517
- Fixed [#1128](https://github.com/LykosAI/StabilityMatrix/issues/1128) - overwriting models when downloading multiple with the same name
1618
- Fixed ROCm torch indexes for ComfyUI & Forge
1719
- Fixed model browser sometimes downloading to `ModelsLora` or `ModelsStableDiffusion` folders instead of the correct folder
1820
- Fixed incorrect Unet folder path for ComfyUI users on Linux/macOS
1921
- Fixed [#1157](https://github.com/LykosAI/StabilityMatrix/issues/1157) - crash when broken symlinks exist in model directories
2022
- Fixed [#1154](https://github.com/LykosAI/StabilityMatrix/issues/1154) - increased width for package name on the package cards
23+
- Fixed ComfyUI-Zluda not being recognized as an option for Inference or SwarmUI
24+
- Fixed SwarmUI showing Python options in the 3-dots menu
25+
- Fixed SD.Next install failures in certain cases when using Zluda
2126

2227
## v2.13.3
2328
### Changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<PropertyGroup>
11-
<AvaloniaVersion>11.2.2</AvaloniaVersion>
11+
<AvaloniaVersion>11.2.5</AvaloniaVersion>
1212
</PropertyGroup>
1313

1414
<PropertyGroup>

Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,4 @@
127127
<PackageVersion Include="xunit" Version="2.9.0" />
128128
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
129129
</ItemGroup>
130-
</Project>
130+
</Project>

StabilityMatrix.Avalonia/ViewModels/Dialogs/InferenceConnectionHelpViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ RunningPackageService runningPackageService
7070

7171
// Get comfy type installed packages
7272
var comfyPackages = this.settingsManager.Settings.InstalledPackages.Where(
73-
p => p.PackageName == "ComfyUI"
73+
p => p.PackageName is "ComfyUI" or "ComfyUI-Zluda"
7474
)
7575
.ToImmutableArray();
7676

@@ -88,7 +88,7 @@ RunningPackageService runningPackageService
8888
// Use active package if its comfy, otherwise use the first comfy type
8989
if (
9090
this.settingsManager.Settings.ActiveInstalledPackage is
91-
{ PackageName: "ComfyUI" } activePackage
91+
{ PackageName: "ComfyUI" or "ComfyUI-Zluda" } activePackage
9292
)
9393
{
9494
SelectedPackage = activePackage;

StabilityMatrix.Avalonia/ViewModels/PackageManager/PackageCardViewModel.cs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ RunningPackageService runningPackageService
102102
[ObservableProperty]
103103
private bool dontCheckForUpdates;
104104

105+
[ObservableProperty]
106+
private bool usesVenv;
107+
108+
[ObservableProperty]
109+
[NotifyPropertyChangedFor(nameof(ShowExtraCommands))]
110+
private List<ExtraPackageCommand>? extraCommands;
111+
112+
public bool ShowExtraCommands => ExtraCommands is { Count: > 0 };
113+
105114
private void RunningPackagesOnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
106115
{
107116
if (runningPackageService.RunningPackages.Select(x => x.Value) is not { } runningPackages)
@@ -141,7 +150,7 @@ partial void OnPackageChanged(InstalledPackage? value)
141150
{
142151
IsUnknownPackage = false;
143152

144-
var basePackage = packageFactory[value.PackageName];
153+
var basePackage = packageFactory[value.PackageName!];
145154
CardImageSource = basePackage?.PreviewImageUri ?? Assets.NoImage;
146155
InstalledVersion = value.Version?.DisplayVersion ?? "Unknown";
147156
CanUseConfigMethod =
@@ -152,6 +161,11 @@ partial void OnPackageChanged(InstalledPackage? value)
152161
CanUseSharedOutput = basePackage?.SharedOutputFolders != null;
153162
CanUseExtensions = basePackage?.SupportsExtensions ?? false;
154163
DontCheckForUpdates = Package?.DontCheckForUpdates ?? false;
164+
UsesVenv = basePackage?.UsesVenv ?? true;
165+
166+
// Set the extra commands if available from the package
167+
var packageExtraCommands = basePackage?.GetExtraCommands();
168+
ExtraCommands = packageExtraCommands?.Count > 0 ? packageExtraCommands : null;
155169

156170
runningPackageService.RunningPackages.CollectionChanged += RunningPackagesOnCollectionChanged;
157171
EventManager.Instance.PackageRelaunchRequested += InstanceOnPackageRelaunchRequested;
@@ -787,6 +801,39 @@ private async Task ShowLaunchOptions()
787801
}
788802
}
789803

804+
[RelayCommand]
805+
private async Task ExecuteExtraCommand(string commandName)
806+
{
807+
var command = ExtraCommands?.FirstOrDefault(cmd => cmd.CommandName == commandName);
808+
if (command == null)
809+
return;
810+
811+
Text = $"Executing {commandName}...";
812+
IsIndeterminate = true;
813+
Value = -1;
814+
815+
try
816+
{
817+
await command.Command(Package!);
818+
notificationService.Show("Command executed successfully", commandName, NotificationType.Success);
819+
}
820+
catch (Exception ex)
821+
{
822+
logger.LogError(ex, "Error executing command {CommandName}", commandName);
823+
notificationService.ShowPersistent(
824+
$"Error during {commandName} operation",
825+
ex.Message,
826+
NotificationType.Error
827+
);
828+
}
829+
finally
830+
{
831+
Text = "";
832+
IsIndeterminate = false;
833+
Value = 0;
834+
}
835+
}
836+
790837
private async Task<bool> HasUpdate()
791838
{
792839
if (Package == null || IsUnknownPackage || Design.IsDesignMode || Package.DontCheckForUpdates)

StabilityMatrix.Avalonia/Views/PackageManager/MainPackageManagerView.axaml

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
xmlns:converters="clr-namespace:StabilityMatrix.Avalonia.Converters"
77
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
88
xmlns:designData="clr-namespace:StabilityMatrix.Avalonia.DesignData"
9+
xmlns:generic="clr-namespace:System.Collections.Generic;assembly=System.Runtime"
910
xmlns:icons="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
11+
xmlns:input="clr-namespace:FluentAvalonia.UI.Input;assembly=FluentAvalonia"
1012
xmlns:lang="clr-namespace:StabilityMatrix.Avalonia.Languages"
1113
xmlns:markupExtensions="clr-namespace:StabilityMatrix.Avalonia.MarkupExtensions"
1214
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
15+
xmlns:models="clr-namespace:StabilityMatrix.Core.Models;assembly=StabilityMatrix.Core"
1316
xmlns:packageManager="clr-namespace:StabilityMatrix.Avalonia.ViewModels.PackageManager"
1417
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
1518
xmlns:vendorLabs="clr-namespace:StabilityMatrix.Avalonia.Controls.VendorLabs"
@@ -160,15 +163,15 @@
160163
<MenuItem
161164
Command="{Binding OpenPythonPackagesDialogCommand}"
162165
Header="{x:Static lang:Resources.Label_PythonPackages}"
163-
IsVisible="{Binding !IsUnknownPackage}">
166+
IsVisible="{Binding UsesVenv}">
164167
<MenuItem.Icon>
165168
<icons:Icon Value="fa-brands fa-python" />
166169
</MenuItem.Icon>
167170
</MenuItem>
168171
<MenuItem
169172
Command="{Binding OpenPythonDependenciesOverrideDialogCommand}"
170173
Header="{x:Static lang:Resources.Label_PythonDependenciesOverride_Title}"
171-
IsVisible="{Binding !IsUnknownPackage}">
174+
IsVisible="{Binding UsesVenv}">
172175
<MenuItem.Icon>
173176
<icons:Icon Value="fa-solid fa-bandage" />
174177
</MenuItem.Icon>
@@ -268,6 +271,34 @@
268271

269272
<Separator IsVisible="{Binding !IsUnknownPackage}" />
270273

274+
<!-- Package-specific extra commands section -->
275+
<MenuItem
276+
Classes="SubItems"
277+
Header="Package Commands"
278+
IsVisible="{Binding ShowExtraCommands}">
279+
<MenuItem.Resources>
280+
<input:StandardUICommand x:Key="ExecuteExtraCommandCommand" Command="{Binding ExecuteExtraCommandCommand}" />
281+
</MenuItem.Resources>
282+
283+
<MenuItem.Icon>
284+
<icons:Icon Value="fa-solid fa-toolbox" />
285+
</MenuItem.Icon>
286+
287+
<MenuItem.ItemsSource>
288+
<Binding Path="ExtraCommands" />
289+
</MenuItem.ItemsSource>
290+
291+
<MenuItem.Styles>
292+
<Style x:DataType="models:ExtraPackageCommand" Selector="MenuItem.SubItems MenuItem">
293+
<Setter Property="Header" Value="{Binding CommandName}" />
294+
<Setter Property="Command" Value="{StaticResource ExecuteExtraCommandCommand}" />
295+
<Setter Property="CommandParameter" Value="{Binding CommandName}" />
296+
</Style>
297+
</MenuItem.Styles>
298+
</MenuItem>
299+
300+
<Separator IsVisible="{Binding ShowExtraCommands}" />
301+
271302
<MenuItem
272303
Command="{Binding Uninstall}"
273304
Header="{x:Static lang:Resources.Action_Uninstall}"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace StabilityMatrix.Core.Models;
2+
3+
public class ExtraPackageCommand
4+
{
5+
public required string CommandName { get; set; }
6+
public required Func<InstalledPackage, Task> Command { get; set; }
7+
}

StabilityMatrix.Core/Models/Packages/BasePackage.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ public abstract class BasePackage(ISettingsManager settingsManager)
5353
public abstract PackageDifficulty InstallerSortOrder { get; }
5454

5555
public virtual PackageType PackageType => PackageType.SdInference;
56+
public virtual bool UsesVenv => true;
57+
58+
/// <summary>
59+
/// Returns a list of extra commands that can be executed for this package.
60+
/// The function takes an InstalledPackage parameter to operate on a specific installation.
61+
/// </summary>
62+
public virtual List<ExtraPackageCommand> GetExtraCommands() => [];
5663

5764
public abstract Task DownloadPackage(
5865
string installLocation,

StabilityMatrix.Core/Models/Packages/SDWebForge.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,19 @@ public override async Task InstallPackage(
146146

147147
var pipArgs = new PipInstallArgs("setuptools==69.5.1");
148148

149+
var isBlackwell =
150+
SettingsManager.Settings.PreferredGpu?.IsBlackwellGpu() ?? HardwareHelper.HasBlackwellGpu();
149151
var torchVersion = options.PythonOptions.TorchIndex ?? GetRecommendedTorchVersion();
150-
if (torchVersion is TorchIndex.DirectMl)
152+
153+
if (isBlackwell && torchVersion is TorchIndex.Cuda)
151154
{
152-
pipArgs = pipArgs.WithTorchDirectML();
155+
pipArgs = pipArgs
156+
.AddArg(
157+
"https://huggingface.co/w-e-w/torch-2.6.0-cu128.nv/resolve/main/torch-2.6.0%2Bcu128.nv-cp310-cp310-win_amd64.whl"
158+
)
159+
.AddArg(
160+
"https://huggingface.co/w-e-w/torch-2.6.0-cu128.nv/resolve/main/torchvision-0.20.0a0%2Bcu128.nv-cp310-cp310-win_amd64.whl"
161+
);
153162
}
154163
else
155164
{

StabilityMatrix.Core/Models/Packages/StableSwarm.cs

Lines changed: 89 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,32 @@ IPrerequisiteHelper prerequisiteHelper
4242
[SharedFolderMethod.Symlink, SharedFolderMethod.Configuration, SharedFolderMethod.None];
4343
public override SharedFolderMethod RecommendedSharedFolderMethod => SharedFolderMethod.Configuration;
4444
public override bool OfferInOneClickInstaller => false;
45+
public override bool UsesVenv => false;
46+
47+
public override List<ExtraPackageCommand> GetExtraCommands() =>
48+
[
49+
new()
50+
{
51+
CommandName = "Rebuild .NET Project",
52+
Command = async installedPackage =>
53+
{
54+
if (installedPackage == null || string.IsNullOrEmpty(installedPackage.FullPath))
55+
{
56+
throw new InvalidOperationException("Package not found or not installed correctly");
57+
}
58+
59+
var srcFolder = Path.Combine(installedPackage.FullPath, "src");
60+
var csprojName = "StableSwarmUI.csproj";
61+
if (File.Exists(Path.Combine(srcFolder, "SwarmUI.csproj")))
62+
{
63+
csprojName = "SwarmUI.csproj";
64+
}
65+
66+
await RebuildDotnetProject(installedPackage.FullPath, csprojName, null)
67+
.ConfigureAwait(false);
68+
}
69+
}
70+
];
4571

4672
public override List<LaunchOptionDefinition> LaunchOptions =>
4773
[
@@ -135,7 +161,7 @@ public override async Task InstallPackage(
135161
progress?.Report(new ProgressReport(-1f, "Installing SwarmUI...", isIndeterminate: true));
136162

137163
var comfy = settingsManager.Settings.InstalledPackages.FirstOrDefault(
138-
x => x.PackageName == nameof(ComfyUI)
164+
x => x.PackageName is nameof(ComfyUI) or "ComfyUI-Zluda"
139165
);
140166

141167
if (comfy == null)
@@ -233,16 +259,45 @@ await prerequisiteHelper
233259
.Where(arg => !string.IsNullOrWhiteSpace(arg))
234260
);
235261

236-
dataSection.Set(
237-
"settings",
238-
new ComfyUiSelfStartSettings
239-
{
240-
StartScript = $"../{comfy.DisplayName}/main.py",
241-
DisableInternalArgs = false,
242-
AutoUpdate = false,
243-
ExtraArgs = comfyArgs
244-
}.Save(true)
245-
);
262+
if (comfy.PackageName == "ComfyUI-Zluda")
263+
{
264+
var fullComfyZludaPath = Path.Combine(SettingsManager.LibraryDir, comfy.LibraryPath);
265+
var zludaPath = Path.Combine(fullComfyZludaPath, "zluda", "zluda.exe");
266+
var comfyVenvPath = Path.Combine(
267+
fullComfyZludaPath,
268+
"venv",
269+
Compat.Switch(
270+
(PlatformKind.Windows, Path.Combine("Scripts", "python.exe")),
271+
(PlatformKind.Unix, Path.Combine("bin", "python3"))
272+
)
273+
);
274+
275+
ProcessArgs args = ["--", comfyVenvPath, "main.py", comfyArgs];
276+
277+
dataSection.Set(
278+
"settings",
279+
new ComfyUiSelfStartSettings
280+
{
281+
StartScript = zludaPath,
282+
DisableInternalArgs = false,
283+
AutoUpdate = false,
284+
ExtraArgs = args
285+
}.Save(true)
286+
);
287+
}
288+
else
289+
{
290+
dataSection.Set(
291+
"settings",
292+
new ComfyUiSelfStartSettings
293+
{
294+
StartScript = $"../{comfy.DisplayName}/main.py",
295+
DisableInternalArgs = false,
296+
AutoUpdate = false,
297+
ExtraArgs = comfyArgs
298+
}.Save(true)
299+
);
300+
}
246301

247302
backendsFile.Set("0", dataSection);
248303
backendsFile.SaveToFile(GetBackendsPath(installLocation));
@@ -385,6 +440,29 @@ await dotnetProcess
385440
GC.SuppressFinalize(this);
386441
}
387442

443+
public async Task RebuildDotnetProject(
444+
string installLocation,
445+
string csprojName,
446+
Action<ProcessOutput>? onConsoleOutput
447+
)
448+
{
449+
await prerequisiteHelper
450+
.RunDotnet(
451+
[
452+
"build",
453+
$"src/{csprojName}",
454+
"--no-incremental",
455+
"--configuration",
456+
"Release",
457+
"-o",
458+
"src/bin/live_release"
459+
],
460+
workingDirectory: installLocation,
461+
onProcessOutput: onConsoleOutput
462+
)
463+
.ConfigureAwait(false);
464+
}
465+
388466
private Task SetupModelFoldersConfig(DirectoryPath installDirectory)
389467
{
390468
var settingsPath = GetSettingsPath(installDirectory);

0 commit comments

Comments
 (0)