* fix: knowledge base files stay on "Uploading" instead of switching to "Processing"
A file added to a knowledge base is uploaded in a moment, and the long wait after that is the text extraction, which the file list still called "Uploading". Nothing updated on its own either, so the only way to find out whether a file had moved on or finished was to leave the knowledge base and come back. The file now switches to "Processing" as soon as it has reached the server, and the list keeps itself current until the file is ready, so slow text extraction no longer looks like a stuck upload. Adding a folder or a web page goes through a different flow and is not touched here.
* refac: inline the processing status update for knowledge base uploads
Moves the status update straight into the upload call with no change in behaviour.
* refac: drop a stray blank line and comment from the upload handler
Removes a blank line and a comment the previous follow-up added, with no change in behaviour.
On fresh installs the web loader and other HTML extraction came back empty because a transitive dependency update started crashing during tokenization. Holding that dependency at its last good version restores extraction. Verified on a clean Python 3.12 install that loading a page returns its text again.
Choosing Add Details, More Concise, or typing a suggestion under a reply sent the model your original question followed straight by the bare instruction, with the reply itself missing, so it answered the instruction on its own (for example "OK, I'll keep answers shorter") instead of rewriting that reply. The model now receives the reply it is being asked to change, so it returns a shorter, more detailed or altered version of it. Plain Try Again and temporary chats were not affected.
Fixes#33083
* fix: built-in tool toggles show while their feature is off
The model editor listed the Memory, Notes, Channels, Notifications, Web Search, Image Generation, Code Interpreter, Automations, Calendar and Sub-agents built-in tools even when the admin had turned that feature off for the whole instance, where those toggles do nothing. Each of them is now hidden while its feature is off, and the choices saved on a model are kept for when it is turned back on. The server now also reports whether sub-agents are on, and saving the Sub-agents settings updates the editor without a reload.
Refs #32830
* refac: name the feature switch map like the rest of the codebase
Uses the same name the model capabilities change uses for its matching map.
* refac: keep each tool's feature switch next to its label
Each built-in tool now carries its feature switch alongside its label and description, so the list is defined in one place.
* fix: built-in tools show while the model's matching capability is off
The Files built-in tool showed in the model editor although a model only gets it while File Upload is on and File Context is off, and File Context is on by default. The Memory, Web Search, Image Generation and Code Interpreter tools also showed while the same capability was off on that model. These tools now appear and disappear as the model's capabilities are switched, and the saved tool choices are kept for when the capability is turned back on.
Refs #32830
* refac: filter built-in tools by their capability directly
Same behaviour, with the per-tool capability list folded into the filter.
* fix: treat unset file capabilities as on when showing the Files tool
Matches how the server decides whether a model gets the Files tool.
Settings > Interface showed the Web Search Query Generation switch even with web search turned off, where it has no effect. It now only shows while web search is on, and its stored value is kept.
Refs #32830
* fix: Call button shows while speech-to-text is unavailable
Unless realtime voice is set up, a call needs the server to turn the user's speech into text. The Call button still showed when the speech-to-text engine is "Web API", where clicking it only answered "Call feature is not supported when using Web STT engine", and to users without the speech-to-text permission, where the call opened but nothing they said was transcribed. The button now shows only when a call can work: realtime voice is on, a call is already running, or the engine is not "Web API" and the user has the speech-to-text permission.
Refs #32830
* fix: keyboard shortcut also needs the speech-to-text permission for calls
The call shortcut and call links now follow the same speech-to-text rule as the Call button.
* refac: keep the whole Call button condition in one place
Also drops the Web API speech-to-text message from the Call button, since the button no longer shows for that engine.
* refac: keep the call permission check unchanged in the call shortcut
The speech-to-text rule for the call shortcut is now its own check after the existing call permission check, which stays as it was.
* fix: image engine settings show while image generation is off
Settings > Images showed the image engine, its credentials and the whole image edit section even with image generation turned off. They now only show while the Image Generation switch is on, and flipping it on shows them right away, so everything can be set up before saving. Stored engine settings and keys are kept.
Refs #32830
* fix: saving image settings without a required key turns image generation off
Saving Settings > Images with Image Generation on but a required URL or API key empty showed an "is required" error and flipped the switch back off, which now also hid the field that needed filling. The switch now stays on with the error, so the missing value can be filled in and saved right away. Nothing is saved until then.
Refs #32830
* refac: always require the Gemini API key while image generation is on
The key field only shows while image generation is on, so it is simply required now.
* refac: drop the stray blank lines left in the image settings save checks
Each missing-setting check now shows its error and stops right away, with no leftover gap from the removed lines.
* fix: files selected together for a knowledge base only appear one at a time
Selecting or dropping several files into a knowledge base showed a row for the first file only. The others got no row at all until the one before them had finished processing, which with slow text extraction can be many minutes per file, so they looked lost. Every selected file now shows up as "Uploading" straight away, in the order they will be uploaded, and keeps its row until it has been added to the knowledge base. Each file still waits for the previous one to finish processing, as before.
* refac: give the upload list a type
The list of files waiting to upload now carries the same type as the rows it holds.
A note imported from a .md or .txt file on the Notes page and not edited since showed all of its text twice when two people opened it at the same time, and the doubled text was then saved into the note. The shared editing session is now the only place that loads the text of such a note, the same as for notes that were already edited, so it opens once for everyone. Like an edited note, it now needs the live connection to show its text.
Fixes#33002
* perf: renaming a folder or deleting all chats takes seconds when many users are online
Renaming, sharing, moving or deleting a folder, and deleting all chats, each made the server recheck access for every chat that any online user had open in a browser tab, one database lookup at a time, before the request finished, and every one of those open chats reloaded its contents afterwards. Any user can do these, so with a few thousand people online every such click took several seconds and reloaded everyone's open chat. Owners keep access to their own chats (a role change or account deletion already disconnects them), so the recheck now skips owners entirely, with no lookup and no reload, and only checks people viewing someone else's chat and chats that no longer exist. Anyone who lost access is still removed from the chat as before.
Postgres 16, one open chat per online user, 2% of them viewing someone else's chat, time for a folder rename (the other actions above run the same recheck):
| Online users | No Redis, before | No Redis, after | Redis, before | Redis, after |
| --- | --- | --- | --- | --- |
| 1,000 | 2.2 s | 0.12 s | 2.5 s | 0.23 s |
| 3,000 | 6.9 s | 0.60 s | 7.7 s | 0.78 s |
* refac: collect the open chats with a plain loop
Same behaviour, the owner lookup now reads more plainly.
* refac: shorten the owner comment in the chat access sweep
* fix: web search engine settings show while web search is off
Settings > Web Search showed the search engine picker and all engine credentials even with web search turned off. They now only show while the Web Search switch is on, and flipping it on shows them right away, so the engine can be set up before saving. An API key the web loader shares with the hidden engine now shows in the loader section instead. Stored engine settings and keys are kept.
Refs #32830
* fix: web search confirmation and Bypass Web Loader show while web search is off
The Web Search Confirmation switch, its text and the Bypass Web Loader switch also showed with web search turned off, although they only act on web searches. They now hide together with the engine settings, and their stored values are kept. Bypass Embedding and Retrieval and Trust Proxy Environment stay visible, since they also apply to web pages attached to a chat.
Refs #32830
* refac: mark web search fields as plainly required
These fields only show while web search is on, so tying their required flag to the toggle no longer does anything.
* refac: write the web search checks inline
Same behaviour, the conditions now sit directly where they are used.
* fix: /skills:create shows for models that cannot create skills
"/skills:create" showed when the model had the "Builtin Tools" capability or its "Skills" built-in tool turned off, and the model then answered that skill creation is disabled. The command now shows only when every selected model has both turned on.
Refs #32830
* refac: keep the skill creation check with the other model capability checks
Moves the check next to the other per-model capability checks so it reads like them.
* refac: add type annotations to the skill creation check
Restores the type on the new option and types the new check.
Settings > Interface showed "Regenerate Menu" to users without permission to regenerate responses. Those users have no regenerate button, so the setting did nothing. It now only shows to users who can regenerate, and the settings search skips it for everyone else.
Refs #32830
Settings > Interface showed the terminal file display, show files on terminal select and terminal preview settings to users who have no terminal to use, which is the default. They now show once the user can reach a terminal, either one the admin set up or one of their own, the same way the chat input decides whether to offer the terminal picker. In the admin default interface settings they show whenever the instance offers terminals.
Refs #32830
* fix: model capability toggles show while their feature is off
In the model editor and the admin model defaults, the Web Search, Image Generation, Code Interpreter and Memory capabilities and the matching Default Features showed even when the admin had turned that feature off for the whole instance, so switching them did nothing. They are now hidden while the feature is off. Values already saved on a model are kept, so turning the feature back on restores each model's settings.
Refs #32830
* refac: use the codebase's name for instance feature switches
Renames the new feature lookup to match how the rest of the frontend refers to instance features.
* refac: keep each feature switch next to its capability
Reads the instance feature switch from the existing capability list instead of a separate map, with no change in behaviour.
* fix: MCP tools that list their arguments under anyOf are called with no arguments
When an MCP tool described its input as alternatives, for example a page by id or by path and locale, and had no top-level list of fields, every argument the model sent was dropped and the tool was called with nothing, so the server rejected the call. Arguments for MCP tools now reach the server as the model sent them, and the MCP server checks them against its own schema. Other tool types still keep only the arguments their schema lists.
Fixes#32898
* refac: shorten the MCP arguments comment
The comment now only says why MCP tools skip the argument filter.
* fix: MCP tool errors reach the model as a Python list dump instead of the server's message
When an MCP tool server answered a call with an error, the model got a Python dump of the whole result list, with quotes, annotations and meta fields, instead of the error text the server wrote. Line breaks in the message were escaped as well, so a validation error listing the missing argument was hard to read and models tended to retry the same broken call. The model now gets the server's error text as written, the same way successful results already arrive.
Fixes#32918
* refac: drop the fallback text for MCP errors with no message
The error now carries only the text the server sent.
* fix: keep a readable error when an MCP error has no text
MCP error results that only carry images, audio or resources now give the model a short error message instead of an empty one.
* fix: Terminal capability shows while no terminal server exists
The Terminal capability showed in the model editor even when the admin had set up no terminal server and direct integrations were off, which is the default, so it did nothing. It now shows only when an enabled terminal server exists or users can add their own through direct integrations, and the value saved on a model is kept. The server now reports whether any enabled terminal server exists, since the editor itself only sees the servers the current user can access and a model can be shared with other users.
Refs #32830
* fix: hide the default terminal picker when no terminal is available
The model editor still showed the default terminal line when no terminal server or direct integration was available. It now follows the same rule as the Terminal capability.
* fix: temporary chat and delete chat shortcuts show while not allowed
The keyboard shortcuts list showed "New Temporary Chat" and "Delete Chat" to users who may not use temporary chats or delete chats, and pressing those shortcuts neither opened a temporary chat nor deleted anything for them. Both entries now only show to users with the matching permission, and the settings search skips them otherwise.
Refs #32830
* fix: new temporary chat shortcut does nothing without the permission
Users without the temporary chat permission were sent to a new chat by the New Temporary Chat shortcut; it now does nothing for them.
Fixes CVE-2026-111497 (the "Node2Shell"/"HTTP2Shell" Brotli decoder flaw). Open WebUI decodes Brotli responses automatically whenever it fetches from a model provider, a tool server or a web page, so a malicious server could hand it a crafted response that hits the vulnerable decoder. Both packages now use the fixed releases.
The required parameters of OpenAPI tool server tools, Open Terminal included, were sent to the model in a random order that could change every time Open WebUI restarted. The tool list sits at the start of every prompt, so a different order made every prefix cache on the model side miss, and long chats were processed again from scratch after a restart. The required parameters now keep the order the tool server declares, so the tool list stays identical across restarts.
Picks up the 3.14.4 security release and the 3.14.5 fixes. Open WebUI only uses aiohttp as a client, and the fixes that apply there stop Secure cookies from going out over plain HTTP, stop a connection from being reused after a cancelled upload, fix a memory leak on upstream websocket connections, and keep a websocket open when the server sends a control frame with the RSV1 bit set. Its URL library yarl moves to 1.25.1 because the new aiohttp requires it. Checked with a fresh install, the startup check, the unit and outbound HTTP integration tests, and a streamed chat.
Pillow, the image library behind image uploads, edits and PDF image reading, moves to 13.0.0, the major release that carries fixes for crafted image files in its JPEG, TIFF, GIF, BMP and other decoders. No code had to change, since nothing in Open WebUI uses the features this release removed or changed. Verified with a real install, a server boot, the unit tests and the image-related integration tests, plus live runs of chat image uploads, image editing, PDF image extraction and profile pictures that gave the same results as the current version.
pypdf moves from 6.7.5 to 6.21.2, which brings many fixes for malformed PDFs that could hang the server or exhaust its memory during upload. Its text extraction also changed a little: some line breaks inside a block of text now come out as spaces, so a re-uploaded document can be split into chunks slightly differently, with the same words. cryptography picks up its 48.0.1 patch release, which ships wheels built against OpenSSL 4.0.1. Verified with a real install, the startup check and the upload, retrieval and sign-in tests, plus a text PDF and an image PDF that give the same extracted text as before.