issue: Unable to get self-hosted Firecrawl Web Loader Engine to work #4941

Closed
opened 2025-11-11 16:07:12 -06:00 by GiteaMirror · 8 comments
Owner

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

  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.

-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
Author
Owner

@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

@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
Author
Owner

@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
  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=
  1. 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.
Author
Owner

@tjbck commented on GitHub (Apr 23, 2025):

Should be addressed with 09874ab83d

@tjbck commented on GitHub (Apr 23, 2025): Should be addressed with 09874ab83dcf7c39babde9e5142b4caf9b2c9193
Author
Owner

@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.

09874ab83d/backend/open_webui/retrieval/web/utils.py (L173)

@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
Author
Owner

@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.

09874ab83d/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.

@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.
Author
Owner

@ER-EPR commented on GitHub (May 22, 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.

  [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?
Author
Owner

@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.

@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.
Author
Owner

@ER-EPR commented on GitHub (Jun 3, 2025):

@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:

2025-06-01 01:39:35 info [:]: Worker 9 started 

2025-06-01 01:39:35 info [:]: Worker 9 listening on port 3002 

2025-06-01 01:39:35 info [:]: Connected to Redis Session Rate Limit Store! 

2025-06-02 15:33:33 warn [:]: You're bypassing authentication {}

2025-06-02 15:33:33 warn [:]: You're bypassing authentication {}

2025-06-02 15:33:33 debug [:]: Scrape 5890fdf7-b56f-41a8-9ce4-1f67a641b2ef starting 

2025-06-02 15:33:36 warn [:]: You're bypassing authentication {}

2025-06-02 15:33:36 warn [:]: You're bypassing authentication {}

2025-06-02 15:33:36 warn [:]: You're bypassing authentication {}

2025-06-02 15:33:36 debug [:]: Scrape c6d7f623-e08f-4ff1-a544-b27652057847 starting 

2025-06-02 15:33:40 debug [:]: Scrape ecdce226-238e-4d41-a905-1966c2ec8488 starting 

2025-06-02 15:33:43 debug [:]: Scrape 8ad9eeff-59e9-43a6-b88f-a0a4b0a33250 starting 

2025-06-02 15:33:44 debug [:]: Scrape 60e260b0-b538-46a3-9662-1164e969c650 starting 

2025-06-02 15:34:09 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"60e260b0-b538-46a3-9662-1164e969c650","scrapeId":"60e260b0-b538-46a3-9662-1164e969c650","startTime":1748878424041}

2025-06-02 15:34:09 debug [:]: Scrape fd546fe4-274c-4b11-934f-1626aead041a starting 

2025-06-02 15:34:22 debug [:]: Scrape badbfa05-6f5d-49e4-a556-70d70e1890bb starting 

2025-06-02 15:34:30 debug [:]: Scrape ce9d7ec4-cdf8-43c4-9374-e979a34ab116 starting 

2025-06-02 15:34:30 debug [:]: Scrape dfae9f22-510e-4f47-89fe-c56b77362491 starting 

2025-06-02 15:34:33 debug [:]: Scrape 66a556da-d446-499b-83d2-68efdf3342c9 starting 

2025-06-02 15:34:34 debug [:]: Scrape 834e0bbb-977e-4bb5-a491-076417c49a09 starting 

2025-06-02 15:34:35 debug [:]: Scrape 976604d1-19cc-4578-8a60-751daeebac32 starting 

2025-06-02 15:34:36 debug [:]: Scrape 60e66fed-13ed-4e08-ac6b-20c875edb97c starting 

2025-06-02 15:34:36 debug [:]: Scrape d052eb2c-0bee-44bd-a003-b85857a47a45 starting 

2025-06-02 15:34:38 debug [:]: Scrape 5dd3eea2-bdd0-499c-95ca-455a1aa722e8 starting 

2025-06-02 15:34:58 debug [:]: Scrape c6abe6e1-c801-4299-9c1b-242552b0bcff starting 

2025-06-02 15:35:01 debug [:]: Scrape f2142464-d542-4906-8421-bc3fca85df92 starting 

2025-06-02 15:35:02 debug [:]: Scrape a016796d-4fda-4d81-8f45-6fc2da90850d starting 

2025-06-02 15:35:27 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"a016796d-4fda-4d81-8f45-6fc2da90850d","scrapeId":"a016796d-4fda-4d81-8f45-6fc2da90850d","startTime":1748878502298}

