diff --git a/PROJECT_HANDOFF.md b/PROJECT_HANDOFF.md index 32e4216..ab880c0 100644 --- a/PROJECT_HANDOFF.md +++ b/PROJECT_HANDOFF.md @@ -2,7 +2,7 @@ > 更新时间:2026-06-18 > 当前分支:`main` -> 当前项目版本:`1.26.4` +> 当前项目版本:`1.26.5` > 上一发布基线:`v1.25.0` > 当前状态:代码清理、识别改进和 UI 重构已完成,运行文件已同步到实际 ComfyUI 插件目录 > 发布约束:只有用户明确要求时才提交或上传 GitHub diff --git a/README.md b/README.md index 8dbc186..acb9720 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ComfyUI_FindModels -Current version: `1.26.4` +Current version: `1.26.5` `ComfyUI_FindModels` scans the workflow currently open in ComfyUI, identifies model references that are missing locally, suggests compatible installed models, and finds diff --git a/model_finder.py b/model_finder.py index e233703..a6dac3e 100644 --- a/model_finder.py +++ b/model_finder.py @@ -437,7 +437,7 @@ def match_reference(reference: Reference, installed: dict[str, list[str]]) -> di reference.category, CATEGORY_ALIASES["unknown"] if reference.category == "unknown" else (reference.category,), ) - if reference.official_missing: + if reference.official_missing or reference.official_valid: categories = tuple(dict.fromkeys((*categories, *CATEGORY_ALIASES["unknown"], *installed.keys()))) candidates = [(category, name) for category in categories for name in installed.get(category, [])] wanted_path = normalize_path(reference.name).lower() diff --git a/pyproject.toml b/pyproject.toml index bd70eb5..5767463 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "comfyui-findmodels" -version = "1.26.4" +version = "1.26.5" description = "Find and adapt missing models in the current ComfyUI workflow" readme = "README.md" requires-python = ">=3.10" diff --git a/tests/test_model_finder.py b/tests/test_model_finder.py index e7dae64..fa9c905 100644 --- a/tests/test_model_finder.py +++ b/tests/test_model_finder.py @@ -456,6 +456,30 @@ class ModelFinderTests(unittest.TestCase): self.assertEqual(result["models"][0]["status"], "adaptable") self.assertEqual(result["models"][0]["match"]["category"], "unet") + def test_confirmed_unet_selection_keeps_legacy_local_candidate(self): + model_name = "ltx-2.3-22b-distilled-1.1_transformer_only_fp8_scaled.safetensors" + payload = { + "nodes": [{ + "id": 400, + "type": "UNet加载器", + "widgets": [{ + "name": "unet_name", + "value": model_name, + "model_selector": True, + "model_value_valid": True, + }], + }] + } + + result = analyze( + payload, + lambda category: [model_name] if category == "unet" else [], + ) + + self.assertEqual(result["summary"]["unresolved"], 1) + self.assertEqual(result["models"][0]["status"], "adaptable") + self.assertEqual(result["models"][0]["match"]["category"], "unet") + def test_text_encoders_do_not_resolve_from_legacy_clip_folder(self): model_name = "qwen_3_06b_base.safetensors" payload = { @@ -486,6 +510,32 @@ class ModelFinderTests(unittest.TestCase): self.assertEqual(result["models"][0]["status"], "adaptable") self.assertEqual(result["models"][0]["match"]["category"], "clip") + def test_confirmed_text_encoder_selection_keeps_legacy_clip_candidate(self): + model_name = "qwen_3_06b_base.safetensors" + payload = { + "nodes": [{ + "id": 2, + "type": "CLIPLoader", + "widgets": [{ + "name": "clip_name", + "value": model_name, + "model_selector": True, + "model_value_valid": True, + "directory": "text_encoders", + }], + }], + } + + result = analyze( + payload, + lambda category: [model_name] if category == "clip" else [], + ) + + self.assertEqual(result["summary"]["unresolved"], 1) + self.assertEqual(result["models"][0]["category"], "text_encoders") + self.assertEqual(result["models"][0]["status"], "adaptable") + self.assertEqual(result["models"][0]["match"]["category"], "clip") + def test_scans_official_embedded_node_model_metadata(self): payload = { "nodes": [{