Files
replicate.maui/Replicate.Maui/ReplicateTransformerFactory.cs
2025-12-10 21:59:12 -05:00

110 lines
4.5 KiB
C#

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace MarketAlly.Replicate.Maui
{
/// <summary>
/// Factory for creating IReplicateTransformer instances with custom API tokens.
/// Useful for BYOK (Bring Your Own Key) scenarios.
/// </summary>
public interface IReplicateTransformerFactory
{
/// <summary>
/// Creates a transformer using the default configured settings.
/// </summary>
IReplicateTransformer Create();
/// <summary>
/// Creates a transformer with a custom API token, using default settings for everything else.
/// </summary>
/// <param name="apiToken">The Replicate API token to use.</param>
IReplicateTransformer CreateWithToken(string apiToken);
/// <summary>
/// Creates a transformer with fully custom settings.
/// </summary>
/// <param name="configure">Action to configure the settings.</param>
IReplicateTransformer CreateWithSettings(Action<ReplicateSettings> configure);
}
public class ReplicateTransformerFactory : IReplicateTransformerFactory
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ReplicateSettings _defaultSettings;
private readonly ILoggerFactory? _loggerFactory;
public ReplicateTransformerFactory(
IHttpClientFactory httpClientFactory,
IOptions<ReplicateSettings> defaultSettings,
ILoggerFactory? loggerFactory = null)
{
_httpClientFactory = httpClientFactory;
_defaultSettings = defaultSettings.Value;
_loggerFactory = loggerFactory;
}
public IReplicateTransformer Create()
{
var httpClient = _httpClientFactory.CreateClient();
var logger = _loggerFactory?.CreateLogger<ReplicateTransformer>();
return new ReplicateTransformer(httpClient, Options.Create(_defaultSettings), logger);
}
public IReplicateTransformer CreateWithToken(string apiToken)
{
var settings = CloneSettings(_defaultSettings);
settings.ApiToken = apiToken;
var httpClient = _httpClientFactory.CreateClient();
var logger = _loggerFactory?.CreateLogger<ReplicateTransformer>();
return new ReplicateTransformer(httpClient, Options.Create(settings), logger);
}
public IReplicateTransformer CreateWithSettings(Action<ReplicateSettings> configure)
{
var settings = CloneSettings(_defaultSettings);
configure(settings);
var httpClient = _httpClientFactory.CreateClient();
var logger = _loggerFactory?.CreateLogger<ReplicateTransformer>();
return new ReplicateTransformer(httpClient, Options.Create(settings), logger);
}
private static ReplicateSettings CloneSettings(ReplicateSettings source)
{
return new ReplicateSettings
{
ApiToken = source.ApiToken,
ApiUrl = source.ApiUrl,
AuthScheme = source.AuthScheme,
ModelVersion = source.ModelVersion,
ModelName = source.ModelName,
TimeoutSeconds = source.TimeoutSeconds,
PollingDelayMs = source.PollingDelayMs,
ImagePrompt = source.ImagePrompt,
VideoModelName = source.VideoModelName,
VideoModelVersion = source.VideoModelVersion,
VideoPrompt = source.VideoPrompt,
VideoTimeoutSeconds = source.VideoTimeoutSeconds,
VideoPollingDelayMs = source.VideoPollingDelayMs,
DefaultSettings = new ImageTransformSettings
{
Seed = source.DefaultSettings.Seed,
GuidanceScale = source.DefaultSettings.GuidanceScale,
Strength = source.DefaultSettings.Strength,
NumInferenceSteps = source.DefaultSettings.NumInferenceSteps
},
VideoSettings = new VideoTransformSettings
{
Seed = source.VideoSettings.Seed,
Duration = source.VideoSettings.Duration,
Size = source.VideoSettings.Size,
AudioUrl = source.VideoSettings.AudioUrl,
NegativePrompt = source.VideoSettings.NegativePrompt,
EnablePromptExpansion = source.VideoSettings.EnablePromptExpansion
}
};
}
}
}