Commit Graph
18673 Commits
Author SHA1 Message Date
Classic298 6b36f620cf fix: stop KeyError 'model' traceback on every new chat from initial title generation (#30356)
Every new saved chat logged "Error generating initial chat title" with a
KeyError: 'model' traceback. The title itself was already generated and
saved by then, so the log was misleading, and the memory settings played no
part in it. The error was silently logged at debug level since v0.10.0 and
became visible in v0.11.4 when the title path switched to log.exception.

The initial title task runs the shared background handler with a context
that has no resolved model, which the memory review step read
unconditionally. It now reads it with a default of None, which the memory
review already accepts. The title path never carries an assistant message,
so the review stops before doing any work there, and the main completion
path keeps reviewing memory exactly once per turn with the real model.

Fixes #30339
2026-09-22 11:35:14 -04:00
Classic298 f956f7adc0 fix: send only the file name to Docling instead of the full storage path (#30357)
With the Docling content extraction engine, every conversion request
carried the server's full internal upload path (for example
/app/backend/data/uploads/<id>_report.pdf) as the multipart file name.
Docling only needs a bare file name, and a hosted Docling instance has
no business learning where Open WebUI keeps its files on disk.

The loader now sends the base name of the stored file, which is what
the MinerU, Datalab and Mistral loaders already do. Nothing else in
the request or the parsed result changes, verified against a capturing
mock server before and after.

Fixes #30352
2026-09-22 11:35:05 -04:00
Classic298 6f6792d484 fix: pass MCP tool images to the model, not only to the UI (#30358)
When an MCP tool returns an image (e.g. a Home Assistant camera snapshot), the
snapshot shows up in the tool call section but the model never sees it: it
answers that there is no image. Only images arriving as inline data URIs were
attached to the model request; MCP images are uploaded to Files first and their
file URL was treated as display-only.

Now an image file item with a file URL is attached to the model request as an
input_image part in addition to staying in the tool call's displayed files. The
existing URL-to-base64 step already resolves file URLs, so the model receives
the image bytes; verified on a running instance with a mock MCP server and a
mock upstream (the second upstream request carries the byte-identical JPEG).
Inline data-URI images keep their existing model-only handling.

Fixes #30327
2026-09-22 11:34:57 -04:00
Classic298 fecbeac7d1 Merge pull request #30354 from Classic298/i18n-en-us-fallback
fix: keep en-US as the last i18n fallback when a stored locale has no bundle
2026-09-22 11:34:44 -04:00
Timothy Jaeryang Baek 344ea53068 doc: changelog 2026-09-21 15:21:52 -04:00
Timothy Jaeryang Baek ca75b4de23 refac 2026-09-21 15:20:43 -04:00
Classic298 33df4a75bd chore: changelog (#29874)
* chore: open the 0.11.4 changelog

Starts the section for the commits landed on dev after the 0.11.3 entry was
merged. Fixed records the direct connection listener left behind on every
request that ended badly, the metadata attached to an uploaded file that never
reached the retrieved sources, the slash command menu showing white text on
white in the light theme, and image editing refusing an image the instance
already held. Added carries the general improvements placeholder and the
Traditional Chinese, Korean and Finnish catalogues.

The tailwind reflow and the raw string escapes are omitted, the first being
whitespace and the second changing nothing that is visible today, though it
keeps the knowledge filesystem tools importable on a later Python.

* chore: extend the metadata and translation entries in 0.11.4

The metadata entry gains the follow-up that trims what travels with each piece
of a file, keeping the oversized and internal fields out of every chunk and
picking up metadata nested a level down, and is recorded there rather than as a
second entry because it continues the same story. The translation entry gains
the Russian and Ukrainian catalogues.

The settings group headings and the keys added for them are omitted: the new
keys carry no translation in any catalogue yet, so every heading still reads as
it did, and the change only makes them translatable later.

* chore: add the security advisory notice to 0.11.4

Adds the standard notice as the first item in the Fixed section. The release
touches the guard that keeps image editing from reaching private addresses, and
carries a listener leak a caller could drive without limit, so it meets the
trigger the format sets for the notice. The notice is the fixed wording and
takes no reference links of its own; the individual entries keep theirs.

* chore: record the file metadata entry as an addition in 0.11.4

Metadata attached to an upload reaching the retrieved sources is a capability
that was not there before rather than a correction, so the entry moves to Added
and leads that section, ahead of the general improvements placeholder and the
translation entry in their reserved places. The wording drops the framing that
described it as something no longer going missing; its pull request, issue and
follow-up commit travel with it unchanged.

* chore: give the file metadata entry a noun phrase label

The label read as an outcome, which suits a correction rather than an addition
and left the entry sounding like something that had stopped going wrong. It is
now the plain noun phrase the format asks of a label, with the sentence beneath
carrying what the metadata now does.

* chore: add the settings group heading entry to 0.11.4

The groundwork that made these headings translatable was held back last time,
the keys having landed empty in every catalogue so nothing read differently.
Russian and Ukrainian now carry the wording, so the change shows and the entry
joins Fixed at the foot of the section, below the corrections that reach
further. The two commits that made the headings translatable are referenced;
the catalogues that filled them sit in the translation entry, which names both
languages and carries no links.

* chore: add the code formatter entry and widen the translation coverage entry in 0.11.4

Fixed leads with the built-in code formatter, which pulled in the formatter but
none of the packages it depends on, so saving any tool or function ended in a
missing module error however plain the code was. It sits directly below the
advisory, being the correction that stops the most people getting their work
saved.

The settings heading entry widens into one covering every string that was fixed
in English, the headings among them, now that labels and messages across the
admin pages, the workspace and notifications have been opened up the same way
and Spanish, Russian and Ukrainian have filled them in. Its five commits travel
together. German and Spanish join the translation entry.

* chore: add the notes shortcut and web citation entries to 0.11.4

Added records the shortcut that turns a note's menu button into a delete button
while Shift is held, ahead of the placeholder and translation entries in their
reserved places.

Fixed records the pages a web search only listed no longer being offered as
things to cite, which had produced citations pointing at the wrong result under
a title that read as correct. It sits directly below the code formatter, a
citation that is wrong being worse to a reader than one that is missing.

* chore: add the version check, ligature and search entries to 0.11.4

Fixed gains the version check that reported whatever it was running as the
newest release whenever it could not reach the listing, and logged nothing
about it, which is placed high because an administrator reads it as an answer
rather than a failure. It also gains the arrow sequences drawn as glyphs, which
had text look altered although every character was stored and sent as typed;
that one sits with the other reading corrections.

Added gains the text search moved off the path the server answers on, so a long
search no longer keeps other requests waiting.

The metadata entry gains the four vector stores that never applied the shared
size cap, coercion and sanitising, bringing them in line with the other eleven
rather than standing as an entry of its own.

* chore: extend the quick delete entry to automations in 0.11.4

The shortcut that turns a note's trailing controls into a delete button now does
the same for a row on the automations page, so the entry names both places and
carries both pull requests with the issues they close, rather than repeating
itself for the second surface.

The pass blanking redundant English values in the en-US catalogue is omitted:
the key stands in for the value there, so nothing reads differently.

* chore: add the note from search entry to 0.11.4

Fixed records the three ways starting a note from the search box went wrong, as
one entry because they are one action: the browser back button making a further
note on every press, the action doing nothing at all when the notes page was
already open, and the typed text losing everything from the first ampersand or
hash onwards. It sits below the listener leak, unwanted notes being a nuisance
rather than something that grows on the server.

* chore: add the arena, relevance and dialog entries to 0.11.4

Fixed gains the arena model that failed on something unrelated whenever its
provider answered with an error, so the reason never reached the chat and
titles and tags broke alongside it; it is placed high, a message that fails
outright costing more than one that reads oddly. It also gains the relevance
figure that a reply drawing on a single source never showed, appearing only
once a second source joined it, and the grey band the attach webpage dialog
carried between its address box and its button.

* chore: add the per-language model wording entries to 0.11.4

Added leads with a model carrying its name, description and starter prompts in
each language, written in the workspace editor or the admin defaults and chosen
by the language the interface is set to, falling back to the plain wording where
that language has none. Every part of it arrived together, so it is one entry.

Changed opens the section for the saving call that now answers with the
suggestions and their per-language wording together where it returned the bare
list, which anything reading that response directly has to account for. No
schema change travels with it, so the section carries no migration warning.

* chore: widen the per-language wording entry in 0.11.4

The mechanism that gave a model its name, description and starter prompts in
each language now covers tools, skills, functions, banners and arena entries
too, each written in the editor that owns it, so the entry names them rather
than standing as a second one beside it. Both commits travel with it.

The response shape entry is unchanged: it is the saving call for the admin
defaults, which this second commit does not touch.

* chore: carry the valve labels and translation table into the wording entry

The entry named only what a resource is called and says about itself, leaving
out the labels on its valves, which are translatable down to the options in a
dropdown, and the table each editor now offers in place of the code when a
language is picked, with the JSON file it reads and writes. An import that
drops a placeholder the original fills in is refused, which is worth the words
it takes to say.

It stays one entry: every part of this arrived together and none of it existed
in another form before.

* chore: add the interface wording and sketch upload entries to 0.11.4

Added records an administrator being able to replace the interface's own
wording language by language, which is a separate thing from a model or a tool
carrying wording of its own and so stands beside that entry rather than joining
it. A replacement that drops a placeholder the original fills in is refused, as
it is for the resources.

Fixed records the Arduino sketch that failed to upload to a knowledge base
because its extension was missing from the list of files read as plain text, so
it went to a document extraction server that answered with something the loader
could not read.

* chore: carry the wording editor follow-ups into the 0.11.4 entry

Two follow-ups tidy the editor the per-language wording is written in, dropping
the line that said whether a field was translated or using the default and
holding back the controls beside a skill or tool name. Neither changes what the
entry describes, so they join its links rather than standing on their own.

The terminal work is left out: the dock it adds is not rendered anywhere yet,
and the rest of that commit rewrites the existing terminal in place and sends
two identifying headers upstream, none of which shows to anyone using it.

* chore: add the document escape sequence entry to 0.11.4

Fixed records the escape sequences in an uploaded file being rewritten before
the text was stored, so what was indexed and what the model read differed from
the file as written, and inconsistently at that, since the rewriting stopped at
the first line holding an angle bracket. It sits beside the sketch upload, both
being corrections to what a file turns into on its way into knowledge.

* chore: add the Apple Silicon and WebKit entries to 0.11.4

Fixed gains the question against a knowledge base that killed the server
outright on a Mac when a reranking model ran locally, placed high, an answer
lost with the connection costing more than one that reads oddly.

It also gains the two separate things the WebKit pull request corrects, kept
apart because a reader meets them as different problems: an assistant reply
coming up blank on Apple devices whose browser never says Safari, and the
sidebar hover preview laid out at the width of a full conversation there since
0.11.0.

* chore: add the terminal dock entry to 0.11.4

Added leads with the terminal pane carrying a tab for every command a model is
running beside the shell, which is the most visible thing in the release for
anyone who watches an agent work.

It was held back earlier on the reading that the dock was built but never
rendered. That reading came from searching a checkout that predated the commit;
the commit swaps the single terminal for the dock in the files pane, so it has
been in front of people since it landed.

* chore: add the note date entry to 0.11.4

Fixed records the date beneath a note title, which was wrapped in a button left
over from an earlier styling pass, so it took a pointing hand and announced
itself as something to press while doing nothing at all. It sits at the foot of
the section beside the dialog banding, both being small corrections to how
something looks rather than what it does.

* chore: add the token logging, model picture and image size entries to 0.11.4

Fixed leads, below the advisory, with the credentials an identity provider
handed over being written into the application log when a sign-in failed part
way through, and with the model picture that any signed-in person could fetch
whatever their access, which also told them whether a model id existed at all.
Both sit above the rest of the section, a credential in a log file and a way to
enumerate what a server holds costing more than anything below them.

Changed records the consequence a viewer will notice: a model picture falling
back to the standard logo wherever no grant is held, which is a change to what
people see rather than a correction, so it is kept apart from the entry above.

Added records the container image losing the second Python it never used.

* chore: gather the image size work and add the docx preview entries to 0.11.4

The image size entry now carries the fonts nothing loaded and the packages
nothing imports alongside the second Python it already named, with all four
pull requests, and states the running total rather than the one measurement it
started from. They are one entry because a reader meets them as one thing: less
to pull.

Changed records what that costs anyone whose tool or function imported a
package it never declared, which worked only while the package happened to be
in the image.

Fixed records the Word document preview no longer rendering an HTML
sub-document embedded in the file, and refusing a link that points anywhere
but a web address, a mail address or a telephone number.

* chore: write the image size figure in digits

The file gives every measurement in digits and spells out only counts of
things, so the size the image loses is written the same way as the ones
recorded before it.

* chore: add the slim image entry to 0.11.4

Changed records the slim image giving up the local models and converters it
carried, so an instance built that way now needs a service configured for
embeddings, vector storage, document extraction past plain text, and speech,
and refuses to build alongside the graphics card or Ollama options. The admin
pages mark what is unavailable and the server answers with what to configure,
both part of the same change.

It is kept out of the image size entry above, which gathers what was carried
and never used; this one removes things that were used and asks for them from
somewhere else.

* chore: correct the slim entry and add the citation link entry to 0.11.4

The slim entry read as though a service had to be configured before the image
would run. It does not: the vector client is built on first use behind a lock,
the speech engine raises only when one is asked for, and extraction raises per
file, so an instance starts and holds a conversation with none of it in place
and each feature asks for what it needs when it is reached. The entry now says
that.

The image size entry gains the slim build leaving behind the tool that
installed its packages and the source maps built beside the interface.

Fixed gains the source attached to a reply opening only where it points at a
web address, which sits with the document preview correction, both being about
where a link in something the model handed back is allowed to go. Portuguese
(Brazil) joins the translation entry.

* chore: add the BuildKit entry and fold the install tool into the size entry

The install tool now leaves every image rather than only the slim one, since it
is mounted for the install step instead of being installed and removed, so the
size entry names it among what the image no longer carries and the slim clause
keeps only the source maps.

Changed records what building the image yourself now takes: the BuildKit
builder, which the syntax line alone did not require before, and reach to the
registry that tool is fetched from.

* chore: add the webhook picture and nameless tool call entries to 0.11.4

Fixed gains the channel webhook picture that anyone signed in could fetch, or
be sent onward to, without belonging to the channel, which sits directly below
the model picture entry, the two being the same gap on two routes.

It also gains the tool call arriving with no name at all, which was kept as it
came, written into the stored message and handed back on the next turn for the
endpoint to refuse, and now fails once where it starts.

The line uninstalling the install tool is not recorded: it went in the same
breath as the mount that made it unnecessary, and the size entry already says
the tool no longer ships.

* chore: add the tool server request entry to 0.11.4

Fixed records a tool call to an OpenAPI tool server repeating in the body the
arguments already placed in the address, which a server checking its input
strictly refused, so reading worked and writing through any such address did
not. It is placed high, a whole class of tool call failing outright costing
more than the corrections below it.

* chore: bring the 0.11.4 date up to the newest change it records

The date was set when the section was opened and left there while entries kept
arriving, so it sat three days behind the last commit it covers.

* chore: add the sign-in form setting entry to 0.11.4

Added records the sign-in form becoming something an administrator can switch
off from the authentication settings. The setting itself is not new, having
been available since before this release as a value read at startup; what is
new is reaching it without restarting the server, so it is recorded as an
addition rather than a change to how signing in works.

The date on the section already stands at the day of this change.

* chore: add the slim backend narrowing entry to 0.11.4

Changed gains the set of things slim will work with at all, which is a separate
matter from the entry above it: that one says the local models are gone and a
service is asked for when a feature reaches for one, this one says which
databases, vector stores and file stores remain, and that being pointed at
anything else stops the server before it starts rather than at first use.
The browser-driven page reader goes with them.

It sits directly below the entry it qualifies.

* chore: say which slim limits stop the server and which do not

The entry put refusing to start against all three limits. Only two behave that
way: the database check raises while the module is read, and the storage
provider is chosen by a call made as the module is read. The vector store is
built on first use, so pointing slim at anything but PostgreSQL for it fails
when something searches, not at startup. The sentence now separates them.

* chore: soften the slim backend entry and cover the browser speech runtime

* chore: lead the 0.11.4 sections with the slimming entries

* chore: cover the slim web search and code interpreter changes

* chore: split the slim limits into their own entries and cover the PDF removal

* chore: fold the dropped Gemini SDK into the tool imports entry

* chore: rewrite the changed entries and cover git leaving the slim image

* chore: drop the entry for the unused PDF endpoint

* chore: cover the tool export scoping and the terminal command echo

* chore: lead with the slim image download size

* chore: cover the model registry rewrite fix

* chore: cover the playwright media skip and lead the registry entry with the cost

* chore: lead the playwright entry with the speed gain

* chore: drop the build and picture entries and retitle the tool imports one

* chore: write the measured image sizes and retitle the page loader entry

* chore: state only how much smaller the images are

* chore: retitle the per-language wording entry

* chore: retitle the terminal tabs entry

* chore: fold the translation coverage entry into translation updates

* chore: date the 0.11.4 section 2026-09-07

* chore: cover continuing a reply in a temporary chat

* chore: write the connection listing role check as a security fix

* chore: keep the connection listing fix brief

* chore: fold the continue reply refinements into its entry

* chore: note the llama.cpp continuation flags

* chore: cover cookie forwarding and the note save on navigation

* chore: cover the model access denial logging

* chore: cover the tool step merge and the model list filters

* chore: cover three fixes from 29494, 29493 and 29325

* chore: note the terminal pane open and collapse behaviour

* chore: cover the settings save rework

* chore: write the settings clobbering fix and trim the api note

* chore: name what the interface permission was blocking

* chore: cover the account menu row highlight

* chore: cover diff blocks, note formatting, tika 4 and the oauth session expiry

* chore: cover folder upload and the file browser selection fixes

* chore: cover file comparison and the query link submit

* chore: cover the task list height cap

* chore: add the server side of the tool call match fix

* chore: cover the exa result length cap

* chore: cover the modal shortcut, build stamp and sticky code headings

* chore: cover knowledge listing order, terminal proxy headers and stale tool links

* chore: cover the forwarded auth type header and terminal attachment name clashes

* chore: cover the misleading model editor permission error

* chore: cover the thread notification and overlapping select chevrons

* chore: cover the OpenAI and Ollama proxy header stripping

* chore: cover stopping every task attached to a chat

* chore: cover code blocks in channel structured output replies

* chore: cover whitespace in model ids and knowledge folder deletion

* chore: cover automation schedule times and mention IDs

* chore: cover the latest translation fills

* chore: note the further pt-BR translation pass

* chore: cover the follow-up suggestion in the message box

* chore: cover notification target names, MCP tool paging and the stop follow-up

* chore: cover thinking blocks, channel terminals and custom header encoding

* chore: cover link schemes, spellcheck, dotless hosts and webhook pictures

* chore: cover tool images, stopped replies, sync errors and terminal proxy limits

* chore: cover malformed tool calls and the direct connection note

* chore: cover the langchain community removal and broken streams

* chore: cover the empty page upload message

* chore: cover embed rendering and two memory leaks

* chore: cover the sign-in limiter, socket cleanup and stored tool images

* docs: changelog entries for terminal skills

* docs: cover the skills:create command and the streaming append option

* docs: cover the model editor save button fix

* docs: fold the skill save location refinements into the skills:create entry

* docs: cover model backgrounds, note range edits and the playwright websocket fix

* docs: link the autoscroll follow-up commit

* docs: cover the responses tool strictness and attachment-only fixes

* docs: widen the non-blocking search entry to the knowledge grep tool

* docs: cover branch descent, checkbox defaults, fork folders, search logging and file access

* docs: cover the direct connection guidance note

* docs: cover tag text leaking into streamed replies

* docs: SVG attachments, Docling conversion failures, title generation logging

* docs: chat unblocked after a failed reply

* docs: directory provisioning patch handling

* docs: settings search matches individual settings

* docs: Staan search, Excel in the code interpreter, pgvector index training, terminal tool gating

* docs: Responses API tool calling

* docs: vector search recall and connections, forking, bundled packages, chat import, image connection checks

* docs: message pair shortcut no longer sends the input

* docs: shortcut recording, note sharing, unarchiving from search, skill saves, recommended badge

* docs: workspace exports cover every prompt and model

* docs: terminal instructions file, sign-in roles, folders, feedback, admin forms

* docs: session revocation, sidebar bulk actions, speech file types, source metadata keys

* docs: model fallback, shared note traffic, recurrence counts, RE2 search, Redis task expiry, direct connection events

Add the entries for the commits since the last pass: the chat model fallback
(#29757) and the shared-note co-editing traffic drop (#28185) in Added, with the
Staan count fix (#30303) folded into the Staan entry and Italian added to the
translation entry. Fixed covers the schedule recurrence and count parsing
(#29262), the RE2-backed file searches, the Redis task expiry and stalled
recurrence guards, the direct-connection events travelling between workers,
the IME guard while renaming a chat, the S3 content-encoding image handling
(#29623) and the sixteen interface and workspace fixes.

* docs: issue references on the fix entries, general improvements without links

Append the issue or discussion each fix PR carries in its body to its
changelog entry, and drop every link from the general improvements entry, which
never carries any.

* docs: model pool cache, message round trips, folder backgrounds, delete shortcut, chat variables

Cover the eight newest dev commits: the per-worker model pool cache (#28176)
and the single-message chat read and write (#28184) in Added, and in Fixed
the knowledge directory scoping, model sharing surviving a save, the folder
background on creation (#30218), the Delete Chat shortcut working wherever
the chat was opened from (#30165) and chat variables a prompt no longer
declares (#30173).

* docs: searchapi results and errors, blocked groups saving, timer owner checks, terminal access rechecks

Cover the four commits still missing from the last pass: the searchapi.io fix
(#30308, with its issue), the OAuth blocked groups save round trip (3fc1146c1,
typed comma lists never took effect), the due-timer owner role check (#30220)
and the terminal session access recheck, which folds its in-cycle introduction
(a1189a2d7) and the cross-worker rework (e8bd0661d) into one entry.

* docs: issue and pull references on the knowledge directory and model sharing entries

The knowledge directory scoping is the landed form of #29887 and the model
sharing fix traces to #30093, which closes #30087; both entries carried only
their commit links.

* docs: memory review gating, channel message quotes, knowledge filter, tool result flushing, localized suggestions

Cover the last dev batch: the background memory review now stops when memory
is switched off or the account is barred (#30309), a deleted channel message
clears the quotes pointing at it (#30314, #30313), the knowledge File content
filter applies on the first click (#30211, #30210), tool results are published
when the round finishes instead of waiting on the stream throttle, with channel
and continuation replies no longer carrying picture data a tool handed the
model, and a fresh install now suggests starter prompts in the interface
language, with a way back to the defaults from the model defaults panel.

* docs: playground image edit request shape

The Images playground edit call wrapped its fields under a heading the
endpoint never read, so every edit came back rejected; the request now carries
them flat (c07fa08b9).

* docs: same-origin diagrams and SVG, read-only folders on the empty-chat page, placeholder translations

Cover the latest dev batch: diagrams and SVG previews only follow same-origin
and data references and a diagram reaching outside is refused (#30271), the
empty-chat page no longer shows folder edit controls for a folder shared
read-only (ee3ece1e2), and translated strings that had their placeholder
names localized or their braces lost are restored across the thirteen locales
(#30326).
2026-09-21 15:19:47 -04:00
Nas 9530cc15c1 i18n: restore placeholder names that were translated or lost their braces (#30326)
{{ models }} -> {{ modelli }} etc. in 10 locales, {{name}} -> {{nombre}} in
gl-ES, {{file}} -> {{arxiu}} in ca-ES, and single/unbalanced braces in kab-DZ,
nb-NO and ca-ES. 22 strings in 13 locales, tokens only.
2026-09-21 15:16:04 -04:00
Classic298 46ea826e01 refac: keep rendered diagrams and SVG on same-origin resources (#30271)
Mermaid diagrams and the shared SVG sanitizer now accept only same-origin and data: references. Image URLs, class styles and directive config are checked on the parsed diagram before it renders, and the sanitizer drops attribute values and stylesheet rules that point at another origin. use elements keep local #id references only.

SVGPanZoom and the SVG file preview call the shared sanitizer instead of keeping their own configs, so SVG artifacts and uploaded SVG files follow the same rule. Uploaded SVGs that reference external sprites now render those parts blank, which is the point of the change.

A diagram that references an external resource now reports an error instead of rendering, and an SVG artifact keeps everything except the rules that reference one.
2026-09-21 15:15:28 -04:00
Timothy Jaeryang Baek ee3ece1e2b refac 2026-09-21 14:43:04 -04:00
Timothy Jaeryang Baek c07fa08b99 refac 2026-09-21 11:45:49 -04:00
Timothy Jaeryang Baek bf476452a8 chore: format 2026-09-21 11:35:30 -04:00
G30 b988f06ce0 fix: drop every local reference to a channel message that was deleted (#30314) 2026-09-21 11:32:14 -04:00
G30 4b61b86a83 fix: apply the knowledge File content filter on the first click (#30211) 2026-09-21 11:30:42 -04:00
Timothy Jaeryang Baek 9fba2843b1 refac 2026-09-21 11:24:40 -04:00
Classic298 e8c26f8394 fix: stop the background memory review when memory is switched off (#30309)
With memories disabled instance-wide, or for a user barred from the feature,
the background review still ran every interval turn: it spent a task-model
call drafting memory operations and only then failed at the write, because
the router's permission check rejected it. The review now checks the
'memories.enable' switch and re-checks the 'features.memories' permission
the same way the context-injection path already does, so a model whose memory
capability is on no longer triggers memory work that can never land.

The permission lookup costs a groups query, so it runs last, after the free
config and interval gates; those stay on every turn's hot path.
2026-09-21 11:22:21 -04:00
Timothy Jaeryang BaekandClassic298 478d1785fd refac
Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com>
2026-09-21 11:21:42 -04:00
Timothy Jaeryang Baek 30881dbcc9 refac 2026-09-21 11:09:09 -04:00
Classic298 419d248093 refac: check the timer owner's role before running a due timer (#30220)
The due-timer executor rehydrates the owner from the database and now
verifies that the owner is still a user or an admin before entering the
chat completion pipeline, mirroring the check the scheduled-automation
executor already performs. A timer whose owner no longer qualifies is
recorded as an error instead of being run.
2026-09-21 10:46:48 -04:00
Timothy Jaeryang Baek 3fc1146c13 refac 2026-09-21 10:44:37 -04:00
Classic298 94eea41a75 fix: surface searchapi errors, news results and redirect links (#30308)
Web search via searchapi.io could come back empty or near-empty with no
hint of why: an invalid or expired API key turned into an empty result
set instead of an error, the google_news engine splits its results
between organic_results and top_stories and only the first block was
read, and google links came back as google.com/goto redirects the web
loader cannot fetch, so citations pointed at a redirect blob.

The search now reads both result blocks, asks google engines for
resolved destination links, raises on HTTP errors, carries a 30s request
timeout, skips result rows without a link, and logs the response body at
debug instead of dumping every search at info.

Fixes #30305
2026-09-21 10:44:06 -04:00
G30 9688d32764 fix: keep the background image chosen while creating a folder from the sidebar (#30218) 2026-09-21 10:36:49 -04:00
Timothy Jaeryang Baek e8bd0661d3 refac 2026-09-21 10:30:53 -04:00
Timothy Jaeryang BaekandClassic298 754c4b5762 refac
Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com>
2026-09-21 10:25:20 -04:00
G30 c864e3ae7c fix: stop asking for chat variables a model's system prompt no longer declares (#30173) 2026-09-21 10:23:21 -04:00
G30 bc50026f7b fix: make the Delete Chat shortcut work whenever a chat is open, not only while its sidebar row is rendered (#30165) 2026-09-21 10:21:19 -04:00
Timothy Jaeryang Baek a9541c18ca refac 2026-09-21 10:19:59 -04:00
Classic298 aceda892bd perf: serve the shared model pool from a per-worker cache (#28176)
With the Redis websocket manager the shared model pool is a `RedisDict`, so resolving a model id fetches from Redis, and more than one of those fetches pulls the whole pool. Every chat request pays that latency and that traffic, and the cost grows with the number of models configured: at 120 models a request moves several hundred kilobytes to ask about models that have not changed since the last request.

The pool now keeps a per-worker cache of the hash and refetches it only when the signature key that `set()` already maintains changes. A cache may only trust a signature that describes the bytes it fetched, so every write invalidates the signature and no signature value is ever issued twice. Without a fresh token each time, a pool that flaps back to an earlier state returns to an earlier digest, so a reader that races the write keeps serving the old pool. `delete_many()` was a second hole in that: it updated a dead attribute and never touched the signature, so readers kept serving models it had already removed. A TTL cache would have been simpler, but it serves a pool it already knows may be stale and costs the same single round trip this check costs.

Replaying the real access pattern, a request that finds the pool unchanged moves about 1 KB no matter how many models are configured, over the same number of round trips as before, except after a write that leaves no signature, which holds reads at two commands until the next non-empty `set()` writes one. A request that first sees a changed pool costs one extra command, and so does rewriting the pool. Values stay cached serialized, so `items()` and `values()` still decode on every call, and each worker holds the whole pool in memory.
2026-09-21 10:15:49 -04:00
Classic298 49b25506dd perf: stop round-tripping the whole chat to read or write one message (#28184)
Long conversations get progressively more expensive to stream into. Every message-level write reloads the entire chat JSON, walks every string in it for a null-byte sanitisation pass and rewrites the whole column, and reading a single message loads and validates the whole chat too. The websocket event emitter reads and then writes, so one message event round-trips the full conversation twice to change a few hundred bytes.

Reading one message now selects only history.messages out of the JSON column and indexes it in Python, so the rest of the chat is neither loaded nor model-validated. Writing one message now sanitises only what is actually entering the chat, plus the title column that is mirrored off the blob, instead of re-walking a conversation that was already sanitised when it was written. Legacy rows are still healed on read by get_chat_by_id, which is unchanged.

One behaviour change: chats written before the null-byte sanitisation existed can still hold null bytes in the stored JSON. Those rows used to be rewritten clean as a side effect of any message write, and are now cleaned when the chat is read instead. The visible consequence is that the message write and delete endpoints echo back the updated chat, and for such a legacy row that echo now carries the raw null bytes rather than stripped ones, until the next read of that chat heals it. A GET of the chat is unaffected, and title, the one text column that PostgreSQL cannot store a null byte in, is still sanitised on every write.

Measured on SQLite with a 10.8 MB chat (3000 messages): a single-message upsert is 227 ms before the branch and 173 ms after, and the legacy single-message read is 135 ms before and 79 ms after. The whole-blob scan the delete path used to run costs 5.40 ms on a 1.8 MB chat and 38.79 ms on the 10.8 MB one, and is gone.

Ref https://github.com/open-webui/open-webui/issues/28169

### Contributor License Agreement

<!--
🚨 DO NOT DELETE THE TEXT BELOW 🚨
Keep the "Contributor License Agreement" confirmation text intact.
Deleting it will trigger the CLA-Bot to INVALIDATE your PR.

Your PR will NOT be reviewed or merged until you check the box below confirming that you have read and agree to the terms of the CLA.
-->

- [x] By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](https://github.com/open-webui/open-webui/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms.

> [!NOTE]
> Deleting the CLA section will lead to immediate closure of your PR and it will not be merged in.
2026-09-21 10:11:38 -04:00
Timothy Jaeryang Baek 5fb869db22 refac 2026-09-21 08:59:39 -04:00
Classic298 488b3c571c perf: stop note co-editing echoing every remote update back to the server (#28185)
Every client in a note re-broadcasts each update it receives, with a full content snapshot attached, and the server appends each echo to the document log and writes the note again. Traffic and note writes therefore scale with the number of people who have the note open: every extra participant adds one more full echo of every keystroke.

Remote updates are now applied with the `'server'` origin the state path already uses, which the local listener ignores, so the echo stops. The echo did carry one thing worth keeping: the receiving client holds the merged document, which the sender had not seen yet, so each receiver now sends a content-only message once the edits settle, debounced 500ms, and flushes a pending one when the editor is torn down. The backend accepts an update message with no `update` field for that case, where it previously raised and dropped the save.

Replaying keystrokes at 120ms with a real Yjs document, socket messages fall 48.8% with two clients, 65.6% with three and 79.2% with five, with byte counts tracking the same on notes up to 50KB. Server-side update appends drop by a factor of the client count. The cost is one snapshot upload per receiving client per typing pause, which the server's own debounce then collapses into a single extra note write however many people are watching. A snapshot has to come from a client because the server cannot rebuild the markdown, HTML and JSON shape the note record stores. It also moves the merge 500ms later than the echo delivered it, so if two edits cross on the wire and every editor then loses its connection and closes inside that window, the note keeps what it was last sent and one of the two edits is lost. A client still connected at teardown flushes its pending snapshot, and any other editor left in the note closes the gap.
2026-09-21 08:53:27 -04:00
Classic298 6fb68e43cb refac(images): request an unencoded body when fetching remote chat images (#29623)
The remote chat-image fetch now asks for an identity-encoded response and skips one that comes back content-encoded.

An image whose host stores and echoes a `Content-Encoding` regardless of what the client asks for (an S3 or MinIO object uploaded with that metadata) is no longer inlined; the message is forwarded with the original URL instead, the same way an unreachable image already behaves.
2026-09-21 08:53:06 -04:00
Classic298 438d9db8db fix: correct recurrence rule parsing for schedules and calendar events (#29262)
* fix: correct recurrence rule parsing for schedules and calendar events

An automation set to repeat a limited number of times, say ten or a hundred, was treated as a one-shot and reported no repeat interval, because any count whose digits began with a one matched a text check for the one-shot case. The scheduler already answers that question correctly by asking the rule for its next two occurrences, so the text check is gone and the count is read as the number it is.

A recurrence rule that carries its start date on the same line as the repeat text kept that date when the automation was parsed, so the schedule ran from whatever date the rule happened to carry and ignored the start the user picked. The filter that drops the start date now splits the rule on any whitespace, the same way the rule parser itself does, so both agree on where one part of the rule ends and the next begins.

The same mismatch on the calendar path anchored a recurring event to the date inside its rule, so occurrences showed up before the event had begun and at the wrong time of day. That filter splits the rule the same way now, and the series starts at the event's own start.

All three come from one place, recurrence rules being matched and cut as text. Rules written across several lines, which is what the schedule and calendar editors produce, behave exactly as before.

* refac: name rrule token vars parts to match calendar.py
2026-09-21 08:44:13 -04:00
Timothy Jaeryang Baek 0180efecf3 refac 2026-09-21 08:43:45 -04:00
Classic298 7fa8673296 fix: resolve this instance's own file URLs in edit_image regardless of the URL host (#29691)
The native edit_image tool fails with "400: [ERROR: Error loading image]" whenever the model hands it an absolute URL for an image Open WebUI already stores. Such a URL is treated as local only when its host string matches the incoming request's host exactly, so a default-port form, a container name or any host the model composed itself falls through to an outbound HTTP fetch instead. That fetch asks /api/v1/files/{id}/content without a session, gets a 401, and the user sees the generic 400.

Match the file URL on its path and let the existing local branch resolve it. Fetching that endpoint over the network can never succeed for a local or a remote instance, because it requires an authenticated user, so the host comparison only decided which way the request failed. Access control is unchanged: the local branch still goes through get_file_content_by_id, which enforces owner, admin or shared access.

Fixes #29220
2026-09-21 08:32:38 -04:00
G30 d9ea46f92d fix: hide Insert into note on a note the viewer may only read (#30223) 2026-09-21 08:32:17 -04:00
G30 f40318c1ff fix: keep the live prompt unchanged when a version is saved without Set as Production (#30231) 2026-09-21 08:32:02 -04:00
G30 440d13e198 fix: refresh the prompt editor after a version is set as production (#30233) 2026-09-21 08:31:51 -04:00
Timothy Jaeryang Baek 7f703dcc98 refac 2026-09-21 08:31:27 -04:00
Timothy Jaeryang Baek dc4f5da5a0 refac 2026-09-21 08:28:36 -04:00
G30 c2f11edb2f fix: keep a workspace model's base model when cloning it from the admin Models settings and hide Clone for arena models (#30080) 2026-09-21 08:15:12 -04:00
Classic298 f5967aebd7 fix: restore chat input draft after reload in chats started from the home page (#29762)
Typing a message, uploading a file or toggling web search in a chat started from the home page was lost on reload: the input came back empty and the uploaded files were gone for good.

Drafts are kept per chat in sessionStorage, but the key was built from the route prop, which stays empty for these chats because creating the chat only swaps the URL with history.replaceState and never re-runs the route load. Drafts were written under the new-chat key while a reload of /c/<id> read the per-chat key. Falling back to the active chat id lines the two up, the same fallback loadChat already uses for this reason.

The Placeholder submit handler also cleared the bare key rather than the current one, which left a stale draft behind once a chat's messages had all been deleted.

Verified against the base commit on a local instance: on base the draft lands under chat-input and is lost on reload, with the change it lands under chat-input-<id> and both the text and the uploaded file come back. Image attachments stay excluded from drafts by design.

The model selection half of #29760 has a different cause and is not fixed here.

Refs #29760
2026-09-21 08:08:45 -04:00
Classic298 f16e9eabe3 feat: fall back to an available model when a chat's models are gone (#29757)
Retiring a model leaves every chat that used it stuck. The chat still stores the old model id, so it loads with nothing usable selected and refuses to send until the user picks a replacement by hand, in every old conversation. There is no admin-side way to move those chats across.

Loading a chat now drops model ids that no longer exist, and an empty selection falls into the fallback this function already applies to new chats: the user's default model, then the admin-configured default, then the first available model. A chat that still has one live model keeps it. The filter runs before the single-model permission clamp so a restricted user keeps a live model the chat already has instead of losing it to the clamp.

The model list cannot distinguish a retired model from one whose connection is momentarily unreachable, so during such an outage a chat pinned to that connection will open on the fallback model and record it when saved. Models defined in the workspace are unaffected, since they stay in the list while their connection is down.
2026-09-21 08:08:27 -04:00
G30 5399e3977d fix: enforce the account form's required fields the way the admin user dialog does (#30296) 2026-09-21 08:08:02 -04:00
G30 aa65f55692 fix: insert the whole emoji when its shortcode is a codepoint sequence (#30213) 2026-09-21 08:07:45 -04:00
Classic298 9012bd153d fix: stop sending count to the Staan search API (#30303)
Staan rejects any count other than its fixed page size of 10, so every search 400ed with the default result count of 3. The API always returns 10 results; the local results[:count] slice already applies the configured count, so the request parameter is simply dropped.
2026-09-21 08:04:26 -04:00
G30 7eebbbb891 fix: stop the MinerU API key blocking a save in local mode (#30299) 2026-09-21 08:04:19 -04:00
andreadegiovineandandreadegiovine e9017c7da4 i18n: update and improve it-IT (#30297)
* i18n: update and improve it-IT

* i18n: update and improve it-IT

---------

Co-authored-by: andreadegiovine <andreadegiovine@gmail.com>
2026-09-21 08:04:08 -04:00
G30 702da1e471 fix: stop injecting memories and memory tools when memory is switched off (#30228) 2026-09-21 01:00:08 -04:00
Timothy Jaeryang Baek 85146206f6 refac 2026-09-21 00:59:46 -04:00