mirror of
https://github.com/open-webui/open-webui.git
synced 2026-05-23 01:51:58 -05:00
[GH-ISSUE #24854] Filter outlet replacement content renders <details> as plain text instead of collapsible disclosure #123723
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @gerpervaz on GitHub (May 17, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/24854
Check Existing Issues
Installation Method
Docker
Open WebUI Version
latest main/stable as of 2026-05-18
Ollama Version (if applicable)
N/A - using vLLM OpenAI-compatible backend
Operating System
Ubuntu Linux with Open WebUI running in Docker
Browser (if applicable)
Chromium-based browser; reproduced from the Ubuntu host browser as well
Confirmation
README.md.Expected Behavior
When a Filter replaces assistant message content in
outletwith Markdown/HTML containing a standard<details><summary>...</summary>...</details>block, Open WebUI should render it as a collapsible disclosure, or clearly document/sanitize it consistently.This is useful for audit trails in safety/validation filters: the main visible response can show a concise failure notice while the original blocked assistant content remains available in a collapsible audit section.
Actual Behavior
When the Filter replaces the assistant message content with a response containing a
<details>block, Open WebUI renders the details section as plain text / non-collapsible content instead of a collapsible disclosure.In my case, a Code Interpreter guard replaces an invalid assistant answer with a failure notice and appends an audit trail using
<details>. The audit trail is preserved, but the<details>block does not behave as a collapsible element in the rendered assistant message.Steps to Reproduce
outletthat replaces the final assistant message content.Minimal filter example:
The same happens in a real-world filter that appends an audit trail after blocking failed Code Interpreter / Native
execute_codeoutput.Logs & Screenshots
No backend crash is involved. The replacement content is persisted and visible, but the
<details>section is not rendered as a collapsible disclosure.This is related to, but distinct from, Issue #24852. That issue is about the first assistant message not being visually updated by outlet events under Native tool calling + streaming. This issue is specifically about Markdown/HTML rendering of
<details>in Filter replacement content once the replacement is visible.A screenshot can be attached showing the audit section rendered as non-collapsible text.
Additional Information
Use case: a safety filter validates Code Interpreter / Native
execute_coderesults. When execution fails, the filter replaces the final answer with a concise failure notice and appends an audit trail containing the original blocked assistant content.A collapsible
<details>block is useful because the original content can be long. Without collapsible rendering, the audit trail makes the message very noisy.This is not a model/tool-calling problem; it should be reproducible with a minimal outlet replacement. If Open WebUI intentionally sanitizes or disables
<details>in assistant Markdown, please document the recommended supported pattern for collapsible audit/debug sections generated by Filters.@owui-terminator[bot] commented on GitHub (May 17, 2026):
⚠️ Missing Issue Title Prefix
@gerpervaz, your issue title is missing a categorising prefix (e.g.
bug:,feat:,docs:).Please update the title to lead with one of:
Example:
bug: Login fails when the password contains special characters@owui-terminator[bot] commented on GitHub (May 17, 2026):
🔍 Related Issues Found
I found some existing issues that might be related. Please check if any of these are duplicates or contain helpful solutions:
🟣 #24635 issue:
This is the closest match: it reports
<details type="reasoning">being shown as raw text instead of a collapsible disclosure. The underlying rendering/parsing problem for<details>blocks is the same class of issue as the filter-generated<details>content here.by siriusa51
🟣 #24634 issue:
This issue covers
<details type="tool_calls">not rendering as collapsible UI and instead appearing as raw text. While the specific source is model tool-call output rather than a Filter, it strongly overlaps with the same<details>rendering path.by sharyuke
🟣 #21860 issue: Inconsistent HTML Rendering: Escaped in Chat, Rendered in Notification
This reports inconsistent HTML rendering between chat and notification surfaces, showing that Open WebUI handles HTML differently across UI paths. It is less specific, but still relevant to the question of whether HTML like
<details>is intentionally rendered or sanitized.by Mywk ·
bug💡 If your issue is a duplicate, please close it and add any additional details to the existing issue instead.
This comment was generated automatically. React with 👍 if helpful, 👎 if not.
@gerpervaz commented on GitHub (May 21, 2026):
Thanks, I checked the related issues.
#24634 and #24635 are definitely close and likely share the same underlying
<details>rendering/parsing path. If the fix is in the Markdown/custom-details rendering pipeline, it may also fix this case.That said, I think this issue still adds a useful reproduction path because it is not model-generated
<details type="reasoning">or<details type="tool_calls">output. It is content produced by a Filteroutletreplacement. That matters because Filter authors may intentionally return Markdown/HTML audit trails, and in this case even a well-formed standard<details><summary>...</summary>...</details>block from the outlet replacement is rendered as plain text / non-collapsible content.#21860 seems broader and already completed around inconsistent chat vs notification HTML rendering, so I do not think it fully covers this Filter/outlet route.
If maintainers prefer a single canonical tracking item, I am happy for this to be linked or closed in favor of the #24634 discussion, but I wanted to keep the Filter/outlet reproduction visible because it may exercise a different rendering path than direct model output.