From 5d53b1a6d09f384c291e43070804173d9ef672e0 Mon Sep 17 00:00:00 2001 From: "aidan08.dacaitou" Date: Wed, 3 Jun 2026 17:49:49 +0800 Subject: [PATCH] Fix stale LLM node running state --- static/js/smart-canvas.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/static/js/smart-canvas.js b/static/js/smart-canvas.js index 20a1e65a5..84a033d41 100644 --- a/static/js/smart-canvas.js +++ b/static/js/smart-canvas.js @@ -370,10 +370,19 @@ function mediaItemForStorage(item){ delete clean.tempCloudUrl; return clean; } +function clearPersistedRunState(target){ + if(!target || typeof target !== 'object') return target; + if(Object.prototype.hasOwnProperty.call(target, 'running')) target.running = false; + ['outputs', 'outputSlots'].forEach(key => { + if(Array.isArray(target[key])) target[key].forEach(clearPersistedRunState); + }); + return target; +} function canvasForStorage(){ const clean = JSON.parse(JSON.stringify(canvas || {})); clean.settings = settingsForStorage(canvasDefaultSmartSettings || initialSmartSettings); (clean.nodes || []).forEach(node => { + clearPersistedRunState(node); if(Array.isArray(node.images)) node.images = node.images.map(mediaItemForStorage); if(node.runSettings) node.runSettings = settingsForStorage(node.runSettings); }); @@ -1116,9 +1125,12 @@ function resolveChatProviderId(providerId=''){ if(providers.some(p => p.id === providerId)) return providerId; return providers[0]?.id || 'comfly'; } +function isConcreteChatModel(model){ + return Boolean(model) && !String(model).includes('*'); +} function providerChatModels(providerId){ const provider = chatApiProviders().find(p => p.id === providerId); - return [...new Set(provider?.chat_models || [])]; + return [...new Set(provider?.chat_models || [])].filter(isConcreteChatModel); } function resolveChatModel(model='', providerId=''){ const models = providerChatModels(resolveChatProviderId(providerId)); @@ -3840,7 +3852,10 @@ async function loadCanvas(){ canvas = data.canvas; document.title = canvas.title || tr('canvas.smartCanvas'); document.getElementById('smartTitle').textContent = canvas.title || tr('canvas.smartCanvas'); - nodes = (Array.isArray(canvas.nodes) ? canvas.nodes : []).map(normalizeLegacySmartNode).filter(Boolean); + nodes = (Array.isArray(canvas.nodes) ? canvas.nodes : []) + .map(normalizeLegacySmartNode) + .filter(Boolean) + .map(clearPersistedRunState); nodes.forEach(n => { const pendingTasks = smartPendingTasks(n); if(pendingTasks.length){ @@ -9570,6 +9585,7 @@ function coolNodeRunningState(node, ms=2000){ if(current){ current.running = false; render(); + scheduleSave(); } }, ms); return token; @@ -10621,6 +10637,7 @@ async function runPromptLLMNode(nodeId){ } finally { node.running = false; render(); + scheduleSave(); } } function comfyFieldKind(field){