diff --git a/py/metadata_collector/metadata_registry.py b/py/metadata_collector/metadata_registry.py index 6e33e806..528f996a 100644 --- a/py/metadata_collector/metadata_registry.py +++ b/py/metadata_collector/metadata_registry.py @@ -196,9 +196,11 @@ class MetadataRegistry: node_metadata[category] = {} node_metadata[category][node_id] = current_metadata[category][node_id] - # Save to cache if we have any metadata for this node + # Save new metadata or clear stale cache entries when metadata is empty if any(node_metadata.values()): self.node_cache[cache_key] = node_metadata + else: + self.node_cache.pop(cache_key, None) def clear_unused_cache(self): """Clean up node_cache entries that are no longer in use""" diff --git a/tests/metadata_collector/test_metadata_collector.py b/tests/metadata_collector/test_metadata_collector.py index 3663f2a9..d53b1a40 100644 --- a/tests/metadata_collector/test_metadata_collector.py +++ b/tests/metadata_collector/test_metadata_collector.py @@ -124,3 +124,40 @@ def test_metadata_registry_caches_and_rehydrates(populated_registry): registry.clear_metadata("promptA") assert "promptA" not in registry.prompt_metadata + + +def test_lora_manager_cache_updates_when_loras_removed(metadata_registry): + import nodes + + class LoraManagerLoader: # type: ignore[too-many-ancestors] + __name__ = "LoraManagerLoader" + + nodes.NODE_CLASS_MAPPINGS["LoraManagerLoader"] = LoraManagerLoader + + prompt_graph = { + "lora_node": {"class_type": "LoraManagerLoader", "inputs": {}}, + } + prompt = SimpleNamespace(original_prompt=prompt_graph) + cache_key = "lora_node:LoraManagerLoader" + + metadata_registry.start_collection("prompt1") + metadata_registry.set_current_prompt(prompt) + metadata_registry.record_node_execution( + "lora_node", + "LoraManagerLoader", + {"loras": [[{"name": "foo", "strength": 0.8, "active": True}]]}, + None, + ) + assert cache_key in metadata_registry.node_cache + + metadata_registry.start_collection("prompt2") + metadata_registry.set_current_prompt(prompt) + metadata_registry.record_node_execution("lora_node", "LoraManagerLoader", {"loras": [[]]}, None) + + assert cache_key not in metadata_registry.node_cache + + metadata_registry.start_collection("prompt3") + metadata_registry.set_current_prompt(prompt) + metadata = metadata_registry.get_metadata("prompt3") + + assert "lora_node" not in metadata[LORAS]