From 4b451b984b930d4ab086e15882510e3358e9e4da Mon Sep 17 00:00:00 2001 From: tth37 Date: Mon, 21 Apr 2025 22:18:05 +0800 Subject: [PATCH 1/3] perf: Multi-thread web searching --- backend/open_webui/utils/middleware.py | 36 ++++++++++++++++---------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 4dde09643..4fc4df10d 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -355,21 +355,20 @@ async def chat_web_search_handler( all_results = [] - for searchQuery in queries: - await event_emitter( - { - "type": "status", - "data": { - "action": "web_search", - "description": 'Searching "{{searchQuery}}"', - "query": searchQuery, - "done": False, - }, - } - ) + await event_emitter( + { + "type": "status", + "data": { + "action": "web_search", + "description": "Searching the web", + "done": False, + }, + } + ) - try: - results = await process_web_search( + web_search_tasks = [ + asyncio.create_task( + process_web_search( request, SearchForm( **{ @@ -378,6 +377,15 @@ async def chat_web_search_handler( ), user=user, ) + ) + for searchQuery in queries + ] + gathered_results = await asyncio.gather(*web_search_tasks, return_exceptions=True) + + for searchQuery, results in zip(queries, gathered_results): + try: + if isinstance(results, Exception): + raise Exception(f"Error searching {searchQuery}: {str(results)}") if results: all_results.append(results) From 5b9c1de3d1daf8b0fa29a1789883cd7c4e71a061 Mon Sep 17 00:00:00 2001 From: tth37 Date: Tue, 22 Apr 2025 01:24:30 +0800 Subject: [PATCH 2/3] fix: Translatable 'Searching the web' --- src/lib/components/chat/Messages/ResponseMessage.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 72459cd3e..2c6d94e2d 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -683,6 +683,8 @@ {$i18n.t('No search query generated')} {:else if status?.description === 'Generating search query'} {$i18n.t('Generating search query')} + {:else if status?.description === 'Searching the web'} + {$i18n.t('Searching the web')} {:else} {status?.description} {/if} From cf2d7de8737825d19f6ef8d4ed521b3506ec425f Mon Sep 17 00:00:00 2001 From: tth37 Date: Tue, 29 Apr 2025 00:20:55 +0800 Subject: [PATCH 3/3] refac: Implicit asyncio create_task --- backend/open_webui/utils/middleware.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 4fc4df10d..b0e89bbf0 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -366,21 +366,17 @@ async def chat_web_search_handler( } ) - web_search_tasks = [ - asyncio.create_task( + gathered_results = await asyncio.gather( + *( process_web_search( request, - SearchForm( - **{ - "query": searchQuery, - } - ), + SearchForm(**{"query": searchQuery}), user=user, ) - ) - for searchQuery in queries - ] - gathered_results = await asyncio.gather(*web_search_tasks, return_exceptions=True) + for searchQuery in queries + ), + return_exceptions=True, + ) for searchQuery, results in zip(queries, gathered_results): try: