From 5656f030c4476fbd270bf817804967f9513c2a0a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 28 Mar 2025 00:52:13 -0700 Subject: [PATCH] refac: error handling --- backend/open_webui/main.py | 14 +++++++++++++- backend/open_webui/utils/filter.py | 2 +- backend/open_webui/utils/middleware.py | 17 +++++++++++++---- src/lib/components/chat/Chat.svelte | 8 +++++--- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 34cf68069..63d5149c7 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -89,6 +89,7 @@ from open_webui.internal.db import Session, engine from open_webui.models.functions import Functions from open_webui.models.models import Models from open_webui.models.users import UserModel, Users +from open_webui.models.chats import Chats from open_webui.config import ( LICENSE_KEY, @@ -428,7 +429,10 @@ app = FastAPI( oauth_manager = OAuthManager(app) -app.state.config = AppConfig(redis_url=REDIS_URL, redis_sentinels=get_sentinels_from_env(REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT)) +app.state.config = AppConfig( + redis_url=REDIS_URL, + redis_sentinels=get_sentinels_from_env(REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT), +) app.state.WEBUI_NAME = WEBUI_NAME app.state.LICENSE_METADATA = None @@ -1084,6 +1088,14 @@ async def chat_completion( except Exception as e: log.debug(f"Error processing chat payload: {e}") + Chats.upsert_message_to_chat_by_id_and_message_id( + metadata["chat_id"], + metadata["message_id"], + { + "error": {"content": str(e)}, + }, + ) + raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=str(e), diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py index 2bafe720b..a11aeb092 100644 --- a/backend/open_webui/utils/filter.py +++ b/backend/open_webui/utils/filter.py @@ -101,7 +101,7 @@ async def process_filter_functions( form_data = handler(**params) except Exception as e: - log.exception(f"Error in {filter_type} handler {filter_id}: {e}") + log.debug(f"Error in {filter_type} handler {filter_id}: {e}") raise e # Handle file cleanup for inlet diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index b0e3b681e..5aecc5c40 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -18,9 +18,7 @@ from uuid import uuid4 from concurrent.futures import ThreadPoolExecutor -from fastapi import Request -from fastapi import BackgroundTasks - +from fastapi import Request, HTTPException from starlette.responses import Response, StreamingResponse @@ -1046,6 +1044,16 @@ async def process_chat_response( # Non-streaming response if not isinstance(response, StreamingResponse): if event_emitter: + if "error" in response: + error = response["error"].get("detail", response["error"]) + Chats.upsert_message_to_chat_by_id_and_message_id( + metadata["chat_id"], + metadata["message_id"], + { + "error": {"content": error}, + }, + ) + if "selected_model_id" in response: Chats.upsert_message_to_chat_by_id_and_message_id( metadata["chat_id"], @@ -1055,7 +1063,8 @@ async def process_chat_response( }, ) - if response.get("choices", [])[0].get("message", {}).get("content"): + choices = response.get("choices", []) + if choices and choices[0].get("message", {}).get("content"): content = response["choices"][0]["message"]["content"] if content: diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 16340247d..4f3cc7c73 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1639,10 +1639,12 @@ return null; }); - console.log(res); - if (res) { - taskId = res.task_id; + if (res.error) { + await handleOpenAIError(res.error, responseMessage); + } else { + taskId = res.task_id; + } } await tick();