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
This commit is contained in:
@@ -104,11 +104,12 @@ export const api = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
async chat(id: string, message: string): Promise<BotChatResponse> {
|
async chat(id: string, message: string, signal?: AbortSignal): Promise<BotChatResponse> {
|
||||||
const response = await fetch(`${API_URL}/bots/${id}/chat`, {
|
const response = await fetch(`${API_URL}/bots/${id}/chat`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: getAuthHeaders(),
|
headers: getAuthHeaders(),
|
||||||
body: JSON.stringify({ message } as BotChatRequest)
|
body: JSON.stringify({ message } as BotChatRequest),
|
||||||
|
signal
|
||||||
});
|
});
|
||||||
return handleResponse<BotChatResponse>(response);
|
return handleResponse<BotChatResponse>(response);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -44,11 +44,17 @@
|
|||||||
|
|
||||||
isSending = true;
|
isSending = true;
|
||||||
|
|
||||||
// Add user's message immediately
|
// Add user's message immediately so it shows even before API response
|
||||||
addMessage({ role: 'user', content: message });
|
addMessage({ role: 'user', content: message });
|
||||||
|
|
||||||
try {
|
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 });
|
addMessage({ role: 'assistant', content: response.response });
|
||||||
|
|
||||||
if (response.strategy_config) {
|
if (response.strategy_config) {
|
||||||
@@ -56,7 +62,11 @@
|
|||||||
setCurrentBot(bot);
|
setCurrentBot(bot);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
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.' });
|
addMessage({ role: 'assistant', content: 'Sorry, I encountered an error. Please try again.' });
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
isSending = false;
|
isSending = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user