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, 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())}"