@@ -19,7 +19,8 @@ public class ComfyServices(ILogger<ComfyServices> log,
19
19
ComfyGateway comfyGateway ,
20
20
IBackgroundJobs jobs ,
21
21
IDbConnectionFactory dbFactory ,
22
- AgentEventsManager agentManager )
22
+ AgentEventsManager agentManager ,
23
+ IComfyWorkflowConverter comfyConverter )
23
24
: Service
24
25
{
25
26
public const string ComfyBaseUrl = "http://localhost:7860/api" ;
@@ -313,7 +314,7 @@ public async Task<WorkflowInfo> GetWorkflowInfoAsync(string path)
313
314
// return apiPrompt;
314
315
// }
315
316
316
- public object Post ( RequeueGeneration request )
317
+ public async Task < object > Post ( RequeueGeneration request )
317
318
{
318
319
var userId = Request . GetClaimsPrincipal ( ) . GetUserId ( ) ;
319
320
log . LogInformation ( "Received RequeueGeneration from '{UserId}' to execute Generation '{Id}'" ,
@@ -339,21 +340,13 @@ public object Post(RequeueGeneration request)
339
340
}
340
341
341
342
var workflowVersion = GetWorkflowVersion ( Db , gen . WorkflowId , gen . VersionId ) ;
342
- var workflow = workflowVersion . Workflow ;
343
- var workflowInfo = workflowVersion . Info ;
344
- var result = ComfyWorkflowParser . MergeWorkflow ( workflow , gen . Args ! , workflowInfo ) ;
345
- gen . Workflow = result . Result ;
346
-
347
- var requiredNodes = ComfyWorkflowParser . ExtractNodeTypes ( workflow , log ) ;
348
- var requiredAssets = ComfyWorkflowParser . ExtractAssetPaths ( workflow , log ) ;
349
- var nodeDefs = appData . GetSupportedNodeDefinitions ( requiredNodes , requiredAssets ) ;
350
- gen . ApiPrompt = ComfyConverters . ConvertWorkflowToApiPrompt ( workflow , nodeDefs , gen . Id , log : log ) ;
343
+ var ( apiPrompt , newWorkflow ) = await comfyConverter . CreateApiPromptAsync ( workflowVersion , gen . Args , gen . Id ) ;
351
344
352
345
Db . UpdateOnly ( ( ) => new WorkflowGeneration
353
346
{
354
347
Args = gen . Args ,
355
- Workflow = gen . Workflow ,
356
- ApiPrompt = gen . ApiPrompt ,
348
+ Workflow = newWorkflow ,
349
+ ApiPrompt = apiPrompt ,
357
350
DeviceId = null ,
358
351
PromptId = null ,
359
352
Error = null ,
@@ -403,32 +396,23 @@ private static WorkflowVersion GetWorkflowVersion(IDbConnection db, int workflow
403
396
return workflowVersion ;
404
397
}
405
398
406
- public object Post ( QueueWorkflow request )
399
+ public async Task < object > Post ( QueueWorkflow request )
407
400
{
408
401
using var db = Db ;
409
402
var userId = Request . GetClaimsPrincipal ( ) . GetUserId ( ) ;
410
403
log . LogInformation ( "Received QueueComfyWorkflow from '{UserId}' to execute workflow '{Workflow}'" ,
411
404
userId , request . WorkflowId ) ;
412
405
413
- var workflowVersion = GetWorkflowVersion ( db , request . WorkflowId , request . VersionId ) ;
414
- var workflow = workflowVersion . Workflow ;
415
- var workflowInfo = workflowVersion . Info ;
416
- if ( request . Args ? . Count > 0 )
417
- {
418
- var result = ComfyWorkflowParser . MergeWorkflow ( workflow , request . Args ! , workflowInfo ) ;
419
- workflow = result . Result ;
420
- }
421
-
422
- var requiredNodes = ComfyWorkflowParser . ExtractNodeTypes ( workflow , log ) ;
423
- var requiredAssets = ComfyWorkflowParser . ExtractAssetPaths ( workflow , log ) ;
424
- var nodeDefs = appData . GetSupportedNodeDefinitions ( requiredNodes , requiredAssets ) ;
425
-
426
406
var clientId = Guid . NewGuid ( ) . ToString ( "N" ) ;
427
- var apiPrompt = ComfyConverters . ConvertWorkflowToApiPrompt ( workflow , nodeDefs , clientId , log : log ) ;
407
+ var workflowVersion = GetWorkflowVersion ( db , request . WorkflowId , request . VersionId ) ;
408
+ var ( apiPrompt , workflow ) = await comfyConverter . CreateApiPromptAsync ( workflowVersion , request . Args ! , clientId ) ;
428
409
429
410
log . LogInformation ( "Queueing ComfyUI Workflow for {ClientId}: {ApiPromptJson}" ,
430
411
apiPrompt . ClientId , ClientConfig . ToSystemJson ( apiPrompt . Prompt ) ) ;
431
412
413
+ var requiredNodes = ComfyWorkflowParser . ExtractNodeTypes ( workflowVersion . Workflow , log ) ;
414
+ var requiredAssets = ComfyWorkflowParser . ExtractAssetPaths ( workflowVersion . Workflow , log ) ;
415
+
432
416
var checkpoint = requiredAssets . FirstOrDefault ( x =>
433
417
x . StartsWith ( "checkpoints/" ) || x . StartsWith ( "diffusion_models/" ) || x . StartsWith ( "unet/" ) ||
434
418
x . StartsWith ( "Stable-diffusion/" , StringComparison . OrdinalIgnoreCase ) ) ;
@@ -870,10 +854,10 @@ public async Task<object> Post(UpdateWorkflowVersion request)
870
854
var workflowJson = await Request . Files [ 0 ] . InputStream . ReadToEndAsync ( ) ;
871
855
var workflow = db . SingleById < Workflow > ( workflowVersion . ParentId ) ;
872
856
873
- var parsedWorkflow = appData . TryParseWorkflow ( workflowJson , workflowVersion . Name , workflow . Base )
857
+ var parsedWorkflow = appData . TryParseWorkflow ( workflowJson , workflowVersion . Name , workflow . Base , workflowVersion . Version )
874
858
?? throw HttpError . BadRequest ( "Failed to parse workflow" ) ;
875
859
876
- var saveToPath = appData . WorkflowsPath . CombineWith ( workflow . Path ) ;
860
+ var saveToPath = appData . WorkflowsPath . CombineWith ( workflowVersion . Path ) ;
877
861
Path . GetDirectoryName ( saveToPath ) . AssertDir ( ) ;
878
862
await File . WriteAllTextAsync ( saveToPath , workflowJson ) ;
879
863
@@ -914,25 +898,28 @@ public async Task<object> Post(ParseWorkflowVersions request)
914
898
foreach ( var version in allVersions )
915
899
{
916
900
var workflow = allWorkflows . Find ( x => x . Id == version . ParentId ) ;
917
- if ( workflow ? . Path == null )
901
+ if ( workflow == null )
918
902
{
919
903
ret . Results . Add ( $ "Workflow not found for version { version . Id } ") ;
920
904
continue ;
921
905
}
922
906
923
907
try
924
908
{
925
- var workflowJson = await File . ReadAllTextAsync ( appData . WorkflowsPath . CombineWith ( workflow . Path ) ) ;
909
+ var workflowJson = await File . ReadAllTextAsync ( appData . WorkflowsPath . CombineWith ( version . Path ) ) ;
926
910
927
- var parsedWorkflow = appData . ParseWorkflow ( workflowJson , version . Name , workflow . Base ) ;
911
+ var parsedWorkflow = appData . ParseWorkflow ( workflowJson , version . Name , workflow . Base , version . Version ) ;
928
912
929
- // if (parsedWorkflow.Nodes.SequenceEqual(version.Nodes) &&
930
- // parsedWorkflow.Assets.SequenceEqual(version.Assets))
931
- // continue;
913
+ var clientId = version . Workflow . TryGetValue ( "Id" , out var oId ) && oId is string id
914
+ ? id
915
+ : Guid . NewGuid ( ) . ToString ( "N" ) ;
916
+ var ( apiPrompt , _) = await comfyConverter . CreateApiPromptAsync ( version , new ( ) , clientId ) ;
917
+ version . ApiPrompt = apiPrompt . Prompt ;
932
918
933
919
await db . UpdateOnlyAsync ( ( ) => new WorkflowVersion {
934
920
Workflow = parsedWorkflow . Workflow ,
935
921
Info = parsedWorkflow . Info ,
922
+ ApiPrompt = version . ApiPrompt ,
936
923
Nodes = parsedWorkflow . Nodes ,
937
924
Assets = parsedWorkflow . Assets ,
938
925
ModifiedBy = userId ,
@@ -943,7 +930,7 @@ public async Task<object> Post(ParseWorkflowVersions request)
943
930
}
944
931
catch ( Exception e )
945
932
{
946
- ret . Results . Add ( $ "Failed to parse { workflow . Path } ") ;
933
+ ret . Results . Add ( $ "Failed to parse { version . Path } ") ;
947
934
}
948
935
}
949
936
@@ -967,7 +954,7 @@ public async Task<object> Post(ParseWorkflow request)
967
954
968
955
workflowName = StringFormatters . FormatName ( workflowName ) ;
969
956
var workflow = workflowJson . ParseAsObjectDictionary ( ) ;
970
- var parsedWorkflow = appData . TryParseWorkflow ( workflowJson , workflowName , "SDXL" )
957
+ var parsedWorkflow = appData . TryParseWorkflow ( workflowJson , workflowName , "SDXL" , "v1" )
971
958
?? throw HttpError . BadRequest ( "Failed to parse workflow" ) ;
972
959
return parsedWorkflow ;
973
960
}
@@ -982,19 +969,25 @@ public async Task<object> Post(UploadNewWorkflow request)
982
969
throw HttpError . BadRequest ( "No file uploaded" ) ;
983
970
984
971
var name = request . WorkflowName ?? Request . Files [ 0 ] . FileName . LastRightPart ( '/' ) . LastLeftPart ( '.' ) ;
985
- var fileName = name + ".json" ;
986
972
// Check for invalid filename chars
987
- if ( fileName . IndexOfAny ( Path . GetInvalidFileNameChars ( ) ) >= 0 ||
988
- fileName . IndexOfAny ( Path . GetInvalidPathChars ( ) ) >= 0 )
973
+ if ( name . IndexOfAny ( Path . GetInvalidFileNameChars ( ) ) >= 0 ||
974
+ name . IndexOfAny ( Path . GetInvalidPathChars ( ) ) >= 0 )
989
975
throw HttpError . BadRequest ( "Invalid Name" ) ;
990
976
977
+ var version = "v1" ;
978
+ if ( name . IndexOf ( '.' ) >= 0 )
979
+ {
980
+ version = name . LastRightPart ( '.' ) ;
981
+ name = name . LastLeftPart ( '.' ) ;
982
+ }
983
+
991
984
if ( db . Exists < Workflow > ( x => x . Name == name ) )
992
985
throw new ArgumentNullException ( nameof ( request . WorkflowName ) , $ "Workflow '{ name } ' already exists") ;
993
986
994
987
var workflowJson = await Request . Files [ 0 ] . InputStream . ReadToEndAsync ( ) ;
995
988
996
989
var baseModel = request . BaseModel . ToJsv ( ) ; // Use EnumMember Value if exists
997
- var parsedWorkflow = appData . ParseWorkflow ( workflowJson , name , baseModel ) ;
990
+ var parsedWorkflow = appData . ParseWorkflow ( workflowJson , name , baseModel , version ) ;
998
991
var saveToFullPath = appData . WorkflowsPath . CombineWith ( parsedWorkflow . Path ) ;
999
992
Path . GetDirectoryName ( saveToFullPath ) . AssertDir ( ) ;
1000
993
await File . WriteAllTextAsync ( saveToFullPath , workflowJson ) ;
0 commit comments