I have searched for any existing and/or related issues.
I have searched for any existing and/or related discussions.
I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!).
I am using the latest version of Open WebUI.
Installation Method
Other
Open WebUI Version
v0.8.3
Ollama Version (if applicable)
v0.16.1
Operating System
Ubuntu 24.04
Browser (if applicable)
Chrome
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 provided every relevant configuration, setting, and environment variable used in my setup.
I have clearly listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
I have documented step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation. My steps:
Start with the initial platform/version/OS and dependencies used,
Specify exact install/launch/configure commands,
List URLs visited, user input (incl. example values/emails/passwords if needed),
Describe all options and toggles enabled or changed,
Include any files or environmental changes,
Identify the expected and actual result at each stage,
Ensure any reasonably skilled user can follow and hit the same issue.
Expected Behavior
Given the following chat prompt to summarize a PDF document, I expect the Web Search (SearXNG), Web Loader (Playwright), and Content Extraction (Tika) pipeline to yield usable textual results for the model to work with, but the pipeline fails.
Stanford AI safety technical governance challenges whitepaper
Searched 55 sites
Querying
Stanford AI Safety whitepaper 2024 2025 2026
aisafety.stanford.edu whitepaper pdf summary
Stanford AI safety technical governance challenges whitepaper
Retrieved 3 sources
Based on the context provided, I can share some information about the Stanford Center for AI Safety and their activities, but I don't have access to the actual full whitepaper content from that URL.
The Open WebUI container logs are littered with exceptions (see below) for every URL to a PDF document, which triggers a file download in Playwright instead of loading an HTML page.
Steps to Reproduce
Configure external SearXNG for Web Search
Configure external Playwright for Web Loader
Configure Tika as Content Extraction provider
Select any model for the chat
Enable Web Search capability for the chat
Enter prompt to search for a PDF document
Examine the container logs for exceptions
Response indicates that PDFs could not be loaded and extracted
Logs & Screenshots
The following exception will repeat for each .pdf URL Playwright tries to retrieve.
2026-02-18 08:42:45.060 | ERROR | open_webui.retrieval.web.utils:alazy_load:545 - Error loading https://aisafety.stanford.edu/whitepaper.pdf: Page.goto: Download is starting
Call log:
- navigating to "https://aisafety.stanford.edu/whitepaper.pdf", waiting until "load"
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/usr/local/lib/python3.11/site-packages/uvicorn/__main__.py", line 4, in <module>
uvicorn.main()
│ └ <Command main>
└ <module 'uvicorn' from '/usr/local/lib/python3.11/site-packages/uvicorn/__init__.py'>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function Command.main at 0x7b9d0f417100>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1406, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x7b9d10148d50>
│ └ <function Command.invoke at 0x7b9d0f416de0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1269, 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 0x7b9d10148d50>
│ │ │ └ <function main at 0x7b9d0f217ec0>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x7b9d0f416020>
└ <click.core.Context object at 0x7b9d10148d50>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 824, 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': ...
│ └ ()
└ <function main at 0x7b9d0f217ec0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 424, in main
run(
└ <function run at 0x7b9d0f2cdc60>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 594, in run
server.run()
│ └ <function Server.run at 0x7b9d0f2cd4e0>
└ <uvicorn.server.Server object at 0x7b9d0f447d90>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 67, in run
return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
│ │ │ │ │ │ └ <function Config.get_loop_factory at 0x7b9d0f3e0360>
│ │ │ │ │ └ <uvicorn.config.Config object at 0x7b9d0f221b10>
│ │ │ │ └ <uvicorn.server.Server object at 0x7b9d0f447d90>
│ │ │ └ None
│ │ └ <function Server.serve at 0x7b9d0f2cd580>
│ └ <uvicorn.server.Server object at 0x7b9d0f447d90>
└ <function asyncio_run at 0x7b9d0f41a020>
File "/usr/local/lib/python3.11/site-packages/uvicorn/_compat.py", line 30, in asyncio_run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x7b9d0f17f5b0>
│ └ <function Runner.run at 0x7b9d0f66cfe0>
└ <asyncio.runners.Runner object at 0x7b9d0f229890>
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:71> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x7b9d0ef42800>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x7b9d0f229890>
File "/app/backend/open_webui/main.py", line 1787, in process_chat
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x7b9ca5d144a0>
│ └ {'user_id': 'b4b671fb-8c8d-4831-a220-77a88a9cb3c5', 'chat_id': '4ba95696-3c3d-4a1a-a0ef-7c1ea9797dce', 'message_id': '9d77907...
└ {'stream': True, 'model': 'claude-sonnet-4-5', 'messages': [{'role': 'system', 'content': 'Today is 2026-02-18, and the time ...
File "/app/backend/open_webui/utils/middleware.py", line 2172, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x7b9ca5f1fe20>
File "/app/backend/open_webui/utils/middleware.py", line 1349, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x7b9ca86023e0>
File "/app/backend/open_webui/routers/retrieval.py", line 2406, in process_web_search
docs = await loader.aload()
│ └ <function PlaywrightURLLoader.aload at 0x7b9cabe92c00>
└ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
File "/usr/local/lib/python3.11/site-packages/langchain_community/document_loaders/url_playwright.py", line 218, in aload
return [doc async for doc in self.alazy_load()]
│ └ <function SafePlaywrightURLLoader.alazy_load at 0x7b9cabea8f40>
└ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
File "/usr/local/lib/python3.11/site-packages/langchain_community/document_loaders/url_playwright.py", line 218, in <listcomp>
return [doc async for doc in self.alazy_load()]
│ └ Document(metadata={'source': 'https://internationalaisafetyreport.org/publication/international-ai-safety-report-2026'}, page...
└ Document(metadata={'source': 'https://internationalaisafetyreport.org/publication/international-ai-safety-report-2026'}, page...
> File "/app/backend/open_webui/retrieval/web/utils.py", line 536, in alazy_load
response = await page.goto(url, timeout=self.playwright_timeout)
│ │ │ │ └ 60000
│ │ │ └ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
│ │ └ 'https://aisafety.stanford.edu/whitepaper.pdf'
│ └ <function Page.goto at 0x7b9c9441eac0>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/async_api/_generated.py", line 9045, in goto
await self._impl_obj.goto(
│ │ └ <function Page.goto at 0x7b9c94409c60>
│ └ <Page url='about:blank'>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_page.py", line 552, in goto
return await self._main_frame.goto(**locals_to_params(locals()))
│ │ │ └ <function locals_to_params at 0x7b9c960d20c0>
│ │ └ <function Frame.goto at 0x7b9c946a76a0>
│ └ <Frame name= url='about:blank'>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_frame.py", line 153, in goto
await self._channel.send(
│ │ └ <function Channel.send at 0x7b9c960d1120>
│ └ <playwright._impl._connection.Channel object at 0x7b9c4e67d250>
└ <Frame name= url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_connection.py", line 69, in send
return await self._connection.wrap_api_call(
│ │ └ <function Connection.wrap_api_call at 0x7b9c960e8ae0>
│ └ <playwright._impl._connection.Connection object at 0x7b9ce6483210>
└ <playwright._impl._connection.Channel object at 0x7b9c4e67d250>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_connection.py", line 559, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
└ <function rewrite_error at 0x7b9c96037740>
playwright._impl._errors.Error: Page.goto: Download is starting
Call log:
- navigating to "https://aisafety.stanford.edu/whitepaper.pdf", waiting until "load"
Additional Information
The current SafePlaywrightURLLoader expects an HTML page to load, from which it can extract text to create a Document object, but if the browser triggers a file download instead (PDF file is just an example--other file types can also trigger downloads instead of completing a full page load), Playwright raises an exception with message Download is starting.
This "download" path requires different handling by saving the download file to a temporary location, then feed it to the Loader engine (e.g. Tika) to yield a Document containing the extracted text, followed by temp file cleanup.
Originally created by @erhhung on GitHub (Feb 18, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/21567
### Check Existing Issues
- [x] I have searched for any existing and/or related issues.
- [x] I have searched for any existing and/or related discussions.
- [x] I have also searched in the CLOSED issues AND CLOSED discussions and found no related items (your issue might already be addressed on the development branch!).
- [x] I am using the latest version of Open WebUI.
### Installation Method
Other
### Open WebUI Version
v0.8.3
### Ollama Version (if applicable)
v0.16.1
### Operating System
Ubuntu 24.04
### Browser (if applicable)
Chrome
### 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 **provided every relevant configuration, setting, and environment variable used in my setup.**
- [x] I have clearly **listed every relevant configuration, custom setting, environment variable, and command-line option that influences my setup** (such as Docker Compose overrides, .env values, browser settings, authentication configurations, etc).
- [x] I have documented **step-by-step reproduction instructions that are precise, sequential, and leave nothing to interpretation**. My steps:
- Start with the initial platform/version/OS and dependencies used,
- Specify exact install/launch/configure commands,
- List URLs visited, user input (incl. example values/emails/passwords if needed),
- Describe all options and toggles enabled or changed,
- Include any files or environmental changes,
- Identify the expected and actual result at each stage,
- Ensure any reasonably skilled user can follow and hit the same issue.
### Expected Behavior
Given the following chat prompt to summarize a PDF document, I expect the Web Search (SearXNG), Web Loader (Playwright), and Content Extraction (Tika) pipeline to yield usable textual results for the model to work with, but the pipeline fails.
> Search for this whitepaper and give me a short summary: https://aisafety.stanford.edu/whitepaper.pdf
### Actual Behavior
`claude-sonnet-4-5` Today at 12:42 AM
Retrieved 3 sources
- Searching the web
- Searching
- Stanford AI Safety whitepaper 2024 2025 2026
- aisafety.stanford.edu whitepaper pdf summary
- Stanford AI safety technical governance challenges whitepaper
- Searched 55 sites
- Querying
- Stanford AI Safety whitepaper 2024 2025 2026
- aisafety.stanford.edu whitepaper pdf summary
- Stanford AI safety technical governance challenges whitepaper
- Retrieved 3 sources
> Based on the context provided, I can share some information about the Stanford Center for AI Safety and their activities, but I don't have access to the actual full whitepaper content from that URL.
---
The Open WebUI container logs are littered with exceptions (see below) for every URL to a PDF document, which triggers a file download in Playwright instead of loading an HTML page.
### Steps to Reproduce
1. Configure external SearXNG for Web Search
2. Configure external Playwright for Web Loader
3. Configure Tika as Content Extraction provider
4. Select any model for the chat
5. Enable Web Search capability for the chat
6. Enter prompt to search for a PDF document
7. Examine the container logs for exceptions
8. Response indicates that PDFs could not be loaded and extracted
### Logs & Screenshots
The following exception will repeat for each `.pdf` URL Playwright tries to retrieve.
```
2026-02-18 08:42:45.060 | ERROR | open_webui.retrieval.web.utils:alazy_load:545 - Error loading https://aisafety.stanford.edu/whitepaper.pdf: Page.goto: Download is starting
Call log:
- navigating to "https://aisafety.stanford.edu/whitepaper.pdf", waiting until "load"
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/usr/local/lib/python3.11/site-packages/uvicorn/__main__.py", line 4, in <module>
uvicorn.main()
│ └ <Command main>
└ <module 'uvicorn' from '/usr/local/lib/python3.11/site-packages/uvicorn/__init__.py'>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1485, in __call__
return self.main(*args, **kwargs)
│ │ │ └ {}
│ │ └ ()
│ └ <function Command.main at 0x7b9d0f417100>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1406, in main
rv = self.invoke(ctx)
│ │ └ <click.core.Context object at 0x7b9d10148d50>
│ └ <function Command.invoke at 0x7b9d0f416de0>
└ <Command main>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1269, 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 0x7b9d10148d50>
│ │ │ └ <function main at 0x7b9d0f217ec0>
│ │ └ <Command main>
│ └ <function Context.invoke at 0x7b9d0f416020>
└ <click.core.Context object at 0x7b9d10148d50>
File "/usr/local/lib/python3.11/site-packages/click/core.py", line 824, 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': ...
│ └ ()
└ <function main at 0x7b9d0f217ec0>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 424, in main
run(
└ <function run at 0x7b9d0f2cdc60>
File "/usr/local/lib/python3.11/site-packages/uvicorn/main.py", line 594, in run
server.run()
│ └ <function Server.run at 0x7b9d0f2cd4e0>
└ <uvicorn.server.Server object at 0x7b9d0f447d90>
File "/usr/local/lib/python3.11/site-packages/uvicorn/server.py", line 67, in run
return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
│ │ │ │ │ │ └ <function Config.get_loop_factory at 0x7b9d0f3e0360>
│ │ │ │ │ └ <uvicorn.config.Config object at 0x7b9d0f221b10>
│ │ │ │ └ <uvicorn.server.Server object at 0x7b9d0f447d90>
│ │ │ └ None
│ │ └ <function Server.serve at 0x7b9d0f2cd580>
│ └ <uvicorn.server.Server object at 0x7b9d0f447d90>
└ <function asyncio_run at 0x7b9d0f41a020>
File "/usr/local/lib/python3.11/site-packages/uvicorn/_compat.py", line 30, in asyncio_run
return runner.run(main)
│ │ └ <coroutine object Server.serve at 0x7b9d0f17f5b0>
│ └ <function Runner.run at 0x7b9d0f66cfe0>
└ <asyncio.runners.Runner object at 0x7b9d0f229890>
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:71> wai...
│ │ └ <cyfunction Loop.run_until_complete at 0x7b9d0ef42800>
│ └ <uvloop.Loop running=True closed=False debug=False>
└ <asyncio.runners.Runner object at 0x7b9d0f229890>
File "/app/backend/open_webui/main.py", line 1787, in process_chat
form_data, metadata, events = await process_chat_payload(
│ │ └ <function process_chat_payload at 0x7b9ca5d144a0>
│ └ {'user_id': 'b4b671fb-8c8d-4831-a220-77a88a9cb3c5', 'chat_id': '4ba95696-3c3d-4a1a-a0ef-7c1ea9797dce', 'message_id': '9d77907...
└ {'stream': True, 'model': 'claude-sonnet-4-5', 'messages': [{'role': 'system', 'content': 'Today is 2026-02-18, and the time ...
File "/app/backend/open_webui/utils/middleware.py", line 2172, in process_chat_payload
form_data = await chat_web_search_handler(
└ <function chat_web_search_handler at 0x7b9ca5f1fe20>
File "/app/backend/open_webui/utils/middleware.py", line 1349, in chat_web_search_handler
results = await process_web_search(
└ <function process_web_search at 0x7b9ca86023e0>
File "/app/backend/open_webui/routers/retrieval.py", line 2406, in process_web_search
docs = await loader.aload()
│ └ <function PlaywrightURLLoader.aload at 0x7b9cabe92c00>
└ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
File "/usr/local/lib/python3.11/site-packages/langchain_community/document_loaders/url_playwright.py", line 218, in aload
return [doc async for doc in self.alazy_load()]
│ └ <function SafePlaywrightURLLoader.alazy_load at 0x7b9cabea8f40>
└ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
File "/usr/local/lib/python3.11/site-packages/langchain_community/document_loaders/url_playwright.py", line 218, in <listcomp>
return [doc async for doc in self.alazy_load()]
│ └ Document(metadata={'source': 'https://internationalaisafetyreport.org/publication/international-ai-safety-report-2026'}, page...
└ Document(metadata={'source': 'https://internationalaisafetyreport.org/publication/international-ai-safety-report-2026'}, page...
> File "/app/backend/open_webui/retrieval/web/utils.py", line 536, in alazy_load
response = await page.goto(url, timeout=self.playwright_timeout)
│ │ │ │ └ 60000
│ │ │ └ <open_webui.retrieval.web.utils.SafePlaywrightURLLoader object at 0x7b9c4e68a0d0>
│ │ └ 'https://aisafety.stanford.edu/whitepaper.pdf'
│ └ <function Page.goto at 0x7b9c9441eac0>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/async_api/_generated.py", line 9045, in goto
await self._impl_obj.goto(
│ │ └ <function Page.goto at 0x7b9c94409c60>
│ └ <Page url='about:blank'>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_page.py", line 552, in goto
return await self._main_frame.goto(**locals_to_params(locals()))
│ │ │ └ <function locals_to_params at 0x7b9c960d20c0>
│ │ └ <function Frame.goto at 0x7b9c946a76a0>
│ └ <Frame name= url='about:blank'>
└ <Page url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_frame.py", line 153, in goto
await self._channel.send(
│ │ └ <function Channel.send at 0x7b9c960d1120>
│ └ <playwright._impl._connection.Channel object at 0x7b9c4e67d250>
└ <Frame name= url='about:blank'>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_connection.py", line 69, in send
return await self._connection.wrap_api_call(
│ │ └ <function Connection.wrap_api_call at 0x7b9c960e8ae0>
│ └ <playwright._impl._connection.Connection object at 0x7b9ce6483210>
└ <playwright._impl._connection.Channel object at 0x7b9c4e67d250>
File "/usr/local/lib/python3.11/site-packages/playwright/_impl/_connection.py", line 559, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
└ <function rewrite_error at 0x7b9c96037740>
playwright._impl._errors.Error: Page.goto: Download is starting
Call log:
- navigating to "https://aisafety.stanford.edu/whitepaper.pdf", waiting until "load"
```
### Additional Information
The current `SafePlaywrightURLLoader` expects an HTML page to load, from which it can extract text to create a `Document` object, but if the browser triggers a file download instead (PDF file is just an example--other file types can also trigger downloads instead of completing a full page load), Playwright raises an exception with message `Download is starting`.
This "download" path requires different handling by saving the download file to a temporary location, then feed it to the `Loader` engine (e.g. Tika) to yield a `Document` containing the extracted text, followed by temp file cleanup.
GiteaMirror
added the bug label 2026-05-18 04:55:34 -05:00
You can build your own web extractor service, which detects the file type - forwards the pdf to tika - sends back extracted text to Open WebUI upon retrieving such a pdf file. Open WebUI per default doesn't extract pdfs from web retrievals. You'd need to implement this yourself using a custom web retriever.
Good feature idea though, but maybe should be implemented on your own. Not all document extraction engines can handle all file types, and there is a lot more one could download from websites besides PDFs.
<!-- gh-comment-id:3919750464 -->
@Classic298 commented on GitHub (Feb 18, 2026):
NAB - missing feature.
You can build your own web extractor service, which detects the file type - forwards the pdf to tika - sends back extracted text to Open WebUI upon retrieving such a pdf file. Open WebUI per default doesn't extract pdfs from web retrievals. You'd need to implement this yourself using a custom web retriever.
Good feature idea though, but maybe should be implemented on your own. Not all document extraction engines can handle all file types, and there is a lot more one could download from websites besides PDFs.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Originally created by @erhhung on GitHub (Feb 18, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/21567
Check Existing Issues
Installation Method
Other
Open WebUI Version
v0.8.3
Ollama Version (if applicable)
v0.16.1
Operating System
Ubuntu 24.04
Browser (if applicable)
Chrome
Confirmation
README.md.Expected Behavior
Given the following chat prompt to summarize a PDF document, I expect the Web Search (SearXNG), Web Loader (Playwright), and Content Extraction (Tika) pipeline to yield usable textual results for the model to work with, but the pipeline fails.
Actual Behavior
claude-sonnet-4-5Today at 12:42 AMRetrieved 3 sources
The Open WebUI container logs are littered with exceptions (see below) for every URL to a PDF document, which triggers a file download in Playwright instead of loading an HTML page.
Steps to Reproduce
Logs & Screenshots
The following exception will repeat for each
.pdfURL Playwright tries to retrieve.Additional Information
The current
SafePlaywrightURLLoaderexpects an HTML page to load, from which it can extract text to create aDocumentobject, but if the browser triggers a file download instead (PDF file is just an example--other file types can also trigger downloads instead of completing a full page load), Playwright raises an exception with messageDownload is starting.This "download" path requires different handling by saving the download file to a temporary location, then feed it to the
Loaderengine (e.g. Tika) to yield aDocumentcontaining the extracted text, followed by temp file cleanup.@Classic298 commented on GitHub (Feb 18, 2026):
NAB - missing feature.
You can build your own web extractor service, which detects the file type - forwards the pdf to tika - sends back extracted text to Open WebUI upon retrieving such a pdf file. Open WebUI per default doesn't extract pdfs from web retrievals. You'd need to implement this yourself using a custom web retriever.
Good feature idea though, but maybe should be implemented on your own. Not all document extraction engines can handle all file types, and there is a lot more one could download from websites besides PDFs.