2025-06-02 15:35:27 debug [:]: Scrape 162ad9f3-1bf3-4eed-808f-f7b55c5dab21 starting 

2025-06-02 15:35:29 debug [:]: Scrape 62ba53ed-7bd7-4bc3-8e3c-970089c87845 starting 

2025-06-02 15:35:39 debug [:]: Scrape 11cc5c47-a0a3-4aa1-84a7-df097323f983 starting 

2025-06-02 15:35:44 debug [:]: Scrape 045e27cd-1878-43bb-a0ce-c13bd30ef9e8 starting 

2025-06-02 15:35:45 debug [:]: Scrape 84eb96aa-96cc-4c95-b366-ed4c7975abec starting 

2025-06-02 15:35:45 debug [:]: Scrape acb7d7fb-cb2a-4c7e-b530-a8c4a2874cdc starting 

2025-06-02 15:35:47 debug [:]: Scrape 580cc266-2c39-4987-a8d8-cf6e9675dfe5 starting 

2025-06-02 15:35:57 debug [:]: Scrape bcaa8934-35b3-4913-a705-cf8f5f789385 starting 

2025-06-02 15:36:08 debug [:]: Scrape c4060985-1f18-417a-a8df-9e4575e030c6 starting 

2025-06-02 15:36:19 debug [:]: Scrape a70b54b0-effb-4bde-ba2a-3ce48b6975a5 starting 

2025-06-02 15:36:21 debug [:]: Scrape 514f424d-d285-4257-b75f-ee3a533eb1a2 starting 

2025-06-02 15:36:22 debug [:]: Scrape 2cf7d02a-13bc-4919-81ce-705eb59c88d5 starting 

2025-06-02 15:36:24 debug [:]: Scrape f825b34b-3aa9-4e9d-8bd0-98bc5dcba0da starting 

2025-06-02 15:36:24 debug [:]: Scrape 8b894328-b7b9-4e12-b747-a5cedf2d54cb starting 

2025-06-02 15:36:25 debug [:]: Scrape 94faafea-201f-4357-be8a-549d837ecd40 starting 

2025-06-02 15:36:26 debug [:]: Scrape 891886ff-f24f-420e-828b-fb760c0989ee starting 

2025-06-02 15:36:30 debug [:]: Scrape 9342e62b-90b2-4923-a5df-d202729e21d3 starting 

2025-06-02 15:36:31 debug [:]: Scrape 985d36bf-7cb6-44c4-ba94-f51802fde99f starting 

2025-06-02 15:36:33 debug [:]: Scrape d4ee4816-8cba-4b8e-a35e-1de84253842e starting 

2025-06-02 15:36:36 debug [:]: Scrape cbec317a-a2d4-491c-ab22-07b14e5d48bb starting 

2025-06-02 15:36:37 debug [:]: Scrape 398e8f79-3dea-4b13-9a96-88927741010e starting 

2025-06-02 15:36:42 debug [:]: Scrape b45fb712-3389-4207-95c9-0a723c1bc33c starting 

2025-06-02 15:36:42 debug [:]: Scrape 312f47ee-33dd-431b-ad41-87446f6770d1 starting 

2025-06-02 15:36:46 debug [:]: Scrape de854a78-d529-4f93-bd98-123699f9feb5 starting 

2025-06-02 15:36:49 debug [:]: Scrape ba3da677-07b0-49ce-9958-543b1149f2f5 starting 

2025-06-02 15:36:50 debug [:]: Scrape 2af02c13-8bcf-4f37-b82f-6e27ef981a32 starting 

2025-06-02 15:36:53 debug [:]: Scrape f8d3acc8-ced8-451b-b85b-dafea65d3fec starting 

