From cb032c7c3da9f1c50d88b7be8161189b6a5fa4f4 Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Wed, 29 Jul 2026 15:53:26 +0200 Subject: [PATCH] feat: track missing models for LoRA loader workflow signatures --- tests/test_downloads_tab_workflow_route.mjs | 20 ++++++++++++++++---- web/resolver/model_resolver.js | 3 ++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/tests/test_downloads_tab_workflow_route.mjs b/tests/test_downloads_tab_workflow_route.mjs index f64fc42..d63d6f2 100644 --- a/tests/test_downloads_tab_workflow_route.mjs +++ b/tests/test_downloads_tab_workflow_route.mjs @@ -2845,23 +2845,28 @@ test('Missing Models signature tracks LoRA Manager list membership changes', () test('workflow hash refresh ignores node movement and tracks model dependency changes', () => { const getWorkflowSignature = eval(`(${extractMethod(workflowStateMethodsSource, 'getWorkflowSignature')})`); + const getMissingWorkflowSignature = eval(`(${extractMethod(workflowStateMethodsSource, 'getMissingWorkflowSignature')})`); const getWorkflowSignatureData = eval(`(${extractMethod(workflowStateMethodsSource, 'getWorkflowSignatureData')})`); const getWorkflowHashMetadataSignature = eval(`(${extractMethod(modelResolverSource, 'getWorkflowHashMetadataSignature')})`); const scheduleWorkflowHashMetadataRefresh = eval(`(${extractMethod(modelResolverSource, 'scheduleWorkflowHashMetadataRefresh')})`); const dialog = { capabilities: { node_rules: {} }, getWorkflowSignature, + getMissingWorkflowSignature, getWorkflowSignatureData, }; - const makeWorkflow = (modelName, position = [0, 0]) => ({ + const makeWorkflow = (modelName, position = [0, 0], strength = 0.75) => ({ nodes: [{ id: 12, - type: 'CheckpointLoaderSimple', + type: 'LoraLoader', pos: position, size: [320, 120], - inputs: [{ name: 'ckpt_name', widget: { name: 'ckpt_name' } }], + inputs: [ + { name: 'lora_name', widget: { name: 'lora_name' } }, + { name: 'strength_model', widget: { name: 'strength_model' } }, + ], outputs: [{ name: 'MODEL', type: 'MODEL', links: [] }], - widgets_values: [modelName], + widgets_values: [modelName, strength], }], links: [], definitions: { @@ -2909,6 +2914,13 @@ test('workflow hash refresh ignores node movement and tracks model dependency ch assert.equal(resolver.armCalls, 0); assert.equal(resolver.workflowHashMetadataRefreshPending, false); + scheduleWorkflowHashMetadataRefresh.call( + resolver, + makeWorkflow('model-a.safetensors', [800, 450], 1.25) + ); + assert.equal(resolver.armCalls, 0); + assert.equal(resolver.workflowHashMetadataRefreshPending, false); + scheduleWorkflowHashMetadataRefresh.call( resolver, makeWorkflow('model-b.safetensors', [800, 450]) diff --git a/web/resolver/model_resolver.js b/web/resolver/model_resolver.js index 9ddcda6..66f5e11 100644 --- a/web/resolver/model_resolver.js +++ b/web/resolver/model_resolver.js @@ -1262,7 +1262,8 @@ export class ModelResolver { getWorkflowHashMetadataSignature(workflow) { if (!workflow || typeof workflow !== 'object') return ''; - const dependencySignature = this.dialog?.getWorkflowSignature?.(workflow); + const dependencySignature = this.dialog?.getMissingWorkflowSignature?.(workflow) + || this.dialog?.getWorkflowSignature?.(workflow); if (dependencySignature) return dependencySignature; const normalizeNode = (node = {}) => ({