diff --git a/src/backend/app_kernel.py b/src/backend/app_kernel.py index 5275f7ad..7b76c22d 100644 --- a/src/backend/app_kernel.py +++ b/src/backend/app_kernel.py @@ -185,7 +185,7 @@ async def input_task_endpoint(input_task: InputTask, request: Request): "error": str(e), }, ) - raise HTTPException(status_code=400, detail="Error creating plan") + raise HTTPException(status_code=400, detail=f"Error creating plan: {e}") @app.post("/api/human_feedback") diff --git a/src/backend/kernel_agents/planner_agent.py b/src/backend/kernel_agents/planner_agent.py index a8063fe7..2bc5ad5b 100644 --- a/src/backend/kernel_agents/planner_agent.py +++ b/src/backend/kernel_agents/planner_agent.py @@ -434,7 +434,12 @@ async def _create_structured_plan( return plan, steps except Exception as e: - logging.exception(f"Error creating structured plan: {e}") + error_message = str(e) + if "Rate limit is exceeded" in error_message: + logging.warning("Rate limit hit. Consider retrying after some delay.") + raise + else: + logging.exception(f"Error creating structured plan: {e}") # Create a fallback dummy plan when parsing fails logging.info("Creating fallback dummy plan due to parsing error") diff --git a/src/frontend/wwwroot/home/home.js b/src/frontend/wwwroot/home/home.js index 00cd0475..dd182879 100644 --- a/src/frontend/wwwroot/home/home.js +++ b/src/frontend/wwwroot/home/home.js @@ -103,6 +103,16 @@ }) .then((response) => response.json()) .then((data) => { + // Check if 'detail' field contains rate limit error + if (data.detail && data.detail.includes("Rate limit is exceeded")) { + notyf.error("Application temporarily unavailable due to quota limits. Please try again later."); + newTaskPrompt.disabled = false; + startTaskButton.disabled = false; + startTaskButton.classList.remove("is-loading"); + hideOverlay(); + return; + } + if (data.status == "Plan not created" || data.plan_id == "") { notyf.error("Unable to create plan for this task."); newTaskPrompt.disabled = false;