| """
|
| Dependency helpers to make the model work even if some libraries are missing.
|
| This file provides fallback implementations for missing dependencies.
|
| """
|
| import os
|
| import logging
|
| import importlib.util
|
| from typing import Any, Dict, Optional, Type, Callable
|
|
|
| logger = logging.getLogger(__name__)
|
|
|
|
|
| MOCK_MODULES = {}
|
|
|
| def is_module_available(module_name: str) -> bool:
|
| """Check if a module is available without importing it"""
|
| return importlib.util.find_spec(module_name) is not None
|
|
|
| def create_mock_emissions_tracker() -> Type:
|
| """Create a mock implementation of codecarbon's EmissionsTracker"""
|
| class MockEmissionsTracker:
|
| def __init__(self, *args, **kwargs):
|
| logger.info("Using mock EmissionsTracker")
|
|
|
| def __enter__(self):
|
| return self
|
|
|
| def __exit__(self, exc_type, exc_val, exc_tb):
|
| pass
|
|
|
| def start(self):
|
| return self
|
|
|
| def stop(self):
|
| return 0.0
|
|
|
| return MockEmissionsTracker
|
|
|
| def create_mock_pydantic_classes() -> Dict[str, Type]:
|
| """Create mock implementations of pydantic classes"""
|
| class MockBaseModel:
|
| """Mock implementation of pydantic's BaseModel"""
|
| def __init__(self, **kwargs):
|
| for key, value in kwargs.items():
|
| setattr(self, key, value)
|
|
|
| def dict(self) -> Dict[str, Any]:
|
| return {k: v for k, v in self.__dict__.items()
|
| if not k.startswith('_')}
|
|
|
| def json(self) -> str:
|
| import json
|
| return json.dumps(self.dict())
|
|
|
| def mock_field(*args, **kwargs) -> Any:
|
| """Mock implementation of pydantic's Field"""
|
| return kwargs.get('default', None)
|
|
|
| class MockValidationError(Exception):
|
| """Mock implementation of pydantic's ValidationError"""
|
| pass
|
|
|
| mock_config_dict = dict
|
|
|
| return {
|
| "BaseModel": MockBaseModel,
|
| "Field": mock_field,
|
| "ValidationError": MockValidationError,
|
| "ConfigDict": mock_config_dict
|
| }
|
|
|
| def setup_dependency_fallbacks():
|
| """Setup fallbacks for all required dependencies"""
|
|
|
| if not is_module_available("codecarbon"):
|
| logger.warning("codecarbon not found, using mock implementation")
|
| MOCK_MODULES["codecarbon"] = type("MockCodecarbon", (), {
|
| "EmissionsTracker": create_mock_emissions_tracker()
|
| })
|
|
|
|
|
| if not is_module_available("pydantic"):
|
| logger.warning("pydantic not found, using mock implementation")
|
| mock_classes = create_mock_pydantic_classes()
|
| MOCK_MODULES["pydantic"] = type("MockPydantic", (), mock_classes)
|
|
|
|
|
| if not is_module_available("service_registry"):
|
| from types import SimpleNamespace
|
| registry_obj = SimpleNamespace()
|
| registry_obj.register = lambda *args, **kwargs: None
|
| registry_obj.get = lambda *args: None
|
| registry_obj.has = lambda *args: False
|
|
|
| MOCK_MODULES["service_registry"] = type("MockServiceRegistry", (), {
|
| "registry": registry_obj,
|
| "MODEL": "MODEL",
|
| "TOKENIZER": "TOKENIZER"
|
| })
|
|
|
|
|
| class DependencyImportFinder:
|
| def __init__(self):
|
| self._mock_modules = MOCK_MODULES
|
|
|
| def find_module(self, fullname, path=None):
|
| if fullname in self._mock_modules:
|
| return self
|
|
|
| def load_module(self, fullname):
|
| import sys
|
| if fullname in sys.modules:
|
| return sys.modules[fullname]
|
|
|
| module = self._mock_modules[fullname]
|
| sys.modules[fullname] = module
|
| return module
|
|
|
|
|
| setup_dependency_fallbacks()
|
|
|
|
|
| import sys
|
| sys.meta_path.insert(0, DependencyImportFinder())
|
|
|