From b493b94fa25edda8d0281b71562f47a37c8c0269 Mon Sep 17 00:00:00 2001 From: Ngoc-Tan Huynh Date: Sun, 18 Jan 2026 11:26:52 +0100 Subject: [PATCH 1/2] feat: Increase LLM retry attempts and delays for enhanced robustness with complex agents. --- src/services/llm/factory.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/llm/factory.py b/src/services/llm/factory.py index 417419cf..012ff12f 100644 --- a/src/services/llm/factory.py +++ b/src/services/llm/factory.py @@ -52,8 +52,8 @@ logger = get_logger("LLMFactory") # Default retry configuration -DEFAULT_MAX_RETRIES = 3 -DEFAULT_RETRY_DELAY = 1.0 # seconds +DEFAULT_MAX_RETRIES = 5 # Increased for complex agents like Research +DEFAULT_RETRY_DELAY = 2.0 # seconds DEFAULT_EXPONENTIAL_BACKOFF = True @@ -197,8 +197,8 @@ def _is_retriable_llm_api_error(exc: BaseException) -> bool: | tenacity.retry_if_exception_type(LLMTimeoutError) | tenacity.retry_if_exception(_is_retriable_llm_api_error) ), - wait=tenacity.wait_exponential(multiplier=retry_delay, min=retry_delay, max=60), - stop=tenacity.stop_after_attempt(max_retries + 1), + wait=tenacity.wait_exponential(multiplier=retry_delay, min=retry_delay, max=120), + stop=tenacity.stop_after_attempt(max_retries + 2), before_sleep=lambda retry_state: logger.warning( f"LLM call failed (attempt {retry_state.attempt_number}/{max_retries + 1}), " f"retrying in {retry_state.upcoming_sleep:.1f}s... Error: {str(retry_state.outcome.exception())}" From b66ddd0ae29a65471d585d126108f4562b7ee2ce Mon Sep 17 00:00:00 2001 From: Ngoc-Tan Huynh Date: Sun, 18 Jan 2026 11:47:21 +0100 Subject: [PATCH 2/2] feat: Add `api_version` parameter to `MaterialOrganizerAgent` and send explicit error messages via websocket in `ideagen` router. --- src/agents/ideagen/material_organizer_agent.py | 2 ++ src/api/routers/ideagen.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/agents/ideagen/material_organizer_agent.py b/src/agents/ideagen/material_organizer_agent.py index 0fbb0395..b07cee79 100644 --- a/src/agents/ideagen/material_organizer_agent.py +++ b/src/agents/ideagen/material_organizer_agent.py @@ -25,6 +25,7 @@ def __init__( language: str = "en", api_key: str | None = None, base_url: str | None = None, + api_version: str | None = None, model: str | None = None, ): super().__init__( @@ -32,6 +33,7 @@ def __init__( agent_name="material_organizer", api_key=api_key, base_url=base_url, + api_version=api_version, model=model, language=language, ) diff --git a/src/api/routers/ideagen.py b/src/api/routers/ideagen.py index 3efd77fb..812ae681 100644 --- a/src/api/routers/ideagen.py +++ b/src/api/routers/ideagen.py @@ -412,6 +412,9 @@ async def websocket_ideagen(websocket: WebSocket): task_manager.update_task_status(task_id, "error", error=str(e)) try: + # Send explicit error message for consistency and better frontend handling + await websocket.send_json({"type": "error", "content": str(e)}) + await send_status( websocket, IdeaGenStage.ERROR,