When the computer connected through Tether reconnected while the terminal's files panel was loading its working folder, a folder listing or a file, the load failed with "Tether connection interrupted". Reads like these are meant to be retried once Tether is back. They never were, because each of them went out with an empty upload attached, and an upload cannot be sent a second time. Requests with nothing to upload now go without one, so these reads are retried on the new connection. Uploads work as before.
Fixes#34394
With the Playwright web loader, the text inside definition lists and figures never reached the model. Reference pages that document each function or option as a term with its description, like the Python standard library docs, loaded without those entries, and figures lost their captions and any table inside them. The loader now keeps this text, as the default web loader already did.
Fixes#34281
When an assistant message has tool calls but no text, the OpenAI Chat Completions format uses `content: null`, since content is optional next to tool calls and OpenAI's own API returns null there. Open WebUI sent an empty string in two places: when replaying earlier tool calls from the chat history, and when converting requests from clients that use its Anthropic-compatible endpoint. For Claude models, LiteLLM 1.81.14 through 1.108.x replaces that empty string with "[System: Empty message content sanitised to satisfy protocol]", and the model then repeats that line in its replies (LiteLLM 1.109 and later leave the empty text out instead). These messages now go out with null content, which OpenAI and every provider tested on OpenRouter (Gemini, Claude, DeepSeek, Qwen, Mistral, Llama, Kimi and Grok) accept.
Fixes#34264
* fix: Browser tab in Chrome mode keeps reconnecting when its chat is open in two windows
With the same chat open in two windows, the terminal hands the Chrome tab to the newer window, but the older window only saw a lost connection. It reconnected and took the tab back, so both windows kept flipping to "Reconnecting…" and the "Browser opened in another viewer." message never showed. The terminal's reason for ending the tab's connection now reaches the page, as it already does for the shell. The window that lost the tab shows that message and stops, and the other window keeps the page.
Fixes#34095
* fix: Browser tab in Chrome mode keeps reconnecting when its chat is open in two windows
Narrows the change to passing the terminal's close reason on to the page. The relay's existing handling of a broken connection stays as it was.
Cursor and Pi model names carry brackets, equals signs, commas or slashes, and Open WebUI kept those in the ids of their agent models, so a pinned Cursor or Pi model opened a new chat on "Select a model". Agent models now get ids made only of letters, digits, dashes and underscores, with a few extra characters added when the name had to change, so two models never end up with the same id. The agent itself still runs on its own model name. Existing pins, default model choices and automations that point at an agent model whose name had other characters (dots included, as in most Codex models) stop matching and need the model picked again, and an existing chat with such an agent answers "Agent model is unavailable in the selected terminal" until the model is picked again.
Fixes#34168
Knowledge searches wrote the names and sources of the files they found to the server log at info level, and the SerpApi, Serply, Firecrawl, Yandex, Kagi, Mojeek and external web search engines wrote their whole results there, snippets included. Anyone who can read the logs could see what users looked up and what the model was given. These lines now log at debug, the same as the search queries, so they only show with GLOBAL_LOG_LEVEL=DEBUG.
Fixes#34129
When the terminal refused to start a coding agent, for example because the system prompt was longer than Open Terminal accepts, the error under the reply was a technical dump of that refusal with the whole system prompt in it. Such a refusal now shows "Agent environment request failed". Refusals the terminal explains in plain words, such as another reply still running in the chat, keep showing that reason.
Fixes#34172
When a turn started from an existing summary and its reply then compacted again between tool calls, the new summary was written without the earlier one whenever the plain summary prompt was used (a model with a filter, a separate Context Compaction Model, or a provider that refuses the cached replay). From the next turn on, everything the earlier summary held was gone. That compaction now gets the turn's summary as its previous summary, as a compaction at the start of a turn already does.
Fixes#34141
A window that had missed a turn, for example a laptop that just woke up and has not reconnected yet, saved its own, older idea of where the chat was when it saved an edited message. The chat then reopened on that older turn, and the next message started a new branch there, so the newest reply moved behind the branch switch and the model no longer saw it. A save now keeps the chat on the newest turn of the branch it is on, the same turn the chat already shows once it has caught up.
Fixes#34126
With the background memory review on, Open WebUI looks back over the chat every few messages (10 by default) to save or update memories, and it did this in temporary chats too. Facts from a temporary chat could end up as memories that stayed after the chat was closed and showed up in later chats. The automatic review now skips temporary chats, so they leave no memories behind unless the user asks for one. Normal chats are reviewed as before, and memories already saved from a temporary chat are not removed.
Fixes#34262
When tool use stopped for a reply (the tool call limit, the same call failing twice, or a reply cut off in the middle of a tool call), Open WebUI asks the model once more for a final answer, and that request carried an empty tools list. vLLM refuses that with a 400, so the reply ended in that error instead of an answer. The final answer request now keeps the chat's tools and turns tool calls off with tool choice "none", the standard setting for that. Ollama has no tool choice setting, so for Ollama models any request with tool choice "none" now leaves the tools out, which is the only way to keep the model from calling them.
Fixes#34169
Sub-agents could only be switched on or off for the whole instance, so once they were on every user could spawn them and an admin had no way to keep the extra model usage to a pilot group. The user permissions now have a Sub-agents switch under Features, both in the default permissions and in each group, next to Memories and working the same way. Users without the permission no longer get the sub-agent tool in their chats, nor the timer tool that is part of the same feature. Admins are not restricted by it, and with sub-agents off in Admin Settings nobody gets them, admins included. The permission is on by default, so existing instances behave as before until an admin turns it off; the default can also be set with the USER_PERMISSIONS_FEATURES_SUBAGENTS environment variable.
Closes#34038
A sub-agent could not see the files of the chat that handed it the task, the files it wrote never showed up in that chat, and its extra machine kept running after it finished. It now works in that chat's machine, the same way it already did on a terminal set to one machine per user.
A chat with a coding agent that was started with a terminal selected kept the default title, even with title generation on and a task model set. The title is now generated once the agent has replied, the same way as for any other model.
Fixes#33970