diff --git a/AiServer.ServiceInterface/Generation/ComfyProvider.cs b/AiServer.ServiceInterface/Generation/ComfyProvider.cs index 472f04d..6162cdb 100644 --- a/AiServer.ServiceInterface/Generation/ComfyProvider.cs +++ b/AiServer.ServiceInterface/Generation/ComfyProvider.cs @@ -99,6 +99,19 @@ private ComfyClient GetClient(MediaProvider provider) // Last check for null seed request.Seed ??= Random.Shared.Next(); var comfyWorkflowReq = request.ConvertTo(); + // Ensure task type is set + comfyWorkflowReq.TaskType = request.TaskType switch + { + AiTaskType.TextToImage => ComfyTaskType.TextToImage, + AiTaskType.ImageToImage => ComfyTaskType.ImageToImage, + AiTaskType.ImageUpscale => ComfyTaskType.ImageUpscale, + AiTaskType.ImageWithMask => ComfyTaskType.ImageWithMask, + AiTaskType.ImageToText => ComfyTaskType.ImageToText, + AiTaskType.TextToAudio => ComfyTaskType.TextToAudio, + AiTaskType.TextToSpeech => ComfyTaskType.TextToSpeech, + AiTaskType.SpeechToText => ComfyTaskType.SpeechToText, + _ => throw new ArgumentOutOfRangeException() + }; comfyWorkflowReq = comfyWorkflowReq.ApplyModelDefaults(AppConfig.Instance, modelSettings.ConvertTo()); var response = await comfyClient.PromptGenerationAsync(comfyWorkflowReq, token, waitResult: true); diff --git a/AiServer.ServiceInterface/MediaTransform/CreateMediaTransformCommand.cs b/AiServer.ServiceInterface/MediaTransform/CreateMediaTransformCommand.cs index 3e13b32..b1d01bf 100644 --- a/AiServer.ServiceInterface/MediaTransform/CreateMediaTransformCommand.cs +++ b/AiServer.ServiceInterface/MediaTransform/CreateMediaTransformCommand.cs @@ -354,7 +354,10 @@ async Task DownloadOutputAsync(IMediaTransformProvider aiProvider, "video/mp4" => "mp4", "video/webm" => "webm", "video/ogg" => "ogg", - _ => "webm" + "video/mov" => "mov", + "video/avi" => "avi", + "video/mkv" => "mkv", + _ => "mp4" }; var imageBytes = await response.Content.ReadAsByteArrayAsync(); diff --git a/AiServer.ServiceInterface/VideoServices.cs b/AiServer.ServiceInterface/VideoServices.cs index fc48ea1..f96bdb2 100644 --- a/AiServer.ServiceInterface/VideoServices.cs +++ b/AiServer.ServiceInterface/VideoServices.cs @@ -124,9 +124,9 @@ public async Task Any(TrimVideo request) private void ValidateTimeFormat(string time, string fieldName) { - if (!Regex.IsMatch(time, @"^\d{2}:\d{2}$")) + if (!Regex.IsMatch(time, @"^(\d{1,3}):([0-5]\d)$")) { - throw new ArgumentException($"Invalid {fieldName} format. Expected format: mm:ss"); + throw new ArgumentException($"Invalid {fieldName} format. Expected format: m:ss, mm:ss, or mmm:ss"); } } @@ -198,8 +198,8 @@ private bool IsVideoFormat(MediaOutputFormat outputFormat) case MediaOutputFormat.MKV: case MediaOutputFormat.MOV: case MediaOutputFormat.WebM: - return true; case MediaOutputFormat.GIF: + return true; case MediaOutputFormat.MP3: case MediaOutputFormat.WAV: case MediaOutputFormat.FLAC: diff --git a/AiServer.ServiceModel/GenerationAdmin.cs b/AiServer.ServiceModel/GenerationAdmin.cs index 1285887..e6965c3 100644 --- a/AiServer.ServiceModel/GenerationAdmin.cs +++ b/AiServer.ServiceModel/GenerationAdmin.cs @@ -57,7 +57,7 @@ public class CreateMediaProvider : ICreateDb, IReturn public List? Models { get; set; } [Input(Type = "hidden")] - public int? MediaTypeId { get; set; } + public string MediaTypeId { get; set; } } [Tag(Tag.Info)] diff --git a/AiServer.ServiceModel/MediaTransforms.cs b/AiServer.ServiceModel/MediaTransforms.cs index d0669dc..0d75b59 100644 --- a/AiServer.ServiceModel/MediaTransforms.cs +++ b/AiServer.ServiceModel/MediaTransforms.cs @@ -266,13 +266,13 @@ public class CropVideo : IMediaTransform, IReturn [ValidateApiKey] public class TrimVideo : IMediaTransform, IReturn { - [ApiMember(Description = "The start time of the trimmed video (format: HH:MM:SS)")] - [Description("The start time of the trimmed video (format: HH:MM:SS)")] + [ApiMember(Description = "The start time of the trimmed video (format: MM:SS)")] + [Description("The start time of the trimmed video (format: MM:SS)")] [Required] public string StartTime { get; set; } - [ApiMember(Description = "The end time of the trimmed video (format: HH:MM:SS)")] - [Description("The end time of the trimmed video (format: HH:MM:SS)")] + [ApiMember(Description = "The end time of the trimmed video (format: MM:SS)")] + [Description("The end time of the trimmed video (format: MM:SS)")] public string? EndTime { get; set; } [Required] diff --git a/AiServer.ServiceModel/QueueMediaTransforms.cs b/AiServer.ServiceModel/QueueMediaTransforms.cs index 9f2f8d5..4a03f04 100644 --- a/AiServer.ServiceModel/QueueMediaTransforms.cs +++ b/AiServer.ServiceModel/QueueMediaTransforms.cs @@ -220,7 +220,7 @@ public class QueueWatermarkImage : IQueueMediaTransform, IPost, IReturn +public class QueueScaleImage : IQueueMediaTransform,IPost, IReturn { [ApiMember(Description = "The image file to be scaled")] [Description("The image file to be scaled")] @@ -235,6 +235,18 @@ public class QueueScaleImage : IPost, IReturn [ApiMember(Description = "Desired height of the scaled image")] [Description("Desired height of the scaled image")] public int? Height { get; set; } + + [ApiMember(Description = "Optional client-provided identifier for the request")] + [Description("Optional client-provided identifier for the request")] + public string? RefId { get; set; } + + [ApiMember(Description = "Optional queue or topic to reply to")] + [Description("Optional queue or topic to reply to")] + public string? ReplyTo { get; set; } + + [ApiMember(Description = "Tag to identify the request")] + [Description("Tag to identify the request")] + public string? Tag { get; set; } } [Description("Convert a video to a different format")] @@ -375,14 +387,8 @@ public enum ConvertVideoOutputFormat MP4, [EnumMember(Value = "avi")] AVI, - [EnumMember(Value = "mkv")] - MKV, [EnumMember(Value = "mov")] - MOV, - [EnumMember(Value = "webm")] - WebM, - [EnumMember(Value = "gif")] - GIF + MOV } [DataContract] diff --git a/AiServer.Tests/ComfyAdminTasks.cs b/AiServer.Tests/ComfyAdminTasks.cs index 33faba5..3b634b3 100644 --- a/AiServer.Tests/ComfyAdminTasks.cs +++ b/AiServer.Tests/ComfyAdminTasks.cs @@ -12,70 +12,6 @@ public class ComfyAdminTasks { private static bool useLocal = true; private ConfigureSecrets ConfigureSecrets = new(); - - public static Dictionary ImportCivitAiModelSettings = new() - { - { - "https://civitai.com/models/194768/jib-mix-realistic-xl?modelVersionId=610292", - new ComfyApiModelSettings - { - Height = 1024, - Width = 1024, - Sampler = ComfySampler.euler_ancestral, - Scheduler = "karras", - CfgScale = 6.0, - Steps = 18 - } - }, - { - "https://civitai.com/models/553410/crazycaricaturesxl?modelVersionId=615871", - new ComfyApiModelSettings - { - Height = 1024, - Width = 1024, - Sampler = ComfySampler.euler_ancestral, - Scheduler = "normal", - CfgScale = 8.0, - Steps = 18 - } - }, - { - "https://civitai.com/models/129403?modelVersionId=259194", - new ComfyApiModelSettings - { - Height = 1024, - Width = 1024, - Sampler = ComfySampler.euler_ancestral, - Scheduler = "normal", - CfgScale = 3.0, - Steps = 12 - } - }, - { - "https://civitai.com/models/157665/lah-hongchen-or-sdxl-and-sd15", - new ComfyApiModelSettings - { - Height = 1024, - Width = 1024, - Sampler = ComfySampler.euler, - Scheduler = "normal", - CfgScale = 1.0, - Steps = 8 - } - }, - { - "https://civitai.com/models/350352?modelVersionId=391971", - new ComfyApiModelSettings - { - Height = 1024, - Width = 1024, - Sampler = ComfySampler.euler, - Scheduler = "normal", - CfgScale = 1.0, - Steps = 8 - } - } - }; private static List MediaProviders = new List { @@ -88,7 +24,7 @@ public class ComfyAdminTasks HeartbeatUrl = "https://api.replicate.com/", ApiBaseUrl = "https://api.replicate.com/", Models = new List { "flux1-dev","flux1-schnell" }, - MediaTypeId = 1 + MediaTypeId = "ConfyUI" }, new() { @@ -105,7 +41,7 @@ public class ComfyAdminTasks "animexlXuebimix_v60LCM.safetensors", "LahHongchenSDXLSD15_xlLightning.safetensors" }, - MediaTypeId = 2 + MediaTypeId = "ComfyUI" } }; diff --git a/AiServer/wwwroot/mjs/components/MediaProviders.mjs b/AiServer/wwwroot/mjs/components/MediaProviders.mjs index 75876f1..733caed 100644 --- a/AiServer/wwwroot/mjs/components/MediaProviders.mjs +++ b/AiServer/wwwroot/mjs/components/MediaProviders.mjs @@ -127,8 +127,11 @@ const SelectModels = { } return; } else { - supportedModels.value = Object.keys(props.providerType?.apiModels, []) - qualifiedModelMappings.value = props.providerType?.apiModels + if (props.providerType?.apiModels) { + console.log(props.providerType?.apiModels) + supportedModels.value = Object.keys(props.providerType?.apiModels, []) + qualifiedModelMappings.value = props.providerType?.apiModels + } } comfyModels.value = [] isConnectionTested.value = false @@ -212,7 +215,7 @@ export default { - {{type.name}} + {{type.id}}