Originally created by @MikeNatC on GitHub (Apr 23, 2025).
Check Existing Issues
I have searched the existing issues and discussions.
I am using the latest version of Open WebUI.
Installation Method
Docker
Open WebUI Version
v0.6.5
Ollama Version (if applicable)
N.A.
Operating System
Unraid
Browser (if applicable)
Chrome Version 135.0.7049.85 (Official Build) (64-bit)
Confirmation
I have read and followed all instructions in README.md.
I am using the latest version of both Open WebUI and Ollama.
I have included the browser console logs.
I have included the Docker container logs.
I have listed steps to reproduce the bug in detail.
Expected Behavior
Open WebUI uses the Firecrawl web engine loader to scrape the web pages from SearXNG and to use it to provide context to the chat.
Actual Behavior
Open WebUI indicates 'No search results found' and completes chat without any search results.
Steps to Reproduce
Run Firecrawl Docker Containers
Go to Admin -> Web Search and change the Web Loader Engine to Firecrawl and insert an API key based on the 'API_TEST_KEY` env variable used in the Firecrawl container.
Set the search engine to SearXNG.
Start a new chat and toggle the web search function. Ask "what is the weather today?".
Logs & Screenshots
I didn't include the browser console logs cause they didn't show any errors.
This is my Open WebUI docker container log. Note that I used the 'diff' language and '-' marker to highlight the error messages.
-KeyError: 'source'
-2025-04-23 21:07:29.703 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', ...
│ └ {'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', 'description': 'Si...
└ Document(metadata={'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', ...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:07:29.743 | INFO | open_webui.routers.retrieval:process_web_search:1477 - trying to web search with ('searxng', 'current conditions Singapore') - {}
-2025-04-23 21:09:26.950 | ERROR | open_webui.routers.retrieval:process_web_search:1545 - 'source' - {}
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
> File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
│ └ {'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Channel', 'referrer'...
└ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
KeyError: 'source'
-2025-04-23 21:09:26.952 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
│ └ {'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Channel', 'referrer'...
└ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:09:26.993 | INFO | open_webui.routers.retrieval:process_web_search:1477 - trying to web search with ('searxng', 'Singapore weather forecast') - {}
2025-04-23 21:09:55.307 | ERROR | open_webui.routers.retrieval:process_web_search:1545 - 'source' - {}
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
> File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
│ └ {'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Council+Singapore?canoni...
└ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
KeyError: 'source'
-2025-04-23 21:09:55.309 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
│ └ {'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Council+Singapore?canoni...
└ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:09:55.351 | INFO | open_webui.routers.openai:get_all_models:389 - get_all_models() - {}
2025-04-23 21:09:55.372 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/chat/completions HTTP/1.1" 200 - {}
2025-04-23 21:09:55.426 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "GET /api/v1/chats/?page=1 HTTP/1.1" 200 - {}
2025-04-23 21:10:02.079 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/chat/completed HTTP/1.1" 200 - {}
2025-04-23 21:10:02.128 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/v1/chats/a3edc261-b138-4e53-bd4c-bdab6df8cbd9 HTTP/1.1" 200 - {}
### Additional Information
_No response_
Originally created by @MikeNatC on GitHub (Apr 23, 2025).
### Check Existing Issues
- [x] I have searched the existing issues and discussions.
- [x] I am using the latest version of Open WebUI.
### Installation Method
Docker
### Open WebUI Version
v0.6.5
### Ollama Version (if applicable)
N.A.
### Operating System
Unraid
### Browser (if applicable)
Chrome Version 135.0.7049.85 (Official Build) (64-bit)
### Confirmation
- [x] I have read and followed all instructions in `README.md`.
- [x] I am using the latest version of **both** Open WebUI and Ollama.
- [x] I have included the browser console logs.
- [x] I have included the Docker container logs.
- [x] I have listed steps to reproduce the bug in detail.
### Expected Behavior
Open WebUI uses the Firecrawl web engine loader to scrape the web pages from SearXNG and to use it to provide context to the chat.
### Actual Behavior
Open WebUI indicates 'No search results found' and completes chat without any search results.
### Steps to Reproduce
1. Run Firecrawl Docker Containers
2. Go to Admin -> Web Search and change the Web Loader Engine to `Firecrawl` and insert an API key based on the 'API_TEST_KEY` env variable used in the Firecrawl container.
3. Set the search engine to SearXNG.
4. Start a new chat and toggle the web search function. Ask "what is the weather today?".
### Logs & Screenshots
I didn't include the browser console logs cause they didn't show any errors.
This is my Open WebUI docker container log. Note that I used the 'diff' language and '-' marker to highlight the error messages.
```diff
-KeyError: 'source'
-2025-04-23 21:07:29.703 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', ...
│ └ {'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', 'description': 'Si...
└ Document(metadata={'application-name': 'Ventusky', 'ogImage': 'https://cdnstatic.ventusky.com/images_v2/ventusky-share.jpg', ...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:07:29.743 | INFO | open_webui.routers.retrieval:process_web_search:1477 - trying to web search with ('searxng', 'current conditions Singapore') - {}
-2025-04-23 21:09:26.950 | ERROR | open_webui.routers.retrieval:process_web_search:1545 - 'source' - {}
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
> File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
│ └ {'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Channel', 'referrer'...
└ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
KeyError: 'source'
-2025-04-23 21:09:26.952 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
│ └ {'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Channel', 'referrer'...
└ Document(metadata={'robots': ['max-image-preview:large', 'index, follow'], 'ogLocale': 'en_US', 'ogSiteName': 'The Weather Ch...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:09:26.993 | INFO | open_webui.routers.retrieval:process_web_search:1477 - trying to web search with ('searxng', 'Singapore weather forecast') - {}
2025-04-23 21:09:55.307 | ERROR | open_webui.routers.retrieval:process_web_search:1545 - 'source' - {}
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
> File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
│ └ {'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Council+Singapore?canoni...
└ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
KeyError: 'source'
-2025-04-23 21:09:55.309 | ERROR | open_webui.utils.middleware:chat_web_search_handler:427 - 400: [ERROR: 'source'] - {}
Traceback (most recent call last):
File "/app/backend/open_webui/routers/retrieval.py", line 1502, in process_web_search
urls = [
File "/app/backend/open_webui/routers/retrieval.py", line 1503, in <listcomp>
doc.metadata["source"] for doc in docs
│ │ └ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
│ └ {'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Council+Singapore?canoni...
└ Document(metadata={'og:url': 'https://weather.com/weather/tenday/l/Bukit+Merah+Central+Singapore+Community+Development+Counci...
KeyError: 'source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/uvicorn", line 10, in <module>
sys.exit(main())
│ │ └ <Command main>
│ └ <built-in function exit>
└ <module 'sys' (built-in)>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1161, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function BaseCommand.main at 0x14eeeae637e0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1082, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x14eeebbc4610>
│ └ <function Command.invoke at 0x14eeeae7c400>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
│ │ │ │ │ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
│ │ │ │ └ <click.core.Context object at 0x14eeebbc4610>
│ │ │ └ <function main at 0x14eeeac86f20>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x14eeeae62d40>
└ <click.core.Context object at 0x14eeebbc4610>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 788, in invoke
return __callback(*args, **kwargs)
│ └ {'host': '0.0.0.0', 'port': 8080, 'forwarded_allow_ips': '*', 'workers': 1, 'app': 'open_webui.main:app', 'uds': None, 'fd': ...
└ ()
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 412, in main
run(
└ <function run at 0x14eeeaeaede0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 579, in run
server.run()
│ └ <function Server.run at 0x14eeead102c0>
└ <uvicorn.server.Server object at 0x14eeead8a0d0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 66, in run
return asyncio.run(self.serve(sockets=sockets))
│ │ │ │ └ None
│ │ │ └ <function Server.serve at 0x14eeead10360>
│ │ └ <uvicorn.server.Server object at 0x14eeead8a0d0>
│ └ <function run at 0x14eeeb1c0ae0>
└ <module 'asyncio' from '/usr/local/lib/python3.11/asyncio/__init__.py'>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 190, in run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x14eeeac416c0>
│ └ <function Runner.run at 0x14eeeb034680>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
│ │ │ └ <Task pending name='Task-1' coro=<Server.serve() running at /usr/local/lib/python3.11/site-packages/uvicorn/server.py:70> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x14eeeac82dc0>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x14eeead7e790>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 141, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <open_webui.main.RedirectMiddleware object at 0x14ee333c6150>
File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
│ │ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_error at 0x14eea51fa660>
│ │ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ │ └ <starlette.requests.Request object at 0x14eea96927d0>
│ │ └ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
│ └ <starlette.middleware.exceptions.ExceptionMiddleware object at 0x14ee3864b190>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
await self.middleware_stack(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <bound method Router.app of <fastapi.routing.APIRouter object at 0x14ee89db9d10>>
└ <fastapi.routing.APIRouter object at 0x14ee89db9d10>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
await route.handle(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function Route.handle at 0x14eee8239b20>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
await self.app(scope, receive, send)
│ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ └ <function request_response.<locals>.app at 0x14ee32ed7240>
└ APIRoute(path='/api/chat/completions', name='chat_completion', methods=['POST'])
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 76, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
│ │ │ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f91c0>
│ │ │ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ │ │ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
│ │ └ <starlette.requests.Request object at 0x14eea96903d0>
│ └ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
└ <function wrap_app_handling_exceptions at 0x14eee8238540>
File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
│ │ │ └ <function wrap_app_handling_exceptions.<locals>.wrapped_app.<locals>.sender at 0x14eea51f9da0>
│ │ └ <function BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect at 0x14eea51f9ee0>
│ └ {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('172.18.0.15', 8080), '...
└ <function request_response.<locals>.app.<locals>.app at 0x14eea51f9e40>
File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 73, in app
response = await f(request)
│ └ <starlette.requests.Request object at 0x14eea96903d0>
└ <function get_request_handler.<locals>.app at 0x14ee32ed7100>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 301, in app
raw_response = await run_endpoint_function(
└ <function run_endpoint_function at 0x14eee823b920>
File "/usr/local/lib/python3.11/site-packages/fastapi/routing.py", line 212, in run_endpoint_function
return await dependant.call(**values)
│ │ └ {'user': UserModel(id='21568af8-e7dd-4175-a686-d692319e2e85', name='Michael Chee', email='michael.n.chee@gmail.com', role='ad...
│ └ <function chat_completion at 0x14ee32ed4cc0>
└ Dependant(path_params=[], query_params=[], header_params=[], cookie_params=[], body_params=[ModelField(field_info=Body(Pydant...
File "/app/backend/open_webui/main.py", line 1130, in chat_completion
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x14ee89d2cf40>
│ └ {'user_id': '21568af8-e7dd-4175-a686-d692319e2e85', 'chat_id': 'a3edc261-b138-4e53-bd4c-bdab6df8cbd9', 'message_id': '93d1b67...
└ {'stream': True, 'model': 'gemini/gemini-2.5-flash-preview-04-17', 'messages': [{'role': 'system', 'content': 'The current da...
File "/app/backend/open_webui/utils/middleware.py", line 796, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x14ee89d2c860>
> File "/app/backend/open_webui/utils/middleware.py", line 372, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x14ee90d85c60>
File "/app/backend/open_webui/routers/retrieval.py", line 1546, in process_web_search
raise HTTPException(
└ <class 'fastapi.exceptions.HTTPException'>
-fastapi.exceptions.HTTPException: 400: [ERROR: 'source']
2025-04-23 21:09:55.351 | INFO | open_webui.routers.openai:get_all_models:389 - get_all_models() - {}
2025-04-23 21:09:55.372 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/chat/completions HTTP/1.1" 200 - {}
2025-04-23 21:09:55.426 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "GET /api/v1/chats/?page=1 HTTP/1.1" 200 - {}
2025-04-23 21:10:02.079 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/chat/completed HTTP/1.1" 200 - {}
2025-04-23 21:10:02.128 | INFO | uvicorn.protocols.http.httptools_impl:send:476 - 10.10.4.1:0 - "POST /api/v1/chats/a3edc261-b138-4e53-bd4c-bdab6df8cbd9 HTTP/1.1" 200 - {}
### Additional Information
_No response_
GiteaMirror
added the bug label 2025-11-11 16:07:12 -06:00
It appears there’s an issue with the FirecrawlLoader where the loaded documents don’t include a source key in the metadata. Instead, an og:url is being returned. Would you mind sharing your Firecrawl URL with me personally? I’ll work on resolving this issue.
(Alternatively, sharing the steps to set up a Firecrawl Docker container that replicates your case would also be helpful.)
@tth37 commented on GitHub (Apr 23, 2025):
It appears there’s an issue with the FirecrawlLoader where the loaded documents don’t include a `source` key in the metadata. Instead, an `og:url` is being returned. Would you mind sharing your Firecrawl URL with me personally? I’ll work on resolving this issue.
(Alternatively, sharing the steps to set up a Firecrawl Docker container that replicates your case would also be helpful.)
My email: xgpsthd0902@outlook.com
My Firecrawl Docker isn't exposed to the internet and I'm not sure if providing access via a cloudflared tunnel will complicate how it works. So I think it might be easier to provide you with the steps I took to create the Docker container.
Create a folder in the root directory for the firecrawl files. Do a git clone of the repository to the folder by running git clone https://github.com/mendableai/firecrawl.git /path/to/selected/folder/ [This is because one of the services does not have a container image and must be built from the source code.]
Modify the TEST_API_KEY to include a default key as follows TEST_API_KEY: ${TEST_API_KEY:-default_api_key}
Create an .env file in the folder at the root directory using the following template.
# ===== Required ENVS ======
PORT=3002
HOST=0.0.0.0
# To turn on DB authentication, you need to set up Supabase.
USE_DB_AUTHENTICATION=false
# ===== Optional ENVS ======
## === AI features (JSON format on scrape, /extract API) ===
# Provide your OpenAI API key here to enable AI features
# OPENAI_API_KEY=
# Experimental: Use Ollama
# OLLAMA_BASE_URL=http://localhost:11434/api
# MODEL_NAME=deepseek-r1:7b
# MODEL_EMBEDDING_NAME=nomic-embed-text
# Experimental: Use any OpenAI-compatible API
# OPENAI_BASE_URL=https://example.com/v1
# OPENAI_API_KEY=
## === Proxy ===
# PROXY_SERVER can be a full URL (e.g. http://0.1.2.3:1234) or just an IP and port combo (e.g. 0.1.2.3:1234)
# Do not uncomment PROXY_USERNAME and PROXY_PASSWORD if your proxy is unauthenticated
# PROXY_SERVER=
# PROXY_USERNAME=
# PROXY_PASSWORD=
## === /search API ===
# By default, the /search API will use Google search.
# You can specify a SearXNG server with the JSON format enabled, if you'd like to use that instead of direct Google.
# You can also customize the engines and categories parameters, but the defaults should also work just fine.
# SEARXNG_ENDPOINT=http://your.searxng.server
# SEARXNG_ENGINES=
# SEARXNG_CATEGORIES=
## === Other ===
# Supabase Setup (used to support DB authentication, advanced logging, etc.)
# SUPABASE_ANON_TOKEN=
# SUPABASE_URL=
# SUPABASE_SERVICE_TOKEN=
# Use if you've set up authentication and want to test with a real API key
# TEST_API_KEY=
# This key lets you access the queue admin panel. Change this if your deployment is publicly accessible.
BULL_AUTH_KEY=CHANGEME
# This is now autoconfigured by the docker-compose.yaml. You shouldn't need to set it.
# PLAYWRIGHT_MICROSERVICE_URL=http://playwright-service:3000/scrape
# REDIS_URL=redis://redis:6379
# REDIS_RATE_LIMIT_URL=redis://redis:6379
# Set if you have a llamaparse key you'd like to use to parse pdfs
# LLAMAPARSE_API_KEY=
# Set if you'd like to send server health status messages to Slack
# SLACK_WEBHOOK_URL=
# Set if you'd like to send posthog events like job logs
# POSTHOG_API_KEY=
# POSTHOG_HOST=
Build and run the Docker containers. This should spin up a local instance at: http://localhost:3002.
@MikeNatC commented on GitHub (Apr 23, 2025):
Thanks for looking into this, @tth37
My Firecrawl Docker isn't exposed to the internet and I'm not sure if providing access via a cloudflared tunnel will complicate how it works. So I think it might be easier to provide you with the steps I took to create the Docker container.
1. Create a folder in the root directory for the firecrawl files. Do a git clone of the repository to the folder by running `git clone https://github.com/mendableai/firecrawl.git /path/to/selected/folder/` [This is because one of the services does not have a container image and must be built from the source code.]
2. The git clone should include the docker-compose.yaml. Otherwise, it is at this location: [https://github.com/mendableai/firecrawl/blob/main/docker-compose.yaml](url)
3. Modify the `TEST_API_KEY` to include a default key as follows ` TEST_API_KEY: ${TEST_API_KEY:-default_api_key}`
4. Create an `.env` file in the folder at the root directory using the following template.
```
# ===== Required ENVS ======
PORT=3002
HOST=0.0.0.0
# To turn on DB authentication, you need to set up Supabase.
USE_DB_AUTHENTICATION=false
# ===== Optional ENVS ======
## === AI features (JSON format on scrape, /extract API) ===
# Provide your OpenAI API key here to enable AI features
# OPENAI_API_KEY=
# Experimental: Use Ollama
# OLLAMA_BASE_URL=http://localhost:11434/api
# MODEL_NAME=deepseek-r1:7b
# MODEL_EMBEDDING_NAME=nomic-embed-text
# Experimental: Use any OpenAI-compatible API
# OPENAI_BASE_URL=https://example.com/v1
# OPENAI_API_KEY=
## === Proxy ===
# PROXY_SERVER can be a full URL (e.g. http://0.1.2.3:1234) or just an IP and port combo (e.g. 0.1.2.3:1234)
# Do not uncomment PROXY_USERNAME and PROXY_PASSWORD if your proxy is unauthenticated
# PROXY_SERVER=
# PROXY_USERNAME=
# PROXY_PASSWORD=
## === /search API ===
# By default, the /search API will use Google search.
# You can specify a SearXNG server with the JSON format enabled, if you'd like to use that instead of direct Google.
# You can also customize the engines and categories parameters, but the defaults should also work just fine.
# SEARXNG_ENDPOINT=http://your.searxng.server
# SEARXNG_ENGINES=
# SEARXNG_CATEGORIES=
## === Other ===
# Supabase Setup (used to support DB authentication, advanced logging, etc.)
# SUPABASE_ANON_TOKEN=
# SUPABASE_URL=
# SUPABASE_SERVICE_TOKEN=
# Use if you've set up authentication and want to test with a real API key
# TEST_API_KEY=
# This key lets you access the queue admin panel. Change this if your deployment is publicly accessible.
BULL_AUTH_KEY=CHANGEME
# This is now autoconfigured by the docker-compose.yaml. You shouldn't need to set it.
# PLAYWRIGHT_MICROSERVICE_URL=http://playwright-service:3000/scrape
# REDIS_URL=redis://redis:6379
# REDIS_RATE_LIMIT_URL=redis://redis:6379
# Set if you have a llamaparse key you'd like to use to parse pdfs
# LLAMAPARSE_API_KEY=
# Set if you'd like to send server health status messages to Slack
# SLACK_WEBHOOK_URL=
# Set if you'd like to send posthog events like job logs
# POSTHOG_API_KEY=
# POSTHOG_HOST=
```
5. Build and run the Docker containers. This should spin up a local instance at: http://localhost:3002.
@tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
@tth37 commented on GitHub (Apr 23, 2025):
@tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
https://github.com/open-webui/open-webui/blob/09874ab83dcf7c39babde9e5142b4caf9b2c9193/backend/open_webui/retrieval/web/utils.py#L173
@tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
After several test I found that issues comes from crawl mode, it consumes so many credits, and it's too slow even for Firecrawl official paid plan. Another problem is openwebui can not use Firecrawl scrape webpages in parallel, which means the process time is multiplied. The official Firecrawl service does have a feature called Concurrent Browser, which means you can scrape pages in parallel, it will be nice to support it soon.
@Xi-Gong commented on GitHub (Apr 24, 2025):
> @tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
>
> https://github.com/open-webui/open-webui/blob/09874ab83dcf7c39babde9e5142b4caf9b2c9193/backend/open_webui/retrieval/web/utils.py#L173
After several test I found that issues comes from `crawl` mode, it consumes so many credits, and it's too slow even for **Firecrawl official paid plan.** Another problem is openwebui can not use Firecrawl `scrape` webpages in **parallel**, which means the process time is multiplied. The official Firecrawl service does have a feature called `Concurrent Browser`, which means you can `scrape` pages in parallel, it will be nice to support it soon.
@tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
[open-webui/backend/open_webui/retrieval/web/utils.py](https://github.com/open-webui/open-webui/blob/09874ab83dcf7c39babde9e5142b4caf9b2c9193/backend/open_webui/retrieval/web/utils.py#L173)
Line 173
in
[09874ab](/open-webui/open-webui/commit/09874ab83dcf7c39babde9e5142b4caf9b2c9193)
mode: Literal["crawl", "scrape", "map"] = "crawl",
After several test I found that issues comes from crawl mode, it consumes so many credits, and it's too slow even for Firecrawl official paid plan. Another problem is openwebui can not use Firecrawl scrape webpages in parallel, which means the process time is multiplied. The official Firecrawl service does have a feature called Concurrent Browser, which means you can scrape pages in parallel, it will be nice to support it soon.
Single thread scrape is still too slow now, could you provide a pull request to support parallel scrape, please?
@ER-EPR commented on GitHub (May 22, 2025):
> > [@tjbck](https://github.com/tjbck) Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
> >
> >
> >
> > [open-webui/backend/open_webui/retrieval/web/utils.py](https://github.com/open-webui/open-webui/blob/09874ab83dcf7c39babde9e5142b4caf9b2c9193/backend/open_webui/retrieval/web/utils.py#L173)
> >
> >
> > Line 173
> > in
> > [09874ab](/open-webui/open-webui/commit/09874ab83dcf7c39babde9e5142b4caf9b2c9193)
> >
> >
> >
> >
> >
> >
> >
> > mode: Literal["crawl", "scrape", "map"] = "crawl",
>
> After several test I found that issues comes from `crawl` mode, it consumes so many credits, and it's too slow even for **Firecrawl official paid plan.** Another problem is openwebui can not use Firecrawl `scrape` webpages in **parallel**, which means the process time is multiplied. The official Firecrawl service does have a feature called `Concurrent Browser`, which means you can `scrape` pages in parallel, it will be nice to support it soon.
Single thread scrape is still too slow now, could you provide a pull request to support parallel scrape, please?
@ER-EPR Certainly! I'll submit a PR to add support for batched parallel crawling in next few days.
I did some investigation today, it seems the langchain document loader api use synchronized lazy_load() and asynchronized alazy_load() to do the work. And in open webui code I saw a rate limiting class. Also from the self-hosted firecrawl log, it seems open webUI, which use lazy_load(), have to wait for the result before send the next url. If the url is fake or inaccessible, it would take a long time to return an error. So if open webui can utilize alazy_load() to send urls and in a separate process look for the completed scrape requests and start embedding work, it will be a huge boost compared with current workflow. Now it has to wait for all urls are scraped before embedding could begin. It's a huge waste of time I think.
Firecrawl log:
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Originally created by @MikeNatC on GitHub (Apr 23, 2025).
Check Existing Issues
Installation Method
Docker
Open WebUI Version
v0.6.5
Ollama Version (if applicable)
N.A.
Operating System
Unraid
Browser (if applicable)
Chrome Version 135.0.7049.85 (Official Build) (64-bit)
Confirmation
README.md.Expected Behavior
Open WebUI uses the Firecrawl web engine loader to scrape the web pages from SearXNG and to use it to provide context to the chat.
Actual Behavior
Open WebUI indicates 'No search results found' and completes chat without any search results.
Steps to Reproduce
Firecrawland insert an API key based on the 'API_TEST_KEY` env variable used in the Firecrawl container.Logs & Screenshots
I didn't include the browser console logs cause they didn't show any errors.
This is my Open WebUI docker container log. Note that I used the 'diff' language and '-' marker to highlight the error messages.
@tth37 commented on GitHub (Apr 23, 2025):
It appears there’s an issue with the FirecrawlLoader where the loaded documents don’t include a
sourcekey in the metadata. Instead, anog:urlis being returned. Would you mind sharing your Firecrawl URL with me personally? I’ll work on resolving this issue.(Alternatively, sharing the steps to set up a Firecrawl Docker container that replicates your case would also be helpful.)
My email: xgpsthd0902@outlook.com
@MikeNatC commented on GitHub (Apr 23, 2025):
Thanks for looking into this, @tth37
My Firecrawl Docker isn't exposed to the internet and I'm not sure if providing access via a cloudflared tunnel will complicate how it works. So I think it might be easier to provide you with the steps I took to create the Docker container.
git clone https://github.com/mendableai/firecrawl.git /path/to/selected/folder/[This is because one of the services does not have a container image and must be built from the source code.]TEST_API_KEYto include a default key as followsTEST_API_KEY: ${TEST_API_KEY:-default_api_key}.envfile in the folder at the root directory using the following template.@tjbck commented on GitHub (Apr 23, 2025):
Should be addressed with
09874ab83d@tth37 commented on GitHub (Apr 23, 2025):
@tjbck Thanks!! But what are your thoughts on changing FirecrawlLoader's default mode to 'scrape'? The 'scrape' mode only fetches a single URL, which aligns with the behavior of most other web loaders. Additionally, if 'crawl' mode is selected (especially in a self-hosted Firecrawl instance), it can take an unacceptably long time just to process a single webpage.
https://github.com/open-webui/open-webui/blob/09874ab83dcf7c39babde9e5142b4caf9b2c9193/backend/open_webui/retrieval/web/utils.py#L173
@Xi-Gong commented on GitHub (Apr 24, 2025):
After several test I found that issues comes from
crawlmode, it consumes so many credits, and it's too slow even for Firecrawl official paid plan. Another problem is openwebui can not use Firecrawlscrapewebpages in parallel, which means the process time is multiplied. The official Firecrawl service does have a feature calledConcurrent Browser, which means you canscrapepages in parallel, it will be nice to support it soon.@ER-EPR commented on GitHub (May 22, 2025):
Single thread scrape is still too slow now, could you provide a pull request to support parallel scrape, please?
@tth37 commented on GitHub (May 22, 2025):
@ER-EPR Certainly! I'll submit a PR to add support for batched parallel crawling in next few days.
@ER-EPR commented on GitHub (Jun 3, 2025):
I did some investigation today, it seems the langchain document loader api use synchronized lazy_load() and asynchronized alazy_load() to do the work. And in open webui code I saw a rate limiting class. Also from the self-hosted firecrawl log, it seems open webUI, which use lazy_load(), have to wait for the result before send the next url. If the url is fake or inaccessible, it would take a long time to return an error. So if open webui can utilize alazy_load() to send urls and in a separate process look for the completed scrape requests and start embedding work, it will be a huge boost compared with current workflow. Now it has to wait for all urls are scraped before embedding could begin. It's a huge waste of time I think.
Firecrawl log: