From b3ab00444798ca6db36981f5cba8ea4643c5ba51 Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:09:30 +0000 Subject: [PATCH] fix: add timeout for chat requests and improve error handling Changes: 1. Add 30-second timeout for chat API requests using AbortController 2. User's message now shows immediately before API response (already done in previous PR) 3. Differentiate between timeout errors and other errors in error messages 4. API client now accepts optional signal parameter for abort support --- src/frontend/src/lib/api/client.ts | 5 +++-- src/frontend/src/routes/bot/[id]/+page.svelte | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/lib/api/client.ts b/src/frontend/src/lib/api/client.ts index cf5a0c3..cbc9787 100644 --- a/src/frontend/src/lib/api/client.ts +++ b/src/frontend/src/lib/api/client.ts @@ -104,11 +104,12 @@ export const api = { } }, - async chat(id: string, message: string): Promise { + async chat(id: string, message: string, signal?: AbortSignal): Promise { const response = await fetch(`${API_URL}/bots/${id}/chat`, { method: 'POST', headers: getAuthHeaders(), - body: JSON.stringify({ message } as BotChatRequest) + body: JSON.stringify({ message } as BotChatRequest), + signal }); return handleResponse(response); }, diff --git a/src/frontend/src/routes/bot/[id]/+page.svelte b/src/frontend/src/routes/bot/[id]/+page.svelte index 5ad30c6..0193e04 100644 --- a/src/frontend/src/routes/bot/[id]/+page.svelte +++ b/src/frontend/src/routes/bot/[id]/+page.svelte @@ -44,11 +44,17 @@ isSending = true; - // Add user's message immediately + // Add user's message immediately so it shows even before API response addMessage({ role: 'user', content: message }); try { - const response = await api.bots.chat(botId, message); + // Add timeout to prevent hanging requests + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 30000); + + const response = await api.bots.chat(botId, message, controller.signal); + clearTimeout(timeoutId); + addMessage({ role: 'assistant', content: response.response }); if (response.strategy_config) { @@ -56,7 +62,11 @@ setCurrentBot(bot); } } catch (e) { - addMessage({ role: 'assistant', content: 'Sorry, I encountered an error. Please try again.' }); + if (e instanceof Error && e.name === 'AbortError') { + addMessage({ role: 'assistant', content: 'Request timed out. Please try again.' }); + } else { + addMessage({ role: 'assistant', content: 'Sorry, I encountered an error. Please try again.' }); + } } finally { isSending = false; } -- 2.49.1