|
|
"""
|
|
|
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())
|
|
|
|