2025-06-02 15:36:54 debug [:]: Scrape ed10e39d-478a-4173-a3b1-d5b4d6d2509c starting 

2025-06-02 15:36:55 debug [:]: Scrape db9bd7d3-9bf6-4c14-8f89-02ad3b429bd0 starting 

2025-06-02 15:36:57 debug [:]: Scrape 730388ff-55de-422c-a239-29b35ce6d16a starting 

2025-06-02 15:36:57 debug [:]: Scrape a30b97ab-5564-4ea2-a4e2-1b94eb7215ee starting 

2025-06-02 15:36:58 debug [:]: Scrape f7e844fe-438d-479a-b963-671b5b2ee1c9 starting 

2025-06-02 15:37:00 debug [:]: Scrape e0dd76d9-6252-4f1c-b642-f438f9eabf29 starting 

2025-06-02 15:37:01 debug [:]: Scrape 159fbe04-2036-47d3-ab6f-372b06cb0241 starting 

2025-06-02 15:37:01 debug [:]: Scrape 5a26e6b7-de5a-43f4-86c7-f556c9a83fe3 starting 

2025-06-02 15:37:02 debug [:]: Scrape 527fb964-1c0b-46f5-b1c6-02f34dea2c85 starting 

2025-06-02 15:37:20 debug [:]: Scrape 6cf36b79-190e-4e1e-91e1-ff1fa5426215 starting 

2025-06-02 15:37:29 debug [:]: Scrape c0bed968-951a-4210-9adc-0a34ba62b66e starting 

2025-06-02 15:37:54 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"c0bed968-951a-4210-9adc-0a34ba62b66e","scrapeId":"c0bed968-951a-4210-9adc-0a34ba62b66e","startTime":1748878649381}

2025-06-02 15:37:54 debug [:]: Scrape 6f3b4224-e98e-477d-9413-5b3e06bb2a1f starting 

2025-06-02 15:37:55 debug [:]: Scrape b788cc6d-4782-4fb2-b322-e071ed1b4309 starting 

2025-06-02 15:37:59 debug [:]: Scrape 3e3865d1-6b2c-46d9-b2e0-a9fe6823e9de starting 

2025-06-02 15:38:01 debug [:]: Scrape 7f303403-cd62-4215-9c28-1b3420dbe731 starting 

2025-06-02 15:38:02 debug [:]: Scrape 1f6d3f3c-18c5-4b01-87dc-781a81c72bde starting 

2025-06-02 15:38:05 debug [:]: Scrape ee3cd989-3d0b-48a5-a236-ca694d5be230 starting 

2025-06-02 15:38:17 debug [:]: Scrape 021f0336-85c8-4679-9a61-0a34540f1a37 starting 

2025-06-02 15:38:28 debug [:]: Scrape 02c95521-60b9-4a0c-b122-5a5c9aea1f7c starting 

2025-06-02 15:38:29 debug [:]: Scrape 37a797fe-66ed-4d8d-8130-32343f769556 starting 

2025-06-02 15:38:31 debug [:]: Scrape 2ef85038-f072-44b2-963d-3e61a60147ad starting 

2025-06-02 15:38:32 debug [:]: Scrape 309fa35d-3ff1-40f4-a5f2-3ec377bf2ad6 starting 

2025-06-02 15:38:33 debug [:]: Scrape 50ad0a96-964e-4ca8-93d6-f94c72fb38e7 starting 

2025-06-02 15:38:35 debug [:]: Scrape 43cb2256-7c3c-4d1c-be22-e1e10af32b66 starting 

2025-06-02 15:38:37 debug [:]: Scrape 553c86c7-bd97-4771-b873-77e0c57f4799 starting 

2025-06-02 15:38:55 debug [:]: Scrape edd87bf7-a51f-4673-8759-3f1e4050defd starting 

2025-06-02 15:39:07 debug [:]: Scrape 155afa75-1ed6-48c3-b8e8-b7a7dddda75b starting 

2025-06-02 15:39:11 debug [:]: Scrape f25916ac-46ec-48a0-a4ad-7c140e018ae4 starting 

