| |
| |
|
|
| import sys |
|
|
| |
| _REDIRECTS = { |
| |
| "ims_client": "src.data.ims_client", |
| "sensor_data_loader": "src.data.sensor_data_loader", |
| "data_schema": "src.data.data_schema", |
| "thingsboard_client": "src.data.thingsboard_client", |
| "data_providers": "src.data.data_providers", |
| |
| "farquhar_model": "src.models.farquhar_model", |
| "canopy_photosynthesis": "src.models.canopy_photosynthesis", |
| "phenology": "src.models.phenology", |
| |
| "predictor": "src.forecasting.predictor", |
| "ts_predictor": "src.forecasting.ts_predictor", |
| "chronos_forecaster": "src.forecasting.chronos_forecaster", |
| "preprocessor": "src.forecasting.preprocessor", |
| "time_features": "src.forecasting.time_features", |
| |
| "solar_geometry": "src.shading.solar_geometry", |
| "tracker_optimizer": "src.shading.tracker_optimizer", |
| "vine_3d_scene": "src.shading.vine_3d_scene", |
| "tradeoff_engine": "src.shading.tradeoff_engine", |
| |
| "day_ahead_advisor": "src.advisor.day_ahead_advisor", |
| "safety_rails": "src.advisor.safety_rails", |
| |
| "vineyard_chatbot": "src.chatbot.vineyard_chatbot", |
| "routing_agent": "src.chatbot.routing_agent", |
| "llm_data_engineer": "src.chatbot.llm_data_engineer", |
| |
| "genai_utils": "src.genai.utils", |
| } |
|
|
|
|
| def __getattr__(name: str): |
| if name in _REDIRECTS: |
| import importlib |
|
|
| mod = importlib.import_module(_REDIRECTS[name]) |
| sys.modules[f"{__name__}.{name}"] = mod |
| return mod |
| raise AttributeError(f"module {__name__!r} has no attribute {name!r}") |
|
|
|
|
| def __dir__(): |
| return sorted(_REDIRECTS.keys()) |
|
|