# SolarWine src package — re-exports for backward compatibility # Modules live in subpackages: data, models, forecasting, shading, advisor, chatbot, genai import sys # Map old flat names to new subpackage locations _REDIRECTS = { # data "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", # models "farquhar_model": "src.models.farquhar_model", "canopy_photosynthesis": "src.models.canopy_photosynthesis", "phenology": "src.models.phenology", # forecasting "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", # shading "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", # advisor "day_ahead_advisor": "src.advisor.day_ahead_advisor", "safety_rails": "src.advisor.safety_rails", # chatbot "vineyard_chatbot": "src.chatbot.vineyard_chatbot", "routing_agent": "src.chatbot.routing_agent", "llm_data_engineer": "src.chatbot.llm_data_engineer", # genai "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())