2025-06-02 15:39:14 debug [:]: Scrape ce9d13c4-ccf6-42ad-806d-eb7011e1e97a starting 

2025-06-02 15:39:15 debug [:]: Scrape 1064c10f-e2e7-4f40-af71-bcece2d859e4 starting 

2025-06-02 15:48:49 info [search:searchController]: Searching for results 

2025-06-02 15:48:55 info [search:searchController]: Searching completed 

2025-06-02 15:48:55 info [search:searchController]: Logging job 
@ER-EPR commented on GitHub (Jun 3, 2025): > [@ER-EPR](https://github.com/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: ``` 2025-06-01 01:39:35 info [:]: Worker 9 started 2025-06-01 01:39:35 info [:]: Worker 9 listening on port 3002 2025-06-01 01:39:35 info [:]: Connected to Redis Session Rate Limit Store! 2025-06-02 15:33:33 warn [:]: You're bypassing authentication {} 2025-06-02 15:33:33 warn [:]: You're bypassing authentication {} 2025-06-02 15:33:33 debug [:]: Scrape 5890fdf7-b56f-41a8-9ce4-1f67a641b2ef starting 2025-06-02 15:33:36 warn [:]: You're bypassing authentication {} 2025-06-02 15:33:36 warn [:]: You're bypassing authentication {} 2025-06-02 15:33:36 warn [:]: You're bypassing authentication {} 2025-06-02 15:33:36 debug [:]: Scrape c6d7f623-e08f-4ff1-a544-b27652057847 starting 2025-06-02 15:33:40 debug [:]: Scrape ecdce226-238e-4d41-a905-1966c2ec8488 starting 2025-06-02 15:33:43 debug [:]: Scrape 8ad9eeff-59e9-43a6-b88f-a0a4b0a33250 starting 2025-06-02 15:33:44 debug [:]: Scrape 60e260b0-b538-46a3-9662-1164e969c650 starting 2025-06-02 15:34:09 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"60e260b0-b538-46a3-9662-1164e969c650","scrapeId":"60e260b0-b538-46a3-9662-1164e969c650","startTime":1748878424041} 2025-06-02 15:34:09 debug [:]: Scrape fd546fe4-274c-4b11-934f-1626aead041a starting 2025-06-02 15:34:22 debug [:]: Scrape badbfa05-6f5d-49e4-a556-70d70e1890bb starting 2025-06-02 15:34:30 debug [:]: Scrape ce9d7ec4-cdf8-43c4-9374-e979a34ab116 starting 2025-06-02 15:34:30 debug [:]: Scrape dfae9f22-510e-4f47-89fe-c56b77362491 starting 2025-06-02 15:34:33 debug [:]: Scrape 66a556da-d446-499b-83d2-68efdf3342c9 starting 2025-06-02 15:34:34 debug [:]: Scrape 834e0bbb-977e-4bb5-a491-076417c49a09 starting 2025-06-02 15:34:35 debug [:]: Scrape 976604d1-19cc-4578-8a60-751daeebac32 starting 2025-06-02 15:34:36 debug [:]: Scrape 60e66fed-13ed-4e08-ac6b-20c875edb97c starting 2025-06-02 15:34:36 debug [:]: Scrape d052eb2c-0bee-44bd-a003-b85857a47a45 starting 2025-06-02 15:34:38 debug [:]: Scrape 5dd3eea2-bdd0-499c-95ca-455a1aa722e8 starting 2025-06-02 15:34:58 debug [:]: Scrape c6abe6e1-c801-4299-9c1b-242552b0bcff starting 2025-06-02 15:35:01 debug [:]: Scrape f2142464-d542-4906-8421-bc3fca85df92 starting 2025-06-02 15:35:02 debug [:]: Scrape a016796d-4fda-4d81-8f45-6fc2da90850d starting 2025-06-02 15:35:27 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"a016796d-4fda-4d81-8f45-6fc2da90850d","scrapeId":"a016796d-4fda-4d81-8f45-6fc2da90850d","startTime":1748878502298} 2025-06-02 15:35:27 debug [:]: Scrape 162ad9f3-1bf3-4eed-808f-f7b55c5dab21 starting 2025-06-02 15:35:29 debug [:]: Scrape 62ba53ed-7bd7-4bc3-8e3c-970089c87845 starting 2025-06-02 15:35:39 debug [:]: Scrape 11cc5c47-a0a3-4aa1-84a7-df097323f983 starting 2025-06-02 15:35:44 debug [:]: Scrape 045e27cd-1878-43bb-a0ce-c13bd30ef9e8 starting 2025-06-02 15:35:45 debug [:]: Scrape 84eb96aa-96cc-4c95-b366-ed4c7975abec starting 2025-06-02 15:35:45 debug [:]: Scrape acb7d7fb-cb2a-4c7e-b530-a8c4a2874cdc starting 2025-06-02 15:35:47 debug [:]: Scrape 580cc266-2c39-4987-a8d8-cf6e9675dfe5 starting 2025-06-02 15:35:57 debug [:]: Scrape bcaa8934-35b3-4913-a705-cf8f5f789385 starting 2025-06-02 15:36:08 debug [:]: Scrape c4060985-1f18-417a-a8df-9e4575e030c6 starting 2025-06-02 15:36:19 debug [:]: Scrape a70b54b0-effb-4bde-ba2a-3ce48b6975a5 starting 2025-06-02 15:36:21 debug [:]: Scrape 514f424d-d285-4257-b75f-ee3a533eb1a2 starting 2025-06-02 15:36:22 debug [:]: Scrape 2cf7d02a-13bc-4919-81ce-705eb59c88d5 starting 2025-06-02 15:36:24 debug [:]: Scrape f825b34b-3aa9-4e9d-8bd0-98bc5dcba0da starting 2025-06-02 15:36:24 debug [:]: Scrape 8b894328-b7b9-4e12-b747-a5cedf2d54cb starting 2025-06-02 15:36:25 debug [:]: Scrape 94faafea-201f-4357-be8a-549d837ecd40 starting 2025-06-02 15:36:26 debug [:]: Scrape 891886ff-f24f-420e-828b-fb760c0989ee starting 2025-06-02 15:36:30 debug [:]: Scrape 9342e62b-90b2-4923-a5df-d202729e21d3 starting 2025-06-02 15:36:31 debug [:]: Scrape 985d36bf-7cb6-44c4-ba94-f51802fde99f starting 2025-06-02 15:36:33 debug [:]: Scrape d4ee4816-8cba-4b8e-a35e-1de84253842e starting 2025-06-02 15:36:36 debug [:]: Scrape cbec317a-a2d4-491c-ab22-07b14e5d48bb starting 2025-06-02 15:36:37 debug [:]: Scrape 398e8f79-3dea-4b13-9a96-88927741010e starting 2025-06-02 15:36:42 debug [:]: Scrape b45fb712-3389-4207-95c9-0a723c1bc33c starting 2025-06-02 15:36:42 debug [:]: Scrape 312f47ee-33dd-431b-ad41-87446f6770d1 starting 2025-06-02 15:36:46 debug [:]: Scrape de854a78-d529-4f93-bd98-123699f9feb5 starting 2025-06-02 15:36:49 debug [:]: Scrape ba3da677-07b0-49ce-9958-543b1149f2f5 starting 2025-06-02 15:36:50 debug [:]: Scrape 2af02c13-8bcf-4f37-b82f-6e27ef981a32 starting 2025-06-02 15:36:53 debug [:]: Scrape f8d3acc8-ced8-451b-b85b-dafea65d3fec starting 2025-06-02 15:36:54 debug [:]: Scrape ed10e39d-478a-4173-a3b1-d5b4d6d2509c starting 2025-06-02 15:36:55 debug [:]: Scrape db9bd7d3-9bf6-4c14-8f89-02ad3b429bd0 starting 2025-06-02 15:36:57 debug [:]: Scrape 730388ff-55de-422c-a239-29b35ce6d16a starting 2025-06-02 15:36:57 debug [:]: Scrape a30b97ab-5564-4ea2-a4e2-1b94eb7215ee starting 2025-06-02 15:36:58 debug [:]: Scrape f7e844fe-438d-479a-b963-671b5b2ee1c9 starting 2025-06-02 15:37:00 debug [:]: Scrape e0dd76d9-6252-4f1c-b642-f438f9eabf29 starting 2025-06-02 15:37:01 debug [:]: Scrape 159fbe04-2036-47d3-ab6f-372b06cb0241 starting 2025-06-02 15:37:01 debug [:]: Scrape 5a26e6b7-de5a-43f4-86c7-f556c9a83fe3 starting 2025-06-02 15:37:02 debug [:]: Scrape 527fb964-1c0b-46f5-b1c6-02f34dea2c85 starting 2025-06-02 15:37:20 debug [:]: Scrape 6cf36b79-190e-4e1e-91e1-ff1fa5426215 starting 2025-06-02 15:37:29 debug [:]: Scrape c0bed968-951a-4210-9adc-0a34ba62b66e starting 2025-06-02 15:37:54 error [:]: Error in scrapeController: All scraping engines failed! -- Double check the URL to make sure it's not broken. If the issue persists, contact us at help@firecrawl.com. {"jobId":"c0bed968-951a-4210-9adc-0a34ba62b66e","scrapeId":"c0bed968-951a-4210-9adc-0a34ba62b66e","startTime":1748878649381} 2025-06-02 15:37:54 debug [:]: Scrape 6f3b4224-e98e-477d-9413-5b3e06bb2a1f starting 2025-06-02 15:37:55 debug [:]: Scrape b788cc6d-4782-4fb2-b322-e071ed1b4309 starting 2025-06-02 15:37:59 debug [:]: Scrape 3e3865d1-6b2c-46d9-b2e0-a9fe6823e9de starting 2025-06-02 15:38:01 debug [:]: Scrape 7f303403-cd62-4215-9c28-1b3420dbe731 starting 2025-06-02 15:38:02 debug [:]: Scrape 1f6d3f3c-18c5-4b01-87dc-781a81c72bde starting 2025-06-02 15:38:05 debug [:]: Scrape ee3cd989-3d0b-48a5-a236-ca694d5be230 starting 2025-06-02 15:38:17 debug [:]: Scrape 021f0336-85c8-4679-9a61-0a34540f1a37 starting 2025-06-02 15:38:28 debug [:]: Scrape 02c95521-60b9-4a0c-b122-5a5c9aea1f7c starting 2025-06-02 15:38:29 debug [:]: Scrape 37a797fe-66ed-4d8d-8130-32343f769556 starting 2025-06-02 15:38:31 debug [:]: Scrape 2ef85038-f072-44b2-963d-3e61a60147ad starting 2025-06-02 15:38:32 debug [:]: Scrape 309fa35d-3ff1-40f4-a5f2-3ec377bf2ad6 starting 2025-06-02 15:38:33 debug [:]: Scrape 50ad0a96-964e-4ca8-93d6-f94c72fb38e7 starting 2025-06-02 15:38:35 debug [:]: Scrape 43cb2256-7c3c-4d1c-be22-e1e10af32b66 starting 2025-06-02 15:38:37 debug [:]: Scrape 553c86c7-bd97-4771-b873-77e0c57f4799 starting 2025-06-02 15:38:55 debug [:]: Scrape edd87bf7-a51f-4673-8759-3f1e4050defd starting 2025-06-02 15:39:07 debug [:]: Scrape 155afa75-1ed6-48c3-b8e8-b7a7dddda75b starting 2025-06-02 15:39:11 debug [:]: Scrape f25916ac-46ec-48a0-a4ad-7c140e018ae4 starting 2025-06-02 15:39:14 debug [:]: Scrape ce9d13c4-ccf6-42ad-806d-eb7011e1e97a starting 2025-06-02 15:39:15 debug [:]: Scrape 1064c10f-e2e7-4f40-af71-bcece2d859e4 starting 2025-06-02 15:48:49 info [search:searchController]: Searching for results 2025-06-02 15:48:55 info [search:searchController]: Searching completed 2025-06-02 15:48:55 info [search:searchController]: Logging job ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/open-webui#4941