Skip to content

Commit 9893ac1

Browse files
mrveissclaude
andcommitted
fix(media): defer VisionProcessor import to break circular dependency (#3551)
media/image/pipeline.py had a module-level try/except import of VisionProcessor from multimodal_processor.processors.vision, which re-entered the multimodal_processor package while it was still being initialized by multimodal_processor_impl.py. Move the import into _get_vision_processor() with a _vision_processor_checked flag so it fires once on first actual use, not at module load time. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fd3c40a commit 9893ac1

1 file changed

Lines changed: 19 additions & 21 deletions

File tree

autobot-backend/media/image/pipeline.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,34 +25,32 @@
2525
except ImportError:
2626
_PIL_AVAILABLE = False
2727

28-
# Optional: existing VisionProcessor for AI-powered analysis
29-
try:
30-
from multimodal_processor.processors.vision import (
31-
VISION_MODELS_AVAILABLE,
32-
VisionProcessor,
33-
)
34-
35-
_VISION_PROCESSOR_AVAILABLE = VISION_MODELS_AVAILABLE
36-
except ImportError:
37-
_VISION_PROCESSOR_AVAILABLE = False
38-
VisionProcessor = None # type: ignore
39-
4028
logger = logging.getLogger(__name__)
4129

42-
# Lazy singleton for VisionProcessor (loads GPU models on first use)
30+
# Lazy singleton for VisionProcessor (loads GPU models on first use).
31+
# Import is deferred into _get_vision_processor() to break the circular
32+
# import chain: multimodal_processor_impl → media.manager → media.image.pipeline
33+
# → multimodal_processor.processors.vision → multimodal_processor_impl
4334
_vision_processor: Optional[Any] = None
35+
_vision_processor_checked: bool = False
4436

4537

4638
def _get_vision_processor() -> Optional[Any]:
47-
"""Lazy-load VisionProcessor; returns None if unavailable."""
48-
global _vision_processor
49-
if not _VISION_PROCESSOR_AVAILABLE:
50-
return None
51-
if _vision_processor is None and VisionProcessor is not None:
52-
try:
39+
"""Lazy-load VisionProcessor on first call; returns None if unavailable."""
40+
global _vision_processor, _vision_processor_checked
41+
if _vision_processor_checked:
42+
return _vision_processor
43+
_vision_processor_checked = True
44+
try:
45+
from multimodal_processor.processors.vision import (
46+
VISION_MODELS_AVAILABLE,
47+
VisionProcessor,
48+
)
49+
50+
if VISION_MODELS_AVAILABLE:
5351
_vision_processor = VisionProcessor()
54-
except Exception as exc:
55-
logger.warning("Failed to initialize VisionProcessor: %s", exc)
52+
except Exception as exc:
53+
logger.warning("VisionProcessor unavailable: %s", exc)
5654
return _vision_processor
5755

5856

0 commit comments

Comments
 (0)