From 42e447e41656e7295d9862c89c22893960b97f5c Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 3 Nov 2025 18:50:36 +0000 Subject: [PATCH] preparing pre-flight requests --- backend/app/plan/router.py | 12 ++++++++++++ backend/ml_models/api.py | 11 ++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index b897dbda..8c502021 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -43,6 +43,18 @@ async def trigger_plan_entrypoint(body: PlanTriggerRequest): logger.error("Failed to parse request body: %s", e) return {"message": "Invalid request"}, 400 + # TODO: Warm up the lambdas here + # from backend.ml_models.api import ModelApi + # model_api = ModelApi( + # portfolio_id=body.portfolio_id, + # timestamp="2020-01-01T00:00:00", + # prediction_buckets=[], + # max_retries=1 + # ) + # await model_api.async_warm_up_lambdas( + # model_prefies=model_api.KWH_MODEL_PREFIXES + model_api.MODEL_PREFIXES + # ) + # If file_format is domna_asset_list and type is xlsx, read and chunk it if data.get("file_format") == "domna_asset_list" and data.get("file_type") == "xlsx": try: diff --git a/backend/ml_models/api.py b/backend/ml_models/api.py index 8d1dbeea..84ba021f 100644 --- a/backend/ml_models/api.py +++ b/backend/ml_models/api.py @@ -257,8 +257,10 @@ class ModelApi: model_prefixes = self.MODEL_PREFIXES if model_prefies is None else model_prefies session = self.get_aiohttp_session() tasks = [ - self._send_warm_up_request(session, f"{self.base_url}/{self.MODEL_URLS[model_prefix]}/predict", - model_prefix) + self._send_warm_up_request( + session, f"{self.base_url}/{self.MODEL_URLS[model_prefix]}/predict", + model_prefix + ) for model_prefix in model_prefixes ] await asyncio.gather(*tasks, return_exceptions=True) @@ -271,7 +273,10 @@ class ModelApi: "file_location": "s3://warm-up-placeholder", "portfolio_id": 0, "property_id": "", - "created_at": "2020-01-01T00:00:00" + "created_at": "2020-01-01T00:00:00", + "warm": True + # The presence of this key will send the api down a specific warm up route, to call + # prediction and load the font manager, because that is a key bottleneck for cold starts } async with session.post(url, json=json_payload, timeout=10) as response: text = await response.text()