fix: florence2_hires — relative-then-absolute import fallback for in-function imports

Runtime error reproduced by user: 'No module named ltx_video_generation'.

The project's pattern is relative imports (.ltx_video_generation), which work
when ComfyUI loads the file inside the package context. My in-function lazy
imports used the absolute form (works in tests where conftest puts the node
root on sys.path, fails at runtime where it isn't).

Fix: each of the 5 in-function imports now tries relative first, falls back
to absolute on ImportError. Tests still pass (96/96) via the absolute branch;
runtime now succeeds via the relative branch.
This commit is contained in:
Jason Hoku
2026-05-18 08:21:54 -07:00
parent 6e399091fa
commit b492267ec2
+20 -5
View File
@@ -297,7 +297,10 @@ def load_florence2_model(model_name):
if model_name in _FLORENCE2_MODEL_CACHE:
return _FLORENCE2_MODEL_CACHE[model_name]
from ltx_video_generation import _call_node, _unwrap
try:
from .ltx_video_generation import _call_node, _unwrap
except ImportError:
from ltx_video_generation import _call_node, _unwrap
classes = get_florence2_node_classes()
loader_cls = classes["DownloadAndLoadFlorence2Model"]
@@ -327,7 +330,10 @@ def _resolve_loaders():
monkeypatch _FH_CKPT_LOADER / _FH_LORA_LOADER directly."""
global _FH_CKPT_LOADER, _FH_LORA_LOADER
if _FH_CKPT_LOADER is None or _FH_LORA_LOADER is None:
from model_loader import load_checkpoint, load_loras
try:
from .model_loader import load_checkpoint, load_loras
except ImportError:
from model_loader import load_checkpoint, load_loras
_FH_CKPT_LOADER = _FH_CKPT_LOADER or load_checkpoint
_FH_LORA_LOADER = _FH_LORA_LOADER or load_loras
return _FH_CKPT_LOADER, _FH_LORA_LOADER
@@ -442,7 +448,10 @@ def run_florence2_step(
florence2_model = load_florence2_model(manifest_extras["florence2_model"])
# 2. Detect — call Florence2Run via _call_node
from ltx_video_generation import _call_node, _unwrap
try:
from .ltx_video_generation import _call_node, _unwrap
except ImportError:
from ltx_video_generation import _call_node, _unwrap
classes = get_florence2_node_classes()
f2r_cls = classes["Florence2Run"]
@@ -542,7 +551,10 @@ def run_florence2_step(
)
# 9. Conditioning (reuse the upscale_runner's cache structure)
from batch_encoding import encode_prompt_with_combinators
try:
from .batch_encoding import encode_prompt_with_combinators
except ImportError:
from batch_encoding import encode_prompt_with_combinators
if positive_prompt not in conditioning_cache["positive"]:
conditioning_cache["positive"][positive_prompt] = encode_prompt_with_combinators(
clip_handle, positive_prompt, clip_skip
@@ -555,7 +567,10 @@ def run_florence2_step(
neg_cond = conditioning_cache["negative"][negative_prompt]
# 10. VAE encode -> generate_image (project's known-working sampling path)
from image_generation import generate_image, decode_latent_with_vae
try:
from .image_generation import generate_image, decode_latent_with_vae
except ImportError:
from image_generation import generate_image, decode_latent_with_vae
encoded_latent = vae_handle.encode(resized_img[:, :, :, :3])
noise_seed = int(item.get("seed", 0)) + 1 # tiny offset so face pass != base seed exactly