From 8b8e1df739b3e3da7040a2779c3262e5a9c36b40 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Tue, 10 Feb 2026 15:35:43 +0400 Subject: [PATCH] fix(backend/chat): Auto-expire stale running tasks to unblock sessions Tasks stuck in "running" status beyond stream_timeout (300s) are now auto-marked as failed when looked up, preventing zombie tasks from blocking the session indefinitely. --- .../api/features/chat/stream_registry.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/autogpt_platform/backend/backend/api/features/chat/stream_registry.py b/autogpt_platform/backend/backend/api/features/chat/stream_registry.py index 789d94225f..986be18b66 100644 --- a/autogpt_platform/backend/backend/api/features/chat/stream_registry.py +++ b/autogpt_platform/backend/backend/api/features/chat/stream_registry.py @@ -814,6 +814,24 @@ async def get_active_task_for_session( if task_user_id and user_id != task_user_id: continue + # Auto-expire stale tasks that exceeded stream_timeout + created_at_str = meta.get("created_at", "") + if created_at_str: + try: + created_at = datetime.fromisoformat(created_at_str) + age_seconds = ( + datetime.now(timezone.utc) - created_at + ).total_seconds() + if age_seconds > config.stream_timeout: + logger.warning( + f"[TASK_LOOKUP] Auto-expiring stale task {task_id[:8]}... " + f"(age={age_seconds:.0f}s > timeout={config.stream_timeout}s)" + ) + await mark_task_completed(task_id, "failed") + continue + except (ValueError, TypeError): + pass + logger.info( f"[TASK_LOOKUP] Found running task {task_id[:8]}... for session {session_id[:8]}..." )