StableDiffusionNet 1.0.0
dotnet add package StableDiffusionNet --version 1.0.0
NuGet\Install-Package StableDiffusionNet -Version 1.0.0
<PackageReference Include="StableDiffusionNet" Version="1.0.0" />
<PackageVersion Include="StableDiffusionNet" Version="1.0.0" />
<PackageReference Include="StableDiffusionNet" />
paket add StableDiffusionNet --version 1.0.0
#r "nuget: StableDiffusionNet, 1.0.0"
#:package StableDiffusionNet@1.0.0
#addin nuget:?package=StableDiffusionNet&version=1.0.0
#tool nuget:?package=StableDiffusionNet&version=1.0.0
StableDiffusionNet
Прогрессивный .NET клиент для Stable Diffusion WebUI API
🌟 Особенности
- 🔄 Dependency Injection: Полная поддержка DI контейнеров
- 🛡️ Обработка ошибок: Встроенная retry-логика с использованием Polly
- 📝 Асинхронность: Все операции поддерживают async/await и CancellationToken
- 📖 Документация: Полная XML документация для всех публичных API
- 🧪 Тестируемость: Все зависимости абстрагированы через интерфейсы
- 🔍 Логирование: Интеграция с Microsoft.Extensions.Logging
📦 Установка
dotnet add package StableDiffusionNet
Или через NuGet Package Manager:
Install-Package StableDiffusionNet
🚀 Быстрый старт
Настройка с Dependency Injection
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using StableDiffusionNet.Extensions;
// Настройка DI контейнера
var services = new ServiceCollection();
// Добавление логирования
services.AddLogging(builder => builder.AddConsole());
// Регистрация StableDiffusion клиента
services.AddStableDiffusion(options =>
{
options.BaseUrl = "http://localhost:7860";
options.TimeoutSeconds = 300;
options.RetryCount = 3;
options.EnableDetailedLogging = true;
});
var serviceProvider = services.BuildServiceProvider();
var client = serviceProvider.GetRequiredService<IStableDiffusionClient>();
Простая настройка
// Для быстрого старта с настройками по умолчанию
services.AddStableDiffusion("http://localhost:7860");
📚 Примеры использования
1. Генерация изображения из текста (txt2img)
using StableDiffusionNet.Models.Requests;
var request = new TextToImageRequest
{
Prompt = "a beautiful sunset over mountains, highly detailed, 4k",
NegativePrompt = "blurry, low quality, distorted",
Width = 512,
Height = 512,
Steps = 30,
CfgScale = 7.5,
SamplerName = "Euler a",
Seed = -1 // Случайный seed
};
var response = await client.TextToImage.GenerateAsync(request);
// Сохранение первого изображения
var base64Image = response.Images[0];
ImageHelper.Base64ToImage(base64Image, "output.png");
Console.WriteLine($"Сгенерировано изображений: {response.Images.Count}");
Console.WriteLine($"Информация: {response.Info}");
2. Генерация изображения из изображения (img2img)
using StableDiffusionNet.Models.Requests;
using StableDiffusionNet.Helpers;
// Загрузка исходного изображения
var initImageBase64 = ImageHelper.ImageToBase64("input.png");
var request = new ImageToImageRequest
{
InitImages = new List<string> { initImageBase64 },
Prompt = "transform into a painting in van gogh style",
NegativePrompt = "photo, realistic",
DenoisingStrength = 0.7,
Steps = 30,
CfgScale = 7.5
};
var response = await client.ImageToImage.GenerateAsync(request);
ImageHelper.Base64ToImage(response.Images[0], "output.png");
3. Работа с моделями
// Получение списка доступных моделей
var models = await client.Models.GetModelsAsync();
foreach (var model in models)
{
Console.WriteLine($"Модель: {model.Title}");
}
// Получение текущей модели
var currentModel = await client.Models.GetCurrentModelAsync();
Console.WriteLine($"Текущая модель: {currentModel}");
// Смена модели
await client.Models.SetModelAsync("sd_xl_base_1.0.safetensors");
// Обновление списка моделей
await client.Models.RefreshModelsAsync();
4. Отслеживание прогресса генерации
// Запуск генерации в отдельной задаче
var generateTask = client.TextToImage.GenerateAsync(request);
// Мониторинг прогресса
while (!generateTask.IsCompleted)
{
var progress = await client.Progress.GetProgressAsync();
Console.WriteLine($"Прогресс: {progress.Progress:P}");
if (progress.State != null)
{
Console.WriteLine($"Шаг: {progress.State.SamplingStep}/{progress.State.SamplingSteps}");
Console.WriteLine($"ETA: {progress.EtaRelative:F1} сек");
}
await Task.Delay(1000);
}
var result = await generateTask;
5. Прерывание генерации
// Прерывание текущей генерации
await client.Progress.InterruptAsync();
// Пропуск текущего изображения при батч-генерации
await client.Progress.SkipAsync();
6. Работа с настройками WebUI
// Получение текущих настроек
var options = await client.Options.GetOptionsAsync();
Console.WriteLine($"Текущий CLIP skip: {options.ClipStopAtLastLayers}");
// Изменение настроек
options.ClipStopAtLastLayers = 2;
options.EnableXformers = true;
await client.Options.SetOptionsAsync(options);
7. Получение списка sampler'ов
var samplers = await client.Samplers.GetSamplersAsync();
foreach (var sampler in samplers)
{
Console.WriteLine($"Sampler: {sampler}");
}
8. Проверка доступности API
var isAvailable = await client.PingAsync();
if (isAvailable)
{
Console.WriteLine("API доступен");
}
else
{
Console.WriteLine("API недоступен");
}
9. Батч-генерация изображений
var request = new TextToImageRequest
{
Prompt = "a cute cat, highly detailed",
BatchSize = 4, // 4 изображения за раз
NIter = 2, // 2 батча
Steps = 20
};
var response = await client.TextToImage.GenerateAsync(request);
// Получим 8 изображений (4 × 2)
for (int i = 0; i < response.Images.Count; i++)
{
ImageHelper.Base64ToImage(response.Images[i], $"output_{i}.png");
}
10. High Resolution (Hires.fix)
var request = new TextToImageRequest
{
Prompt = "a beautiful landscape, 8k, highly detailed",
Width = 512,
Height = 512,
EnableHr = true,
HrScale = 2.0, // Увеличение в 2 раза (итого 1024×1024)
HrUpscaler = "Latent",
HrSecondPassSteps = 20,
DenoisingStrength = 0.7
};
var response = await client.TextToImage.GenerateAsync(request);
11. Inpainting (рисование по маске)
var initImage = ImageHelper.ImageToBase64("input.png");
var mask = ImageHelper.ImageToBase64("mask.png"); // Белые области будут перерисованы
var request = new ImageToImageRequest
{
InitImages = new List<string> { initImage },
Mask = mask,
Prompt = "a red apple",
DenoisingStrength = 0.75,
InpaintingFill = 1, // 0: fill, 1: original, 2: latent noise, 3: latent nothing
InpaintFullRes = true,
MaskBlur = 4
};
var response = await client.ImageToImage.GenerateAsync(request);
ImageHelper.Base64ToImage(response.Images[0], "inpainted.png");
🔧 Конфигурация
Доступные опции
services.AddStableDiffusion(options =>
{
// Базовый URL API (обязательно)
options.BaseUrl = "http://localhost:7860";
// Таймаут для запросов в секундах (по умолчанию: 300)
options.TimeoutSeconds = 600;
// Количество повторов при ошибке (по умолчанию: 3)
options.RetryCount = 5;
// Задержка между повторами в мс (по умолчанию: 1000)
options.RetryDelayMilliseconds = 2000;
// API ключ (если требуется)
options.ApiKey = "your-api-key";
// Детальное логирование (по умолчанию: false)
options.EnableDetailedLogging = true;
});
🧪 Тестирование
Благодаря использованию интерфейсов, все компоненты легко тестируются с использованием mock-объектов:
var mockHttpClient = new Mock<IHttpClientWrapper>();
mockHttpClient
.Setup(x => x.PostAsync<TextToImageRequest, TextToImageResponse>(
It.IsAny<string>(),
It.IsAny<TextToImageRequest>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(new TextToImageResponse
{
Images = new List<string> { "base64data" }
});
var service = new TextToImageService(
mockHttpClient.Object,
Mock.Of<ILogger<TextToImageService>>());
📝 Обработка ошибок
Библиотека предоставляет специализированные исключения:
StableDiffusionException- базовое исключениеApiException- ошибки API (содержит StatusCode и ResponseBody)ConfigurationException- ошибки конфигурации
try
{
var response = await client.TextToImage.GenerateAsync(request);
}
catch (ApiException ex)
{
Console.WriteLine($"Ошибка API: {ex.Message}");
Console.WriteLine($"Статус код: {ex.StatusCode}");
Console.WriteLine($"Тело ответа: {ex.ResponseBody}");
}
catch (StableDiffusionException ex)
{
Console.WriteLine($"Общая ошибка: {ex.Message}");
}
🔄 Retry Policy
Библиотека использует Polly для автоматических повторов при временных ошибках:
- Транзитные HTTP ошибки
- Ошибки сети
- HTTP 429 (Too Many Requests)
Повторы выполняются с экспоненциальной задержкой.
🎯 Требования
- .NET Standard 2.1 или выше
- Stable Diffusion WebUI (AUTOMATIC1111) с включенным API
🤝 Вклад в проект
Мы приветствуем вклад в развитие проекта! Пожалуйста:
- Создайте форк репозитория
- Создайте ветку для вашей функции
- Внесите изменения с соблюдением принципов SOLID
- Добавьте тесты
- Создайте Pull Request
📄 Лицензия
MIT License
🔗 Полезные ссылки
📧 Поддержка
При возникновении проблем создайте issue в репозитории проекта.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Http (>= 9.0.10)
- Microsoft.Extensions.Http.Polly (>= 9.0.10)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Options (>= 9.0.10)
- Newtonsoft.Json (>= 13.0.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|
See CHANGELOG.md for details