From f66684b40417a8dadc27582806a587b3bb58bd64 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:29:06 +0100 Subject: [PATCH 01/50] code-interpreter --- .../chat-features/code-execution/index.md | 4 +++- .../chat-features/code-execution/python.md | 18 ++++++++++++--- .../image-generation-and-editing/usage.md | 7 ++++-- docs/features/plugin/tools/development.mdx | 22 ++++++++++++++++--- docs/features/web-search/agentic-search.mdx | 20 +++++++++++------ docs/features/workspace/models.md | 2 +- 6 files changed, 56 insertions(+), 17 deletions(-) diff --git a/docs/features/chat-features/code-execution/index.md b/docs/features/chat-features/code-execution/index.md index 74d2660ee..3468f506c 100644 --- a/docs/features/chat-features/code-execution/index.md +++ b/docs/features/chat-features/code-execution/index.md @@ -7,7 +7,9 @@ Open WebUI offers powerful code execution capabilities directly within your chat ## Key Features -- **Python Code Execution**: Run Python scripts directly in your browser using Pyodide, with support for popular libraries like pandas and matplotlib with no setup required. +- **Code Interpreter Capability**: Enable models to autonomously write and execute Python code as part of their responses. Works with both Default Mode (XML-based) and Native Mode (tool calling via `execute_code`). + +- **Python Code Execution**: Run Python scripts directly in your browser using Pyodide, or on a server using Jupyter. Supports popular libraries like pandas and matplotlib with no setup required. - **MermaidJS Rendering**: Create and visualize flowcharts, diagrams, and other visual representations with MermaidJS syntax that automatically renders in your chat. diff --git a/docs/features/chat-features/code-execution/python.md b/docs/features/chat-features/code-execution/python.md index 8c5bbc617..34bf91f4f 100644 --- a/docs/features/chat-features/code-execution/python.md +++ b/docs/features/chat-features/code-execution/python.md @@ -50,6 +50,20 @@ These settings can be configured at **Admin Panel → Settings → Code Executio For Jupyter configuration, see the [Jupyter Notebook Integration](/tutorials/integrations/jupyter) tutorial. +### Native Function Calling (Native Mode) + +When using **Native function calling mode** with a capable model (e.g., GPT-5, Claude 4.5, MiniMax M2.1), the code interpreter is available as a builtin tool called `execute_code`. This provides a more integrated experience: + +- **No XML tags required**: The model calls `execute_code(code)` directly +- **Same image handling**: Base64 image URLs in output are replaced with file URLs; model embeds via markdown + +**Requirements:** +1. `ENABLE_CODE_INTERPRETER` must be enabled globally +2. Model must have `code_interpreter` capability enabled +3. Model must use **Native** function calling mode (set in model's advanced params) + +For more details on builtin tools and native mode, see the [Tool Development Guide](/features/plugin/tools/development#built-in-system-tools-nativeagentic-mode). + ## Displaying Images Inline (matplotlib, etc.) When using matplotlib or other visualization libraries, images can be displayed directly in the chat. For this to work correctly, the code must output the image as a **base64 data URL**. @@ -92,9 +106,7 @@ If you see raw base64 text appearing in chat responses, the model is incorrectly ### Example Prompt -> Create a bar chart showing quarterly sales: Q1: 150, Q2: 230, Q3: 180, Q4: 310. -> Use matplotlib, save the figure to a BytesIO buffer, encode it as base64, and print the data URL. -> After the code runs, use the resulting file URL from the output to display the image in your response. +> Create a bar chart showing quarterly sales: Q1: 150, Q2: 230, Q3: 180, Q4: 310. **Expected model behavior:** 1. Model writes Python code using the base64 pattern above diff --git a/docs/features/image-generation-and-editing/usage.md b/docs/features/image-generation-and-editing/usage.md index 4a132db1d..aea079cc5 100644 --- a/docs/features/image-generation-and-editing/usage.md +++ b/docs/features/image-generation-and-editing/usage.md @@ -18,9 +18,12 @@ Before you can use image generation, you must ensure that the **Image Generation If your model is configured with **Native Function Calling** (see the [**Central Tool Calling Guide**](/features/plugin/tools#tool-calling-modes-default-vs-native)), it can invoke image generation directly as a tool. ### How it works: -- **Requirement**: The **Image Generation** feature must be toggled **ON** for the chat or model. This grants the model "permission" to use the tool. +- **Requirements**: + - **Image Generation** must be enabled globally in **Admin Panel → Settings → Images** + - The model must have the **Image Generation** capability enabled +- **No Chat Toggle Needed**: With Native Mode, the `generate_image` tool is automatically included when the model has the `image_generation` capability. You don't need to manually toggle it on per chat. - **Natural Language**: You can simply ask the model: *"Generate an image of a cybernetic forest."* -- **Action**: If **Native Mode** is active and the feature is enabled, the model will invoke the `generate_image` tool. +- **Action**: If **Native Mode** is active and the model has the capability, it will invoke the `generate_image` tool. - **Display**: The generated image is displayed directly in the chat interface. - **Editing**: This also supports **Image Editing** (inpainting) via the `edit_image` tool (e.g., *"Make the sky in this image red"*). diff --git a/docs/features/plugin/tools/development.mdx b/docs/features/plugin/tools/development.mdx index 0b315843b..a896e12d7 100644 --- a/docs/features/plugin/tools/development.mdx +++ b/docs/features/plugin/tools/development.mdx @@ -158,7 +158,7 @@ Agentic tool calling requires **high-quality frontier models** to work reliably. | Tool | Purpose | Requirements | |------|---------|--------------| | **Search & Web** | | | -| `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | `ENABLE_WEB_SEARCH` enabled. | +| `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | `ENABLE_WEB_SEARCH` enabled + model `web_search` capability. | | `fetch_url` | Visits a URL and extracts text content via the Web Loader. | Part of Web Search feature. | | **Knowledge Base** | | | | `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | Always available. | @@ -167,8 +167,10 @@ Agentic tool calling requires **high-quality frontier models** to work reliably. | `view_knowledge_file` | Get the full content of a file from a knowledge base. | Always available. | | `query_knowledge_bases` | Search internal knowledge bases using semantic/vector search. Should be your first choice for finding information before searching the web. | Always available. | | **Image Gen** | | | -| `generate_image` | Generates a new image based on a prompt (supports `steps`). | `ENABLE_IMAGE_GENERATION` enabled. | -| `edit_image` | Edits an existing image based on a prompt and URL. | `ENABLE_IMAGE_EDIT` enabled.| +| `generate_image` | Generates a new image based on a prompt (supports `steps`). | `ENABLE_IMAGE_GENERATION` enabled + model `image_generation` capability. | +| `edit_image` | Edits an existing image based on a prompt and URL. | `ENABLE_IMAGE_EDIT` enabled + model `image_generation` capability. | +| **Code Interpreter** | | | +| `execute_code` | Execute Python code in a sandboxed environment. Supports calculations, data analysis, and visualizations. Uses either Pyodide (browser-based) or Jupyter (server-side) depending on configuration. | `ENABLE_CODE_INTERPRETER` enabled + model `code_interpreter` capability. | | **Memory** | | | | `search_memories` | Searches the user's personal memory/personalization bank. | Memory feature enabled. | | `add_memory` | Stores a new fact in the user's personalization memory. | Memory feature enabled. | @@ -201,6 +203,20 @@ Agentic tool calling requires **high-quality frontier models** to work reliably. This table provides a quick reference for developers. For the complete user-facing guide on how to enable and use these tools, see the [**Tool Calling Modes Guide**](/features/plugin/tools#tool-calling-modes-default-vs-native). ::: +:::warning Model Capability vs. Chat Toggle in Native Mode +In **Native Mode**, builtin tools are included based on the **model's capability settings**, not the chat-level toggles. If you: + +1. Use **Native Mode** function calling +2. **Disable** a capability (e.g., `web_search`) on the model +3. **Manually enable** the feature toggle in the chat (e.g., Web Search toggle) + +The builtin tool will **NOT** be passed to the model—the model cannot call `search_web()` as a function. + +**However**, features like Web Search that have RAG-style fallbacks will still work via context injection. The chat toggle triggers the traditional behavior (search results injected into context), just without giving the model autonomous control via tool calling. + +In **Default Mode** (non-native), the chat toggle fully controls the feature via RAG-style injection, independent of capability settings. +::: + #### Complete Event Type Compatibility Matrix diff --git a/docs/features/web-search/agentic-search.mdx b/docs/features/web-search/agentic-search.mdx index a4fdbdeeb..5f9f39cbd 100644 --- a/docs/features/web-search/agentic-search.mdx +++ b/docs/features/web-search/agentic-search.mdx @@ -29,13 +29,19 @@ For comprehensive information about all built-in agentic tools (including web se To unlock these features, your model must support native tool calling and have strong reasoning capabilities (e.g., GPT-5, Claude 4.5 Sonnet, Gemini 3 Flash, MiniMax M2.1). Administrator-level configuration for these built-in system tools is handled via the [**Central Tool Calling Guide**](/features/plugin/tools#tool-calling-modes-default-vs-native). -1. **Enable Web Search**: Ensure a search engine is configured in **Admin Panel > Settings > Web Search**. -2. **Enable Native Mode (Agentic Mode)**: - * Go to **Admin Panel > Settings > Models**. - * Navigate to **Model Specific Settings** for your target model. - * Under **Advanced Parameters**, set **Function Calling** to `Native`. -3. **Use a Quality Model**: Ensure you're using a frontier model with strong reasoning capabilities for best results. -4. **Chat Features**: Ensure the **Web Search** feature is toggled **ON** for your chat session. +1. **Enable Web Search Globally**: Ensure a search engine is configured in **Admin Panel → Settings → Web Search**. +2. **Enable Model Capability**: In **Admin Panel → Settings → Models**, select your model and enable the **Web Search** capability. +3. **Enable Native Mode (Agentic Mode)**: + * In the same model settings, under **Advanced Parameters**, set **Function Calling** to `Native`. +4. **Use a Quality Model**: Ensure you're using a frontier model with strong reasoning capabilities for best results. + +:::tip Model Capability vs. Chat Toggle +In **Native Mode**, the `search_web` and `fetch_url` tools are automatically included based on the model's `web_search` capability setting. The chat toggle is not required. + +In **Default Mode** (non-native), the chat toggle still controls whether web search is performed via RAG-style injection. + +**Important**: If you disable the `web_search` capability on a model but use Native Mode, the tools won't be available even if you manually toggle Web Search on in the chat. +::: ## How Native Tools Handle Data (Agentic Mode) 🔗 It is important to understand that Native Mode (Agentic Mode) works fundamentally differently from the global "Web Search" toggle found in standard models. diff --git a/docs/features/workspace/models.md b/docs/features/workspace/models.md index 62f0361fa..923325f89 100644 --- a/docs/features/workspace/models.md +++ b/docs/features/workspace/models.md @@ -81,7 +81,7 @@ You can transform a generic model into a specialized agent by toggling specific - **Web Search**: Enable the model to access the configured search provider (e.g., Google, SearxNG) for real-time information. - **File Upload**: Allow users to upload files to this model. - **File Context**: When enabled (default), attached files are processed via RAG and their content is injected into the conversation. When disabled, file content is **not** extracted or injected—the model receives no file content unless it retrieves it via builtin tools. Only visible when File Upload is enabled. See [File Context vs Builtin Tools](../rag/index.md#file-context-vs-builtin-tools) for details. - - **Code Interpreter**: Enable Python code execution. + - **Code Interpreter**: Enable Python code execution. See [Python Code Execution](../chat-features/code-execution/python.md) for details. - **Image Generation**: Enable image generation integration. - **Usage / Citations**: Toggle usage tracking or source citations. - **Status Updates**: Show visible progress steps in the chat UI (e.g., "Searching web...", "Reading file...") during generation. Useful for slower, complex tasks. From 6ab1b5c2c10e931c31ac067d31758ad290c15b63 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:48:37 +0100 Subject: [PATCH 02/50] Update python.md --- .../chat-features/code-execution/python.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/features/chat-features/code-execution/python.md b/docs/features/chat-features/code-execution/python.md index 34bf91f4f..c2a2a05c4 100644 --- a/docs/features/chat-features/code-execution/python.md +++ b/docs/features/chat-features/code-execution/python.md @@ -187,6 +187,32 @@ plt.close() The image will be automatically uploaded and displayed inline in your chat. +## Browser Compatibility + +### Microsoft Edge: Pyodide Crashes + +If Pyodide-based code execution causes Microsoft Edge to crash with a `STATUS_ACCESS_VIOLATION` error, this is caused by Edge's enhanced security mode. + +**Symptom:** The browser tab or entire browser crashes when attempting to run Python code, with no useful error message. + +**Cause:** Edge's "Enhance your security on the web" setting (found at `edge://settings/privacy/security`) enables stricter security mitigations that are incompatible with WebAssembly-based runtimes like Pyodide. + +**Solutions:** + +1. **Disable enhanced security in Edge:** + - Go to `edge://settings/privacy/security` + - Turn off **"Enhance your security on the web"** + +2. **Use a different browser:** + - Chrome and Firefox do not have this issue + +3. **Use Jupyter backend:** + - Switch `CODE_INTERPRETER_ENGINE` to `jupyter` to avoid browser-based execution entirely + +:::note +This is a known compatibility issue between Edge's enhanced security mode and WebAssembly. The same crash occurs on the official [Pyodide console](https://pyodide.org/en/stable/console.html) when this setting is enabled. +::: + ## Tips for Better Results - **Mention the environment**: Tell the LLM it's running in a "Pyodide environment" or "code interpreter" for better code generation From e689144a3840c2037a25485f457f817eb29eef95 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 16 Jan 2026 19:34:56 +0100 Subject: [PATCH 03/50] update --- docs/features/plugin/tools/development.mdx | 72 +--------------------- docs/features/plugin/tools/index.mdx | 70 ++++++++++----------- 2 files changed, 37 insertions(+), 105 deletions(-) diff --git a/docs/features/plugin/tools/development.mdx b/docs/features/plugin/tools/development.mdx index ee5da9ef3..46cd1e32f 100644 --- a/docs/features/plugin/tools/development.mdx +++ b/docs/features/plugin/tools/development.mdx @@ -145,76 +145,8 @@ You can configure the function calling mode in two places: If the model seems to be unable to call the tool, make sure it is enabled (either via the Model page or via the `+` sign next to the chat input field). -### Built-in System Tools (Native/Agentic Mode) - -When **Native Mode (Agentic Mode)** is enabled, Open WebUI automatically injects built-in system tools based on the features enabled for the chat. This enables powerful agentic behaviors where capable models (like GPT-5, Claude 4.5 Sonnet, Gemini 3 Flash, or MiniMax M2.1) can perform multi-step research, explore knowledge bases autonomously, or manage user memory dynamically. - -:::warning Quality Models Required for Agentic Behavior -Agentic tool calling requires **high-quality frontier models** to work reliably. Small local models often struggle with the complex reasoning, proper JSON formatting, and multi-step planning required for effective tool use. For production agentic workflows, use models like **GPT-5**, **Claude 4.5+**, **Gemini 3+**, or **MiniMax M2.1**. Small local models may work better with **Default Mode** instead. -::: - -#### Available Built-in Tools - -| Tool | Purpose | Requirements | -|------|---------|--------------| -| **Search & Web** | | | -| `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | `ENABLE_WEB_SEARCH` enabled + model `web_search` capability. | -| `fetch_url` | Visits a URL and extracts text content via the Web Loader. | Part of Web Search feature. | -| **Knowledge Base** | | | -| `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | Always available. | -| `search_knowledge_bases` | Search knowledge bases by name and description. | Always available. | -| `search_knowledge_files` | Search files across accessible knowledge bases by filename. | Always available. | -| `view_knowledge_file` | Get the full content of a file from a knowledge base. | Always available. | -| `query_knowledge_bases` | Search knowledge bases using semantic/vector search (default: 5 results). **Note:** Does not use hybrid search or reranking. | Always available. | -| **Image Gen** | | | -| `generate_image` | Generates a new image based on a prompt (supports `steps`). | `ENABLE_IMAGE_GENERATION` enabled + model `image_generation` capability. | -| `edit_image` | Edits an existing image based on a prompt and URL. | `ENABLE_IMAGE_EDIT` enabled + model `image_generation` capability. | -| **Code Interpreter** | | | -| `execute_code` | Execute Python code in a sandboxed environment. Supports calculations, data analysis, and visualizations. Uses either Pyodide (browser-based) or Jupyter (server-side) depending on configuration. | `ENABLE_CODE_INTERPRETER` enabled + model `code_interpreter` capability. | -| **Memory** | | | -| `search_memories` | Searches the user's personal memory/personalization bank. | Memory feature enabled. | -| `add_memory` | Stores a new fact in the user's personalization memory. | Memory feature enabled. | -| `replace_memory_content` | Updates an existing memory record by its unique ID. | Memory feature enabled. | -| **Notes** | | | -| `search_notes` | Search the user's notes by title and content. | `ENABLE_NOTES` enabled. | -| `view_note` | Get the full markdown content of a specific note. | `ENABLE_NOTES` enabled. | -| `write_note` | Create a new private note for the user. | `ENABLE_NOTES` enabled. | -| `replace_note_content` | Update an existing note's content or title. | `ENABLE_NOTES` enabled. | -| **Chat History** | | | -| `search_chats` | Simple text search across chat titles and message content. Returns matching chat IDs and snippets. | Always available. | -| `view_chat` | Reads and returns the full message history of a specific chat by ID. | Always available. | -| **Channels** | | | -| `search_channels` | Find public or accessible channels by name/description. | `ENABLE_CHANNELS` enabled. | -| `search_channel_messages` | Search for specific messages inside accessible channels. | `ENABLE_CHANNELS` enabled. | -| `view_channel_message` | View a specific message or its details in a channel. | `ENABLE_CHANNELS` enabled. | -| `view_channel_thread` | View a full message thread/replies in a channel. | `ENABLE_CHANNELS` enabled. | -| **Time Tools** | | | -| `get_current_timestamp` | Get the current UTC Unix timestamp and ISO date. | Always available. | -| `calculate_timestamp` | Calculate relative timestamps (e.g., "3 days ago"). | Always available. | - -#### Why Use Built-in Tools? -- **Agentic Research**: Models can invoke `search_web` multiple times to refine results, then use `fetch_url` to read specific deep-dive articles. -- **Knowledge Base Search**: Models can use `query_knowledge_bases` to search internal documents semantically, or `list_knowledge_bases` and `view_knowledge_file` to browse and read specific files. -- **Contextual Awareness**: Models can search your previous chat history or notes to find specific details without manual copy-pasting. -- **Dynamic Personalization**: Models can proactively store important facts about the user using `add_memory` during the conversation. -- **Improved Context Selection**: Instead of forcing a search before every prompt, the model decides *when* a search or retrieval is actually necessary. - -:::info Complete Tool Reference -This table provides a quick reference for developers. For the complete user-facing guide on how to enable and use these tools, see the [**Tool Calling Modes Guide**](/features/plugin/tools#tool-calling-modes-default-vs-native). -::: - -:::warning Model Capability vs. Chat Toggle in Native Mode -In **Native Mode**, builtin tools are included based on the **model's capability settings**, not the chat-level toggles. If you: - -1. Use **Native Mode** function calling -2. **Disable** a capability (e.g., `web_search`) on the model -3. **Manually enable** the feature toggle in the chat (e.g., Web Search toggle) - -The builtin tool will **NOT** be passed to the model—the model cannot call `search_web()` as a function. - -**However**, features like Web Search that have RAG-style fallbacks will still work via context injection. The chat toggle triggers the traditional behavior (search results injected into context), just without giving the model autonomous control via tool calling. - -In **Default Mode** (non-native), the chat toggle fully controls the feature via RAG-style injection, independent of capability settings. +:::info Native Mode & Built-in Tools +When writing custom tools, be aware that Open WebUI also provides **built-in system tools** when Native Mode is enabled. For details on built-in tools, function calling modes, and model requirements, see the [**Tool Calling Modes Guide**](/features/plugin/tools#tool-calling-modes-default-vs-native). ::: diff --git a/docs/features/plugin/tools/index.mdx b/docs/features/plugin/tools/index.mdx index 0c56469c4..89d0caa0d 100644 --- a/docs/features/plugin/tools/index.mdx +++ b/docs/features/plugin/tools/index.mdx @@ -148,41 +148,41 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo 🛠️ When **Native Mode (Agentic Mode)** is enabled, Open WebUI automatically injects powerful system tools based on the features toggled for the chat. This unlocks truly agentic behaviors where capable models (like GPT-5, Claude 4.5 Sonnet, Gemini 3 Flash, or MiniMax M2.1) can perform multi-step research, explore knowledge bases, or manage user memory autonomously. -| Tool | Purpose | Requirements | -|------|---------|--------------| -| **Search & Web** | | | -| `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | `ENABLE_WEB_SEARCH` enabled. | -| `fetch_url` | Visits a URL and extracts text content via the Web Loader. | Part of Web Search feature. | -| **Knowledge Base** | | | -| `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | Always available. | -| `query_knowledge_bases` | Search knowledge bases by semantic similarity to query. Finds KBs whose name/description match the meaning of your query. Use this to discover relevant knowledge bases before querying their files. | Always available. | -| `search_knowledge_bases` | Search knowledge bases by name and description. | Always available. | -| `query_knowledge_files` | Search knowledge base files using simple vector search. **Note:** Does not use hybrid search or reranking—for full RAG pipeline with reranking, use File Context instead by attaching files via `#` or assigning knowledge bases. | Always available. | -| `search_knowledge_files` | Search files across accessible knowledge bases by filename. | Always available. | -| `view_knowledge_file` | Get the full content of a file from a knowledge base. | Always available. | -| **Image Gen** | | | -| `generate_image` | Generates a new image based on a prompt. | `ENABLE_IMAGE_GENERATION` enabled. | -| `edit_image` | Edits existing images based on a prompt and image URLs. | `ENABLE_IMAGE_EDIT` enabled. | -| **Memory** | | | -| `search_memories` | Searches the user's personal memory/personalization bank. | Memory feature enabled. | -| `add_memory` | Stores a new fact in the user's personalization memory. | Memory feature enabled. | -| `replace_memory_content` | Updates an existing memory record by its unique ID. | Memory feature enabled. | -| **Notes** | | | -| `search_notes` | Search the user's notes by title and content. | `ENABLE_NOTES` enabled. | -| `view_note` | Get the full markdown content of a specific note. | `ENABLE_NOTES` enabled. | -| `write_note` | Create a new private note for the user. | `ENABLE_NOTES` enabled. | -| `replace_note_content` | Update an existing note's content or title. | `ENABLE_NOTES` enabled. | -| **Chat History** | | | -| `search_chats` | Simple text search across chat titles and message content. Returns matching chat IDs and snippets. | Always available. | -| `view_chat` | Reads and returns the full message history of a specific chat by ID. | Always available. | -| **Channels** | | | -| `search_channels` | Find public or accessible channels by name/description. | `ENABLE_CHANNELS` enabled. | -| `search_channel_messages` | Search for specific messages inside accessible channels. | `ENABLE_CHANNELS` enabled. | -| `view_channel_message` | View a specific message or its details in a channel. | `ENABLE_CHANNELS` enabled. | -| `view_channel_thread` | View a full message thread/replies in a channel. | `ENABLE_CHANNELS` enabled. | -| **Time Tools** | | | -| `get_current_timestamp` | Get the current UTC Unix timestamp and ISO date. | Always available. | -| `calculate_timestamp` | Calculate relative timestamps (e.g., "3 days ago"). | Always available. | +| Tool | Purpose | +|------|---------| +| **Search & Web** | *Requires `ENABLE_WEB_SEARCH` enabled.* | +| `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | +| `fetch_url` | Visits a URL and extracts text content via the Web Loader. | +| **Knowledge Base** | *Always available.* | +| `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | +| `query_knowledge_bases` | Search knowledge bases by semantic similarity to query. Finds KBs whose name/description match the meaning of your query. Use this to discover relevant knowledge bases before querying their files. | +| `search_knowledge_bases` | Search knowledge bases by name and description. | +| `query_knowledge_files` | Search knowledge base files using simple vector search. **Note:** Does not use hybrid search or reranking—for full RAG pipeline with reranking, use File Context instead by attaching files via `#` or assigning knowledge bases. | +| `search_knowledge_files` | Search files across accessible knowledge bases by filename. | +| `view_knowledge_file` | Get the full content of a file from a knowledge base. | +| **Image Gen** | *Requires image generation enabled (per-tool).* | +| `generate_image` | Generates a new image based on a prompt. Requires `ENABLE_IMAGE_GENERATION`. | +| `edit_image` | Edits existing images based on a prompt and image URLs. Requires `ENABLE_IMAGE_EDIT`. | +| **Memory** | *Requires Memory feature enabled.* | +| `search_memories` | Searches the user's personal memory/personalization bank. | +| `add_memory` | Stores a new fact in the user's personalization memory. | +| `replace_memory_content` | Updates an existing memory record by its unique ID. | +| **Notes** | *Requires `ENABLE_NOTES` enabled.* | +| `search_notes` | Search the user's notes by title and content. | +| `view_note` | Get the full markdown content of a specific note. | +| `write_note` | Create a new private note for the user. | +| `replace_note_content` | Update an existing note's content or title. | +| **Chat History** | *Always available.* | +| `search_chats` | Simple text search across chat titles and message content. Returns matching chat IDs and snippets. | +| `view_chat` | Reads and returns the full message history of a specific chat by ID. | +| **Channels** | *Requires `ENABLE_CHANNELS` enabled.* | +| `search_channels` | Find public or accessible channels by name/description. | +| `search_channel_messages` | Search for specific messages inside accessible channels. | +| `view_channel_message` | View a specific message or its details in a channel. | +| `view_channel_thread` | View a full message thread/replies in a channel. | +| **Time Tools** | *Always available.* | +| `get_current_timestamp` | Get the current UTC Unix timestamp and ISO date. | +| `calculate_timestamp` | Calculate relative timestamps (e.g., "3 days ago"). | #### Tool Parameters Reference From 3c3850ee34bb67f851bd26431dd24574de943c80 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:51:44 +0100 Subject: [PATCH 04/50] weaviate --- docs/getting-started/env-configuration.mdx | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 688d3a86f..6ea71e11a 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -2262,11 +2262,25 @@ When using Pinecone as the vector store, the following environment variables are ### Weaviate +:::info + +**Self-Hosted and Cloud Deployments** + +Open WebUI uses `connect_to_custom` for Weaviate connections, which supports both locally hosted and remote Weaviate instances. This is essential for self-hosted deployments where HTTP and gRPC endpoints may be on different ingresses or hostnames, which is common in container orchestration platforms like Kubernetes or Azure Container Apps. + +::: + #### `WEAVIATE_HTTP_HOST` - Type: `str` - Default: Empty string (' ') -- Description: Specifies the hostname of the Weaviate server for HTTP connections. +- Description: Specifies the hostname of the Weaviate server for HTTP connections. For self-hosted deployments, this is typically your Weaviate HTTP endpoint hostname. + +#### `WEAVIATE_GRPC_HOST` + +- Type: `str` +- Default: Empty string (' ') +- Description: Specifies the hostname of the Weaviate server for gRPC connections. This can be different from `WEAVIATE_HTTP_HOST` when HTTP and gRPC are served on separate ingresses, which is common in container orchestration environments. #### `WEAVIATE_HTTP_PORT` @@ -2280,12 +2294,30 @@ When using Pinecone as the vector store, the following environment variables are - Default: `50051` - Description: Specifies the gRPC port for connecting to the Weaviate server. +#### `WEAVIATE_HTTP_SECURE` + +- Type: `bool` +- Default: `False` +- Description: Enables HTTPS for HTTP connections to the Weaviate server. Set to `true` when connecting to a Weaviate instance with TLS enabled on the HTTP endpoint. + +#### `WEAVIATE_GRPC_SECURE` + +- Type: `bool` +- Default: `False` +- Description: Enables TLS for gRPC connections to the Weaviate server. Set to `true` when connecting to a Weaviate instance with TLS enabled on the gRPC endpoint. + #### `WEAVIATE_API_KEY` - Type: `str` - Default: `None` - Description: Sets the API key for authenticating with Weaviate server. +#### `WEAVIATE_SKIP_INIT_CHECKS` + +- Type: `bool` +- Default: `False` +- Description: Skips Weaviate initialization checks when connecting. This can be useful in certain network configurations where the checks may fail but the connection itself works. + ### Oracle 23ai Vector Search (oracle23ai) #### `ORACLE_DB_USE_WALLET` From b152009a5c80266548e5a504e446f6bab1c565e2 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Sat, 17 Jan 2026 18:54:19 +0100 Subject: [PATCH 05/50] engine io --- docs/getting-started/env-configuration.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 6ea71e11a..086024b88 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5855,8 +5855,8 @@ When this variable is left empty (default), `REDIS_SOCKET_CONNECT_TIMEOUT` is au #### `WEBSOCKET_SERVER_ENGINEIO_LOGGING` - Type: `bool` -- Default: `false` -- Description: Controls logging for EngineIO server related to websocket operations. +- Default: Falls back to `WEBSOCKET_SERVER_LOGGING` if not set, otherwise `false` +- Description: Controls logging for Engine.IO server related to websocket operations. If not explicitly set, this inherits the value from `WEBSOCKET_SERVER_LOGGING`. :::warning From dff8bbcb7abe3b6afeb05469e93e9b57db3d308b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:11:36 +0100 Subject: [PATCH 06/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 086024b88..759a72dcc 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -1481,6 +1481,19 @@ Invalid regex patterns will cause password validation to fail, potentially preve ::: +#### `PASSWORD_VALIDATION_HINT` + +- Type: `str` +- Default: `""` (empty string) +- Description: Custom hint message displayed to users when their password fails validation. This message appears in error dialogs during signup, password changes, and admin user creation when the password doesn't meet the requirements defined by `PASSWORD_VALIDATION_REGEX_PATTERN`. Use this to explain your specific password requirements in user-friendly terms. +- Example: `Password must be at least 12 characters with uppercase, lowercase, number, and special character.` + +:::tip + +When setting a custom `PASSWORD_VALIDATION_REGEX_PATTERN`, always set `PASSWORD_VALIDATION_HINT` to explain the requirements in plain language. Without a hint, users will only see a generic "Invalid password" error with no guidance on what's required. + +::: + #### `WEBUI_SECRET_KEY` - Type: `str` From bd743d6c515cb42a34640055eb2f3e4adff124fe Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:18:38 +0100 Subject: [PATCH 07/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index a729a2207..e5da337f8 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -2753,6 +2753,16 @@ The `markdown_header` option has been removed from `RAG_TEXT_SPLITTER`. Markdown - Description: Extracts images from PDFs using OCR when loading documents. - Persistence: This environment variable is a `PersistentConfig` variable. +#### `PDF_LOADER_MODE` + +- Type: `str` +- Options: + - `page` - Creates one document per page (default). + - `single` - Combines all pages into one document for better chunking across page boundaries. +- Default: `page` +- Description: Controls how PDFs are loaded and split into documents when using the **default content extraction engine** (PyPDFLoader). Page mode creates one document per page, while single mode combines all pages into one document, which can improve chunking quality when content spans across page boundaries. This setting has no effect when using external content extraction engines like Tika, Docling, Document Intelligence, MinerU, or Mistral OCR, as those engines have their own document handling logic. +- Persistence: This environment variable is a `PersistentConfig` variable. + #### `RAG_FILE_MAX_SIZE` - Type: `int` From 290be8560b842ffcdfada32890243467d577a64e Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:21:25 +0100 Subject: [PATCH 08/50] Update valves.mdx --- docs/features/plugin/development/valves.mdx | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/features/plugin/development/valves.mdx b/docs/features/plugin/development/valves.mdx index b91ff0701..1905eb20d 100644 --- a/docs/features/plugin/development/valves.mdx +++ b/docs/features/plugin/development/valves.mdx @@ -75,3 +75,30 @@ class Filter: ``` + +## Input Types + +Valves support special input types that change how fields are rendered in the UI. You can configure these using `json_schema_extra` with the `input` key in your Pydantic `Field` definitions. + +### Password Input (Masked Fields) + +For sensitive fields like passwords, API keys, or secrets, you can use the password input type to mask the value in the UI. This prevents the password from being visible on screen (protecting against shoulder surfing). + +```python +from pydantic import BaseModel, Field + +class Tools: + class UserValves(BaseModel): + service_password: str = Field( + default="", + description="Your service password", + json_schema_extra={"input": {"type": "password"}} + ) +``` + +When rendered, this field will appear as a masked input (dots instead of characters) with a toggle to reveal the value if needed, using Open WebUI's `SensitiveInput` component. + +:::tip +Use password input types for any credential or secret that users configure in their Valves or UserValves. This is especially important for UserValves since they are configurable by end users directly from the chat interface. +::: + From 915cacf2797162dce027ea5c1d7822792d288347 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:29:32 +0100 Subject: [PATCH 09/50] fixlinks --- docs/faq.mdx | 2 +- docs/features/chat-features/code-execution/python.md | 2 +- docs/features/workspace/knowledge.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/faq.mdx b/docs/faq.mdx index b8c9d7085..61eb1eece 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -165,7 +165,7 @@ def wait_for_processing(token, file_id): time.sleep(2) # Wait before checking again ``` -For complete workflow examples, see the **[API Endpoints documentation](/getting-started/api-endpoints#checking-file-processing-status)** and the **[RAG Troubleshooting guide](/troubleshooting/rag#9-api-file-upload-the-content-provided-is-empty-error-)**. +For complete workflow examples, see the **[API Endpoints documentation](/getting-started/api-endpoints#checking-file-processing-status)** and the **[RAG Troubleshooting guide](/troubleshooting/rag#9-api-file-upload-the-content-provided-is-empty-error)**. ### Q: I asked the model what it is and it gave the wrong answer. Is Open WebUI routing to the wrong model? diff --git a/docs/features/chat-features/code-execution/python.md b/docs/features/chat-features/code-execution/python.md index c2a2a05c4..35d663f77 100644 --- a/docs/features/chat-features/code-execution/python.md +++ b/docs/features/chat-features/code-execution/python.md @@ -62,7 +62,7 @@ When using **Native function calling mode** with a capable model (e.g., GPT-5, C 2. Model must have `code_interpreter` capability enabled 3. Model must use **Native** function calling mode (set in model's advanced params) -For more details on builtin tools and native mode, see the [Tool Development Guide](/features/plugin/tools/development#built-in-system-tools-nativeagentic-mode). +For more details on builtin tools and native mode, see the [Tool Development Guide](/features/plugin/tools#built-in-system-tools-nativeagentic-mode). ## Displaying Images Inline (matplotlib, etc.) diff --git a/docs/features/workspace/knowledge.md b/docs/features/workspace/knowledge.md index 052eee44b..4cf4036b9 100644 --- a/docs/features/workspace/knowledge.md +++ b/docs/features/workspace/knowledge.md @@ -88,7 +88,7 @@ Key API endpoints: :::warning Important: Async File Processing When uploading files via API, processing happens asynchronously. You **must** wait for file processing to complete before adding files to a knowledge base, or you will receive an "empty content" error. -For detailed examples and proper workflow handling, see the [API Endpoints documentation](/getting-started/api-endpoints#retrieval-augmented-generation-rag). +For detailed examples and proper workflow handling, see the [API Endpoints documentation](/getting-started/api-endpoints#-retrieval-augmented-generation-rag). ::: ## Summary From 75407a518993d6041742885a28d8610bdc5eb1fd Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:07:10 +0100 Subject: [PATCH 10/50] updates --- docs/features/plugin/development/valves.mdx | 126 ++++++++++++++++++++ docs/getting-started/env-configuration.mdx | 22 ++++ docs/troubleshooting/multi-replica.mdx | 16 +++ 3 files changed, 164 insertions(+) diff --git a/docs/features/plugin/development/valves.mdx b/docs/features/plugin/development/valves.mdx index 1905eb20d..22c3ccf14 100644 --- a/docs/features/plugin/development/valves.mdx +++ b/docs/features/plugin/development/valves.mdx @@ -102,3 +102,129 @@ When rendered, this field will appear as a masked input (dots instead of charact Use password input types for any credential or secret that users configure in their Valves or UserValves. This is especially important for UserValves since they are configurable by end users directly from the chat interface. ::: +### Select Dropdown Input + +For fields where users should choose from a predefined list of options, use the select input type to render a dropdown menu. Options can be either static (hardcoded list) or dynamic (generated at runtime by a method). + +#### Static Options + +Use a list directly for options that don't change: + +```python +from pydantic import BaseModel, Field + +class Tools: + class Valves(BaseModel): + priority: str = Field( + default="medium", + description="Processing priority level", + json_schema_extra={ + "input": { + "type": "select", + "options": ["low", "medium", "high"] + } + } + ) +``` + +You can also use label/value pairs for more descriptive options: + +```python +from pydantic import BaseModel, Field + +class Tools: + class Valves(BaseModel): + log_level: str = Field( + default="info", + description="Logging verbosity", + json_schema_extra={ + "input": { + "type": "select", + "options": [ + {"value": "debug", "label": "Debug (Verbose)"}, + {"value": "info", "label": "Info (Standard)"}, + {"value": "warn", "label": "Warning (Minimal)"}, + {"value": "error", "label": "Error (Critical Only)"} + ] + } + } + ) +``` + +#### Dynamic Options + +For options that need to be generated at runtime (e.g., fetching available models, databases, or user-specific resources), specify a method name as a string. The method will be called when the configuration UI is rendered: + +```python +from pydantic import BaseModel, Field + +class Tools: + class Valves(BaseModel): + selected_model: str = Field( + default="", + description="Choose a model to use", + json_schema_extra={ + "input": { + "type": "select", + "options": "get_model_options" # Method name as string + } + } + ) + + @classmethod + def get_model_options(cls, __user__=None) -> list[dict]: + """ + Dynamically fetch available models. + Called when the Valves configuration UI is opened. + """ + # Example: Return options based on runtime state + return [ + {"value": "gpt-4", "label": "GPT-4"}, + {"value": "gpt-3.5-turbo", "label": "GPT-3.5 Turbo"}, + {"value": "claude-3-opus", "label": "Claude 3 Opus"} + ] +``` + +The method can accept an optional `__user__` parameter to generate user-specific options: + +```python +from pydantic import BaseModel, Field + +class Tools: + class UserValves(BaseModel): + workspace: str = Field( + default="", + description="Select your workspace", + json_schema_extra={ + "input": { + "type": "select", + "options": "get_user_workspaces" + } + } + ) + + @classmethod + def get_user_workspaces(cls, __user__=None) -> list[dict]: + """ + Return workspaces available to the current user. + __user__ contains the user's information as a dict. + """ + if not __user__: + return [] + + user_id = __user__.get("id") + # Fetch user-specific workspaces from your data source + return [ + {"value": "ws-1", "label": "Personal Workspace"}, + {"value": "ws-2", "label": "Team Workspace"} + ] +``` + +:::tip +Dynamic options are particularly useful for: +- Fetching available API models from connected providers +- Loading database or file options based on current system state +- Presenting user-specific resources like projects or workspaces +- Any scenario where options change based on runtime context +::: + diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index e5da337f8..1bbfea9c2 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -341,6 +341,12 @@ If you are running larger instances, you WILL NEED to set this to a higher value - Description: Globally enables or disables user status functionality. When disabled, the status UI (including blinking active/away indicators and status messages) is hidden across the application, and user status API endpoints are restricted. - Persistence: This environment variable is a `PersistentConfig` variable. It can be toggled in the **Admin Panel > Settings > General > User Status**. +#### `ENABLE_EASTER_EGGS` + +- Type: `bool` +- Default: `True` +- Description: Enables or disables easter egg features in the UI, such as special themes (e.g., the "Her" theme option in the theme selector). Set to `False` to hide these optional novelty features from users. + #### `ADMIN_EMAIL` - Type: `str` @@ -5641,6 +5647,22 @@ For deployments with many concurrent users, consider increasing both `DATABASE_P ::: +:::warning Pool Size Multiplies with Concurrency + +**Each Open WebUI process maintains its own independent connection pool.** This applies whether you're running multiple Uvicorn workers (`UVICORN_WORKERS > 1`), multiple Kubernetes pods, Docker Swarm replicas, or any other multi-instance deployment. + +The actual maximum number of database connections is: + +``` +Total connections = (DATABASE_POOL_SIZE + DATABASE_POOL_MAX_OVERFLOW) × Number of processes/instances +``` + +For example, with `DATABASE_POOL_SIZE=15`, `DATABASE_POOL_MAX_OVERFLOW=20`, and 4 instances (whether workers, pods, or replicas), you could open up to **140 connections** (35 × 4). + +When calculating pool settings, always account for this multiplier to avoid exhausting your database's `max_connections` limit. This is a fundamental limitation—connection pools cannot be shared across separate processes or containers. + +::: + #### `DATABASE_POOL_MAX_OVERFLOW` - Type: `int` diff --git a/docs/troubleshooting/multi-replica.mdx b/docs/troubleshooting/multi-replica.mdx index 2a0dc9a1e..a3f18fa1d 100644 --- a/docs/troubleshooting/multi-replica.mdx +++ b/docs/troubleshooting/multi-replica.mdx @@ -156,6 +156,22 @@ DATABASE_POOL_MAX_OVERFLOW=20 (or higher) **Important:** The combined total (`DATABASE_POOL_SIZE` + `DATABASE_POOL_MAX_OVERFLOW`) should remain well below your database's `max_connections` limit. PostgreSQL defaults to 100 max connections, so keep the combined total under 50-80 per Open WebUI instance to leave room for other clients and maintenance operations. +:::warning Pool Size Multiplies with Concurrency + +**Each Open WebUI process maintains its own independent connection pool.** This applies to multiple replicas (Kubernetes pods, Docker Swarm replicas) *and* multiple Uvicorn workers within each replica. + +The actual maximum number of database connections is: + +``` +Total connections = (DATABASE_POOL_SIZE + DATABASE_POOL_MAX_OVERFLOW) × Total processes +``` + +Where `Total processes = Number of replicas × UVICORN_WORKERS per replica`. + +For example, with `DATABASE_POOL_SIZE=15`, `DATABASE_POOL_MAX_OVERFLOW=20`, 3 replicas, and 2 workers each, you could open up to **210 connections** (35 × 6 processes). + +::: + See [DATABASE_POOL_SIZE](/getting-started/env-configuration#database_pool_size) for details. --- From ac568bc8694e9fe3ff518e29b817aac2a0fae22b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 17:18:14 +0100 Subject: [PATCH 11/50] Update prompts.md --- docs/features/workspace/prompts.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/features/workspace/prompts.md b/docs/features/workspace/prompts.md index eba31f61d..7c625a996 100644 --- a/docs/features/workspace/prompts.md +++ b/docs/features/workspace/prompts.md @@ -38,6 +38,11 @@ Open WebUI supports two kinds of variables to make your prompts more dynamic and * `{{CURRENT_WEEKDAY}}`: Current day of the week * **User Information**: * `{{USER_NAME}}`: Current user's name + * `{{USER_EMAIL}}`: Current user's email address + * `{{USER_BIO}}`: Current user's bio. Configured in **Settings > Account > User Profile**. If not set, the variable remains unreplaced. + * `{{USER_GENDER}}`: Current user's gender. Configured in **Settings > Account > User Profile**. If not set, the variable remains unreplaced. + * `{{USER_BIRTH_DATE}}`: Current user's birth date. Configured in **Settings > Account > User Profile**. If not set, the variable remains unreplaced. + * `{{USER_AGE}}`: Current user's age, calculated from birth date. If birth date is not set, the variable remains unreplaced. * `{{USER_LANGUAGE}}`: User's selected language * `{{USER_LOCATION}}`: User's location (requires HTTPS and Settings > Interface toggle) From 0925cd4da02130d581b4c30378072b8abd27540b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 22 Jan 2026 23:05:09 +0100 Subject: [PATCH 12/50] built in --- docs/features/memory.mdx | 1 + docs/features/plugin/tools/index.mdx | 44 ++++++++++++++++++++++++---- docs/features/workspace/knowledge.md | 4 +++ docs/features/workspace/models.md | 2 +- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/docs/features/memory.mdx b/docs/features/memory.mdx index 24748ff73..a26b4d973 100644 --- a/docs/features/memory.mdx +++ b/docs/features/memory.mdx @@ -45,6 +45,7 @@ Autonomous memory management works best with frontier models (GPT-5, Claude 4.5+ 1. **Administrative Enablement**: Ensure the Memory feature is [enabled globally](#administrative-controls) by an administrator and that you have the required permissions. 2. **Native Mode (Agentic Mode)**: Enable **Native Function Calling** in the model's advanced parameters (**Admin Panel > Settings > Models > Model Specific Settings > Advanced Parameters**). 3. **Quality Models Required**: To unlock these features effectively, use frontier models with strong reasoning capabilities (e.g., GPT-5, Claude 4.5 Sonnet, Gemini 3 Flash, MiniMax M2.1) for the best experience. Small local models may not effectively manage memories autonomously. +4. **Per-Model Category Toggle**: Ensure the **Memory** category is enabled for the model in **Workspace > Models > Edit > Builtin Tools** (enabled by default). :::info Central Tool Documentation For complete details on all built-in agentic tools (including memory, web search, and knowledge bases) and how to configure them, see the [**Native/Agentic Mode Tools Guide**](/features/plugin/tools#built-in-system-tools-nativeagentic-mode). diff --git a/docs/features/plugin/tools/index.mdx b/docs/features/plugin/tools/index.mdx index 8f8f82d7c..9797f4bb0 100644 --- a/docs/features/plugin/tools/index.mdx +++ b/docs/features/plugin/tools/index.mdx @@ -179,7 +179,7 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo | **Search & Web** | *Requires `ENABLE_WEB_SEARCH` enabled.* | | `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | | `fetch_url` | Visits a URL and extracts text content via the Web Loader. | -| **Knowledge Base** | *Always available.* | +| **Knowledge Base** | *Requires per-model "Knowledge Base" category enabled (default: on).* | | `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | | `query_knowledge_bases` | Search knowledge bases by semantic similarity to query. Finds KBs whose name/description match the meaning of your query. Use this to discover relevant knowledge bases before querying their files. | | `search_knowledge_bases` | Search knowledge bases by name and description. | @@ -189,24 +189,24 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo | **Image Gen** | *Requires image generation enabled (per-tool).* | | `generate_image` | Generates a new image based on a prompt. Requires `ENABLE_IMAGE_GENERATION`. | | `edit_image` | Edits existing images based on a prompt and image URLs. Requires `ENABLE_IMAGE_EDIT`. | -| **Memory** | *Requires Memory feature enabled.* | +| **Memory** | *Requires Memory feature enabled AND per-model "Memory" category enabled (default: on).* | | `search_memories` | Searches the user's personal memory/personalization bank. | | `add_memory` | Stores a new fact in the user's personalization memory. | | `replace_memory_content` | Updates an existing memory record by its unique ID. | -| **Notes** | *Requires `ENABLE_NOTES` enabled.* | +| **Notes** | *Requires `ENABLE_NOTES` AND per-model "Notes" category enabled (default: on).* | | `search_notes` | Search the user's notes by title and content. | | `view_note` | Get the full markdown content of a specific note. | | `write_note` | Create a new private note for the user. | | `replace_note_content` | Update an existing note's content or title. | -| **Chat History** | *Always available.* | +| **Chat History** | *Requires per-model "Chat History" category enabled (default: on).* | | `search_chats` | Simple text search across chat titles and message content. Returns matching chat IDs and snippets. | | `view_chat` | Reads and returns the full message history of a specific chat by ID. | -| **Channels** | *Requires `ENABLE_CHANNELS` enabled.* | +| **Channels** | *Requires `ENABLE_CHANNELS` AND per-model "Channels" category enabled (default: on).* | | `search_channels` | Find public or accessible channels by name/description. | | `search_channel_messages` | Search for specific messages inside accessible channels. | | `view_channel_message` | View a specific message or its details in a channel. | | `view_channel_thread` | View a full message thread/replies in a channel. | -| **Time Tools** | *Always available.* | +| **Time Tools** | *Requires per-model "Time & Calculation" category enabled (default: on).* | | `get_current_timestamp` | Get the current UTC Unix timestamp and ISO date. | | `calculate_timestamp` | Calculate relative timestamps (e.g., "3 days ago"). | @@ -274,6 +274,38 @@ The **Builtin Tools** capability can be toggled on or off for each model in the 2. **RAG still works** (if File Context is enabled): Attached files are still processed via RAG and injected as context. 3. **No autonomous retrieval**: The model cannot decide to search knowledge bases or fetch additional information—it works only with what's provided upfront. +#### Granular Builtin Tool Categories (Per-Model) + +When the **Builtin Tools** capability is enabled, you can further control which **categories** of builtin tools are available to the model. This appears in the Model Editor as a set of checkboxes under **Builtin Tools**. + +| Category | Tools Included | Description | +|----------|----------------|-------------| +| **Time & Calculation** | `get_current_timestamp`, `calculate_timestamp` | Get current time and perform date/time calculations | +| **Memory** | `search_memories`, `add_memory`, `replace_memory_content` | Search and manage user memories | +| **Chat History** | `search_chats`, `view_chat` | Search and view user chat history | +| **Notes** | `search_notes`, `view_note`, `write_note`, `replace_note_content` | Search, view, and manage user notes | +| **Knowledge Base** | `list_knowledge_bases`, `search_knowledge_bases`, `query_knowledge_bases`, `search_knowledge_files`, `query_knowledge_files`, `view_knowledge_file` | Browse and query knowledge bases | +| **Channels** | `search_channels`, `search_channel_messages`, `view_channel_message`, `view_channel_thread` | Search channels and channel messages | + +All categories are **enabled by default**. Disabling a category prevents those specific tools from being injected, while keeping other categories active. + +**Use cases for granular control:** + +| Scenario | Recommended Configuration | +|----------|---------------------------| +| **Privacy-focused model** | Disable Memory and Chat History to prevent access to personal data | +| **Read-only assistant** | Disable Notes (prevents creating/modifying notes) but keep Knowledge Base enabled | +| **Minimal token usage** | Enable only the categories the model actually needs | +| **Knowledge-centric bot** | Disable everything except Knowledge Base and Time | + +:::note +These per-category toggles only appear when the main **Builtin Tools** capability is enabled. If you disable Builtin Tools entirely, no tools are injected regardless of category settings. +::: + +:::info Global Features Take Precedence +Enabling a per-model category toggle does **not** override global feature flags. For example, if `ENABLE_NOTES` is disabled globally (Admin Panel), Notes tools will not be available even if the "Notes" category is enabled for the model. The per-model toggles only allow you to *further restrict* what's already available—they cannot enable features that are disabled at the global level. +::: + :::tip Builtin Tools vs File Context **Builtin Tools** controls whether the model gets *tools* for autonomous retrieval. It does **not** control whether file content is injected via RAG—that's controlled by the separate **File Context** capability. diff --git a/docs/features/workspace/knowledge.md b/docs/features/workspace/knowledge.md index 4cf4036b9..8b3eac22f 100644 --- a/docs/features/workspace/knowledge.md +++ b/docs/features/workspace/knowledge.md @@ -56,6 +56,10 @@ Autonomous knowledge base exploration works best with frontier models (GPT-5, Cl These tools enable models to autonomously explore and retrieve information from your knowledge bases, making conversations more contextually aware and grounded in your stored documents. +:::note Per-Model Control +The Knowledge Base tools require the **Knowledge Base** category to be enabled for the model in **Workspace > Models > Edit > Builtin Tools** (enabled by default). Administrators can disable this category per-model to prevent autonomous knowledge base access. +::: + :::info Central Tool Documentation For complete details on all built-in agentic tools and how to configure them, see the [**Native/Agentic Mode Tools Guide**](/features/plugin/tools#built-in-system-tools-nativeagentic-mode). ::: diff --git a/docs/features/workspace/models.md b/docs/features/workspace/models.md index 923325f89..d042124a0 100644 --- a/docs/features/workspace/models.md +++ b/docs/features/workspace/models.md @@ -85,7 +85,7 @@ You can transform a generic model into a specialized agent by toggling specific - **Image Generation**: Enable image generation integration. - **Usage / Citations**: Toggle usage tracking or source citations. - **Status Updates**: Show visible progress steps in the chat UI (e.g., "Searching web...", "Reading file...") during generation. Useful for slower, complex tasks. - - **Builtin Tools**: When enabled (default), automatically injects system tools (timestamps, memory, chat history, knowledge base queries, notes, etc.) in [Native Function Calling mode](../plugin/tools/index.mdx#disabling-builtin-tools-per-model). Disable this if the model doesn't support function calling or you need to save context window tokens. Note: This is separate from **File Context**—see [File Context vs Builtin Tools](../rag/index.md#file-context-vs-builtin-tools) for the difference. + - **Builtin Tools**: When enabled (default), automatically injects system tools (timestamps, memory, chat history, knowledge base queries, notes, etc.) in [Native Function Calling mode](../plugin/tools/index.mdx#disabling-builtin-tools-per-model). When enabled, you can further control which **tool categories** are available (Time, Memory, Chats, Notes, Knowledge, Channels) via checkboxes in the Model Editor. Disable the main toggle if the model doesn't support function calling or you need to save context window tokens. Note: This is separate from **File Context**—see [File Context vs Builtin Tools](../rag/index.md#file-context-vs-builtin-tools) for the difference. - **TTS Voice**: Set a specific Text-to-Speech voice for this model. When users read responses aloud, this voice will be used instead of the global default. Useful for giving different personas distinct voices. Leave empty to use the user's settings or system default. See [Per-Model TTS Voice](../audio/text-to-speech/openai-tts-integration#per-model-tts-voice) for details. - **Default Features**: Force specific toggles (like Web Search) to be "On" immediately when a user starts a chat with this model. From 87968101013d04ce52bdc674f2d13c8e96605d29 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:47:10 +0100 Subject: [PATCH 13/50] ENABLE_OAUTH_TOKEN_EXCHANGE --- docs/features/auth/sso/index.mdx | 9 +++++ docs/getting-started/env-configuration.mdx | 40 ++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/docs/features/auth/sso/index.mdx b/docs/features/auth/sso/index.mdx index aff93fb02..4b58eb89a 100644 --- a/docs/features/auth/sso/index.mdx +++ b/docs/features/auth/sso/index.mdx @@ -39,6 +39,7 @@ You cannot have Microsoft **and** Google as OIDC providers simultaneously. | `OAUTH_SESSION_TOKEN_ENCRYPTION_KEY` | `WEBUI_SECRET_KEY` | A secret key for encrypting OAuth tokens stored on the server. Must be shared across all instances in a cluster. | | `OAUTH_CLIENT_INFO_ENCRYPTION_KEY` | `WEBUI_SECRET_KEY` | A secret key for encrypting OAuth client information stored on the server - used for OAuth 2.1 authentication for MCP servers. | | `ENABLE_OAUTH_ID_TOKEN_COOKIE` | `true` | For backward compatibility. Controls if the legacy `oauth_id_token` cookie is set. Recommended to set to `false`. | +| `ENABLE_OAUTH_TOKEN_EXCHANGE` | `false` | Enables the token exchange endpoint for external apps to exchange OAuth tokens for Open WebUI JWTs. | :::warning @@ -69,6 +70,14 @@ This system is enabled by default but can be fine-tuned with the environment var For more information, check out the [environment variable docs page](https://docs.openwebui.com/getting-started/env-configuration/). +### OAuth Token Exchange for External Applications + +Open WebUI also supports **OAuth Token Exchange**, allowing external applications to authenticate with Open WebUI by exchanging an OAuth provider's access token for an Open WebUI JWT session token. This is useful for programmatic access from scripts, CLI tools, or services that already have OAuth tokens from your identity provider. + +**Example use case:** A CLI tool that has obtained an OAuth access token from your identity provider can exchange it for an Open WebUI token to make API calls to Open WebUI. + +To enable this feature, set `ENABLE_OAUTH_TOKEN_EXCHANGE=true`. See the [`ENABLE_OAUTH_TOKEN_EXCHANGE`](/getting-started/env-configuration#enable_oauth_token_exchange) environment variable documentation for details on usage, request/response examples, and security considerations. + ### Google To configure a Google OAuth client, please refer to [Google's documentation](https://support.google.com/cloud/answer/6158849) on how to create a Google OAuth client for a **web application**. diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 1bbfea9c2..faab79cce 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -4461,6 +4461,46 @@ If the OAuth picture claim is disabled by setting `OAUTH_PICTURE_CLAIM` to `''` - Description: Controls whether the **legacy** `oauth_id_token` cookie (unsafe, not recommended, token can go stale/orphaned) is set in the browser upon a successful OAuth login. This is provided for **backward compatibility** with custom tools or older versions that might rely on scraping this cookie. **The new, recommended approach is to use the server-side session management.** - Usage: For new and secure deployments, **it is recommended to set this to `False`** to minimize the information exposed to the client-side. Keep it as `True` only if you have integrations that depend on the old cookie-based method. +#### `ENABLE_OAUTH_TOKEN_EXCHANGE` + +- Type: `bool` +- Default: `False` +- Description: Enables the OAuth token exchange endpoint, allowing external applications to exchange an OAuth provider's access token for an Open WebUI JWT session token. This enables programmatic authentication for external tools and services that already have OAuth tokens from your identity provider. +- Usage: Set to `true` to enable the token exchange endpoint at `/api/v1/oauth/{provider}/token/exchange`. When enabled, external applications can POST to this endpoint with an OAuth access token to obtain an Open WebUI session token. + +:::warning + +**Security Note**: This feature should only be enabled when you have external applications that need to authenticate with Open WebUI using OAuth tokens from your identity provider. Ensure proper access controls are in place for any external applications using this endpoint. + +::: + +**Request Example:** +```bash +curl -X POST "http://localhost:8080/api/v1/oauth/google/token/exchange" \ + -H "Content-Type: application/json" \ + -d '{"token": "ya29.a0AfH6SMB..."}' +``` + +**Response:** +```json +{ + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", + "token_type": "Bearer", + "expires_at": 1735682400, + "id": 1, + "email": "user@example.com", + "name": "John Doe", + "role": "user", + "profile_image_url": "https://...", + "permissions": {...} +} +``` + +**Requirements:** +- The user must already exist in Open WebUI (they must have signed in via the web interface at least once) +- The OAuth provider must be properly configured +- The token exchange uses the same user lookup logic as regular OAuth login (by OAuth `sub` claim first, then by email if `OAUTH_MERGE_ACCOUNTS_BY_EMAIL` is enabled) + #### `OAUTH_CLIENT_INFO_ENCRYPTION_KEY` - Type: `str` From 584a7c5d1427b2c62a09fa47bf1e0a72243a924e Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Mon, 26 Jan 2026 19:17:32 +0100 Subject: [PATCH 14/50] 0.7.3 new env vars, prompts and yandex --- docs/features/web-search/yandex.md | 43 ++++++++++++++++++ docs/features/workspace/prompts.md | 52 ++++++++++++++++++---- docs/getting-started/env-configuration.mdx | 22 +++++++++ 3 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 docs/features/web-search/yandex.md diff --git a/docs/features/web-search/yandex.md b/docs/features/web-search/yandex.md new file mode 100644 index 000000000..a3c8c588c --- /dev/null +++ b/docs/features/web-search/yandex.md @@ -0,0 +1,43 @@ +--- +sidebar_position: 14 +title: "Yandex" +--- + +:::tip + +For a comprehensive list of all environment variables related to Web Search (including concurrency settings, result counts, and more), please refer to the [Environment Configuration documentation](../../getting-started/env-configuration#web-search). + +::: + +:::tip Troubleshooting + +Having issues with web search? Check out the [Web Search Troubleshooting Guide](../../troubleshooting/web-search) for solutions to common problems like proxy configuration, connection timeouts, and empty content. + +::: + +## Yandex Search API + +Support for Yandex Web Search is integrated via the [Yandex Cloud Search API](https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search). + +### Docker Compose Setup + +Add the following environment variables to your Open WebUI `docker-compose.yaml` file: + +```yaml +services: + open-webui: + environment: + ENABLE_RAG_WEB_SEARCH: True + RAG_WEB_SEARCH_ENGINE: "yandex" + YANDEX_WEB_SEARCH_API_KEY: "YOUR_YANDEX_CLOUD_API_KEY" + # Optional: Override default search URL + # YANDEX_WEB_SEARCH_URL: "https://searchapi.api.cloud.yandex.net/v2/web/search" + # Optional: Custom JSON configuration for Yandex Search API + # YANDEX_WEB_SEARCH_CONFIG: '{"query": {"searchType": "SEARCH_TYPE_RU"}}' +``` + +### Configuration Options + +* **YANDEX_WEB_SEARCH_URL**: The endpoint for the Yandex Search API. Defaults to `https://searchapi.api.cloud.yandex.net/v2/web/search`. +* **YANDEX_WEB_SEARCH_API_KEY**: Your Yandex Cloud API Key. +* **YANDEX_WEB_SEARCH_CONFIG**: An optional JSON string to customize the search request (e.g., setting `searchType`, `region`, or other parameters supported by the Yandex Search API). diff --git a/docs/features/workspace/prompts.md b/docs/features/workspace/prompts.md index 7c625a996..00ca12419 100644 --- a/docs/features/workspace/prompts.md +++ b/docs/features/workspace/prompts.md @@ -9,19 +9,23 @@ The `Prompts` section of the `Workspace` within Open WebUI enables users to crea The Prompts interface provides several key features for managing your custom prompts: -* **Create**: Design new prompts with customizable titles, access levels, and content. +* **Create**: Design new prompts with customizable names, tags, access levels, and content. * **Share**: Share prompts with other users based on configured access permissions. * **Access Control**: Set visibility and usage permissions for each prompt (refer to [Permissions](/features/rbac/permissions) for more details). * **Slash Commands**: Quickly access prompts using custom slash commands during chat sessions. +* **Versioning & History**: Track every change with a full version history, allowing you to compare and revert to previous versions. +* **Tags & Filtering**: Organize your prompts using tags and easily filter through your collection in the workspace. ### Creating and Editing Prompts When creating or editing a prompt, you can configure the following settings: -* **Title**: Give your prompt a descriptive name for easy identification. +* **Name**: Give your prompt a descriptive name for easy identification. +* **Tags**: Categorize your prompts with tags to make them easier to find and filter in your workspace. * **Access**: Set the access level to control who can view and use the prompt. -* **Command**: Define a slash command that will trigger the prompt (e.g., `/summarize`). +* **Command**: Define a slash command that will trigger the prompt (e.g., `/summarize`). Commands are triggered in the chat by typing `/` followed by the command name. * **Prompt Content**: Write the actual prompt text that will be sent to the model. +* **Commit Message**: When saving changes, you can provide an optional commit message to describe what was updated in this version. ### Prompt Variables @@ -58,7 +62,19 @@ By leveraging custom input variables, you can move beyond static text and build * The `{{USER_LOCATION}}` system variable requires: * A secure HTTPS connection * Enabling the feature in `Settings` > `Interface` -* The `{{CLIPBOARD}}` system variable requires clipboard access permission from your device +* The `{{CLIPBOARD}}` system variable requires clipboard access permission from your device. + +--- + +#### Advanced Variable Modifiers + +Certain system variables like `{{prompt}}` and `{{MESSAGES}}` support optional modifiers to control their length and which part of the content is included. This is particularly useful for managing context window limits. + +* **Start Truncation**: `{{prompt:start:N}}` - Includes only the first **N** characters of the content. +* **End Truncation**: `{{prompt:end:N}}` - Includes only the last **N** characters of the content. +* **Middle Truncation**: `{{prompt:middletruncate:N}}` - Includes a total of **N** characters, taking half from the beginning and half from the end, with `...` in the middle. + +These modifiers also work with the `{{MESSAGES}}` variable (e.g., `{{MESSAGES:START:5}}` to include only the first 5 messages). --- @@ -239,6 +255,26 @@ A flexible template for reviewing various types of content. Please provide detailed feedback and suggestions for improvement. ``` +### Prompt Versioning and History + +Open WebUI includes a robust versioning system for prompts, allowing you to track changes over time and revert to previous versions if needed. + +#### Version Tracking +Every time you save changes to a prompt's content, name, command, or access control, a new version is automatically created. This ensures that your prompt's evolution is preserved. + +#### History Sidebar +When editing an existing prompt, you will see a **History** sidebar (on desktop) that lists all previous versions in reverse chronological order. Each entry shows: +* **Commit Message**: A brief description of the changes (if provided). +* **Author**: The user who made the changes, including their profile picture. +* **Timestamp**: When the change was made. +* **Live Badge**: Indicates which version is currently active in the chat. + +#### Managing Versions +* **Previewing**: Click on any version in the history sidebar to preview its content in the main editor. +* **Setting as Production**: To make a previous version the active "Live" version, select it and click **Set as Production**. +* **Deleting Versions**: You can delete individual history entries by clicking the menu icon next to the version. Note that you cannot delete the currently active production version. +* **Copying ID**: Click the prompt ID or a specific version's short ID to copy it to your clipboard for reference. + ### Access Control and Permissions Prompt management is controlled by the following permission settings: @@ -261,8 +297,6 @@ Prompt management is controlled by the following permission settings: ### Migration Notes -If you have existing prompts created before this update, they will continue to work as before. However, note that: - -* All existing variables are now treated as optional by default -* If you want to maintain required behavior for critical fields, edit your prompts to add the `:required` flag to those variables -* This change provides better user experience by allowing flexible usage of prompt templates +* **Prompt History Migration**: Existing prompts created before the versioning update have been automatically migrated to the new system. Their current content has been preserved as the initial "Live" version in their history. +* **ID-based URLs**: The URL structure for editing prompts has changed from using commands to using unique IDs. Existing bookmarks to prompt edit pages may need to be updated. +* **Variable Requirement**: As of the v0.5.0 update, all variables are now treated as optional by default. To maintain required behavior for critical fields, edit your prompts to add the `:required` flag to those variables. diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index faab79cce..ddc65bfd9 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -3285,6 +3285,7 @@ Allow only specific domains: WEB_FETCH_FILTER_LIST="example.com,trusted-site.org - `ollama_cloud` - Uses the [Ollama Cloud](https://ollama.com/blog/web-search) search engine. - `azure_ai_search` - `yacy` + - `yandex` - Uses the [Yandex Search API](https://yandex.cloud/en/docs/search-api/api-ref/WebSearch/search). - Persistence: This environment variable is a `PersistentConfig` variable. #### `DDGS_BACKEND` @@ -3549,6 +3550,27 @@ Brave's free tier enforces a rate limit of 1 request per second. Open WebUI auto - Description: Sets the API key for authenticating with the external web loader service. - Persistence: This environment variable is a `PersistentConfig` variable. +#### `YANDEX_WEB_SEARCH_URL` + +- Type: `str` +- Default: `https://searchapi.api.cloud.yandex.net/v2/web/search` +- Description: Specifies the URL of the Yandex Web Search service API endpoint. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `YANDEX_WEB_SEARCH_API_KEY` + +- Type: `str` +- Default: Empty string (' ') +- Description: Sets the API key for authenticating with the Yandex Web Search service. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `YANDEX_WEB_SEARCH_CONFIG` + +- Type: `str` +- Default: Empty string (' ') +- Description: Optional JSON configuration string for Yandex Web Search. Can be used to set parameters like `searchType` or `region` as per the Yandex API documentation. +- Persistence: This environment variable is a `PersistentConfig` variable. + #### `PERPLEXITY_API_KEY` - Type: `str` From b2c23ff67546e9f16202e5e5b2218d18b89a8bb3 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:50:25 +0100 Subject: [PATCH 15/50] db schema --- docs/features/web-search/yandex.md | 8 +++- docs/tutorials/tips/sqlite-database.md | 63 ++++++++++++++++++++------ 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/docs/features/web-search/yandex.md b/docs/features/web-search/yandex.md index a3c8c588c..4dc1c9ee9 100644 --- a/docs/features/web-search/yandex.md +++ b/docs/features/web-search/yandex.md @@ -3,6 +3,12 @@ sidebar_position: 14 title: "Yandex" --- +:::warning + +This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. + +::: + :::tip For a comprehensive list of all environment variables related to Web Search (including concurrency settings, result counts, and more), please refer to the [Environment Configuration documentation](../../getting-started/env-configuration#web-search). @@ -40,4 +46,4 @@ services: * **YANDEX_WEB_SEARCH_URL**: The endpoint for the Yandex Search API. Defaults to `https://searchapi.api.cloud.yandex.net/v2/web/search`. * **YANDEX_WEB_SEARCH_API_KEY**: Your Yandex Cloud API Key. -* **YANDEX_WEB_SEARCH_CONFIG**: An optional JSON string to customize the search request (e.g., setting `searchType`, `region`, or other parameters supported by the Yandex Search API). +* **YANDEX_WEB_SEARCH_CONFIG**: An optional JSON string to customize the search request. This allows you to set any parameters supported by the Yandex Search API. diff --git a/docs/tutorials/tips/sqlite-database.md b/docs/tutorials/tips/sqlite-database.md index 131095958..50860c9cf 100644 --- a/docs/tutorials/tips/sqlite-database.md +++ b/docs/tutorials/tips/sqlite-database.md @@ -79,9 +79,10 @@ Here is a complete list of tables in Open-WebUI's SQLite database. The tables ar | 23 | note | Stores user-created notes and annotations | | 24 | oauth_session | Manages active OAuth sessions for users | | 25 | prompt | Stores templates and configurations for AI prompts | -| 26 | tag | Manages tags/labels for content categorization | -| 27 | tool | Stores configurations for system tools and integrations | -| 28 | user | Maintains user profiles and account information | +| 26 | prompt_history | Tracks version history and snapshots for prompts | +| 27 | tag | Manages tags/labels for content categorization | +| 28 | tool | Stores configurations for system tools and integrations | +| 29 | user | Maintains user profiles and account information | Note: there are two additional tables in Open-WebUI's SQLite database that are not related to Open-WebUI's core functionality, that have been excluded: @@ -446,14 +447,33 @@ The `access_control` fields expected structure: ## Prompt Table -| **Column Name** | **Data Type** | **Constraints** | **Description** | -| --------------- | ------------- | --------------- | ------------------------- | -| command | String | PRIMARY KEY | Unique command identifier | -| user_id | String | - | Prompt owner | -| title | Text | - | Prompt title | -| content | Text | - | Prompt content/template | -| timestamp | BigInteger | - | Last update timestamp | -| access_control | JSON | nullable | Access permissions | +| **Column Name** | **Data Type** | **Constraints** | **Description** | +| --------------- | ------------- | --------------- | ----------------------------------- | +| id | Text | PRIMARY KEY | Unique identifier (UUID) | +| command | String | UNIQUE, INDEX | Unique command identifier | +| user_id | String | NOT NULL | Owner of the prompt | +| name | Text | NOT NULL | Display name of the prompt | +| content | Text | NOT NULL | Prompt content/template | +| data | JSON | nullable | Additional prompt data | +| meta | JSON | nullable | Prompt metadata | +| access_control | JSON | nullable | Permission settings | +| is_active | Boolean | default=True | Active status | +| version_id | Text | nullable | Current version identifier | +| tags | JSON | nullable | Associated tags | +| created_at | BigInteger | NOT NULL | Creation timestamp | +| updated_at | BigInteger | NOT NULL | Last update timestamp | + +## Prompt History Table + +| **Column Name** | **Data Type** | **Constraints** | **Description** | +| --------------- | ------------- | ------------------------------ | --------------------------------- | +| id | Text | PRIMARY KEY | Unique identifier (UUID) | +| prompt_id | Text | FOREIGN KEY(prompt.id), INDEX | Reference to the prompt | +| parent_id | Text | nullable | Reference to the parent version | +| snapshot | JSON | NOT NULL | Snapshot of the prompt at version | +| user_id | Text | NOT NULL | User who created the version | +| commit_message | Text | nullable | Version commit message | +| created_at | BigInteger | NOT NULL | Creation timestamp | ## Tag Table @@ -524,6 +544,8 @@ erDiagram user ||--o{ memory : "owns" user ||--o{ model : "manages" user ||--o{ prompt : "creates" + user ||--o{ prompt_history : "creates" + prompt ||--o{ prompt_history : "has" user ||--o{ tag : "creates" user ||--o{ tool : "manages" user ||--o{ note : "owns" @@ -698,11 +720,26 @@ erDiagram } prompt { - string command PK + text id PK + string command string user_id FK - text title + text name text content + json data + json meta json access_control + boolean is_active + text version_id + json tags + } + + prompt_history { + text id PK + text prompt_id FK + text parent_id FK + json snapshot + text user_id FK + text commit_message } tag { From d4cb35adef36dd17a41dff507a543b9ee90c2df9 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 27 Jan 2026 23:17:43 +0100 Subject: [PATCH 16/50] SECURITY WARNINGS tools and plugins --- docs/features/pipelines/index.mdx | 4 +-- docs/features/plugin/functions/index.mdx | 6 ++++ docs/features/plugin/index.mdx | 22 ++++++++++++ docs/security.mdx | 44 ++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/docs/features/pipelines/index.mdx b/docs/features/pipelines/index.mdx index 354ba4b62..d27376ae1 100644 --- a/docs/features/pipelines/index.mdx +++ b/docs/features/pipelines/index.mdx @@ -53,9 +53,9 @@ Integrating Pipelines with any OpenAI API-compatible UI client is simple. Launch ## ⚡ Quick Start with Docker -:::warning +:::danger ⚠️ Security Warning -Pipelines are a plugin system with arbitrary code execution — **don't fetch random pipelines from sources you don't trust**. +Pipelines are a plugin system with arbitrary code execution — **don't fetch random pipelines from sources you don't trust**. A malicious Pipeline could access your file system, exfiltrate data, mine cryptocurrency, or compromise your system. Always review Pipeline source code before installing. See the [Security Policy](/security) for more details. ::: diff --git a/docs/features/plugin/functions/index.mdx b/docs/features/plugin/functions/index.mdx index e3f719a76..f6548f42b 100644 --- a/docs/features/plugin/functions/index.mdx +++ b/docs/features/plugin/functions/index.mdx @@ -11,6 +11,12 @@ Unlike external tools that may require complex integrations, **Functions are bui Think of Functions as **modular building blocks** that let you enhance how the WebUI works, tailored exactly to what you need. They’re lightweight, highly customizable, and written in **pure Python**, so you have the freedom to create anything—from new AI-powered workflows to integrations with anything you use, like Google Search or Home Assistant. +:::danger ⚠️ Security Warning + +**Functions execute arbitrary Python code on your server.** Only install Functions from trusted sources. Before importing any Function, review its source code to understand what it does. A malicious Function could access your file system, exfiltrate data, or compromise your system. See the [Security Policy](/security) for more details. + +::: + --- ## 🏗️ Types of Functions diff --git a/docs/features/plugin/index.mdx b/docs/features/plugin/index.mdx index f8e6dd434..20842e2d6 100644 --- a/docs/features/plugin/index.mdx +++ b/docs/features/plugin/index.mdx @@ -17,6 +17,28 @@ Getting started with Tools and Functions is easy because everything’s already ## What are "Tools" and "Functions"? +--- + +:::danger ⚠️ Critical Security Warning + +**Tools, Functions, Pipes, Filters, and Pipelines execute arbitrary Python code on your server.** This is by design—it's what makes them powerful. However, this also means: + +1. **Only install from trusted sources.** Never import Tools or Functions from unknown or untrusted sources. Malicious code can compromise your entire system. + +2. **Review code before importing.** Before installing any community Tool or Function, review its source code. If you don't understand what it does, don't install it. + +3. **Protect your data directory.** The `data` directory (mounted at `/app/backend/data` in Docker) contains your database, configurations, and cached Tools/Functions. If an attacker gains write access to this directory, they can inject malicious code that will execute on your server. + +4. **Restrict Workspace access.** Only trusted administrators should have permission to create, import, or modify Tools and Functions. Regular users should **not** have Workspace access unless explicitly required. + +5. **Audit installed plugins regularly.** Periodically review the Tools and Functions installed in your instance via **Workspace → Tools** and **Admin Panel → Functions**. + +**What could go wrong?** A malicious Tool or Function could exfiltrate data, install malware, mine cryptocurrency, pivot to other systems on your network, or corrupt your instance. + +::: + +--- + Let's start by thinking of **Open WebUI** as a "base" software that can do many tasks related to using Large Language Models (LLMs). But sometimes, you need extra features or abilities that don't come *out of the box*—this is where **tools** and **functions** come into play. ### Tools diff --git a/docs/security.mdx b/docs/security.mdx index b57dcd72f..35d30100b 100644 --- a/docs/security.mdx +++ b/docs/security.mdx @@ -85,6 +85,50 @@ If your concern does not meet the vulnerability requirements outlined above, is Examples of non-vulnerability, still security-related concerns include suggestions for better default configuration values, security hardening recommendations, deployment best practices guidance, unclear configuration instructions, need for additional security documentation, feature requests for optional security enhancements (2FA, audit logging, etc.), and general security questions about production deployment. Please use the adequate channel for your specific issue. +## Tools, Functions, and Pipelines Security + +Open WebUI provides powerful extensibility through **Tools**, **Functions** (including Pipes, Filters, and Actions), and **Pipelines**. These features allow you to extend Open WebUI's capabilities with custom Python code. However, this power comes with security responsibilities. + +:::warning + +**Tools, Functions, and Pipelines execute arbitrary Python code on your server.** This is intentional—it's what makes them powerful. However, this means they have the same level of access as the Open WebUI backend process itself. + +::: + +### Security Implications + +When you install a Tool, Function, or Pipeline, you are granting it the ability to: + +- **Access the file system** — read or write any files the backend process can access +- **Make network requests** — connect to external services, potentially exfiltrating data +- **Execute system commands** — run shell commands via subprocess +- **Access environment variables** — read API keys, secrets, and configuration +- **Modify the database** — access or alter stored data +- **Consume compute resources** — run CPU-intensive operations + +### Best Practices + +| Practice | Description | +|----------|-------------| +| **Only install from trusted sources** | Only use Tools/Functions from the official community library or sources you trust | +| **Review code before installing** | Read and understand what a Tool/Function does before importing it | +| **Restrict Workspace access** | Only grant Workspace permissions to trusted administrators | +| **Audit installed plugins** | Regularly review installed Tools (Workspace → Tools) and Functions (Admin Panel → Functions) | +| **Protect your data directory** | The `/app/backend/data` directory contains your database and cached plugins—protect it from unauthorized access | +| **Monitor resource usage** | Watch for unexpected CPU spikes that could indicate cryptomining or other abuse | +| **Use official Docker images** | Only pull from `ghcr.io/open-webui/open-webui`—unofficial images may be compromised | + +### What Is NOT a Vulnerability + +The following scenarios are **not** considered vulnerabilities because they require administrator action: + +- An admin installing a malicious Tool or Function +- An admin granting Workspace access to an untrusted user +- An admin importing code from an untrusted source +- An attacker with write access to the data volume injecting malicious plugins + +These scenarios represent **admin negligence** or **environment compromise**, not vulnerabilities in Open WebUI itself. See [Rule #10 in our Security Policy](https://github.com/open-webui/open-webui/security) for details. + ## Product Security Process - Internal and periodic external reviews of our architecture and pipelines From df2dbf6edd614cfe05ec565de78a7b26fa030217 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 27 Jan 2026 23:19:11 +0100 Subject: [PATCH 17/50] playground --- docs/features/index.mdx | 2 +- docs/security.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/features/index.mdx b/docs/features/index.mdx index d757b5673..3aeceba0e 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -276,7 +276,7 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🍻 **TavernAI Character Card Integration**: Experience enhanced visual storytelling with TavernAI Character Card Integration in our model builder. Users can seamlessly incorporate TavernAI character card PNGs directly into their model files, creating a more immersive and engaging user experience. -- 🎲 **Model Playground (Beta)**: Try out models with the model playground area (`beta`), which enables users to test and explore model capabilities and parameters with ease in a sandbox environment before deployment in a live chat environment. +- 🎲 **Model Playground (Beta)**: Try out models with the model playground area (`beta`), which enables users to test and explore model capabilities and parameters with ease in a sandbox environment before deployment in a live chat environment. Export your playground conversations in JSON format (compatible with Open WebUI chat import) or as plain text for easy sharing and documentation. --- diff --git a/docs/security.mdx b/docs/security.mdx index 35d30100b..dcf5bc7ad 100644 --- a/docs/security.mdx +++ b/docs/security.mdx @@ -127,7 +127,7 @@ The following scenarios are **not** considered vulnerabilities because they requ - An admin importing code from an untrusted source - An attacker with write access to the data volume injecting malicious plugins -These scenarios represent **admin negligence** or **environment compromise**, not vulnerabilities in Open WebUI itself. See [Rule #10 in our Security Policy](https://github.com/open-webui/open-webui/security) for details. +These scenarios represent **admin negligence** or **environment compromise**, not vulnerabilities in Open WebUI itself. See [our Security Policy](https://github.com/open-webui/open-webui/security) for details. ## Product Security Process From 27f9defab44a81dc093fb0ba081e098237d63204 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 08:38:52 +0100 Subject: [PATCH 18/50] sync (#1040) Co-authored-by: Friedrich Staufenbiel Co-authored-by: Alex Zolotarov <62614322+webgtx@users.noreply.github.com> Co-authored-by: MaxDevNix --- docs/features/plugin/tools/development.mdx | 1 - docs/features/web-search/google-pse.md | 6 + docs/features/web-search/searxng.md | 2 +- docs/getting-started/env-configuration.mdx | 14 +- .../integrations/entra-group-name-sync.md | 209 ++++++++++++++++++ 5 files changed, 217 insertions(+), 15 deletions(-) create mode 100644 docs/tutorials/integrations/entra-group-name-sync.md diff --git a/docs/features/plugin/tools/development.mdx b/docs/features/plugin/tools/development.mdx index 46cd1e32f..b0244dc3c 100644 --- a/docs/features/plugin/tools/development.mdx +++ b/docs/features/plugin/tools/development.mdx @@ -1553,7 +1553,6 @@ When embedding external content, several security options can be configured thro - `iframeSandboxAllowForms`: Allow form submissions within embedded content - `iframeSandboxAllowSameOrigin`: Allow same-origin requests (use with caution) -- `iframeSandboxAllowPopups`: Allow popup windows from embedded content #### Use Cases diff --git a/docs/features/web-search/google-pse.md b/docs/features/web-search/google-pse.md index 4c3f2e4d9..c1a2f7bb3 100644 --- a/docs/features/web-search/google-pse.md +++ b/docs/features/web-search/google-pse.md @@ -5,6 +5,12 @@ title: "Google PSE" :::warning +**New Google PSE projects are no longer supported.** Google has restricted the legacy JSON API to existing customers only. New users attempting to use Google PSE will receive a `403 Forbidden` error. + +::: + +:::warning + This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. ::: diff --git a/docs/features/web-search/searxng.md b/docs/features/web-search/searxng.md index 3d90c1299..e3aeefd80 100644 --- a/docs/features/web-search/searxng.md +++ b/docs/features/web-search/searxng.md @@ -261,7 +261,7 @@ docker compose up -d :::note -On the first run, you must remove `cap_drop: - ALL` from the `docker-compose.yaml` file for the `searxng` service to successfully create `/etc/searxng/uwsgi`.ini. This is necessary because the `cap_drop: - ALL` directive removes all capabilities, including those required for the creation of the `uwsgi.ini` file. After the first run, you should re-add `cap_drop: - ALL` to the `docker-compose.yaml` file for security reasons. +On the first run, you must remove `cap_drop: - ALL` from the `docker-compose.yaml` file for the `searxng` service to successfully create `/etc/searxng/uwsgi.ini`. This is necessary because the `cap_drop: - ALL` directive removes all capabilities, including those required for the creation of the `uwsgi.ini` file. After the first run, you should re-add `cap_drop: - ALL` to the `docker-compose.yaml` file for security reasons. ::: diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index ddc65bfd9..694309471 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -270,23 +270,11 @@ is also being used and set to `True`. **Never disable this if OAUTH/SSO is not b - Default: `True` - Description: Enables admin users to directly access the chats of other users. When disabled, admins can no longer accesss user's chats in the admin panel. If you disable this, consider disabling `ENABLE_ADMIN_EXPORT` too, if you are using SQLite, as the exports also contain user chats. -#### `ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS` - -- Type: `bool` -- Default: `True` -- Description: Enables admin users to access all workspace content (models, knowledge bases, prompts, and tools) regardless of access control settings. When set to `False`, admins will only see workspace items they have been explicitly granted access to. - -:::warning **Deprecated** - -**This environment variable is deprecated and may be removed in a future release.** Use [`BYPASS_ADMIN_ACCESS_CONTROL`](#bypass_admin_access_control) instead, which provides the same functionality with a clearer name. - -::: - #### `BYPASS_ADMIN_ACCESS_CONTROL` - Type: `bool` - Default: `True` -- Description: When disabled, admin users are treated like regular users for workspace access (models, knowledge, prompts and tools) and only see items they have **explicit permission to access** through the existing access control system. This also applies to the visibility of models in the model selector - admins will be treated as regular users: base models and custom models they do not have **explicit permission to access**, will be hidden. If set to `True` (Default), admins have access to **all created items** in the workspace area and all models in the model selector, **regardless of access permissions**. +- Description: When disabled, admin users are treated like regular users for workspace access (models, knowledge, prompts and tools) and only see items they have **explicit permission to access** through the existing access control system. This also applies to the visibility of models in the model selector - admins will be treated as regular users: base models and custom models they do not have **explicit permission to access**, will be hidden. If set to `True` (Default), admins have access to **all created items** in the workspace area and all models in the model selector, **regardless of access permissions**. This environment variable deprecates `ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS`. If you are still using `ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS` you should switch to `BYPASS_ADMIN_ACCESS_CONTROL`. #### `ENABLE_USER_WEBHOOKS` diff --git a/docs/tutorials/integrations/entra-group-name-sync.md b/docs/tutorials/integrations/entra-group-name-sync.md new file mode 100644 index 000000000..6aec23f6f --- /dev/null +++ b/docs/tutorials/integrations/entra-group-name-sync.md @@ -0,0 +1,209 @@ +--- +sidebar_position: 15 +title: "Microsoft Entra ID Group Name Sync" +--- + +:::warning + +This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. + +::: + +# Microsoft Entra ID Group Name Sync + +By default, when you configure Microsoft Entra ID OAuth and automatic group creation with Open WebUI, security groups are synced using their **Group IDs (GUIDs)** rather than human-readable group names. This is a Microsoft limitation where the ID token doesn't include group display names by default. + +This tutorial explains how to configure Microsoft Entra ID to return group **names** instead of IDs, enabling a much better user experience when working with groups in Open WebUI. + +## Prerequisites + +- An Open WebUI instance configured with [Microsoft OAuth](/features/auth/sso#microsoft) +- An Azure account with permissions to modify App Registrations +- Access to the Microsoft Entra admin center +- Basic understanding of Microsoft Entra ID application configuration + +## Overview + +To get human-readable group names in Open WebUI, you need to: + +1. Configure your App Registration to include groups in the token +2. Modify the application manifest to use `cloud_displayname` +3. Set `groupMembershipClaims` to `ApplicationGroup` only +4. Assign security groups to the Enterprise Application +5. Configure Open WebUI environment variables for [OAuth Group Management](/features/auth/sso#oauth-group-management) + +:::info Key Requirement + +The `cloud_displayname` property in the manifest **only works** when `groupMembershipClaims` is set to `ApplicationGroup`. If you include other options (like `SecurityGroup` or `All`), the token will revert to using Group IDs instead of names. + +::: + +## Step 1: Configure Token Claims in App Registration + +1. Navigate to the **Microsoft Entra admin center** > **App registrations** +2. Select your Open WebUI application +3. Go to **Token configuration** in the left menu +4. Click **Add groups claim** +5. Select **Security groups** (or the appropriate group type for your needs) +6. Under **Customize token properties by type**, ensure groups are added for: + - ID token + - Access token +7. Click **Add** + +## Step 2: Modify the Application Manifest + +This is the critical step that enables group names instead of IDs. + +1. In your App Registration, go to **Manifest** in the left menu +2. Locate the `optionalClaims` section +3. Add `cloud_displayname` to the `additionalProperties` array for each token type + +Your manifest should look like this: + +```json +"optionalClaims": { + "idToken": [ + { + "name": "groups", + "source": null, + "essential": false, + "additionalProperties": [ + "cloud_displayname" + ] + } + ], + "accessToken": [ + { + "name": "groups", + "source": null, + "essential": false, + "additionalProperties": [ + "cloud_displayname" + ] + } + ], + "saml2Token": [ + { + "name": "groups", + "source": null, + "essential": false, + "additionalProperties": [ + "cloud_displayname" + ] + } + ] +} +``` + +4. **Critical**: Set `groupMembershipClaims` to `ApplicationGroup` only: + +```json +"groupMembershipClaims": "ApplicationGroup" +``` + +:::warning + +If `groupMembershipClaims` includes other values like `SecurityGroup` or `All`, the `cloud_displayname` property will be ignored and the token will contain Group IDs instead of names. See [Microsoft's optional claims documentation](https://learn.microsoft.com/en-us/entra/identity-platform/optional-claims) for more details. + +::: + +5. Click **Save** + +## Step 3: Assign Groups to the Enterprise Application + +When using `ApplicationGroup`, only groups explicitly assigned to the Enterprise Application will be included in the token. + +1. Navigate to **Microsoft Entra admin center** > **Enterprise applications** +2. Find and select your Open WebUI application +3. Go to **Users and groups** in the left menu +4. Click **Add user/group** +5. Select the security groups you want to sync with Open WebUI +6. Click **Assign** + +:::warning Multiple Group Assignment + +When a user belongs to multiple groups, ensure all relevant groups are assigned to the Enterprise Application. Note that only groups explicitly assigned here will appear in the user's token and subsequently sync to Open WebUI. + +::: + +## Step 4: Configure API Permissions + +Ensure your App Registration has the required Microsoft Graph permissions: + +1. In your App Registration, go to **API permissions** +2. Click **Add a permission** > **Microsoft Graph** > **Delegated permissions** +3. Add the following permissions from the OpenID section if not already present: + - `openid` + - `email` + - `profile` +4. Click **Grant admin consent for [your organization]** + +## Step 5: Configure Open WebUI Environment Variables + +Configure the following environment variables for your Open WebUI deployment. For more details on each variable, see the [environment variable documentation](/getting-started/env-configuration). + +```bash +# Required: Your public WebUI address +WEBUI_URL=https://your-open-webui-domain + +# Microsoft OAuth Configuration (required) +MICROSOFT_CLIENT_ID=your_client_id +MICROSOFT_CLIENT_SECRET=your_client_secret +MICROSOFT_CLIENT_TENANT_ID=your_tenant_id +MICROSOFT_REDIRECT_URI=https://your-open-webui-domain/oauth/microsoft/callback + +# Required for logout to work properly +OPENID_PROVIDER_URL=https://login.microsoftonline.com/your_tenant_id/v2.0/.well-known/openid-configuration + +# Enable OAuth signup +ENABLE_OAUTH_SIGNUP=true + +# OAuth Group Management +OAUTH_GROUP_CLAIM=groups +ENABLE_OAUTH_GROUP_MANAGEMENT=true +ENABLE_OAUTH_GROUP_CREATION=true + +# Recommended: Set a consistent secret key +WEBUI_SECRET_KEY=your_secure_secret_key +``` + +### Environment Variable Reference + +| Variable | Default | Description | +| ------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `OAUTH_GROUP_CLAIM` | `groups` | The claim in the ID/access token containing the user's group memberships. | +| `ENABLE_OAUTH_GROUP_MANAGEMENT` | `false` | When `true`, user group memberships are synchronized with OAuth claims upon each login. | +| `ENABLE_OAUTH_GROUP_CREATION` | `false` | When `true`, enables **Just-in-Time (JIT) group creation** - groups present in OAuth claims but not in Open WebUI will be created automatically. | + +:::warning Strict Group Synchronization + +When `ENABLE_OAUTH_GROUP_MANAGEMENT` is set to `true`, a user's group memberships in Open WebUI are **strictly synchronized** with the groups received in their OAuth claims upon each login. + +- Users will be **added** to Open WebUI groups that match their OAuth claims. +- Users will be **removed** from any Open WebUI groups (including those manually assigned within Open WebUI) if those groups are **not** present in their OAuth claims for that login session. + +::: + +## Verification + +After completing the configuration: + +1. **Test the token**: Use [https://jwt.ms](https://jwt.ms) to decode your ID token and verify that the `groups` claim contains display names instead of GUIDs. +2. **Log in as a non-admin user**: Admin users' group memberships are not automatically updated via OAuth group management. Use a standard user account for testing. +3. **Check Open WebUI**: Navigate to the Admin Panel and verify that groups appear with readable names. + +:::info Admin Users + +Admin users' group memberships are **not** automatically updated via OAuth group management. If you need to test the configuration, use a non-admin user account. + +::: + + +## Additional Resources + +- [SSO (OAuth, OIDC, Trusted Header)](/features/auth/sso) - OAuth configuration overview +- [OAuth Group Management](/features/auth/sso#oauth-group-management) - Group synchronization details +- [Groups](/features/rbac/groups) - Group management in Open WebUI +- [SSO Troubleshooting Guide](/troubleshooting/sso) - Common OAuth issues and solutions +- [Environment Configuration](/getting-started/env-configuration) - All environment variables +- [Microsoft Optional Claims Documentation](https://learn.microsoft.com/en-us/entra/identity-platform/optional-claims) - Microsoft's official documentation From 904f4ae079d1a1c7bcab80adc5a6ba0d5c4b42c9 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:51:41 +0100 Subject: [PATCH 19/50] REDIS --- docs/getting-started/env-configuration.mdx | 18 ++++++++++++++++++ docs/tutorials/integrations/redis.md | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index ddc65bfd9..c0a7cada3 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5859,6 +5859,24 @@ If `WEBSOCKET_REDIS_OPTIONS` is not set, `REDIS_SOCKET_CONNECT_TIMEOUT` will be ::: +#### `REDIS_SENTINEL_MAX_RETRY_COUNT` + +- Type: `int` +- Default: `2` +- Description: Sets the maximum number of retries for Redis operations when using Sentinel fail-over. This is a critical high-availability setting that allows the application time for master election and promotion. If your Sentinel `down-after-milliseconds` is high, you should tune this value accordingly to ensure the service survives the failover window without dropping connections. + +#### `REDIS_RECONNECT_DELAY` + +- Type: `float` (milliseconds) +- Default: None +- Description: Optional reconnect delay in milliseconds for Redis Sentinel retry logic, applied consistently across both synchronous and asynchronous Redis operations. This improves stability during Sentinel failover by preventing tight retry loops. When unset or invalid, retry behavior remains unchanged. + +#### `WEBSOCKET_REDIS_LOCK_TIMEOUT` + +- Type: `int` +- Default: `60` +- Description: Sets the timeout in seconds for Redis locks used by the websocket manager. + #### `ENABLE_WEBSOCKET_SUPPORT` - Type: `bool` diff --git a/docs/tutorials/integrations/redis.md b/docs/tutorials/integrations/redis.md index 2e48e1daa..47d49577f 100644 --- a/docs/tutorials/integrations/redis.md +++ b/docs/tutorials/integrations/redis.md @@ -215,6 +215,13 @@ WEBSOCKET_REDIS_OPTIONS='{"socket_connect_timeout": 5}' ::: +#### Retry and Reconnect Logic + +To enhance resilience during Sentinel failover—the window when a new master is being elected and promoted—you can configure retry behavior to prevent the application from exhausting its reconnection attempts too quickly. + +- **`REDIS_SENTINEL_MAX_RETRY_COUNT`**: Sets the maximum number of retries for Redis operations when using Sentinel (Default: `2`). +- **`REDIS_RECONNECT_DELAY`**: Adds an optional delay in **milliseconds** between retry attempts (e.g., `REDIS_RECONNECT_DELAY=500`). This prevents tight retry loops that may otherwise overwhelm the event loop or block the application before a new master is ready. + ### Complete Example Configuration Here's a complete example showing all Redis-related environment variables: @@ -229,6 +236,8 @@ WEBSOCKET_REDIS_URL="redis://redis-valkey:6379/1" # Recommended for Sentinel deployments (prevents failover hangs) REDIS_SOCKET_CONNECT_TIMEOUT=5 +REDIS_SENTINEL_MAX_RETRY_COUNT=5 +REDIS_RECONNECT_DELAY=1000 # Optional REDIS_KEY_PREFIX="open-webui" From d63d247c379fb5db0c8b06a1d6e7bbe5a007cf50 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:53:35 +0100 Subject: [PATCH 20/50] Dev (#1041) --- docs/features/index.mdx | 2 +- docs/features/pipelines/index.mdx | 4 +- docs/features/plugin/functions/index.mdx | 6 +++ docs/features/plugin/index.mdx | 22 ++++++++ docs/features/web-search/yandex.md | 8 ++- docs/getting-started/env-configuration.mdx | 18 +++++++ docs/security.mdx | 44 +++++++++++++++ docs/tutorials/integrations/redis.md | 9 ++++ docs/tutorials/tips/sqlite-database.md | 63 +++++++++++++++++----- 9 files changed, 159 insertions(+), 17 deletions(-) diff --git a/docs/features/index.mdx b/docs/features/index.mdx index d757b5673..3aeceba0e 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -276,7 +276,7 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🍻 **TavernAI Character Card Integration**: Experience enhanced visual storytelling with TavernAI Character Card Integration in our model builder. Users can seamlessly incorporate TavernAI character card PNGs directly into their model files, creating a more immersive and engaging user experience. -- 🎲 **Model Playground (Beta)**: Try out models with the model playground area (`beta`), which enables users to test and explore model capabilities and parameters with ease in a sandbox environment before deployment in a live chat environment. +- 🎲 **Model Playground (Beta)**: Try out models with the model playground area (`beta`), which enables users to test and explore model capabilities and parameters with ease in a sandbox environment before deployment in a live chat environment. Export your playground conversations in JSON format (compatible with Open WebUI chat import) or as plain text for easy sharing and documentation. --- diff --git a/docs/features/pipelines/index.mdx b/docs/features/pipelines/index.mdx index 354ba4b62..d27376ae1 100644 --- a/docs/features/pipelines/index.mdx +++ b/docs/features/pipelines/index.mdx @@ -53,9 +53,9 @@ Integrating Pipelines with any OpenAI API-compatible UI client is simple. Launch ## ⚡ Quick Start with Docker -:::warning +:::danger ⚠️ Security Warning -Pipelines are a plugin system with arbitrary code execution — **don't fetch random pipelines from sources you don't trust**. +Pipelines are a plugin system with arbitrary code execution — **don't fetch random pipelines from sources you don't trust**. A malicious Pipeline could access your file system, exfiltrate data, mine cryptocurrency, or compromise your system. Always review Pipeline source code before installing. See the [Security Policy](/security) for more details. ::: diff --git a/docs/features/plugin/functions/index.mdx b/docs/features/plugin/functions/index.mdx index e3f719a76..f6548f42b 100644 --- a/docs/features/plugin/functions/index.mdx +++ b/docs/features/plugin/functions/index.mdx @@ -11,6 +11,12 @@ Unlike external tools that may require complex integrations, **Functions are bui Think of Functions as **modular building blocks** that let you enhance how the WebUI works, tailored exactly to what you need. They’re lightweight, highly customizable, and written in **pure Python**, so you have the freedom to create anything—from new AI-powered workflows to integrations with anything you use, like Google Search or Home Assistant. +:::danger ⚠️ Security Warning + +**Functions execute arbitrary Python code on your server.** Only install Functions from trusted sources. Before importing any Function, review its source code to understand what it does. A malicious Function could access your file system, exfiltrate data, or compromise your system. See the [Security Policy](/security) for more details. + +::: + --- ## 🏗️ Types of Functions diff --git a/docs/features/plugin/index.mdx b/docs/features/plugin/index.mdx index f8e6dd434..20842e2d6 100644 --- a/docs/features/plugin/index.mdx +++ b/docs/features/plugin/index.mdx @@ -17,6 +17,28 @@ Getting started with Tools and Functions is easy because everything’s already ## What are "Tools" and "Functions"? +--- + +:::danger ⚠️ Critical Security Warning + +**Tools, Functions, Pipes, Filters, and Pipelines execute arbitrary Python code on your server.** This is by design—it's what makes them powerful. However, this also means: + +1. **Only install from trusted sources.** Never import Tools or Functions from unknown or untrusted sources. Malicious code can compromise your entire system. + +2. **Review code before importing.** Before installing any community Tool or Function, review its source code. If you don't understand what it does, don't install it. + +3. **Protect your data directory.** The `data` directory (mounted at `/app/backend/data` in Docker) contains your database, configurations, and cached Tools/Functions. If an attacker gains write access to this directory, they can inject malicious code that will execute on your server. + +4. **Restrict Workspace access.** Only trusted administrators should have permission to create, import, or modify Tools and Functions. Regular users should **not** have Workspace access unless explicitly required. + +5. **Audit installed plugins regularly.** Periodically review the Tools and Functions installed in your instance via **Workspace → Tools** and **Admin Panel → Functions**. + +**What could go wrong?** A malicious Tool or Function could exfiltrate data, install malware, mine cryptocurrency, pivot to other systems on your network, or corrupt your instance. + +::: + +--- + Let's start by thinking of **Open WebUI** as a "base" software that can do many tasks related to using Large Language Models (LLMs). But sometimes, you need extra features or abilities that don't come *out of the box*—this is where **tools** and **functions** come into play. ### Tools diff --git a/docs/features/web-search/yandex.md b/docs/features/web-search/yandex.md index a3c8c588c..4dc1c9ee9 100644 --- a/docs/features/web-search/yandex.md +++ b/docs/features/web-search/yandex.md @@ -3,6 +3,12 @@ sidebar_position: 14 title: "Yandex" --- +:::warning + +This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. + +::: + :::tip For a comprehensive list of all environment variables related to Web Search (including concurrency settings, result counts, and more), please refer to the [Environment Configuration documentation](../../getting-started/env-configuration#web-search). @@ -40,4 +46,4 @@ services: * **YANDEX_WEB_SEARCH_URL**: The endpoint for the Yandex Search API. Defaults to `https://searchapi.api.cloud.yandex.net/v2/web/search`. * **YANDEX_WEB_SEARCH_API_KEY**: Your Yandex Cloud API Key. -* **YANDEX_WEB_SEARCH_CONFIG**: An optional JSON string to customize the search request (e.g., setting `searchType`, `region`, or other parameters supported by the Yandex Search API). +* **YANDEX_WEB_SEARCH_CONFIG**: An optional JSON string to customize the search request. This allows you to set any parameters supported by the Yandex Search API. diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 694309471..4a1b5f996 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5847,6 +5847,24 @@ If `WEBSOCKET_REDIS_OPTIONS` is not set, `REDIS_SOCKET_CONNECT_TIMEOUT` will be ::: +#### `REDIS_SENTINEL_MAX_RETRY_COUNT` + +- Type: `int` +- Default: `2` +- Description: Sets the maximum number of retries for Redis operations when using Sentinel fail-over. This is a critical high-availability setting that allows the application time for master election and promotion. If your Sentinel `down-after-milliseconds` is high, you should tune this value accordingly to ensure the service survives the failover window without dropping connections. + +#### `REDIS_RECONNECT_DELAY` + +- Type: `float` (milliseconds) +- Default: None +- Description: Optional reconnect delay in milliseconds for Redis Sentinel retry logic, applied consistently across both synchronous and asynchronous Redis operations. This improves stability during Sentinel failover by preventing tight retry loops. When unset or invalid, retry behavior remains unchanged. + +#### `WEBSOCKET_REDIS_LOCK_TIMEOUT` + +- Type: `int` +- Default: `60` +- Description: Sets the timeout in seconds for Redis locks used by the websocket manager. + #### `ENABLE_WEBSOCKET_SUPPORT` - Type: `bool` diff --git a/docs/security.mdx b/docs/security.mdx index b57dcd72f..dcf5bc7ad 100644 --- a/docs/security.mdx +++ b/docs/security.mdx @@ -85,6 +85,50 @@ If your concern does not meet the vulnerability requirements outlined above, is Examples of non-vulnerability, still security-related concerns include suggestions for better default configuration values, security hardening recommendations, deployment best practices guidance, unclear configuration instructions, need for additional security documentation, feature requests for optional security enhancements (2FA, audit logging, etc.), and general security questions about production deployment. Please use the adequate channel for your specific issue. +## Tools, Functions, and Pipelines Security + +Open WebUI provides powerful extensibility through **Tools**, **Functions** (including Pipes, Filters, and Actions), and **Pipelines**. These features allow you to extend Open WebUI's capabilities with custom Python code. However, this power comes with security responsibilities. + +:::warning + +**Tools, Functions, and Pipelines execute arbitrary Python code on your server.** This is intentional—it's what makes them powerful. However, this means they have the same level of access as the Open WebUI backend process itself. + +::: + +### Security Implications + +When you install a Tool, Function, or Pipeline, you are granting it the ability to: + +- **Access the file system** — read or write any files the backend process can access +- **Make network requests** — connect to external services, potentially exfiltrating data +- **Execute system commands** — run shell commands via subprocess +- **Access environment variables** — read API keys, secrets, and configuration +- **Modify the database** — access or alter stored data +- **Consume compute resources** — run CPU-intensive operations + +### Best Practices + +| Practice | Description | +|----------|-------------| +| **Only install from trusted sources** | Only use Tools/Functions from the official community library or sources you trust | +| **Review code before installing** | Read and understand what a Tool/Function does before importing it | +| **Restrict Workspace access** | Only grant Workspace permissions to trusted administrators | +| **Audit installed plugins** | Regularly review installed Tools (Workspace → Tools) and Functions (Admin Panel → Functions) | +| **Protect your data directory** | The `/app/backend/data` directory contains your database and cached plugins—protect it from unauthorized access | +| **Monitor resource usage** | Watch for unexpected CPU spikes that could indicate cryptomining or other abuse | +| **Use official Docker images** | Only pull from `ghcr.io/open-webui/open-webui`—unofficial images may be compromised | + +### What Is NOT a Vulnerability + +The following scenarios are **not** considered vulnerabilities because they require administrator action: + +- An admin installing a malicious Tool or Function +- An admin granting Workspace access to an untrusted user +- An admin importing code from an untrusted source +- An attacker with write access to the data volume injecting malicious plugins + +These scenarios represent **admin negligence** or **environment compromise**, not vulnerabilities in Open WebUI itself. See [our Security Policy](https://github.com/open-webui/open-webui/security) for details. + ## Product Security Process - Internal and periodic external reviews of our architecture and pipelines diff --git a/docs/tutorials/integrations/redis.md b/docs/tutorials/integrations/redis.md index 2e48e1daa..47d49577f 100644 --- a/docs/tutorials/integrations/redis.md +++ b/docs/tutorials/integrations/redis.md @@ -215,6 +215,13 @@ WEBSOCKET_REDIS_OPTIONS='{"socket_connect_timeout": 5}' ::: +#### Retry and Reconnect Logic + +To enhance resilience during Sentinel failover—the window when a new master is being elected and promoted—you can configure retry behavior to prevent the application from exhausting its reconnection attempts too quickly. + +- **`REDIS_SENTINEL_MAX_RETRY_COUNT`**: Sets the maximum number of retries for Redis operations when using Sentinel (Default: `2`). +- **`REDIS_RECONNECT_DELAY`**: Adds an optional delay in **milliseconds** between retry attempts (e.g., `REDIS_RECONNECT_DELAY=500`). This prevents tight retry loops that may otherwise overwhelm the event loop or block the application before a new master is ready. + ### Complete Example Configuration Here's a complete example showing all Redis-related environment variables: @@ -229,6 +236,8 @@ WEBSOCKET_REDIS_URL="redis://redis-valkey:6379/1" # Recommended for Sentinel deployments (prevents failover hangs) REDIS_SOCKET_CONNECT_TIMEOUT=5 +REDIS_SENTINEL_MAX_RETRY_COUNT=5 +REDIS_RECONNECT_DELAY=1000 # Optional REDIS_KEY_PREFIX="open-webui" diff --git a/docs/tutorials/tips/sqlite-database.md b/docs/tutorials/tips/sqlite-database.md index 131095958..50860c9cf 100644 --- a/docs/tutorials/tips/sqlite-database.md +++ b/docs/tutorials/tips/sqlite-database.md @@ -79,9 +79,10 @@ Here is a complete list of tables in Open-WebUI's SQLite database. The tables ar | 23 | note | Stores user-created notes and annotations | | 24 | oauth_session | Manages active OAuth sessions for users | | 25 | prompt | Stores templates and configurations for AI prompts | -| 26 | tag | Manages tags/labels for content categorization | -| 27 | tool | Stores configurations for system tools and integrations | -| 28 | user | Maintains user profiles and account information | +| 26 | prompt_history | Tracks version history and snapshots for prompts | +| 27 | tag | Manages tags/labels for content categorization | +| 28 | tool | Stores configurations for system tools and integrations | +| 29 | user | Maintains user profiles and account information | Note: there are two additional tables in Open-WebUI's SQLite database that are not related to Open-WebUI's core functionality, that have been excluded: @@ -446,14 +447,33 @@ The `access_control` fields expected structure: ## Prompt Table -| **Column Name** | **Data Type** | **Constraints** | **Description** | -| --------------- | ------------- | --------------- | ------------------------- | -| command | String | PRIMARY KEY | Unique command identifier | -| user_id | String | - | Prompt owner | -| title | Text | - | Prompt title | -| content | Text | - | Prompt content/template | -| timestamp | BigInteger | - | Last update timestamp | -| access_control | JSON | nullable | Access permissions | +| **Column Name** | **Data Type** | **Constraints** | **Description** | +| --------------- | ------------- | --------------- | ----------------------------------- | +| id | Text | PRIMARY KEY | Unique identifier (UUID) | +| command | String | UNIQUE, INDEX | Unique command identifier | +| user_id | String | NOT NULL | Owner of the prompt | +| name | Text | NOT NULL | Display name of the prompt | +| content | Text | NOT NULL | Prompt content/template | +| data | JSON | nullable | Additional prompt data | +| meta | JSON | nullable | Prompt metadata | +| access_control | JSON | nullable | Permission settings | +| is_active | Boolean | default=True | Active status | +| version_id | Text | nullable | Current version identifier | +| tags | JSON | nullable | Associated tags | +| created_at | BigInteger | NOT NULL | Creation timestamp | +| updated_at | BigInteger | NOT NULL | Last update timestamp | + +## Prompt History Table + +| **Column Name** | **Data Type** | **Constraints** | **Description** | +| --------------- | ------------- | ------------------------------ | --------------------------------- | +| id | Text | PRIMARY KEY | Unique identifier (UUID) | +| prompt_id | Text | FOREIGN KEY(prompt.id), INDEX | Reference to the prompt | +| parent_id | Text | nullable | Reference to the parent version | +| snapshot | JSON | NOT NULL | Snapshot of the prompt at version | +| user_id | Text | NOT NULL | User who created the version | +| commit_message | Text | nullable | Version commit message | +| created_at | BigInteger | NOT NULL | Creation timestamp | ## Tag Table @@ -524,6 +544,8 @@ erDiagram user ||--o{ memory : "owns" user ||--o{ model : "manages" user ||--o{ prompt : "creates" + user ||--o{ prompt_history : "creates" + prompt ||--o{ prompt_history : "has" user ||--o{ tag : "creates" user ||--o{ tool : "manages" user ||--o{ note : "owns" @@ -698,11 +720,26 @@ erDiagram } prompt { - string command PK + text id PK + string command string user_id FK - text title + text name text content + json data + json meta json access_control + boolean is_active + text version_id + json tags + } + + prompt_history { + text id PK + text prompt_id FK + text parent_id FK + json snapshot + text user_id FK + text commit_message } tag { From 02d3eaaa1e844eb99365ee1d9f1ee81e5150f156 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:19:59 +0100 Subject: [PATCH 21/50] CHAT SHARING FEATURE --- docs/faq.mdx | 4 ++ docs/features/chat-features/chatshare.md | 68 ++++++++++++++++++++++++ docs/features/index.mdx | 2 +- 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/docs/faq.mdx b/docs/faq.mdx index 61eb1eece..fe22ab78a 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -17,6 +17,10 @@ For more details on enterprise solutions and branding customizations, [click her **A:** No, your data is never sent anywhere unless you explicitly choose to share it or you connect an external model provider. Everything inside Open WebUI runs and is stored locally on your machine or server, giving you full control over your data at all times. We encourage you not to simply take our word for it: our entire codebase is hosted publicly, so you can inspect exactly how everything works, and if you ever notice anything concerning, please report it to us on our repo immediately. +### Q: How can I see a list of all the chats I've ever shared? + +**A:** Open WebUI provides a centralized **Shared Chats** dashboard where you can see every link you've generated. This is available to all users via **Settings > Data > Shared Chats > Manage**. From there, you can search through your shared history, re-copy links, or revoke (unshare) access to any conversation instantly. + ### Q: Can I use Open WebUI in outer space (e.g., Mars and beyond) or other extreme environments? **A:** **Yes.** Open WebUI is fully self-hosted and does not rely on persistent internet connectivity, making it suitable for environments where cloud-based systems are impractical or impossible. As long as the underlying hardware can run a supported runtime, Open WebUI will function normally regardless of location. diff --git a/docs/features/chat-features/chatshare.md b/docs/features/chat-features/chatshare.md index 619162d07..2267c7b9d 100644 --- a/docs/features/chat-features/chatshare.md +++ b/docs/features/chat-features/chatshare.md @@ -110,3 +110,71 @@ Once deleted, the shared link will no longer be valid, and users will not be abl 4. Click on the chat you wish to change permission access for. 5. Scroll to the bottom of the chat and update its permission level. 6. Click the **Update Chat** button. + +### Managing Shared Chats + +Open WebUI now includes a robust, centralized management system for all your shared conversations. This feature is available to **all users** and provides a convenient way to audit, update, and secure your shared content without having to navigate through your entire chat history. + +#### Why Use Shared Chat Management? + +- **Privacy Audit**: Quickly see every conversation you have ever made public via a share link. +- **Link Retrieval**: Lost a link you shared previously? Find it here in seconds. +- **Instant Revocation**: If you accidentally shared sensitive information, you can invalidate the link immediately from this central dashboard. +- **Organization**: Clean up old shared links that are no longer relevant. + +#### Accessing the Management Dashboard + +1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. +2. Select **Settings** from the menu. +3. In the Settings modal, navigate to the **Data** tab. +4. Locate the **Shared Chats** row and click the **Manage** button. + +#### Dashboard Features + +The **Shared Chats** modal provides a streamlined interface for managing your public content: + +- **Powerful Search**: Find specific shared conversations by their title. This is especially useful for users with hundreds of previous chats. +- **Dynamic Sorting**: Toggle the sort order by date (last updated) to see your most recent or oldest shares first. +- **Copy Link**: Each entry has a dedicated **Clipboard icon** to instantly copy the share URL back to your clipboard. +- **Instant Unshare**: Use the **Unshare icon** to delete the link. + - :::warning + Once unshared, the URL will be immediately deactivated. Anyone attempting to use the old link will receive a "Not Found" error. This action is permanent, though you can always re-share the chat later to generate a *new* unique link. + ::: +- **Pagination and Load More**: Efficiently browse through your entire history of shared content with smooth "Load More" scrolling. + +#### Availability + +This feature is available to **every user** on the platform. While Administrators can manage their own shared chats, they do not see other users' shared chats here to maintain privacy. For global administration of shared content, admins should refer to the **Admin Panel > Settings**. + +:::info +**Unsharing is Local**: This dashboard manages links generated on your local Open WebUI instance. If you have shared a chat to the [Open WebUI Community](https://openwebui.com), you must manage those snapshots directly on the community platform (see [Deleting Shared Chats](#deleting-shared-chats)). +::: + +### Security Considerations + +The Shared Chat Management dashboard is a critical security tool for any organization: + +- **Link Persistence**: Shared links are persistent by default. If a user shares a chat and leaves the organization, the link remains active unless the chat is deleted or unshared. +- **Static Snapshots**: Remember that local share links are **static snapshots**. If you share a link and then continue the conversation, the shared link will *not* show the new messages unless you explicitly use "Update and Copy Link". +- **Access Control**: Users must be logged into your specific Open WebUI instance to view a local share link. This provides a layer of security over internal shared chats. + +### Best Practices + +1. **Regular Audits**: We recommend checking your Manage Shared Chats dashboard once a month to ensure you aren't inadvertently leaking internal project details. +2. **Descriptive Titles**: Give your chats clear titles. The management dashboard's search feature relies on the chat title, so "Project Alpha Design Review" is much easier to find later than "New Chat". +3. **Explicit Unsharing**: If a shared link was only needed for a temporary review, unshare it as soon as the review is complete to minimize your data footprint. +4. **Update vs New Link**: If you need to show someone the next step in a conversation, use the **Update** feature in the individual chat modal rather than generating a new link. This keeps your management dashboard clean and ensures the recipient always has the latest version on the same URL. + +### Shared Management FAQ + +**Q: Does unsharing a chat delete the conversation?** +**A:** No. Unsharing only deletes the public link. Your original conversation remains perfectly intact in your history. + +**Q: Can I share a chat that has been archived?** +**A:** Yes. Archiving and Sharing are independent features. A chat can be both archived and shared. + +**Q: If I delete a chat, what happens to the shared link?** +**A:** Deleting a chat also immediately invalidates and deletes any associated share links. + +**Q: Can I see who has viewed my shared link?** +**A:** Currently, Open WebUI does not track view counts or recipient identities for shared links to prioritize privacy and performance. diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 3aeceba0e..83db20536 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -282,7 +282,7 @@ import { TopBanners } from "@site/src/components/TopBanners"; ### 👥 Collaboration -- 🗨️ **Local Chat Sharing**: Generate and share chat links between users in an efficient and seamless manner, thereby enhancing collaboration and communication. +- 🗨️ **Local Chat Sharing**: Generate and share chat links between users in an efficient and seamless manner. Includes a **centralized management interface** in Settings to view, copy links, or unshare conversations at any time. [Learn more about Chat Sharing](/features/chat-features/chatshare). - 👍👎 **RLHF Annotation**: Enhance the impact of your messages by rating them with either a thumbs up or thumbs down AMD provide a rating for the response on a scale of 1-10, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (`RLHF`). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. From b883381bd106c75e82fb07006dfa506d26513461 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:59:01 +0100 Subject: [PATCH 22/50] docs: document centralized data management and admin model controls This update provides comprehensive documentation for three major platform enhancements: Centralized Data Management - Shared Chat Manager: Documents the new dashboard in Settings > Data for auditing and revoking share links (LinkSlash icon). - File Manager: Detailed the unified dashboard for document management, including the automatic Knowledge Base and embedding cleanup logic. - Search & Performance: Documented the 500ms search debounce and advanced sorting (Updated At, Created At) across both managers. Admin Model Management - Admin View Selector: Guide for status-based filtering (Enabled, Disabled, Hidden, Visible). - Bulk Actions: Documented the new "Enable All" and "Disable All" controls in the Admin Panel for high-volume provider management. UI/UX & Discovery - Updated the Features Overview and FAQ sections to highlight these management tools and provide clear user navigation paths. --- docs/faq.mdx | 4 ++ docs/features/chat-features/chatshare.md | 65 +++++++----------------- docs/features/index.mdx | 6 +++ docs/features/rag/index.md | 4 ++ docs/features/workspace/files.md | 65 ++++++++++++++++++++++++ docs/features/workspace/index.mdx | 1 + docs/features/workspace/models.md | 26 ++++++++++ 7 files changed, 124 insertions(+), 47 deletions(-) create mode 100644 docs/features/workspace/files.md diff --git a/docs/faq.mdx b/docs/faq.mdx index fe22ab78a..d401c914e 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -21,6 +21,10 @@ For more details on enterprise solutions and branding customizations, [click her **A:** Open WebUI provides a centralized **Shared Chats** dashboard where you can see every link you've generated. This is available to all users via **Settings > Data > Shared Chats > Manage**. From there, you can search through your shared history, re-copy links, or revoke (unshare) access to any conversation instantly. +### Q: How can I manage or delete files I've uploaded? + +**A:** You can access the **File Manager** by going to **Settings > Data > Manage Files > Manage**. This dashboard allows you to search through all your uploaded documents, view their details, and delete them. Deleting a file here also automatically cleans up any associated Knowledge Base entries and vector embeddings. + ### Q: Can I use Open WebUI in outer space (e.g., Mars and beyond) or other extreme environments? **A:** **Yes.** Open WebUI is fully self-hosted and does not rely on persistent internet connectivity, making it suitable for environments where cloud-based systems are impractical or impossible. As long as the underlying hardware can run a supported runtime, Open WebUI will function normally regardless of location. diff --git a/docs/features/chat-features/chatshare.md b/docs/features/chat-features/chatshare.md index 2267c7b9d..ec49a660e 100644 --- a/docs/features/chat-features/chatshare.md +++ b/docs/features/chat-features/chatshare.md @@ -113,68 +113,39 @@ Once deleted, the shared link will no longer be valid, and users will not be abl ### Managing Shared Chats -Open WebUI now includes a robust, centralized management system for all your shared conversations. This feature is available to **all users** and provides a convenient way to audit, update, and secure your shared content without having to navigate through your entire chat history. - -#### Why Use Shared Chat Management? - -- **Privacy Audit**: Quickly see every conversation you have ever made public via a share link. -- **Link Retrieval**: Lost a link you shared previously? Find it here in seconds. -- **Instant Revocation**: If you accidentally shared sensitive information, you can invalidate the link immediately from this central dashboard. -- **Organization**: Clean up old shared links that are no longer relevant. +Open WebUI provides a centralized dashboard to manage every chat conversation you have shared. This feature allows users to audit their shared content and quickly revoke access if needed. #### Accessing the Management Dashboard 1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. 2. Select **Settings** from the menu. -3. In the Settings modal, navigate to the **Data** tab. +3. Navigate to the **Data** tab. 4. Locate the **Shared Chats** row and click the **Manage** button. #### Dashboard Features -The **Shared Chats** modal provides a streamlined interface for managing your public content: +The **Shared Chats** modal provides a unified interface for your public content: -- **Powerful Search**: Find specific shared conversations by their title. This is especially useful for users with hundreds of previous chats. -- **Dynamic Sorting**: Toggle the sort order by date (last updated) to see your most recent or oldest shares first. -- **Copy Link**: Each entry has a dedicated **Clipboard icon** to instantly copy the share URL back to your clipboard. -- **Instant Unshare**: Use the **Unshare icon** to delete the link. +- **Centralized List**: View all conversations that have an active share link. +- **Search & Filter**: Quickly find specific shared chats by title. The search bar includes a **500ms debounce** to ensure smooth performance while typing. +- **Advanced Sorting**: Organize your shared history by: + - **Updated At** (Default) + - **Created At** + - **Title** +- **Copy Link**: Use the **Clipboard icon** next to any entry to instantly copy the share URL back to your clipboard. +- **Revoke Access (Unshare)**: Use the **Unshare icon** (represented by a slashed link) to deactivate a share link. - :::warning - Once unshared, the URL will be immediately deactivated. Anyone attempting to use the old link will receive a "Not Found" error. This action is permanent, though you can always re-share the chat later to generate a *new* unique link. + Revoking access immediately invalidates the link. Anyone attempting to visit the URL will receive a "Not Found" error. This action is permanent, though you can generate a *new* unique link by sharing the chat again from the main interface. ::: -- **Pagination and Load More**: Efficiently browse through your entire history of shared content with smooth "Load More" scrolling. - -#### Availability - -This feature is available to **every user** on the platform. While Administrators can manage their own shared chats, they do not see other users' shared chats here to maintain privacy. For global administration of shared content, admins should refer to the **Admin Panel > Settings**. - -:::info -**Unsharing is Local**: This dashboard manages links generated on your local Open WebUI instance. If you have shared a chat to the [Open WebUI Community](https://openwebui.com), you must manage those snapshots directly on the community platform (see [Deleting Shared Chats](#deleting-shared-chats)). -::: - -### Security Considerations - -The Shared Chat Management dashboard is a critical security tool for any organization: - -- **Link Persistence**: Shared links are persistent by default. If a user shares a chat and leaves the organization, the link remains active unless the chat is deleted or unshared. -- **Static Snapshots**: Remember that local share links are **static snapshots**. If you share a link and then continue the conversation, the shared link will *not* show the new messages unless you explicitly use "Update and Copy Link". -- **Access Control**: Users must be logged into your specific Open WebUI instance to view a local share link. This provides a layer of security over internal shared chats. - -### Best Practices - -1. **Regular Audits**: We recommend checking your Manage Shared Chats dashboard once a month to ensure you aren't inadvertently leaking internal project details. -2. **Descriptive Titles**: Give your chats clear titles. The management dashboard's search feature relies on the chat title, so "Project Alpha Design Review" is much easier to find later than "New Chat". -3. **Explicit Unsharing**: If a shared link was only needed for a temporary review, unshare it as soon as the review is complete to minimize your data footprint. -4. **Update vs New Link**: If you need to show someone the next step in a conversation, use the **Update** feature in the individual chat modal rather than generating a new link. This keeps your management dashboard clean and ensures the recipient always has the latest version on the same URL. +- **Pagination**: Efficiently browse through your history using the "Load More" functionality at the bottom of the list. ### Shared Management FAQ -**Q: Does unsharing a chat delete the conversation?** -**A:** No. Unsharing only deletes the public link. Your original conversation remains perfectly intact in your history. +**Q: Does unsharing a chat delete the original conversation?** +**A:** No. Unsharing only deletes the public link. Your original chat history remains completely intact. -**Q: Can I share a chat that has been archived?** -**A:** Yes. Archiving and Sharing are independent features. A chat can be both archived and shared. +**Q: Can I manage chats I've shared on the community platform here?** +**A:** No. This dashboard manages links generated on your local instance. For community-shared content, see [Deleting Shared Chats](#deleting-shared-chats). -**Q: If I delete a chat, what happens to the shared link?** +**Q: If I delete my original chat, what happens to the shared link?** **A:** Deleting a chat also immediately invalidates and deletes any associated share links. - -**Q: Can I see who has viewed my shared link?** -**A:** Currently, Open WebUI does not track view counts or recipient identities for shared links to prioritize privacy and performance. diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 83db20536..3eca7414a 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -19,6 +19,10 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔐 **SCIM 2.0 Provisioning**: Enterprise-grade user and group provisioning through SCIM 2.0 protocol, enabling seamless integration with identity providers like Okta, Azure AD, and Google Workspace for automated user lifecycle management. [Read the SCIM Guide](/features/auth/scim). +- 📂 **Centralized File Management**: A unified dashboard to search, view, and manage all your uploaded documents in one place. Includes automated cleanup of Knowledge Base associations and vector embeddings when deleting files. [Learn about File Management](/features/workspace/files). + +- 💬 **Shared Chat Management**: A centralized interface to audit every conversation you've ever shared. Easily search through your shared history, re-copy links, or revoke (unshare) access instantly from a single location. [Learn about Chat Sharing](/features/chat-features/chatshare#managing-shared-chats). + - 📱 **Responsive Design**: Enjoy a seamless experience across desktop PCs, laptops, and mobile devices. - 📱 **Progressive Web App for Mobile**: Enjoy a native progressive web application experience on your mobile device with offline access on `localhost` or a personal domain, and a smooth user interface. In order for our PWA to be installable on your device, it must be delivered in a secure context. This usually means that it must be served over HTTPS. @@ -424,6 +428,8 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔒 **Default Sign-Up Role**: Specify the default role for new sign-ups to `pending`, `user`, or `admin`, providing flexibility in managing user permissions and access levels for new users. +- 🤖 **Bulk Model Management & Filtering**: Administrators can effortlessly manage large model collections from external providers with tools to bulk enable/disable models and filter the admin list by status (Enabled, Disabled, Hidden, etc.) to maintain a clean workspace. [Learn about Admin Models](/features/workspace/models#global-model-management-admin). + - 🔒 **Prevent New Sign-Ups**: Enable the option to disable new user sign-ups, restricting access to the platform and maintaining a fixed number of users. - 🔒 **Prevent Chat Deletion**: Ability for admins to toggle a setting that prevents all users from deleting their chat messages, ensuring that all chat messages are retained for audit or compliance purposes. diff --git a/docs/features/rag/index.md b/docs/features/rag/index.md index 816c1b7d9..6ea5468cf 100644 --- a/docs/features/rag/index.md +++ b/docs/features/rag/index.md @@ -17,6 +17,10 @@ One of the key advantages of RAG is its ability to access and integrate informat Local documents must first be uploaded via the Documents section of the Workspace area to access them using the `#` symbol before a query. Click on the formatted URL in the that appears above the chat box. Once selected, a document icon appears above `Send a message`, indicating successful retrieval. +:::tip Bulk File Management +Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/workspace/files)** located in **Settings > Data > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. +::: + You can also load documents into the workspace area with their access by starting a prompt with `#`, followed by a URL. This can help incorporate web content directly into your conversations. ## Web Search for RAG diff --git a/docs/features/workspace/files.md b/docs/features/workspace/files.md new file mode 100644 index 000000000..d93a0ba35 --- /dev/null +++ b/docs/features/workspace/files.md @@ -0,0 +1,65 @@ +--- +sidebar_position: 5 +title: "📁 File Management" +--- + +Open WebUI provides a comprehensive file management system that allows you to upload, organize, and utilize your documents across various features like Knowledge Bases and RAG. + +## Centralized File Manager + +The **Centralized File Manager** provides a unified interface to view, search, and manage every file you have uploaded to your Open WebUI instance, whether it was uploaded directly to a chat or into a Knowledge Base. + +### Accessing the File Manager + +1. Click on your **profile name** or avatar in the bottom-left corner. +2. Select **Settings** from the menu. +3. Navigate to the **Data** tab. +4. Locate the **Manage Files** row and click the **Manage** button. + +### Key Features + +The File Manager modal offers several powerful tools for maintaining your data: + +- **Universal Search**: Quickly find any file by its filename using the integrated search bar. +- **Advanced Sorting**: Organize your file list by: + - **Filename**: Sort alphabetically to find specific documents. + - **Created At**: See your most recent uploads or find older files. +- **File Details**: View important information at a glance, including: + - **File Size**: See how much space each document occupies (e.g., KB, MB). + - **Upload Date**: Track when each file was added to your instance. +- **Built-in Viewer**: Click on any file to open the **File Item Viewer**, which displays the file's metadata and specific details (such as size and type). +- **Safe Deletion**: Easily remove files you no longer need. + - :::info **Knowledge Base Cleanup** + When you delete a file through the File Manager, Open WebUI automatically performs a deep cleanup. It removes the file from all associated Knowledge Bases and deletes its corresponding vector embeddings, ensuring your database stays clean and efficient. + ::: + +## Using Files in Open WebUI + +Files are at the heart of the platform's advanced capabilities: + +### 1. Retrieval Augmented Generation (RAG) +By uploading documents (PDFs, Word docs, text files, etc.), you can ground your AI's responses in your own data. +- **Chat Uploads**: Simply drag and drop files into a chat or use the upload icon. +- **Knowledge Bases**: Add files to structured collections for more permanent and organized retrieval. + +### 2. File Metadata +Every file carries metadata that helps both you and the AI understand its context. This includes content type, original filename, and size. + +## Best Practices + +- **Naming Conventions**: Use clear, descriptive filenames. This improves the accuracy of the File Manager's search and helps you identify specific documents. +- **Regular Audits**: Periodically use the **Manage Files** dashboard to delete old or redundant documents. This saves disk/database space and improves the performance of your system by ensuring only relevant data is retained. + +## FAQ + +**Q: If I delete a file, is it gone from my chats?** +**A:** Yes. Deleting a file via the File Manager removes it from the system entirely. Any chat that referenced that file using RAG will no longer be able to pull information from it. + +**Q: Can I download my files back from the File Manager?** +**A:** Currently, the File Manager focuses on viewing metadata and management (deletion). To download a file, you should typically access it from the original chat or Knowledge Base where it was used. + +**Q: Are there limits on the number of files I can manage?** +**A:** There is no hard-coded limit in Open WebUI. The scalability depends on your storage (disk/S3) and your Vector Database (e.g., ChromaDB, PGVector). + +**Q: Does managing files require Admin privileges?** +**A:** Regular users can manage their *own* uploaded files. Administrators have additional tools to manage global files and configuration via the Admin Panel. diff --git a/docs/features/workspace/index.mdx b/docs/features/workspace/index.mdx index 6a08a8e30..46d6145d6 100644 --- a/docs/features/workspace/index.mdx +++ b/docs/features/workspace/index.mdx @@ -10,5 +10,6 @@ The Workspace in Open WebUI provides a comprehensive environment for managing yo - [🤖 Models](./models.md) - Create and manage custom models tailored to specific purposes - [🧠 Knowledge](./knowledge.md) - Manage your knowledge bases for retrieval augmented generation - [📚 Prompts](./prompts.md) - Create and organize reusable prompts +- [📁 Files](./files.md) - Centralized management for all your uploaded documents Each section of the Workspace is designed to give you fine-grained control over your Open WebUI experience, allowing for customization and optimization of your AI interactions. diff --git a/docs/features/workspace/models.md b/docs/features/workspace/models.md index d042124a0..b581a693e 100644 --- a/docs/features/workspace/models.md +++ b/docs/features/workspace/models.md @@ -116,6 +116,32 @@ A raw Base Model can be cloned as a custom Workspace model, but it will not clon To download new raw Base Models (like `Llama-3.2-3B-Instruct-GGUF:Q8_0` or `Mistral-7B-Instruct-v0.2-GGUF:Q4_K_M`), navigate to **Settings > Connections > Ollama**. Alternatively, type `ollama run hf.co/{username}/{repository}:{quantization}` in the model selector to pull directly from Hugging Face. This action will create a button within the model selector labeled "Pull [Model Name]" that will begin downloading the model from its source once clicked. ::: +## Global Model Management (Admin) + +Administrators have access to a centralized management interface via **Admin Panel > Settings > Models**. This page provides powerful tools for decluttering and organizing the model list, especially when connected to providers with hundreds of available models. + +### View Filtering + +The **Admin View Selector** allows you to filter the entire list of models by their operational status. This is located next to the search bar and includes the following views: + +- **All**: Shows every model available to the system. +- **Enabled**: Displays only models that are currently active and selectable by users. +- **Disabled**: Shows models that have been deactivated. +- **Visible**: Shows models that are currently visible in the user model selector. +- **Hidden**: Displays only the models that have been hidden (these appear with reduced opacity in the list). + +### Bulk Actions + +To streamline the management of large model collections, the Admin Panel includes **Bulk Actions** that apply to the models currently visible in your filtered view. + +1. **Filter your view** (e.g., select "Disabled" or "Hidden"). +2. **Open the Actions menu** (Ellipsis icon next to the search bar). +3. **Select an action**: + - **Enable All**: Activates all models in the current filtered list simultaneously. + - **Disable All**: Deactivates all models in the current filtered list. + +These tools are specifically designed to help administrators quickly manage external providers (like OpenAI or Anthropic) that expose a high volume of models, allowing for instant site-wide configuration changes. + ## Model Switching in Chat Open WebUI allows for dynamic model switching and parallel inference within a chat session. From e86756e2e35e32913e53ab26f192b0383d362ab8 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:08:02 +0100 Subject: [PATCH 23/50] fixes --- docs/features/chat-features/chatshare.md | 3 +-- docs/features/workspace/files.md | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/features/chat-features/chatshare.md b/docs/features/chat-features/chatshare.md index ec49a660e..2ddb70161 100644 --- a/docs/features/chat-features/chatshare.md +++ b/docs/features/chat-features/chatshare.md @@ -119,7 +119,7 @@ Open WebUI provides a centralized dashboard to manage every chat conversation yo 1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. 2. Select **Settings** from the menu. -3. Navigate to the **Data** tab. +3. Navigate to the **Data Controls** tab. 4. Locate the **Shared Chats** row and click the **Manage** button. #### Dashboard Features @@ -130,7 +130,6 @@ The **Shared Chats** modal provides a unified interface for your public content: - **Search & Filter**: Quickly find specific shared chats by title. The search bar includes a **500ms debounce** to ensure smooth performance while typing. - **Advanced Sorting**: Organize your shared history by: - **Updated At** (Default) - - **Created At** - **Title** - **Copy Link**: Use the **Clipboard icon** next to any entry to instantly copy the share URL back to your clipboard. - **Revoke Access (Unshare)**: Use the **Unshare icon** (represented by a slashed link) to deactivate a share link. diff --git a/docs/features/workspace/files.md b/docs/features/workspace/files.md index d93a0ba35..b5ecbf6b8 100644 --- a/docs/features/workspace/files.md +++ b/docs/features/workspace/files.md @@ -13,7 +13,7 @@ The **Centralized File Manager** provides a unified interface to view, search, a 1. Click on your **profile name** or avatar in the bottom-left corner. 2. Select **Settings** from the menu. -3. Navigate to the **Data** tab. +3. Navigate to the **Data Controls** tab. 4. Locate the **Manage Files** row and click the **Manage** button. ### Key Features From 3091fa724e25411ecef58dc73174e5d5ec1c39e3 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 20:08:09 +0100 Subject: [PATCH 24/50] fixes --- docs/faq.mdx | 4 ++-- docs/features/rag/index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/faq.mdx b/docs/faq.mdx index d401c914e..25d3448d8 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -19,11 +19,11 @@ For more details on enterprise solutions and branding customizations, [click her ### Q: How can I see a list of all the chats I've ever shared? -**A:** Open WebUI provides a centralized **Shared Chats** dashboard where you can see every link you've generated. This is available to all users via **Settings > Data > Shared Chats > Manage**. From there, you can search through your shared history, re-copy links, or revoke (unshare) access to any conversation instantly. +**A:** Open WebUI provides a centralized **Shared Chats** dashboard where you can see every link you've generated. This is available to all users via **Settings > Data Controls > Shared Chats > Manage**. From there, you can search through your shared history, re-copy links, or revoke (unshare) access to any conversation instantly. ### Q: How can I manage or delete files I've uploaded? -**A:** You can access the **File Manager** by going to **Settings > Data > Manage Files > Manage**. This dashboard allows you to search through all your uploaded documents, view their details, and delete them. Deleting a file here also automatically cleans up any associated Knowledge Base entries and vector embeddings. +**A:** You can access the **File Manager** by going to **Settings > Data Controls > Manage Files > Manage**. This dashboard allows you to search through all your uploaded documents, view their details, and delete them. Deleting a file here also automatically cleans up any associated Knowledge Base entries and vector embeddings. ### Q: Can I use Open WebUI in outer space (e.g., Mars and beyond) or other extreme environments? diff --git a/docs/features/rag/index.md b/docs/features/rag/index.md index 6ea5468cf..4e7c25231 100644 --- a/docs/features/rag/index.md +++ b/docs/features/rag/index.md @@ -18,7 +18,7 @@ One of the key advantages of RAG is its ability to access and integrate informat Local documents must first be uploaded via the Documents section of the Workspace area to access them using the `#` symbol before a query. Click on the formatted URL in the that appears above the chat box. Once selected, a document icon appears above `Send a message`, indicating successful retrieval. :::tip Bulk File Management -Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/workspace/files)** located in **Settings > Data > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. +Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/workspace/files)** located in **Settings > Data Controls > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. ::: You can also load documents into the workspace area with their access by starting a prompt with `#`, followed by a URL. This can help incorporate web content directly into your conversations. From 0ed3bf2dfd68b24d70fd713bfd47465f12c27512 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 29 Jan 2026 22:20:52 +0100 Subject: [PATCH 25/50] Dev (#1042) --- docs/faq.mdx | 8 +++ docs/features/chat-features/chatshare.md | 38 ++++++++++++++ docs/features/index.mdx | 8 ++- docs/features/rag/index.md | 4 ++ docs/features/workspace/files.md | 65 ++++++++++++++++++++++++ docs/features/workspace/index.mdx | 1 + docs/features/workspace/models.md | 26 ++++++++++ 7 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 docs/features/workspace/files.md diff --git a/docs/faq.mdx b/docs/faq.mdx index 61eb1eece..25d3448d8 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -17,6 +17,14 @@ For more details on enterprise solutions and branding customizations, [click her **A:** No, your data is never sent anywhere unless you explicitly choose to share it or you connect an external model provider. Everything inside Open WebUI runs and is stored locally on your machine or server, giving you full control over your data at all times. We encourage you not to simply take our word for it: our entire codebase is hosted publicly, so you can inspect exactly how everything works, and if you ever notice anything concerning, please report it to us on our repo immediately. +### Q: How can I see a list of all the chats I've ever shared? + +**A:** Open WebUI provides a centralized **Shared Chats** dashboard where you can see every link you've generated. This is available to all users via **Settings > Data Controls > Shared Chats > Manage**. From there, you can search through your shared history, re-copy links, or revoke (unshare) access to any conversation instantly. + +### Q: How can I manage or delete files I've uploaded? + +**A:** You can access the **File Manager** by going to **Settings > Data Controls > Manage Files > Manage**. This dashboard allows you to search through all your uploaded documents, view their details, and delete them. Deleting a file here also automatically cleans up any associated Knowledge Base entries and vector embeddings. + ### Q: Can I use Open WebUI in outer space (e.g., Mars and beyond) or other extreme environments? **A:** **Yes.** Open WebUI is fully self-hosted and does not rely on persistent internet connectivity, making it suitable for environments where cloud-based systems are impractical or impossible. As long as the underlying hardware can run a supported runtime, Open WebUI will function normally regardless of location. diff --git a/docs/features/chat-features/chatshare.md b/docs/features/chat-features/chatshare.md index 619162d07..2ddb70161 100644 --- a/docs/features/chat-features/chatshare.md +++ b/docs/features/chat-features/chatshare.md @@ -110,3 +110,41 @@ Once deleted, the shared link will no longer be valid, and users will not be abl 4. Click on the chat you wish to change permission access for. 5. Scroll to the bottom of the chat and update its permission level. 6. Click the **Update Chat** button. + +### Managing Shared Chats + +Open WebUI provides a centralized dashboard to manage every chat conversation you have shared. This feature allows users to audit their shared content and quickly revoke access if needed. + +#### Accessing the Management Dashboard + +1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. +2. Select **Settings** from the menu. +3. Navigate to the **Data Controls** tab. +4. Locate the **Shared Chats** row and click the **Manage** button. + +#### Dashboard Features + +The **Shared Chats** modal provides a unified interface for your public content: + +- **Centralized List**: View all conversations that have an active share link. +- **Search & Filter**: Quickly find specific shared chats by title. The search bar includes a **500ms debounce** to ensure smooth performance while typing. +- **Advanced Sorting**: Organize your shared history by: + - **Updated At** (Default) + - **Title** +- **Copy Link**: Use the **Clipboard icon** next to any entry to instantly copy the share URL back to your clipboard. +- **Revoke Access (Unshare)**: Use the **Unshare icon** (represented by a slashed link) to deactivate a share link. + - :::warning + Revoking access immediately invalidates the link. Anyone attempting to visit the URL will receive a "Not Found" error. This action is permanent, though you can generate a *new* unique link by sharing the chat again from the main interface. + ::: +- **Pagination**: Efficiently browse through your history using the "Load More" functionality at the bottom of the list. + +### Shared Management FAQ + +**Q: Does unsharing a chat delete the original conversation?** +**A:** No. Unsharing only deletes the public link. Your original chat history remains completely intact. + +**Q: Can I manage chats I've shared on the community platform here?** +**A:** No. This dashboard manages links generated on your local instance. For community-shared content, see [Deleting Shared Chats](#deleting-shared-chats). + +**Q: If I delete my original chat, what happens to the shared link?** +**A:** Deleting a chat also immediately invalidates and deletes any associated share links. diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 3aeceba0e..3eca7414a 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -19,6 +19,10 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔐 **SCIM 2.0 Provisioning**: Enterprise-grade user and group provisioning through SCIM 2.0 protocol, enabling seamless integration with identity providers like Okta, Azure AD, and Google Workspace for automated user lifecycle management. [Read the SCIM Guide](/features/auth/scim). +- 📂 **Centralized File Management**: A unified dashboard to search, view, and manage all your uploaded documents in one place. Includes automated cleanup of Knowledge Base associations and vector embeddings when deleting files. [Learn about File Management](/features/workspace/files). + +- 💬 **Shared Chat Management**: A centralized interface to audit every conversation you've ever shared. Easily search through your shared history, re-copy links, or revoke (unshare) access instantly from a single location. [Learn about Chat Sharing](/features/chat-features/chatshare#managing-shared-chats). + - 📱 **Responsive Design**: Enjoy a seamless experience across desktop PCs, laptops, and mobile devices. - 📱 **Progressive Web App for Mobile**: Enjoy a native progressive web application experience on your mobile device with offline access on `localhost` or a personal domain, and a smooth user interface. In order for our PWA to be installable on your device, it must be delivered in a secure context. This usually means that it must be served over HTTPS. @@ -282,7 +286,7 @@ import { TopBanners } from "@site/src/components/TopBanners"; ### 👥 Collaboration -- 🗨️ **Local Chat Sharing**: Generate and share chat links between users in an efficient and seamless manner, thereby enhancing collaboration and communication. +- 🗨️ **Local Chat Sharing**: Generate and share chat links between users in an efficient and seamless manner. Includes a **centralized management interface** in Settings to view, copy links, or unshare conversations at any time. [Learn more about Chat Sharing](/features/chat-features/chatshare). - 👍👎 **RLHF Annotation**: Enhance the impact of your messages by rating them with either a thumbs up or thumbs down AMD provide a rating for the response on a scale of 1-10, followed by the option to provide textual feedback, facilitating the creation of datasets for Reinforcement Learning from Human Feedback (`RLHF`). Utilize your messages to train or fine-tune models, all while ensuring the confidentiality of locally saved data. @@ -424,6 +428,8 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔒 **Default Sign-Up Role**: Specify the default role for new sign-ups to `pending`, `user`, or `admin`, providing flexibility in managing user permissions and access levels for new users. +- 🤖 **Bulk Model Management & Filtering**: Administrators can effortlessly manage large model collections from external providers with tools to bulk enable/disable models and filter the admin list by status (Enabled, Disabled, Hidden, etc.) to maintain a clean workspace. [Learn about Admin Models](/features/workspace/models#global-model-management-admin). + - 🔒 **Prevent New Sign-Ups**: Enable the option to disable new user sign-ups, restricting access to the platform and maintaining a fixed number of users. - 🔒 **Prevent Chat Deletion**: Ability for admins to toggle a setting that prevents all users from deleting their chat messages, ensuring that all chat messages are retained for audit or compliance purposes. diff --git a/docs/features/rag/index.md b/docs/features/rag/index.md index 816c1b7d9..4e7c25231 100644 --- a/docs/features/rag/index.md +++ b/docs/features/rag/index.md @@ -17,6 +17,10 @@ One of the key advantages of RAG is its ability to access and integrate informat Local documents must first be uploaded via the Documents section of the Workspace area to access them using the `#` symbol before a query. Click on the formatted URL in the that appears above the chat box. Once selected, a document icon appears above `Send a message`, indicating successful retrieval. +:::tip Bulk File Management +Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/workspace/files)** located in **Settings > Data Controls > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. +::: + You can also load documents into the workspace area with their access by starting a prompt with `#`, followed by a URL. This can help incorporate web content directly into your conversations. ## Web Search for RAG diff --git a/docs/features/workspace/files.md b/docs/features/workspace/files.md new file mode 100644 index 000000000..b5ecbf6b8 --- /dev/null +++ b/docs/features/workspace/files.md @@ -0,0 +1,65 @@ +--- +sidebar_position: 5 +title: "📁 File Management" +--- + +Open WebUI provides a comprehensive file management system that allows you to upload, organize, and utilize your documents across various features like Knowledge Bases and RAG. + +## Centralized File Manager + +The **Centralized File Manager** provides a unified interface to view, search, and manage every file you have uploaded to your Open WebUI instance, whether it was uploaded directly to a chat or into a Knowledge Base. + +### Accessing the File Manager + +1. Click on your **profile name** or avatar in the bottom-left corner. +2. Select **Settings** from the menu. +3. Navigate to the **Data Controls** tab. +4. Locate the **Manage Files** row and click the **Manage** button. + +### Key Features + +The File Manager modal offers several powerful tools for maintaining your data: + +- **Universal Search**: Quickly find any file by its filename using the integrated search bar. +- **Advanced Sorting**: Organize your file list by: + - **Filename**: Sort alphabetically to find specific documents. + - **Created At**: See your most recent uploads or find older files. +- **File Details**: View important information at a glance, including: + - **File Size**: See how much space each document occupies (e.g., KB, MB). + - **Upload Date**: Track when each file was added to your instance. +- **Built-in Viewer**: Click on any file to open the **File Item Viewer**, which displays the file's metadata and specific details (such as size and type). +- **Safe Deletion**: Easily remove files you no longer need. + - :::info **Knowledge Base Cleanup** + When you delete a file through the File Manager, Open WebUI automatically performs a deep cleanup. It removes the file from all associated Knowledge Bases and deletes its corresponding vector embeddings, ensuring your database stays clean and efficient. + ::: + +## Using Files in Open WebUI + +Files are at the heart of the platform's advanced capabilities: + +### 1. Retrieval Augmented Generation (RAG) +By uploading documents (PDFs, Word docs, text files, etc.), you can ground your AI's responses in your own data. +- **Chat Uploads**: Simply drag and drop files into a chat or use the upload icon. +- **Knowledge Bases**: Add files to structured collections for more permanent and organized retrieval. + +### 2. File Metadata +Every file carries metadata that helps both you and the AI understand its context. This includes content type, original filename, and size. + +## Best Practices + +- **Naming Conventions**: Use clear, descriptive filenames. This improves the accuracy of the File Manager's search and helps you identify specific documents. +- **Regular Audits**: Periodically use the **Manage Files** dashboard to delete old or redundant documents. This saves disk/database space and improves the performance of your system by ensuring only relevant data is retained. + +## FAQ + +**Q: If I delete a file, is it gone from my chats?** +**A:** Yes. Deleting a file via the File Manager removes it from the system entirely. Any chat that referenced that file using RAG will no longer be able to pull information from it. + +**Q: Can I download my files back from the File Manager?** +**A:** Currently, the File Manager focuses on viewing metadata and management (deletion). To download a file, you should typically access it from the original chat or Knowledge Base where it was used. + +**Q: Are there limits on the number of files I can manage?** +**A:** There is no hard-coded limit in Open WebUI. The scalability depends on your storage (disk/S3) and your Vector Database (e.g., ChromaDB, PGVector). + +**Q: Does managing files require Admin privileges?** +**A:** Regular users can manage their *own* uploaded files. Administrators have additional tools to manage global files and configuration via the Admin Panel. diff --git a/docs/features/workspace/index.mdx b/docs/features/workspace/index.mdx index 6a08a8e30..46d6145d6 100644 --- a/docs/features/workspace/index.mdx +++ b/docs/features/workspace/index.mdx @@ -10,5 +10,6 @@ The Workspace in Open WebUI provides a comprehensive environment for managing yo - [🤖 Models](./models.md) - Create and manage custom models tailored to specific purposes - [🧠 Knowledge](./knowledge.md) - Manage your knowledge bases for retrieval augmented generation - [📚 Prompts](./prompts.md) - Create and organize reusable prompts +- [📁 Files](./files.md) - Centralized management for all your uploaded documents Each section of the Workspace is designed to give you fine-grained control over your Open WebUI experience, allowing for customization and optimization of your AI interactions. diff --git a/docs/features/workspace/models.md b/docs/features/workspace/models.md index d042124a0..b581a693e 100644 --- a/docs/features/workspace/models.md +++ b/docs/features/workspace/models.md @@ -116,6 +116,32 @@ A raw Base Model can be cloned as a custom Workspace model, but it will not clon To download new raw Base Models (like `Llama-3.2-3B-Instruct-GGUF:Q8_0` or `Mistral-7B-Instruct-v0.2-GGUF:Q4_K_M`), navigate to **Settings > Connections > Ollama**. Alternatively, type `ollama run hf.co/{username}/{repository}:{quantization}` in the model selector to pull directly from Hugging Face. This action will create a button within the model selector labeled "Pull [Model Name]" that will begin downloading the model from its source once clicked. ::: +## Global Model Management (Admin) + +Administrators have access to a centralized management interface via **Admin Panel > Settings > Models**. This page provides powerful tools for decluttering and organizing the model list, especially when connected to providers with hundreds of available models. + +### View Filtering + +The **Admin View Selector** allows you to filter the entire list of models by their operational status. This is located next to the search bar and includes the following views: + +- **All**: Shows every model available to the system. +- **Enabled**: Displays only models that are currently active and selectable by users. +- **Disabled**: Shows models that have been deactivated. +- **Visible**: Shows models that are currently visible in the user model selector. +- **Hidden**: Displays only the models that have been hidden (these appear with reduced opacity in the list). + +### Bulk Actions + +To streamline the management of large model collections, the Admin Panel includes **Bulk Actions** that apply to the models currently visible in your filtered view. + +1. **Filter your view** (e.g., select "Disabled" or "Hidden"). +2. **Open the Actions menu** (Ellipsis icon next to the search bar). +3. **Select an action**: + - **Enable All**: Activates all models in the current filtered list simultaneously. + - **Disable All**: Deactivates all models in the current filtered list. + +These tools are specifically designed to help administrators quickly manage external providers (like OpenAI or Anthropic) that expose a high volume of models, allowing for instant site-wide configuration changes. + ## Model Switching in Chat Open WebUI allows for dynamic model switching and parallel inference within a chat session. From b22c2cc5e65fe3fd21d9947b826a39b8612c7569 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 30 Jan 2026 00:35:29 +0100 Subject: [PATCH 26/50] data controls --- docs/features/chat-features/chatshare.md | 36 +------------ docs/features/data-controls/archived-chats.md | 42 ++++++++++++++++ .../{workspace => data-controls}/files.md | 0 docs/features/data-controls/import-export.md | 50 +++++++++++++++++++ docs/features/data-controls/index.mdx | 13 +++++ docs/features/data-controls/shared-chats.md | 44 ++++++++++++++++ docs/features/index.mdx | 4 +- docs/features/rag/index.md | 2 +- docs/features/workspace/index.mdx | 1 - 9 files changed, 154 insertions(+), 38 deletions(-) create mode 100644 docs/features/data-controls/archived-chats.md rename docs/features/{workspace => data-controls}/files.md (100%) create mode 100644 docs/features/data-controls/import-export.md create mode 100644 docs/features/data-controls/index.mdx create mode 100644 docs/features/data-controls/shared-chats.md diff --git a/docs/features/chat-features/chatshare.md b/docs/features/chat-features/chatshare.md index 2ddb70161..e20bf03ba 100644 --- a/docs/features/chat-features/chatshare.md +++ b/docs/features/chat-features/chatshare.md @@ -113,38 +113,6 @@ Once deleted, the shared link will no longer be valid, and users will not be abl ### Managing Shared Chats -Open WebUI provides a centralized dashboard to manage every chat conversation you have shared. This feature allows users to audit their shared content and quickly revoke access if needed. +Open WebUI provides a centralized dashboard to manage every chat conversation you have shared. From there you can search through your shared history, re-copy links, or revoke access instantly. -#### Accessing the Management Dashboard - -1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. -2. Select **Settings** from the menu. -3. Navigate to the **Data Controls** tab. -4. Locate the **Shared Chats** row and click the **Manage** button. - -#### Dashboard Features - -The **Shared Chats** modal provides a unified interface for your public content: - -- **Centralized List**: View all conversations that have an active share link. -- **Search & Filter**: Quickly find specific shared chats by title. The search bar includes a **500ms debounce** to ensure smooth performance while typing. -- **Advanced Sorting**: Organize your shared history by: - - **Updated At** (Default) - - **Title** -- **Copy Link**: Use the **Clipboard icon** next to any entry to instantly copy the share URL back to your clipboard. -- **Revoke Access (Unshare)**: Use the **Unshare icon** (represented by a slashed link) to deactivate a share link. - - :::warning - Revoking access immediately invalidates the link. Anyone attempting to visit the URL will receive a "Not Found" error. This action is permanent, though you can generate a *new* unique link by sharing the chat again from the main interface. - ::: -- **Pagination**: Efficiently browse through your history using the "Load More" functionality at the bottom of the list. - -### Shared Management FAQ - -**Q: Does unsharing a chat delete the original conversation?** -**A:** No. Unsharing only deletes the public link. Your original chat history remains completely intact. - -**Q: Can I manage chats I've shared on the community platform here?** -**A:** No. This dashboard manages links generated on your local instance. For community-shared content, see [Deleting Shared Chats](#deleting-shared-chats). - -**Q: If I delete my original chat, what happens to the shared link?** -**A:** Deleting a chat also immediately invalidates and deletes any associated share links. +For details on the management dashboard, see [Shared Chats Management](/features/data-controls/shared-chats). diff --git a/docs/features/data-controls/archived-chats.md b/docs/features/data-controls/archived-chats.md new file mode 100644 index 000000000..1af64bedf --- /dev/null +++ b/docs/features/data-controls/archived-chats.md @@ -0,0 +1,42 @@ +--- +sidebar_position: 3 +title: "📦 Archived Chats" +--- + +Open WebUI allows you to archive conversations to declutter your sidebar while preserving them for future reference. The **Archived Chats** dashboard lets you manage all your archived conversations in one place. + +## Accessing Archived Chats + +1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. +2. Select **Settings** from the menu. +3. Navigate to the **Data Controls** tab. +4. Locate the **Archived Chats** row and click the **Manage** button. + +## Dashboard Features + +The **Archived Chats** modal provides tools to manage your archived conversations: + +- **Search**: Quickly find archived chats by title using the search bar. +- **Restore**: Bring an archived chat back to your main sidebar. +- **Delete**: Permanently remove an archived chat from your account. + +## Bulk Operations + +From the Data Controls tab, you can also perform bulk operations: + +- **Archive All Chats**: Move all your current conversations to the archive at once. This is useful for periodic cleanup. +- **Delete All Chats**: Permanently remove all conversations (both active and archived). + - :::warning + This action cannot be undone. All chat history will be permanently deleted. + ::: + +## FAQ + +**Q: Can I search within archived chats?** +**A:** The archive dashboard searches by chat title. To search within message content, you would need to restore the chat first. + +**Q: Is there a limit to how many chats I can archive?** +**A:** There is no hard limit. The scalability depends on your database configuration. + +**Q: Do archived chats still use storage?** +**A:** Yes. Archived chats remain in your database. To free up space, you must permanently delete them. diff --git a/docs/features/workspace/files.md b/docs/features/data-controls/files.md similarity index 100% rename from docs/features/workspace/files.md rename to docs/features/data-controls/files.md diff --git a/docs/features/data-controls/import-export.md b/docs/features/data-controls/import-export.md new file mode 100644 index 000000000..30f4063c1 --- /dev/null +++ b/docs/features/data-controls/import-export.md @@ -0,0 +1,50 @@ +--- +sidebar_position: 4 +title: "💾 Import & Export" +--- + +Open WebUI provides tools to backup your chat history and restore it later, or migrate conversations from other platforms. + +## Accessing Import & Export + +1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. +2. Select **Settings** from the menu. +3. Navigate to the **Data Controls** tab. +4. Use the **Import Chats** or **Export Chats** buttons. + +## Exporting Chats + +Click the **Export Chats** button to download all your conversations as a JSON file. This backup includes: + +- All chat messages and their metadata +- Model information used in each conversation +- Timestamps and conversation structure + +:::tip Regular Backups +It's a good practice to periodically export your chats, especially before major updates or migrations. +::: + +## Importing Chats + +Click the **Import Chats** button and select a JSON file to restore conversations. Open WebUI supports importing from: + +- **Open WebUI exports**: Native JSON format from previous exports +- **ChatGPT exports**: Conversations exported from OpenAI's ChatGPT +- **Other compatible formats**: JSON files following the expected structure + +### Import Behavior + +- Imported chats are added to your existing conversations (they don't replace them) +- Duplicate detection may vary based on chat IDs +- If using ChatGPT exports, the format is automatically converted + +## FAQ + +**Q: Will importing chats overwrite my existing conversations?** +**A:** No. Imported chats are added alongside your existing conversations. + +**Q: Can I import chats from Claude, Gemini, or other platforms?** +**A:** Currently, native import support is available for Open WebUI and ChatGPT formats. Other platforms may require manual conversion to the expected JSON structure. + +**Q: Is there a size limit for imports?** +**A:** There's no hard-coded limit, but very large files may take longer to process. The practical limit depends on your server configuration and available memory. diff --git a/docs/features/data-controls/index.mdx b/docs/features/data-controls/index.mdx new file mode 100644 index 000000000..ab737fb52 --- /dev/null +++ b/docs/features/data-controls/index.mdx @@ -0,0 +1,13 @@ +--- +sidebar_position: 15 +title: "Data Controls" +--- + +The **Data Controls** section in Open WebUI provides tools for managing your personal data, including files, shared content, and chat history. Access it via **Settings > Data Controls**. + +## Resources + +- [📁 File Management](./files.md) - Centralized management for all your uploaded documents +- [🔗 Shared Chats](./shared-chats.md) - Manage and revoke access to your shared chat links +- [📦 Archived Chats](./archived-chats.md) - Restore or permanently delete archived conversations +- [💾 Import & Export](./import-export.md) - Backup and restore your chat history diff --git a/docs/features/data-controls/shared-chats.md b/docs/features/data-controls/shared-chats.md new file mode 100644 index 000000000..3382beffa --- /dev/null +++ b/docs/features/data-controls/shared-chats.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 2 +title: "🔗 Shared Chats" +--- + +Open WebUI provides a centralized dashboard to manage every chat conversation you have shared. This feature allows users to audit their shared content and quickly revoke access if needed. + +:::info +This page documents the **management dashboard** for shared chats. For information on how to share chats, see [Chat Sharing](/features/chat-features/chatshare). +::: + +## Accessing the Management Dashboard + +1. Click on your **profile name** or avatar in the bottom-left corner of the sidebar. +2. Select **Settings** from the menu. +3. Navigate to the **Data Controls** tab. +4. Locate the **Shared Chats** row and click the **Manage** button. + +## Dashboard Features + +The **Shared Chats** modal provides a unified interface for your public content: + +- **Centralized List**: View all conversations that have an active share link. +- **Search & Filter**: Quickly find specific shared chats by title. The search bar includes a **500ms debounce** to ensure smooth performance while typing. +- **Advanced Sorting**: Organize your shared history by: + - **Updated At** (Default) + - **Title** +- **Copy Link**: Use the **Clipboard icon** next to any entry to instantly copy the share URL back to your clipboard. +- **Revoke Access (Unshare)**: Use the **Unshare icon** (represented by a slashed link) to deactivate a share link. + - :::warning + Revoking access immediately invalidates the link. Anyone attempting to visit the URL will receive a "Not Found" error. This action is permanent, though you can generate a *new* unique link by sharing the chat again from the main interface. + ::: +- **Pagination**: Efficiently browse through your history using the "Load More" functionality at the bottom of the list. + +## FAQ + +**Q: Does unsharing a chat delete the original conversation?** +**A:** No. Unsharing only deletes the public link. Your original chat history remains completely intact. + +**Q: Can I manage chats I've shared on the community platform here?** +**A:** No. This dashboard manages links generated on your local instance. For community-shared content, see [Deleting Shared Chats](/features/chat-features/chatshare#deleting-shared-chats). + +**Q: If I delete my original chat, what happens to the shared link?** +**A:** Deleting a chat also immediately invalidates and deletes any associated share links. diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 3eca7414a..f001caf84 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -19,9 +19,9 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔐 **SCIM 2.0 Provisioning**: Enterprise-grade user and group provisioning through SCIM 2.0 protocol, enabling seamless integration with identity providers like Okta, Azure AD, and Google Workspace for automated user lifecycle management. [Read the SCIM Guide](/features/auth/scim). -- 📂 **Centralized File Management**: A unified dashboard to search, view, and manage all your uploaded documents in one place. Includes automated cleanup of Knowledge Base associations and vector embeddings when deleting files. [Learn about File Management](/features/workspace/files). +- 📂 **Centralized File Management**: A unified dashboard to search, view, and manage all your uploaded documents in one place. Includes automated cleanup of Knowledge Base associations and vector embeddings when deleting files. [Learn about File Management](/features/data-controls/files). -- 💬 **Shared Chat Management**: A centralized interface to audit every conversation you've ever shared. Easily search through your shared history, re-copy links, or revoke (unshare) access instantly from a single location. [Learn about Chat Sharing](/features/chat-features/chatshare#managing-shared-chats). +- 💬 **Shared Chat Management**: A centralized interface to audit every conversation you've ever shared. Easily search through your shared history, re-copy links, or revoke (unshare) access instantly from a single location. [Learn about Shared Chats](/features/data-controls/shared-chats). - 📱 **Responsive Design**: Enjoy a seamless experience across desktop PCs, laptops, and mobile devices. diff --git a/docs/features/rag/index.md b/docs/features/rag/index.md index 4e7c25231..47b53e542 100644 --- a/docs/features/rag/index.md +++ b/docs/features/rag/index.md @@ -18,7 +18,7 @@ One of the key advantages of RAG is its ability to access and integrate informat Local documents must first be uploaded via the Documents section of the Workspace area to access them using the `#` symbol before a query. Click on the formatted URL in the that appears above the chat box. Once selected, a document icon appears above `Send a message`, indicating successful retrieval. :::tip Bulk File Management -Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/workspace/files)** located in **Settings > Data Controls > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. +Need to clean up multiple uploaded documents or audit your storage? You can now use the centralized **[File Manager](/features/data-controls/files)** located in **Settings > Data Controls > Manage Files**. Deleting files there will automatically clean up their corresponding RAG embeddings. ::: You can also load documents into the workspace area with their access by starting a prompt with `#`, followed by a URL. This can help incorporate web content directly into your conversations. diff --git a/docs/features/workspace/index.mdx b/docs/features/workspace/index.mdx index 46d6145d6..6a08a8e30 100644 --- a/docs/features/workspace/index.mdx +++ b/docs/features/workspace/index.mdx @@ -10,6 +10,5 @@ The Workspace in Open WebUI provides a comprehensive environment for managing yo - [🤖 Models](./models.md) - Create and manage custom models tailored to specific purposes - [🧠 Knowledge](./knowledge.md) - Manage your knowledge bases for retrieval augmented generation - [📚 Prompts](./prompts.md) - Create and organize reusable prompts -- [📁 Files](./files.md) - Centralized management for all your uploaded documents Each section of the Workspace is designed to give you fine-grained control over your Open WebUI experience, allowing for customization and optimization of your AI interactions. From 2881efe8b62a27f22b9a54b8b4c8e4dc79c1360c Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:52:19 +0100 Subject: [PATCH 27/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 4a1b5f996..0968a65aa 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5789,6 +5789,46 @@ If you're running Open WebUI as a single instance with `UVICORN_WORKERS=1` (the ::: +:::danger + +**Critical Redis Server Configuration — Prevent Connection Exhaustion** + +Open WebUI uses Redis for token validation, WebSocket management, and session storage. Each user action can create Redis connections. If your Redis server is misconfigured, connections will accumulate over time until the limit is reached, causing **500 Internal Server Errors** and preventing all users from logging in. + +**You must configure these settings in your `redis.conf` (not Open WebUI environment variables):** + +| Setting | Bad Default | Recommended | Why | +|---------|-------------|-------------|-----| +| `maxclients` | 1000 (some distros) | `10000` or higher | Low limits cause "max number of clients reached" errors | +| `timeout` | 0 (never close) | `1800` (30 minutes) | Without timeout, idle connections accumulate forever | + +**Example `redis.conf` settings:** +```conf +maxclients 10000 +timeout 1800 +``` + +**Symptoms of this misconfiguration:** +- Works fine for days/weeks, then suddenly all logins fail with 500 errors +- `redis.exceptions.ConnectionError: max number of clients reached` in logs +- Problem appears to "fix itself" temporarily, then returns + +**Why this happens:** +With `timeout 0`, every Redis connection stays open indefinitely. Over days or weeks, connections from token checks, WebSocket events, and session validations accumulate. Once `maxclients` is reached, no new connections can be made, and authentication fails completely. + +**To check your current connection count:** +```bash +redis-cli INFO clients | grep connected_clients +``` + +**To verify your settings:** +```bash +redis-cli CONFIG GET maxclients +redis-cli CONFIG GET timeout +``` + +::: + #### `REDIS_SENTINEL_HOSTS` - Type: `str` From 99faa731e9f5fb199403a42105d9f0bffeb02898 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:56:32 +0100 Subject: [PATCH 28/50] Update redis.md --- docs/tutorials/integrations/redis.md | 116 ++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/integrations/redis.md b/docs/tutorials/integrations/redis.md index 47d49577f..48ba56f17 100644 --- a/docs/tutorials/integrations/redis.md +++ b/docs/tutorials/integrations/redis.md @@ -63,6 +63,70 @@ Without Redis in multi-worker or multi-instance scenarios, you will experience: - A Docker network for communication between Open WebUI and Redis - Basic understanding of Docker, Redis, and Open WebUI +### Critical: Redis Server Configuration + +:::danger + +**Prevent "Max Number of Clients Reached" Errors** + +Before configuring Open WebUI to use Redis, you **must** ensure your Redis server itself is properly configured. A common misconfiguration causes connections to accumulate over time, eventually exhausting the connection limit and causing **complete authentication failure** (500 Internal Server Error for all users). + +**The Problem:** + +Open WebUI uses Redis for: +- Token validation/revocation checking (every authenticated request) +- WebSocket management (real-time updates) +- Session storage (if `ENABLE_STAR_SESSIONS_MIDDLEWARE` is enabled) + +With default Redis settings on some distributions (`maxclients 1000`, `timeout 0`), connections are never closed. Over days or weeks, they accumulate silently until the limit is reached. Then, suddenly, no one can log in. + +**The Symptoms:** +- Application works fine for days/weeks +- Suddenly, all users get 500 Internal Server Error on login +- Error in logs: `redis.exceptions.ConnectionError: max number of clients reached` +- May temporarily "fix itself" as old connections eventually die, then fail again + +**The Solution:** + +Add these settings to your Redis configuration: + +```conf +# Allow sufficient concurrent connections +maxclients 10000 + +# Close idle connections after 30 minutes (1800 seconds) +# This does NOT affect session validity — only the TCP connection to Redis +timeout 1800 +``` + +**For Docker deployments**, add to your Redis command: + +```yml +services: + redis: + image: docker.io/valkey/valkey:8.0.1-alpine + command: "valkey-server --save 30 1 --maxclients 10000 --timeout 1800" + # ... rest of config +``` + +**Why `timeout 1800` is safe:** + +The timeout only affects idle Redis TCP connections, not user sessions. When a connection times out: +- The user's JWT token remains valid +- Their session is not affected +- The next request simply opens a new Redis connection (adds ~1-5ms, imperceptible) + +**Monitoring:** + +Check current connection count: +```bash +redis-cli INFO clients | grep connected_clients +``` + +With proper `timeout` configuration, this number should fluctuate naturally (rising during active hours, falling during quiet periods) rather than climbing indefinitely. + +::: + ## Setting up Redis To set up Redis for websocket support, you will need to create a `docker-compose.yml` file with the following contents: @@ -75,7 +139,7 @@ services: container_name: redis-valkey volumes: - redis-data:/data - command: "valkey-server --save 30 1" + command: "valkey-server --save 30 1 --maxclients 10000 --timeout 1800" healthcheck: test: "[ $$(valkey-cli ping) = 'PONG' ]" start_period: 5s @@ -113,6 +177,8 @@ The `ports` directive is not included in this configuration, as it is not necess The above configuration sets up a Redis container named `redis-valkey` and mounts a volume for data persistence. The `healthcheck` directive ensures that the container is restarted if it fails to respond to the `ping` command. The `--save 30 1` command option saves the Redis database to disk every 30 minutes if at least 1 key has changed. +**Important:** The `--maxclients 10000 --timeout 1800` flags prevent connection exhaustion. See the "Critical: Redis Server Configuration" section above for details. + ::: To create a Docker network for communication between Open WebUI and Redis, run the following command: @@ -452,6 +518,54 @@ REDIS_KEY_PREFIX="openwebui-dev" 2. Monitor Redis memory: `docker exec -it redis-valkey valkey-cli info memory` 3. Clear old keys if needed: `docker exec -it redis-valkey valkey-cli FLUSHDB` +#### Issue: "max number of clients reached" after days/weeks of operation + +**Symptoms:** + +- Application worked fine for an extended period, then suddenly fails +- All login attempts return 500 Internal Server Error +- Error in logs: `redis.exceptions.ConnectionError: max number of clients reached` +- May temporarily recover, then fail again + +**Cause:** Redis `maxclients` limit reached due to connection accumulation. This happens when: +- `timeout` is set to `0` (connections never close) +- `maxclients` is too low for your usage pattern + +**Solution:** + +1. Check current connection count: + ```bash + redis-cli INFO clients | grep connected_clients + ``` + +2. Check current settings: + ```bash + redis-cli CONFIG GET maxclients + redis-cli CONFIG GET timeout + ``` + +3. Fix the configuration: + ```bash + redis-cli CONFIG SET maxclients 10000 + redis-cli CONFIG SET timeout 1800 + ``` + +4. Make permanent by adding to `redis.conf` or Docker command: + ```conf + maxclients 10000 + timeout 1800 + ``` + +5. Restart Redis to clear accumulated connections: + ```bash + # For systemd + sudo systemctl restart redis + + # For Docker + docker restart redis-valkey + +**Prevention:** Always configure `timeout` to a reasonable value (e.g., 1800 seconds). The timeout only affects idle TCP connections, not user sessions — it's safe and recommended. + ### Additional Resources - [Redis Documentation](https://redis.io/docs) From 1b8ad698113209fb97fb63dcf301efc9553c7232 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:03:20 +0100 Subject: [PATCH 29/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 98 ++++++++++++++++++++-- 1 file changed, 93 insertions(+), 5 deletions(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 0968a65aa..3ea437506 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5230,39 +5230,127 @@ For API Key creation (and the API keys themselves) to work, you need **both**: - Description: Enables or disables user permission to access workspace tools. - Persistence: This environment variable is a `PersistentConfig` variable. +### Sharing (Private) + +These settings control whether users can share workspace items with other users **privately** (non-public sharing). + +#### `USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING` + +- Type: `str` +- Default: `False` +- Description: Enables or disables **private sharing** of workspace models. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING` + +- Type: `str` +- Default: `False` +- Description: Enables or disables **private sharing** of workspace knowledge. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING` + +- Type: `str` +- Default: `False` +- Description: Enables or disables **private sharing** of workspace prompts. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING` + +- Type: `str` +- Default: `False` +- Description: Enables or disables **private sharing** of workspace tools. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_NOTES_ALLOW_SHARING` + +- Type: `str` +- Default: `True` +- Description: Enables or disables **private sharing** of notes. +- Persistence: This environment variable is a `PersistentConfig` variable. + +### Sharing (Public) + +These settings control whether users can share workspace items **publicly**. + #### `USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING` - Type: `str` - Default: `False` -- Description: Enables or disables public sharing of workspace models. +- Description: Enables or disables **public sharing** of workspace models. - Persistence: This environment variable is a `PersistentConfig` variable. #### `USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING` - Type: `str` - Default: `False` -- Description: Enables or disables public sharing of workspace knowledge. +- Description: Enables or disables **public sharing** of workspace knowledge. - Persistence: This environment variable is a `PersistentConfig` variable. #### `USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING` - Type: `str` - Default: `False` -- Description: Enables or disables public sharing of workspace prompts. +- Description: Enables or disables **public sharing** of workspace prompts. - Persistence: This environment variable is a `PersistentConfig` variable. #### `USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING` - Type: `str` - Default: `False` -- Description: Enables or disables public sharing of workspace tools. +- Description: Enables or disables **public sharing** of workspace tools. - Persistence: This environment variable is a `PersistentConfig` variable. #### `USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING` - Type: `str` - Default: `True` -- Description: Enables or disables public sharing of notes. +- Description: Enables or disables **public sharing** of notes. +- Persistence: This environment variable is a `PersistentConfig` variable. + +### Import / Export + +#### `USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT` + +- Type: `str` +- Default: `True` +- Description: Enables or disables user permission to import workspace models. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT` + +- Type: `str` +- Default: `True` +- Description: Enables or disables user permission to export workspace models. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT` + +- Type: `str` +- Default: `True` +- Description: Enables or disables user permission to import workspace prompts. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT` + +- Type: `str` +- Default: `True` +- Description: Enables or disables user permission to export workspace prompts. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT` + +- Type: `str` +- Default: `False` +- Description: Enables or disables user permission to import workspace tools. +- Persistence: This environment variable is a `PersistentConfig` variable. + +#### `USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT` + +- Type: `str` +- Default: `False` +- Description: Enables or disables user permission to export workspace tools. +- Persistence: This environment variable is a `PersistentConfig` variable. ### Settings Permissions From 70892536f5dd2c3adfc36d749079dfe78b64bfe2 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:01:13 +0100 Subject: [PATCH 30/50] analytics --- docs/features/analytics/index.mdx | 342 ++++++++++++++++++++++++++++++ docs/features/index.mdx | 2 + 2 files changed, 344 insertions(+) create mode 100644 docs/features/analytics/index.mdx diff --git a/docs/features/analytics/index.mdx b/docs/features/analytics/index.mdx new file mode 100644 index 000000000..b9fbe81e6 --- /dev/null +++ b/docs/features/analytics/index.mdx @@ -0,0 +1,342 @@ +--- +sidebar_position: 1050 +title: "Analytics" +--- + +# Analytics + +The **Analytics** feature in Open WebUI provides administrators with comprehensive insights into usage patterns, token consumption, and model performance across their instance. This powerful tool helps you understand how your users are interacting with AI models and make data-driven decisions about resource allocation and model selection. + +:::info Admin-Only Feature +Analytics is only accessible to users with **admin** role. Access it via **Admin Panel > Analytics**. +::: + +## Overview + +The Analytics dashboard gives you a bird's-eye view of your Open WebUI instance's activity, including: + +- **Message volume** across different models and time periods +- **Token usage** tracking for cost estimation and resource planning +- **User activity** patterns to understand engagement +- **Time-series data** showing trends over hours, days, or months + +All analytics data is derived from the message history stored in your instance's database. When the Analytics feature is enabled, Open WebUI automatically tracks and indexes messages to provide fast, queryable insights. + +--- + +## Accessing Analytics + +1. Log in with an **admin** account +2. Navigate to **Admin Panel** (click your profile icon → Admin Panel) +3. Click on the **Analytics** tab in the admin navigation + +--- + +## Dashboard Features + +### Time Period Selection + +At the top right of the Analytics dashboard, you can filter all data by time period: + +- **Last 24 hours** - Hourly granularity for real-time monitoring +- **Last 7 days** - Daily overview of the past week +- **Last 30 days** - Monthly snapshot +- **Last 90 days** - Quarterly trends +- **All time** - Complete historical data + +All metrics on the page update automatically when you change the time period. + +### Summary Statistics + +The dashboard header displays key metrics for the selected time period: + +- **Total Messages** - Number of assistant responses generated +- **Total Tokens** - Sum of all input and output tokens processed +- **Total Chats** - Number of unique conversations +- **Total Users** - Number of users who sent messages + +:::note Message Counting +Analytics counts **assistant responses** rather than user messages. This provides a more accurate measure of AI model usage and token consumption. +::: + +### Message Timeline Chart + +The interactive timeline chart visualizes message volume over time, broken down by model. Key features: + +- **Hourly or Daily granularity** - Automatically adjusts based on selected time period +- **Multi-model visualization** - Shows up to 8 models with distinct colors +- **Hover tooltips** - Display exact counts and percentages for each model at any point in time +- **Trend identification** - Quickly spot usage patterns, peak hours, and model adoption + +This chart helps you: +- Identify busy periods for capacity planning +- Track model adoption after deployment +- Detect unusual activity spikes +- Monitor the impact of changes or announcements + +### Model Usage Table + +A detailed breakdown of how each model is being used: + +| Column | Description | +|--------|-------------| +| **#** | Rank by message count | +| **Model** | Model name with icon | +| **Messages** | Total assistant responses generated | +| **Tokens** | Total tokens (input + output) consumed | +| **%** | Percentage share of total messages | + +**Features:** +- **Sortable columns** - Click column headers to sort by name or message count +- **Model icons** - Visual identification with profile images +- **Token tracking** - See which models consume the most resources + +**Use cases:** +- Identify your most popular models +- Calculate cost per model (by multiplying tokens by provider rates) +- Decide which models to keep or remove +- Plan infrastructure upgrades based on usage + +### User Activity Table + +Track user engagement and token consumption per user: + +| Column | Description | +|--------|-------------| +| **#** | Rank by activity | +| **User** | Username with profile picture | +| **Messages** | Total messages sent by this user | +| **Tokens** | Total tokens consumed by this user | + +**Features:** +- **Sortable columns** - Organize by name or activity level +- **User identification** - Profile pictures and display names +- **Token attribution** - See resource consumption per user + +**Use cases:** +- Monitor power users and their token consumption +- Identify inactive or low-usage accounts +- Plan user quotas or rate limits +- Calculate per-user costs for billing purposes + +--- + +## Token Usage Tracking + +### What Are Tokens? + +Tokens are the units that language models use to process text. Both the **input** (your prompt) and **output** (the model's response) consume tokens. Most AI providers charge based on token usage, making token tracking essential for cost management. + +### How Token Tracking Works + +Open WebUI automatically captures token usage from model responses and stores it with each message. The Analytics feature aggregates this data to show: + +- **Input tokens** - Tokens in user prompts and context +- **Output tokens** - Tokens in model responses +- **Total tokens** - Sum of input and output + +Token data is normalized across different model providers (OpenAI, Ollama, llama.cpp, etc.) to provide consistent metrics regardless of which backend you're using. + +### Token Usage Metrics + +The **Token Usage** section (accessible via the Tokens endpoint or dashboard) provides: + +- **Per-model token breakdown** - Input, output, and total tokens for each model +- **Total token consumption** - Instance-wide token usage +- **Message count correlation** - Tokens per message for efficiency analysis + +:::tip Cost Estimation +To estimate costs, multiply the token counts by your provider's pricing: +``` +Cost = (input_tokens × input_price) + (output_tokens × output_price) +``` + +Example for GPT-4: +- Input: 1,000,000 tokens × $0.03/1K = $30 +- Output: 500,000 tokens × $0.06/1K = $30 +- **Total: $60** +::: + +--- + +## Use Cases + +### 1. Resource Planning + +**Scenario:** You're running Open WebUI for a team and need to plan infrastructure capacity. + +**How Analytics helps:** +- View the **Message Timeline** to identify peak usage hours +- Check **Model Usage** to see which models need more resources +- Monitor **Token Usage** to estimate future costs +- Track **User Activity** to plan for team growth + +### 2. Model Evaluation + +**Scenario:** You've deployed several models and want to know which ones your users prefer. + +**How Analytics helps:** +- Compare **message counts** across models to see adoption rates +- Check **token efficiency** (tokens per message) to identify verbose models +- Monitor **trends** in the timeline chart after introducing new models +- Combine with the [Evaluation feature](../evaluation/index.mdx) for quality insights + +### 3. Cost Management + +**Scenario:** You're using paid API providers and need to control costs. + +**How Analytics helps:** +- Track **total token consumption** by model and user +- Identify **high-usage users** for quota discussions +- Compare **token costs** across different model providers +- Set up regular reviews using time-period filters + +### 4. User Engagement + +**Scenario:** You want to understand how your team is using AI tools. + +**How Analytics helps:** +- Monitor **active users** vs. registered accounts +- Identify **power users** who might need support or training +- Track **adoption trends** over time +- Correlate usage with team initiatives or training sessions + +### 5. Compliance & Auditing + +**Scenario:** Your organization requires usage reporting for compliance. + +**How Analytics helps:** +- Generate **activity reports** for specific time periods +- Track **user attribution** for all AI interactions +- Monitor **model usage** for approved vs. unapproved models +- Export data via API for external reporting tools + +--- + +## Technical Details + +### Data Storage + +Analytics data is stored in the `chat_message` table, which contains: + +- **Message content** - User and assistant messages +- **Metadata** - Model ID, user ID, timestamps +- **Token usage** - Input, output, and total tokens +- **Relationships** - Links to parent messages and chats + +When you enable Analytics (via migration), Open WebUI: +1. Creates the `chat_message` table with optimized indexes +2. **Backfills existing messages** from your chat history +3. **Dual-writes** new messages to both the chat JSON and the message table + +This dual-write approach ensures: +- **Backward compatibility** - Existing features continue working +- **Fast queries** - Analytics doesn't impact chat performance +- **Data consistency** - All messages are captured + +### Database Indexes + +The following indexes optimize analytics queries: + +- `chat_id` - Fast lookup of all messages in a chat +- `user_id` - Quick user activity reports +- `model_id` - Efficient model usage queries +- `created_at` - Time-range filtering +- Composite indexes for common query patterns + +### API Endpoints + +For advanced users and integrations, Analytics provides REST API endpoints: + +``` +GET /api/v1/analytics/summary +GET /api/v1/analytics/models +GET /api/v1/analytics/users +GET /api/v1/analytics/messages +GET /api/v1/analytics/daily +GET /api/v1/analytics/tokens +``` + +All endpoints support `start_date` and `end_date` parameters (Unix timestamps) for time-range filtering. + +:::tip API Access +All Analytics endpoints require admin authentication. Include your admin bearer token: +```bash +curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ + https://your-instance.com/api/v1/analytics/summary +``` +::: + +--- + +## Privacy & Data Considerations + +### What Gets Tracked? + +Analytics tracks: +- ✅ Message timestamps and counts +- ✅ Token usage per message +- ✅ Model IDs and user IDs +- ✅ Chat IDs and message relationships + +Analytics **does not** track: +- ❌ Message content display in the dashboard (only metadata) +- ❌ External sharing or exports +- ❌ Individual message content outside the database + +### Data Retention + +Analytics data follows your instance's chat retention policy. When you delete: +- **A chat** - All associated messages are removed from analytics +- **A user** - All their messages are disassociated +- **Message history** - Analytics data is also cleared + +--- + +## Frequently Asked Questions + +### Why are message counts different from what I expected? + +Analytics counts **assistant responses**, not user messages. If a chat has 10 user messages and 10 assistant responses, the count is 10. This provides a more accurate measure of AI usage and token consumption. + +### How accurate is token tracking? + +Token accuracy depends on your model provider: +- **OpenAI/Anthropic** - Exact counts from API responses +- **Ollama** - Accurate for models with token reporting +- **llama.cpp** - Reports tokens when available +- **Custom providers** - Depends on implementation + +Missing token data appears as 0 in analytics. + +### Can I export analytics data? + +Yes, via the API endpoints. Use tools like `curl`, Python scripts, or BI tools to fetch and export data: + +```bash +curl -H "Authorization: Bearer TOKEN" \ + "https://instance.com/api/v1/analytics/summary?start_date=1704067200&end_date=1706745600" \ + > analytics_export.json +``` + +--- + +## Summary + +Open WebUI's Analytics feature transforms your instance into a data-driven platform by providing: + +- 📊 **Real-time insights** into model and user activity +- 💰 **Token tracking** for cost management and optimization +- 📈 **Trend analysis** to understand usage patterns over time +- 👥 **User engagement** metrics for community building +- 🔒 **Privacy-focused** design keeping all data on your instance + +Whether you're managing a personal instance or a large organizational deployment, Analytics gives you the visibility needed to optimize performance, control costs, and better serve your users. + +--- + +## Related Features + +- [**Evaluation**](../evaluation/index.mdx) - Measure model quality through user feedback +- [**RBAC**](../rbac/index.mdx) - Control access to models and features per user +- [**Data Controls**](../data-controls/index.mdx) - Manage chat history and exports diff --git a/docs/features/index.mdx b/docs/features/index.mdx index f001caf84..9fbc8a058 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -426,6 +426,8 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 👥 **Active Users Indicator**: Monitor the number of active users and which models are being utilized by whom to assist in gauging when performance may be impacted due to a high number of users. +- 📊 **Analytics Dashboard**: Comprehensive usage insights for administrators including message volume, token consumption, user activity, and model performance metrics with interactive time-series charts and detailed breakdowns. Track costs, identify trends, and make data-driven decisions about resource allocation. [Learn more about Analytics](/features/analytics). + - 🔒 **Default Sign-Up Role**: Specify the default role for new sign-ups to `pending`, `user`, or `admin`, providing flexibility in managing user permissions and access levels for new users. - 🤖 **Bulk Model Management & Filtering**: Administrators can effortlessly manage large model collections from external providers with tools to bulk enable/disable models and filter the admin list by status (Enabled, Disabled, Hidden, etc.) to maintain a clean workspace. [Learn about Admin Models](/features/workspace/models#global-model-management-admin). From 5c3f2562c0a291465bf9cdcc62937824f770ba60 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 3 Feb 2026 21:26:28 +0100 Subject: [PATCH 31/50] redis --- docs/getting-started/env-configuration.mdx | 8 +++- docs/tutorials/integrations/redis.md | 54 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 4a1b5f996..5237c1980 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -5804,7 +5804,7 @@ If you're running Open WebUI as a single instance with `UVICORN_WORKERS=1` (the - Type: `bool` - Default: `False` -- Description: Connect to a Redis Cluster instead of a single instance or using Redis Sentinels. If `True`, `REDIS_URL` must also be defined. +- Description: Connect to a Redis Cluster instead of a single instance or using Redis Sentinels. If `True`, `REDIS_URL` must also be defined. This mode is compatible with AWS Elasticache Serverless and other Redis Cluster implementations. :::info @@ -5812,6 +5812,12 @@ This option has no effect if `REDIS_SENTINEL_HOSTS` is defined. ::: +:::tip OpenTelemetry Support + +Redis Cluster mode is fully compatible with OpenTelemetry instrumentation. When `ENABLE_OTEL` is enabled, Redis operations are properly traced regardless of whether you're using a single Redis instance or Redis Cluster mode. + +::: + #### `REDIS_KEY_PREFIX` - Type: `str` diff --git a/docs/tutorials/integrations/redis.md b/docs/tutorials/integrations/redis.md index 47d49577f..9db6a0b26 100644 --- a/docs/tutorials/integrations/redis.md +++ b/docs/tutorials/integrations/redis.md @@ -222,6 +222,41 @@ To enhance resilience during Sentinel failover—the window when a new master is - **`REDIS_SENTINEL_MAX_RETRY_COUNT`**: Sets the maximum number of retries for Redis operations when using Sentinel (Default: `2`). - **`REDIS_RECONNECT_DELAY`**: Adds an optional delay in **milliseconds** between retry attempts (e.g., `REDIS_RECONNECT_DELAY=500`). This prevents tight retry loops that may otherwise overwhelm the event loop or block the application before a new master is ready. +### Redis Cluster Mode + +For deployments using Redis Cluster (including managed services like **AWS Elasticache Serverless**), enable cluster mode with the following configuration: + +```bash +REDIS_URL="redis://your-cluster-endpoint:6379/0" +REDIS_CLUSTER="true" +``` + +:::info + +**Key Configuration Notes** + +- `REDIS_CLUSTER` enables cluster-aware connection handling +- The `REDIS_URL` should point to your cluster's configuration endpoint +- This option has no effect if `REDIS_SENTINEL_HOSTS` is defined (Sentinel takes precedence) +- When using cluster mode, the `REDIS_KEY_PREFIX` is automatically formatted as `{prefix}:` to ensure multi-key operations target the same hash slot + +::: + +#### AWS Elasticache Serverless + +For AWS Elasticache Serverless deployments, use the following configuration: + +```bash +REDIS_URL="rediss://your-elasticache-endpoint.serverless.use1.cache.amazonaws.com:6379/0" +REDIS_CLUSTER="true" +``` + +Note the `rediss://` scheme (with double 's') which enables TLS, required for Elasticache Serverless. + +#### OpenTelemetry Support + +Redis Cluster mode is fully compatible with OpenTelemetry instrumentation. When `ENABLE_OTEL` is enabled, Redis operations are properly traced regardless of whether you're using a single Redis instance, Redis Sentinel, or Redis Cluster mode. + ### Complete Example Configuration Here's a complete example showing all Redis-related environment variables: @@ -245,6 +280,25 @@ REDIS_KEY_PREFIX="open-webui" For Redis Sentinel deployments specifically, ensure `REDIS_SOCKET_CONNECT_TIMEOUT` is set to prevent application hangs during master failover. +#### Redis Cluster Mode Example + +For Redis Cluster deployments (including AWS Elasticache Serverless): + +```bash +# Required for Redis Cluster +REDIS_URL="rediss://your-cluster-endpoint:6379/0" +REDIS_CLUSTER="true" + +# Required for websocket support +ENABLE_WEBSOCKET_SUPPORT="true" +WEBSOCKET_MANAGER="redis" +WEBSOCKET_REDIS_URL="rediss://your-cluster-endpoint:6379/0" +WEBSOCKET_REDIS_CLUSTER="true" + +# Optional +REDIS_KEY_PREFIX="open-webui" +``` + ### Docker Run Example When running Open WebUI using Docker, connect it to the same Docker network and include all necessary Redis variables: From 7a3a25e23e093c17901794b55fe24bf329a07d88 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:53:44 +0100 Subject: [PATCH 32/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 5237c1980..d1be55e27 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -4048,9 +4048,21 @@ Strictly return in JSON format: - Type: `str` - Default: `512x512` -- Description: Sets the default output dimensions for generated images in WIDTHxHEIGHT format (e.g., `1024x1024`). +- Description: Sets the default output dimensions for generated images in WIDTHxHEIGHT format (e.g., `1024x1024`). Set to `auto` to let the model determine the appropriate size (only supported by models matching `IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN`). - Persistence: This environment variable is a `PersistentConfig` variable. +#### `IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN` + +- Type: `str` +- Default: `^gpt-image` +- Description: A regex pattern to match model names that support `IMAGE_SIZE = "auto"`. When a model matches this pattern, the `auto` size option becomes available, allowing the model to determine the appropriate output dimensions. By default, only models starting with `gpt-image` (e.g., `gpt-image-1`) are matched. + +#### `IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN` + +- Type: `str` +- Default: `^gpt-image` +- Description: A regex pattern to match model names that return image URLs directly instead of base64-encoded data. Models matching this pattern will not include `response_format: b64_json` in API requests. By default, only models starting with `gpt-image` are matched. For other models, Open WebUI requests base64 responses and handles the conversion internally. + #### `IMAGE_STEPS` - Type: `int` From 8709187535a01a0471927ef15dcadcdd3ff8eefb Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:18:32 +0100 Subject: [PATCH 33/50] filters --- .../plugin/development/reserved-args.mdx | 21 ++ docs/features/plugin/functions/filter.mdx | 206 ++++++++++++++++-- docs/getting-started/api-endpoints.md | 75 +++++++ 3 files changed, 289 insertions(+), 13 deletions(-) diff --git a/docs/features/plugin/development/reserved-args.mdx b/docs/features/plugin/development/reserved-args.mdx index 8b36d2f63..133381ed7 100644 --- a/docs/features/plugin/development/reserved-args.mdx +++ b/docs/features/plugin/development/reserved-args.mdx @@ -132,6 +132,27 @@ A `dict` with wide ranging information about the chat, model, files, etc. +:::tip Detecting Request Source + +The `interface` field indicates where the request originated: +- **`"open-webui"`** - Request came from the web interface +- **Other/missing** - Request likely came from a direct API call + +For direct API calls, some fields like `chat_id`, `message_id`, and `session_id` may be absent or `null` if not explicitly provided by the API client. You can use this to distinguish between WebUI and API requests in your filters: + +```python +def inlet(self, body: dict, __metadata__: dict = None) -> dict: + if __metadata__ and __metadata__.get("interface") == "open-webui": + # Request from WebUI + pass + else: + # Direct API request + pass + return body +``` + +::: + ### `__model__` A `dict` with information about the model. diff --git a/docs/features/plugin/functions/filter.mdx b/docs/features/plugin/functions/filter.mdx index aa365f3ec..c1815e882 100644 --- a/docs/features/plugin/functions/filter.mdx +++ b/docs/features/plugin/functions/filter.mdx @@ -243,10 +243,15 @@ Understanding the difference between these two types is key to using the filter - Do **not** show up in the chat integrations menu (⚙️ icon) **Use Cases:** -- Content moderation (always filter inappropriate content) -- PII scrubbing (always remove sensitive data) -- System-level transformations (always apply certain formatting) -- Security/compliance filters +- **Content moderation** - Filter profanity, hate speech, or inappropriate content +- **PII scrubbing** - Automatically redact emails, phone numbers, SSNs, credit card numbers +- **Prompt injection detection** - Block attempts to manipulate the system prompt +- **Input/output logging** - Track all conversations for audit or analytics +- **Cost tracking** - Estimate and log token usage for billing +- **Rate limiting** - Enforce request limits per user or globally +- **Language enforcement** - Ensure responses are in a specific language +- **Company policy enforcement** - Inject legal disclaimers or compliance notices +- **Model routing** - Redirect requests to different models based on content **Example:** ```python @@ -271,12 +276,16 @@ class ContentModerationFilter: - `defaultFilterIds` controls their initial state (ON or OFF) **Use Cases:** -- Web search integration (user decides when to search) -- Citation mode (user controls when to require sources) -- Verbose output mode (user toggles detailed responses) -- Translation filters (user enables when needed) -- Code formatting (user chooses when to apply) -- Thinking/reasoning toggle (user controls whether to show model reasoning) +- **Web search integration** - User decides when to search the web for context +- **Citation mode** - User controls when to require sources in responses +- **Verbose/detailed mode** - User toggles between concise and detailed responses +- **Translation filters** - User enables translation to/from specific languages +- **Code formatting** - User chooses when to apply syntax highlighting or linting +- **Thinking/reasoning toggle** - Show or hide model's chain-of-thought reasoning +- **Markdown rendering** - Toggle between raw text and formatted output +- **Anonymization mode** - User enables when discussing sensitive topics +- **Expert mode** - Inject domain-specific context (legal, medical, technical) +- **Creative writing mode** - Adjust temperature and style for creative tasks **Example:** ```python @@ -342,6 +351,149 @@ Here's the complete flow from admin configuration to filter execution: --- +### 📡 Filter Behavior with API Requests + +When using Open WebUI's API endpoints directly (e.g., via `curl` or external applications), filters behave differently than when the request comes from the web interface. Understanding these differences is crucial for building effective filters. + +#### Key Behavioral Differences + +| Function | WebUI Request | Direct API Request | +|----------|--------------|-------------------| +| `inlet()` | ✅ Always called | ✅ Always called | +| `stream()` | ✅ Called during streaming | ✅ Called during streaming | +| `outlet()` | ✅ Called after response | ❌ **NOT called** by default | +| `__event_emitter__` | ✅ Shows UI feedback | ⚠️ Runs but no UI to display | + +:::warning Outlet Not Called for API Requests +The `outlet()` function is **only triggered for WebUI chat requests**, not for direct API calls to `/api/chat/completions`. This is because `outlet()` is invoked by the WebUI's `/api/chat/completed` endpoint after the chat is finished. + +If you need `outlet()` processing for API requests, your API client must call `/api/chat/completed` after receiving the full response. +::: + +#### Triggering Outlet for API Requests + +To invoke `outlet()` filters for API requests, your client must make a second request to `/api/chat/completed` after receiving the complete response: + +```bash +# After receiving the full response from /api/chat/completions, call: +curl -X POST http://localhost:3000/api/chat/completed \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "llama3.1", + "messages": [ + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": "Hi there! How can I help you?"} + ], + "chat_id": "optional-chat-id", + "session_id": "optional-session-id" + }' +``` + +:::tip +Include the full conversation in `messages`, including the assistant's response. The `chat_id` and `session_id` are optional but recommended for proper logging and state tracking. +::: + +#### Detecting API vs WebUI Requests + +You can detect whether a request originates from the WebUI or a direct API call by checking the `__metadata__` argument: + +```python +def inlet(self, body: dict, __metadata__: dict = None) -> dict: + # Check if request is from WebUI + interface = __metadata__.get("interface") if __metadata__ else None + + if interface == "open-webui": + print("Request from WebUI") + else: + print("Direct API request") + + # You can also check for presence of chat context + chat_id = __metadata__.get("chat_id") if __metadata__ else None + if not chat_id: + print("No chat context - likely a direct API call") + + return body +``` + +#### Example: Rate Limiting for All Requests + +Since `inlet()` is always called, use it for rate limiting that applies to both WebUI and API requests: + +```python +from pydantic import BaseModel, Field +from typing import Optional +import time + +class Filter: + class Valves(BaseModel): + requests_per_minute: int = Field(default=60, description="Max requests per minute per user") + + def __init__(self): + self.valves = self.Valves() + self.user_requests = {} # Track requests per user + + def inlet(self, body: dict, __user__: dict = None) -> dict: + if not __user__: + return body + + user_id = __user__.get("id") + current_time = time.time() + + # Clean old entries and count recent requests + if user_id not in self.user_requests: + self.user_requests[user_id] = [] + + # Keep only requests from the last minute + self.user_requests[user_id] = [ + t for t in self.user_requests[user_id] + if current_time - t < 60 + ] + + if len(self.user_requests[user_id]) >= self.valves.requests_per_minute: + raise Exception(f"Rate limit exceeded: {self.valves.requests_per_minute} requests/minute") + + self.user_requests[user_id].append(current_time) + return body +``` + +#### Example: Logging All API Usage + +Track token usage and requests for both WebUI and direct API calls: + +```python +from pydantic import BaseModel, Field +from typing import Optional +import logging + +class Filter: + class Valves(BaseModel): + log_level: str = Field(default="INFO", description="Logging level") + + def __init__(self): + self.valves = self.Valves() + self.logger = logging.getLogger("api_usage") + + def inlet(self, body: dict, __user__: dict = None, __metadata__: dict = None) -> dict: + user_email = __user__.get("email", "unknown") if __user__ else "anonymous" + model = body.get("model", "unknown") + interface = __metadata__.get("interface", "api") if __metadata__ else "api" + chat_id = __metadata__.get("chat_id") if __metadata__ else None + + self.logger.info( + f"Request: user={user_email}, model={model}, " + f"interface={interface}, chat_id={chat_id or 'none'}" + ) + + return body +``` + +:::note Event Emitter Behavior +Filters that use `__event_emitter__` will still execute for API requests, but since there's no WebUI to display the events, the status messages won't be visible. The filter logic still runs—only the visual feedback is missing. +::: + +--- + ### ⚡ Filter Priority & Execution Order When multiple filters are active, they execute in a specific order determined by their **priority** value. Understanding this is crucial when building filter chains where one filter depends on another's changes. @@ -612,6 +764,18 @@ Modify and return the `body`. The modified version of the `body` is what the LLM 4. **Streamlining User Input**: If your model’s output improves with additional guidance, you can use the `inlet` to inject clarifying instructions automatically! +5. **Rate Limiting**: Track requests per user and reject requests that exceed your quota (works for both WebUI and API requests). + +6. **Request Logging**: Log all incoming requests for analytics, debugging, or billing purposes. + +7. **Language Detection**: Detect the user's language and inject translation instructions or route to a language-specific model. + +8. **Prompt Injection Detection**: Scan user input for attempts to manipulate the system prompt and block malicious requests. + +9. **Cost Estimation**: Estimate input tokens before sending to the model for budget tracking. + +10. **A/B Testing**: Route users to different model configurations based on user ID or random selection. + ##### 💡 Example Use Cases: Build on Food Prep ###### 🥗 Example 1: Adding System Context @@ -669,9 +833,12 @@ The **`stream` function** is a new feature introduced in Open WebUI **0.5.17** t Unlike `outlet`, which processes an entire completed response, `stream` operates on **individual chunks** as they are received from the model. ##### 🛠️ When to Use the Stream Hook? -- Modify **streaming responses** before they are displayed to users. -- Implement **real-time censorship or cleanup**. -- **Monitor streamed data** for logging/debugging. +- **Real-time content filtering** - Censor profanity or sensitive content as it streams +- **Live word replacement** - Replace brand names, competitor mentions, or outdated terms +- **Streaming analytics** - Count tokens and track response length in real-time +- **Progress indicators** - Detect specific patterns to show loading states +- **Debugging** - Log each chunk for troubleshooting streaming issues +- **Format correction** - Fix common formatting issues as they appear ##### 📜 Example: Logging Streaming Chunks @@ -719,6 +886,19 @@ The `outlet` function is like a **proofreader**: tidy up the AI's response (or m - Prefer logging over direct edits in the outlet (e.g., for debugging or analytics). - If heavy modifications are needed (like formatting outputs), consider using the **pipe function** instead. +##### 🛠️ Use Cases for `outlet`: +- **Response logging** - Track all model outputs for analytics or compliance +- **Token usage tracking** - Count output tokens after completion for billing +- **Langfuse/observability integration** - Send traces to monitoring platforms +- **Citation formatting** - Reformat reference links in the final output +- **Disclaimer injection** - Append legal notices or AI disclosure statements +- **Response caching** - Store responses for future retrieval +- **Quality scoring** - Run automated quality checks on model outputs + +:::warning Outlet and API Requests +Remember: `outlet()` is **not called** for direct API requests to `/api/chat/completions`. If you need outlet processing for API calls, see the [Filter Behavior with API Requests](#-filter-behavior-with-api-requests) section above. +::: + 💡 **Example Use Case**: Strip out sensitive API responses you don't want the user to see: ```python def outlet(self, body: dict, __user__: Optional[dict] = None) -> dict: diff --git a/docs/getting-started/api-endpoints.md b/docs/getting-started/api-endpoints.md index 189bd61b4..7ec3f89b5 100644 --- a/docs/getting-started/api-endpoints.md +++ b/docs/getting-started/api-endpoints.md @@ -81,6 +81,81 @@ Access detailed API documentation for different services provided by Open WebUI: return response.json() ``` +### 🔧 Filter and Function Behavior with API Requests + +When using the API endpoints directly, filters (Functions) behave differently than when requests come from the web interface. + +:::info Authentication Note +Open WebUI accepts both **API keys** (prefixed with `sk-`) and **JWT tokens** for API authentication. This is intentional—the web interface uses JWT tokens internally for the same API endpoints. Both authentication methods provide equivalent API access. +::: + +#### Filter Execution + +| Filter Function | WebUI Request | Direct API Request | +|----------------|--------------|-------------------| +| `inlet()` | ✅ Runs | ✅ Runs | +| `stream()` | ✅ Runs | ✅ Runs | +| `outlet()` | ✅ Runs | ❌ **Does NOT run** | + +The `inlet()` function always executes, making it ideal for: +- **Rate limiting** - Track and limit requests per user +- **Request logging** - Log all API usage for monitoring +- **Input validation** - Reject invalid requests before they reach the model + +#### Triggering Outlet Processing + +The `outlet()` function only runs when the WebUI calls `/api/chat/completed` after a chat finishes. For direct API requests, you must call this endpoint yourself if you need outlet processing: + +- **Endpoint**: `POST /api/chat/completed` +- **Description**: Triggers outlet filter processing for a completed chat + +- **Curl Example**: + + ```bash + curl -X POST http://localhost:3000/api/chat/completed \ + -H "Authorization: Bearer YOUR_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "llama3.1", + "messages": [ + {"role": "user", "content": "Hello"}, + {"role": "assistant", "content": "Hi! How can I help you today?"} + ], + "chat_id": "optional-uuid", + "session_id": "optional-session-id" + }' + ``` + +- **Python Example**: + + ```python + import requests + + def complete_chat_with_outlet(token, model, messages, chat_id=None): + """ + Call after receiving the full response from /api/chat/completions + to trigger outlet filter processing. + """ + url = 'http://localhost:3000/api/chat/completed' + headers = { + 'Authorization': f'Bearer {token}', + 'Content-Type': 'application/json' + } + payload = { + 'model': model, + 'messages': messages # Include the full conversation with assistant response + } + if chat_id: + payload['chat_id'] = chat_id + + response = requests.post(url, headers=headers, json=payload) + return response.json() + ``` + +:::tip +For more details on writing filters that work with API requests, see the [Filter Function documentation](/features/plugin/functions/filter#-filter-behavior-with-api-requests). +::: + ### 🦙 Ollama API Proxy Support If you want to interact directly with Ollama models—including for embedding generation or raw prompt streaming—Open WebUI offers a transparent passthrough to the native Ollama API via a proxy route. From 3cebd1c6e125dcf41df09bc63a43b4fdad8f0865 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:25:57 +0100 Subject: [PATCH 34/50] access control knowledge bases --- docs/features/rag/index.md | 4 +++ docs/features/rbac/groups.md | 4 +++ docs/features/workspace/knowledge.md | 37 ++++++++++++++++++++++++++++ docs/features/workspace/models.md | 2 +- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/features/rag/index.md b/docs/features/rag/index.md index 47b53e542..ab43f1386 100644 --- a/docs/features/rag/index.md +++ b/docs/features/rag/index.md @@ -168,6 +168,10 @@ The **File Context** capability controls whether Open WebUI performs RAG (Retrie When File Context is disabled, file content is **not automatically extracted or injected**. Open WebUI does not forward files to the model's native API. If you disable this, the only way the model can access file content is through builtin tools (if enabled) that query knowledge bases or retrieve attached files on-demand (agentic file processing). ::: +:::tip Per-File Retrieval Mode +Individual files and knowledge bases can also be set to bypass RAG entirely using the **"Using Entire Document"** toggle. This injects the full file content into every message regardless of native function calling settings. See [Full Context vs Focused Retrieval](/features/workspace/knowledge#full-context-vs-focused-retrieval) for details. +::: + :::info The File Context toggle only appears when **File Upload** is enabled for the model. ::: diff --git a/docs/features/rbac/groups.md b/docs/features/rbac/groups.md index 7b9d70c4a..01d4fd9d9 100644 --- a/docs/features/rbac/groups.md +++ b/docs/features/rbac/groups.md @@ -69,6 +69,10 @@ You can restrict access to specific objects (like a proprietary Model or sensiti 1. **Tag the Resource**: When creating/editing a Model or Knowledge Base, set its visibility to **Private** or **Restricted**. 2. **Grant Access**: Select the specific **Groups** (or individual users) that should have "Read" or "Write" access. +:::tip Knowledge Scoping for Models +Beyond visibility, knowledge access is also scoped by model configuration. When a model has **attached knowledge bases**, it can only access those specific KBs (not all user-accessible KBs). See [Knowledge Scoping with Native Function Calling](/features/workspace/knowledge#knowledge-scoping-with-native-function-calling) for details. +::: + ### Access Control Object At a deeper level, resources store an access control list (ACL) looking like this: diff --git a/docs/features/workspace/knowledge.md b/docs/features/workspace/knowledge.md index 8b3eac22f..8ef16e41c 100644 --- a/docs/features/workspace/knowledge.md +++ b/docs/features/workspace/knowledge.md @@ -56,6 +56,43 @@ Autonomous knowledge base exploration works best with frontier models (GPT-5, Cl These tools enable models to autonomously explore and retrieve information from your knowledge bases, making conversations more contextually aware and grounded in your stored documents. +#### Knowledge Scoping with Native Function Calling + +When native function calling is enabled, the model's access to knowledge bases depends on whether you've attached specific knowledge to the model: + +| Model Configuration | Knowledge Access | +|-------------------|------------------| +| **No KB attached** | Model can access **all** knowledge bases the user has access to (public KBs, user's own KBs) | +| **KB attached to model** | Model is **limited** to only the attached knowledge base(s) | + +:::tip Restricting Knowledge Access +If you want a model to focus on specific documents, attach those knowledge bases to the model in **Workspace > Models > Edit**. This prevents the model from searching other available knowledge bases. +::: + +### Full Context vs Focused Retrieval + +When attaching files, notes, or knowledge bases to a model, you can choose between two retrieval modes by clicking on the attached item: + +#### 🔍 Focused Retrieval (Default) + +- Uses **RAG (Retrieval Augmented Generation)** to find relevant chunks +- Only injects the most relevant portions of documents based on the user's query +- Best for large documents or knowledge bases where only specific sections are relevant +- With native function calling enabled, the model decides when to search + +#### 📄 Using Entire Document (Full Context) + +- Injects the **complete content** of the file/note into every message +- Bypasses RAG entirely—no chunking or semantic search +- Best for short reference documents, style guides, or context that's always relevant +- **Always injected** regardless of native function calling settings + +:::info Full Context with Native Function Calling +When "Using Entire Document" is enabled for a file or knowledge base, its content is **always injected** into the conversation, even when native function calling is enabled. The model does not need to call any tools to access this content—it's automatically included in the context. + +Files set to Focused Retrieval (the default) will only be accessed when the model calls the appropriate knowledge tools. +::: + :::note Per-Model Control The Knowledge Base tools require the **Knowledge Base** category to be enabled for the model in **Workspace > Models > Edit > Builtin Tools** (enabled by default). Administrators can disable this category per-model to prevent autonomous knowledge base access. ::: diff --git a/docs/features/workspace/models.md b/docs/features/workspace/models.md index b581a693e..7b1c7da6c 100644 --- a/docs/features/workspace/models.md +++ b/docs/features/workspace/models.md @@ -72,7 +72,7 @@ Clicking **Show** on **Advanced Params** allows you to fine-tune the inference g You can transform a generic model into a specialized agent by toggling specific capabilities and binding resources. -- **Knowledge**: Instead of manually selecting documents for every chat, you can bind a specific knowledgebase **Collection** or **File** to this model. Whenever this model is selected, RAG (Retrieval Augmented Generation) is automatically active for those specific files. +- **Knowledge**: Instead of manually selecting documents for every chat, you can bind a specific knowledgebase **Collection** or **File** to this model. Whenever this model is selected, RAG (Retrieval Augmented Generation) is automatically active for those specific files. Click on attached items to toggle between **Focused Retrieval** (RAG chunks) and **Using Entire Document** (full content injection). See [Full Context vs Focused Retrieval](/features/workspace/knowledge#full-context-vs-focused-retrieval) for details. - **Tools**: Force specific tools to be enabled by default (e.g., always enable the **Calculator** tool for a "Math Bot"). - **Filters**: Attach specific Pipelines/Filters (e.g., a Profanity Filter or PII Redaction script) to run exclusively on this model. - **Actions**: Attach actionable scripts like `Add to Memories` or `Button` triggers. From a6512e6c861f342ac9bcd8a8625ad7022e47e6b8 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:29:20 +0100 Subject: [PATCH 35/50] follow up --- .../chat-features/follow-up-prompts.md | 47 +++++++++++++++++++ docs/features/chat-features/index.mdx | 2 + 2 files changed, 49 insertions(+) create mode 100644 docs/features/chat-features/follow-up-prompts.md diff --git a/docs/features/chat-features/follow-up-prompts.md b/docs/features/chat-features/follow-up-prompts.md new file mode 100644 index 000000000..11e2b810a --- /dev/null +++ b/docs/features/chat-features/follow-up-prompts.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 9 +title: "Follow-Up Prompts" +--- + +# Follow-Up Prompts + +Open WebUI can automatically generate follow-up question suggestions after each model response. These suggestions appear as clickable chips below the response, helping you explore topics further without typing new prompts. + +## Settings + +Configure follow-up prompt behavior in **Settings > Interface** under the **Chat** section: + +### Follow-Up Auto-Generation + +**Default: On** + +Automatically generates follow-up question suggestions after each response. These suggestions are generated by the [task model](/getting-started/admin-panel#task-model) based on the conversation context. + +- **On**: Follow-up prompts are generated after each model response +- **Off**: No follow-up suggestions are generated + +### Keep Follow-Up Prompts in Chat + +**Default: Off** + +By default, follow-up prompts only appear for the most recent message and disappear when you continue the conversation. + +- **On**: Follow-up prompts are preserved and remain visible for all messages in the chat history +- **Off**: Only the last message shows follow-up prompts + +:::tip Perfect for Knowledge Exploration +Enable this setting when exploring a knowledge base. You can see all the suggested follow-ups from previous responses, making it easy to revisit and explore alternative paths through the information. +::: + +### Insert Follow-Up Prompt to Input + +**Default: Off** + +Controls what happens when you click a follow-up prompt. + +- **On**: Clicking a follow-up inserts the text into the input field, allowing you to edit it before sending +- **Off**: Clicking a follow-up immediately sends it as your next message + +## Regenerating Follow-Ups + +If you want to regenerate follow-up suggestions for a specific response, you can use the [Regenerate Followups](https://openwebui.com/f/silentoplayz/regenerate_followups) action button from the community. diff --git a/docs/features/chat-features/index.mdx b/docs/features/chat-features/index.mdx index 93f191b8b..9ac8814f5 100644 --- a/docs/features/chat-features/index.mdx +++ b/docs/features/chat-features/index.mdx @@ -24,3 +24,5 @@ Open WebUI provides a comprehensive set of chat features designed to enhance you - **[🕒 Temporal Awareness](./temporal-awareness.mdx)**: How models understand time and date, including native tools for precise time calculations. - **[🧠 Reasoning & Thinking Models](./reasoning-models.mdx)**: Specialized support for models that generate internal chains of thought using thinking tags. + +- **[💬 Follow-Up Prompts](./follow-up-prompts.md)**: Automatic generation of suggested follow-up questions after model responses. From 6ecf9275e40121cc82dc9aa47ef3e106791c7923 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:41:45 +0100 Subject: [PATCH 36/50] nginx --- docs/troubleshooting/performance.md | 40 +++++ docs/tutorials/https/nginx.md | 145 ++++++++++++++++++ docs/tutorials/tab-nginx/LetsEncrypt.md | 7 +- docs/tutorials/tab-nginx/NginxProxyManager.md | 14 ++ docs/tutorials/tab-nginx/SelfSigned.md | 6 +- docs/tutorials/tab-nginx/Windows.md | 6 +- 6 files changed, 215 insertions(+), 3 deletions(-) diff --git a/docs/troubleshooting/performance.md b/docs/troubleshooting/performance.md index e20ba1349..678eb956d 100644 --- a/docs/troubleshooting/performance.md +++ b/docs/troubleshooting/performance.md @@ -176,8 +176,48 @@ Defines the number of worker threads available for handling requests. - **Env Var**: `THREAD_POOL_SIZE=2000` +#### AIOHTTP Client Timeouts +Long LLM completions can exceed default HTTP client timeouts. Configure these to prevent requests being cut off mid-response: + +- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT=1800` (30 minutes for completions) +- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST=15` (shorter for model listing) +- **Env Var**: `AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST=15` + +#### Container Resource Limits +For Docker deployments, ensure adequate resource allocation: + +```yaml +deploy: + resources: + limits: + memory: 8G # Adjust based on usage + cpus: '4.0' + reservations: + memory: 4G + cpus: '2.0' + +# Increase file descriptor limits +ulimits: + nofile: + soft: 65536 + hard: 65536 +``` + +**Diagnosis commands:** +```bash +# Check container resource usage +docker stats openwebui --no-stream + +# Check connection states +docker exec openwebui netstat -an | grep -E "ESTABLISHED|TIME_WAIT|CLOSE_WAIT" | sort | uniq -c + +# Check open file descriptors +docker exec openwebui ls -la /proc/1/fd | wc -l +``` + --- + ## ☁️ Cloud Infrastructure Latency When deploying Open WebUI in cloud Kubernetes environments (AKS, EKS, GKE), you may notice significant performance degradation compared to local Kubernetes (Rancher Desktop, kind, Minikube) or bare-metal deployments—even with identical resource allocations. This is almost always caused by **latency** in the underlying infrastructure. diff --git a/docs/tutorials/https/nginx.md b/docs/tutorials/https/nginx.md index dafa1c95d..88dd3b120 100644 --- a/docs/tutorials/https/nginx.md +++ b/docs/tutorials/https/nginx.md @@ -89,6 +89,151 @@ import Windows from '../tab-nginx/Windows.md'; +## Complete Optimized NGINX Configuration + +This section provides a production-ready NGINX configuration optimized for Open WebUI streaming, WebSocket connections, and high-concurrency deployments. + +### Upstream Configuration + +Define an upstream with keepalive connections to reduce connection setup overhead: + +```nginx +upstream openwebui { + server 127.0.0.1:3000; + keepalive 128; # Persistent connections + keepalive_timeout 1800s; # 30 minutes + keepalive_requests 10000; +} +``` + +### Timeout Configuration + +Long-running LLM completions require extended timeouts: + +```nginx +location /api/ { + proxy_connect_timeout 1800; # 30 minutes + proxy_send_timeout 1800; + proxy_read_timeout 1800; +} + +# WebSocket connections need even longer timeouts +location ~ ^/(ws/|socket\.io/) { + proxy_connect_timeout 86400; # 24 hours + proxy_send_timeout 86400; + proxy_read_timeout 86400; +} +``` + +### Header and Body Size Limits + +Prevent errors with large requests or OAuth tokens: + +```nginx +# In http {} or server {} block +client_max_body_size 100M; # Large file uploads +proxy_buffer_size 128k; # Large headers (OAuth tokens) +proxy_buffers 4 256k; +proxy_busy_buffers_size 256k; +large_client_header_buffers 4 32k; +``` + +### Common Streaming Mistakes + +| Setting | Impact on Streaming | +|---------|---------------------| +| `gzip on` with `application/json` | 🔴 Buffers for compression | +| `proxy_buffering on` | 🔴 Buffers entire response | +| `tcp_nopush on` | 🔴 Waits for full packets | +| `chunked_transfer_encoding on` | 🟡 Can break SSE | +| `proxy_cache` enabled on `/api/` | 🟡 Adds overhead | + +### Full Example Configuration + +```nginx +upstream openwebui { + server 127.0.0.1:3000; + keepalive 128; + keepalive_timeout 1800s; + keepalive_requests 10000; +} + +server { + listen 443 ssl http2; + server_name your-domain.com; + + # SSL configuration... + + # Compression - EXCLUDE streaming content types + gzip on; + gzip_types text/plain text/css application/javascript image/svg+xml; + # DO NOT include: application/json, text/event-stream + + # API endpoints - streaming optimized + location /api/ { + proxy_pass http://openwebui; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # CRITICAL: Disable all buffering for streaming + gzip off; + proxy_buffering off; + proxy_request_buffering off; + proxy_cache off; + tcp_nodelay on; + add_header X-Accel-Buffering "no" always; + add_header Cache-Control "no-store" always; + + # Extended timeouts for LLM completions + proxy_connect_timeout 1800; + proxy_send_timeout 1800; + proxy_read_timeout 1800; + } + + # WebSocket endpoints + location ~ ^/(ws/|socket\.io/) { + proxy_pass http://openwebui; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + gzip off; + proxy_buffering off; + proxy_cache off; + + # 24-hour timeout for persistent connections + proxy_connect_timeout 86400; + proxy_send_timeout 86400; + proxy_read_timeout 86400; + } + + # Static assets - CAN buffer and cache + location /static/ { + proxy_pass http://openwebui; + proxy_buffering on; + proxy_cache_valid 200 7d; + add_header Cache-Control "public, max-age=604800, immutable"; + } + + # Default location + location / { + proxy_pass http://openwebui; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} +``` + +--- + ## Caching Configuration Proper caching significantly improves Open WebUI performance by reducing backend load and speeding up page loads. This section provides guidance for advanced users who want to implement server-side and client-side caching. diff --git a/docs/tutorials/tab-nginx/LetsEncrypt.md b/docs/tutorials/tab-nginx/LetsEncrypt.md index 2e17a4eb3..21e3b7ce0 100644 --- a/docs/tutorials/tab-nginx/LetsEncrypt.md +++ b/docs/tutorials/tab-nginx/LetsEncrypt.md @@ -270,7 +270,12 @@ With the certificate saved in your `ssl` directory, you can now update the Nginx proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_read_timeout 10m; + + # Extended timeout for long LLM completions (30 minutes) + proxy_read_timeout 1800; + proxy_send_timeout 1800; + proxy_connect_timeout 1800; + proxy_buffering off; proxy_cache off; client_max_body_size 20M; diff --git a/docs/tutorials/tab-nginx/NginxProxyManager.md b/docs/tutorials/tab-nginx/NginxProxyManager.md index 1f8c0cf1a..93859dd5d 100644 --- a/docs/tutorials/tab-nginx/NginxProxyManager.md +++ b/docs/tutorials/tab-nginx/NginxProxyManager.md @@ -94,6 +94,20 @@ Without this, Nginx re-chunks SSE streams, breaking markdown formatting (visible ::: +:::tip Extended Timeouts for Long Completions + +Long LLM completions (30+ minutes for complex tasks) may exceed the default 60-second timeout. Add these directives in the **Advanced** tab → **Custom Nginx Configuration**: + +```nginx +proxy_read_timeout 1800; +proxy_send_timeout 1800; +proxy_connect_timeout 1800; +``` + +This sets a 30-minute timeout. Adjust as needed for your use case. + +::: + :::tip Caching Best Practice While Nginx Proxy Manager handles most configuration automatically, be aware that: diff --git a/docs/tutorials/tab-nginx/SelfSigned.md b/docs/tutorials/tab-nginx/SelfSigned.md index aa024d579..369bd24a4 100644 --- a/docs/tutorials/tab-nginx/SelfSigned.md +++ b/docs/tutorials/tab-nginx/SelfSigned.md @@ -83,7 +83,11 @@ Using self-signed certificates is suitable for development or internal use where proxy_cache off; client_max_body_size 20M; - proxy_read_timeout 10m; + + # Extended timeout for long LLM completions (30 minutes) + proxy_read_timeout 1800; + proxy_send_timeout 1800; + proxy_connect_timeout 1800; add_header Cache-Control "public, max-age=300, must-revalidate"; } diff --git a/docs/tutorials/tab-nginx/Windows.md b/docs/tutorials/tab-nginx/Windows.md index 3675c788a..42a8763f5 100644 --- a/docs/tutorials/tab-nginx/Windows.md +++ b/docs/tutorials/tab-nginx/Windows.md @@ -156,7 +156,11 @@ http { proxy_buffering off; proxy_cache off; client_max_body_size 20M; - proxy_read_timeout 10m; + + # Extended timeout for long LLM completions (30 minutes) + proxy_read_timeout 1800; + proxy_send_timeout 1800; + proxy_connect_timeout 1800; add_header Cache-Control "public, max-age=300, must-revalidate"; } From c3c4edd32a86522a703e9136dfb79a09037dfeef Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:46:55 +0100 Subject: [PATCH 37/50] reranking --- docs/getting-started/env-configuration.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index d1be55e27..3daa7d1a0 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -2907,6 +2907,14 @@ If you are embedding externally via API, ensure your rate limits are high enough ### Reranking +#### `RAG_RERANKING_ENGINE` + +- Type: `str` +- Options: `external`, or empty for local Sentence-Transformer CrossEncoder +- Default: Empty string (local reranking) +- Description: Specifies the reranking engine to use. Set to `external` to use an external reranker API (requires `RAG_EXTERNAL_RERANKER_URL`). Leave empty to use a local Sentence-Transformer CrossEncoder model. +- Persistence: This environment variable is a `PersistentConfig` variable. + #### `RAG_RERANKING_MODEL` - Type: `str` From c593e9fec969e9b6a2e006e19f3de34c812c48ca Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 18:49:20 +0100 Subject: [PATCH 38/50] Update amazon-bedrock.md --- docs/tutorials/integrations/amazon-bedrock.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/tutorials/integrations/amazon-bedrock.md b/docs/tutorials/integrations/amazon-bedrock.md index 9ff014462..c5d3ce48d 100644 --- a/docs/tutorials/integrations/amazon-bedrock.md +++ b/docs/tutorials/integrations/amazon-bedrock.md @@ -73,6 +73,23 @@ docker run -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS You should now be able to access the BAG's swagger page at: http://localhost:8000/docs +:::warning Troubleshooting: Container Exits Immediately + +If the Bedrock Gateway container starts and immediately exits (especially on Windows), check the logs with `docker logs `. If you see Python/Uvicorn errors, this is likely a **Python 3.13 compatibility issue** with the BAG's Dockerfile. + +**Workaround:** Edit the `Dockerfile` before building and change the Python version from 3.13 to 3.12: + +```dockerfile +# Change this line: +FROM python:3.13-slim +# To: +FROM python:3.12-slim +``` + +Then rebuild with `docker build . -f Dockerfile -t bedrock-gateway`. + +::: + ![Bedrock Access Gateway Swagger](/images/tutorials/amazon-bedrock/amazon-bedrock-proxy-api.png) ## Step 3: Add Connection in Open-WebUI From 6a3da9b50c1652124d38cacb872e13a5e49abf8f Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:01:56 +0100 Subject: [PATCH 39/50] knowledge --- .../chat-features/follow-up-prompts.md | 2 +- docs/features/plugin/tools/index.mdx | 77 ++++++++++++------- docs/features/workspace/knowledge.md | 15 ++++ 3 files changed, 64 insertions(+), 30 deletions(-) diff --git a/docs/features/chat-features/follow-up-prompts.md b/docs/features/chat-features/follow-up-prompts.md index 11e2b810a..d2af865fe 100644 --- a/docs/features/chat-features/follow-up-prompts.md +++ b/docs/features/chat-features/follow-up-prompts.md @@ -15,7 +15,7 @@ Configure follow-up prompt behavior in **Settings > Interface** under the **Chat **Default: On** -Automatically generates follow-up question suggestions after each response. These suggestions are generated by the [task model](/getting-started/admin-panel#task-model) based on the conversation context. +Automatically generates follow-up question suggestions after each response. These suggestions are generated by the [task model](/getting-started/env-configuration#task_model) based on the conversation context. - **On**: Follow-up prompts are generated after each model response - **Off**: No follow-up suggestions are generated diff --git a/docs/features/plugin/tools/index.mdx b/docs/features/plugin/tools/index.mdx index 9797f4bb0..0e08e4390 100644 --- a/docs/features/plugin/tools/index.mdx +++ b/docs/features/plugin/tools/index.mdx @@ -210,35 +210,43 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo | `get_current_timestamp` | Get the current UTC Unix timestamp and ISO date. | | `calculate_timestamp` | Calculate relative timestamps (e.g., "3 days ago"). | -#### Tool Parameters Reference - -| Tool | Parameters | -|------|------------| -| `search_web` | `query` (required), `count` (default: 5) | -| `fetch_url` | `url` (required) | -| `list_knowledge_bases` | `count` (default: 10), `skip` (default: 0) | -| `query_knowledge_bases` | `query` (required), `count` (default: 5) | -| `search_knowledge_bases` | `query` (required), `count` (default: 5), `skip` (default: 0) | -| `query_knowledge_files` | `query` (required), `knowledge_ids` (optional), `count` (default: 5) | -| `search_knowledge_files` | `query` (required), `knowledge_id` (optional), `count` (default: 5), `skip` (default: 0) | -| `view_knowledge_file` | `file_id` (required) | -| `generate_image` | `prompt` (required) | -| `edit_image` | `prompt` (required), `image_urls` (required) | -| `search_memories` | `query` (required), `count` (default: 5) | -| `add_memory` | `content` (required) | -| `replace_memory_content` | `memory_id` (required), `content` (required) | -| `search_notes` | `query` (required), `count` (default: 5), `start_timestamp` (optional), `end_timestamp` (optional) | -| `view_note` | `note_id` (required) | -| `write_note` | `title` (required), `content` (required) | -| `replace_note_content` | `note_id` (required), `content` (required), `title` (optional) | -| `search_chats` | `query` (required), `count` (default: 5), `start_timestamp` (optional), `end_timestamp` (optional) | -| `view_chat` | `chat_id` (required) | -| `search_channels` | `query` (required), `count` (default: 5) | -| `search_channel_messages` | `query` (required), `count` (default: 10), `start_timestamp` (optional), `end_timestamp` (optional) | -| `view_channel_message` | `message_id` (required) | -| `view_channel_thread` | `parent_message_id` (required) | -| `get_current_timestamp` | None | -| `calculate_timestamp` | `days_ago` (default: 0), `weeks_ago` (default: 0), `months_ago` (default: 0), `years_ago` (default: 0) | +#### Tool Reference + +| Tool | Parameters | Output | +|------|------------|--------| +| **Search & Web** | | | +| `search_web` | `query` (required), `count` (default: 5) | Array of `{title, link, snippet}` | +| `fetch_url` | `url` (required) | Plain text content (max 50,000 chars) | +| **Knowledge Base** | | | +| `list_knowledge_bases` | `count` (default: 10), `skip` (default: 0) | Array of `{id, name, description, file_count}` | +| `query_knowledge_bases` | `query` (required), `count` (default: 5) | Array of `{id, name, description}` by similarity | +| `search_knowledge_bases` | `query` (required), `count` (default: 5), `skip` (default: 0) | Array of `{id, name, description, file_count}` | +| `query_knowledge_files` | `query` (required), `knowledge_ids` (optional), `count` (default: 5) | Array of `{id, filename, content_snippet, knowledge_id}` | +| `search_knowledge_files` | `query` (required), `knowledge_id` (optional), `count` (default: 5), `skip` (default: 0) | Array of `{id, filename, knowledge_id, knowledge_name}` | +| `view_knowledge_file` | `file_id` (required) | `{id, filename, content}` | +| **Image Gen** | | | +| `generate_image` | `prompt` (required) | `{status, message, images}` — auto-displayed | +| `edit_image` | `prompt` (required), `image_urls` (required) | `{status, message, images}` — auto-displayed | +| **Memory** | | | +| `search_memories` | `query` (required), `count` (default: 5) | Array of `{id, date, content}` | +| `add_memory` | `content` (required) | `{status: "success", id}` | +| `replace_memory_content` | `memory_id` (required), `content` (required) | `{status: "success", id, content}` | +| **Notes** | | | +| `search_notes` | `query` (required), `count` (default: 5), `start_timestamp`, `end_timestamp` | Array of `{id, title, snippet, updated_at}` | +| `view_note` | `note_id` (required) | `{id, title, content, updated_at, created_at}` | +| `write_note` | `title` (required), `content` (required) | `{status: "success", id}` | +| `replace_note_content` | `note_id` (required), `content` (required), `title` (optional) | `{status: "success", id, title}` | +| **Chat History** | | | +| `search_chats` | `query` (required), `count` (default: 5), `start_timestamp`, `end_timestamp` | Array of `{id, title, snippet, updated_at}` | +| `view_chat` | `chat_id` (required) | `{id, title, messages: [{role, content}]}` | +| **Channels** | | | +| `search_channels` | `query` (required), `count` (default: 5) | Array of `{id, name, description}` | +| `search_channel_messages` | `query` (required), `count` (default: 10), `start_timestamp`, `end_timestamp` | Array of `{id, channel_id, content, user_name, created_at}` | +| `view_channel_message` | `message_id` (required) | `{id, content, user_name, created_at, reply_count}` | +| `view_channel_thread` | `parent_message_id` (required) | Array of `{id, content, user_name, created_at}` | +| **Time Tools** | | | +| `get_current_timestamp` | None | `{current_timestamp, current_iso}` | +| `calculate_timestamp` | `days_ago`, `weeks_ago`, `months_ago`, `years_ago` (all default: 0) | `{current_timestamp, current_iso, calculated_timestamp, calculated_iso}` | :::info Automatic Timezone Detection Open WebUI automatically detects and stores your timezone when you log in. This allows time-related tools and features to provide accurate local times without any manual configuration. Your timezone is determined from your browser settings. @@ -253,6 +261,17 @@ The native `query_knowledge_files` tool uses **simple vector search** with a def For the full RAG pipeline with hybrid search and reranking, use the **File Context** capability (attach files via `#` or knowledge base assignment) instead of relying on autonomous tool calls. ::: +:::warning Knowledge is NOT Auto-Injected in Native Mode +**Important:** When using Native Function Calling, attached knowledge is **not automatically injected** into the conversation. The model must actively call knowledge tools to search and retrieve information. + +**If your model isn't using attached knowledge:** +1. **Add instructions to your system prompt** telling the model to discover and query knowledge bases. Example: *"When users ask questions, first use list_knowledge_bases to see what knowledge is available, then use query_knowledge_files to search the relevant knowledge base before answering."* +2. **Or disable Native Function Calling** for that model to restore automatic RAG injection. +3. **Or use "Full Context" mode** for attached knowledge (click on the attachment and select "Use Entire Document") which always injects the full content. + +See [Knowledge Scoping with Native Function Calling](/features/workspace/knowledge#knowledge-scoping-with-native-function-calling) for more details. +::: + **Why use these?** It allows for **Deep Research** (searching the web multiple times, or querying knowledge bases), **Contextual Awareness** (looking up previous chats or notes), **Dynamic Personalization** (saving facts), and **Precise Automation** (generating content based on existing notes or documents). #### Disabling Builtin Tools (Per-Model) diff --git a/docs/features/workspace/knowledge.md b/docs/features/workspace/knowledge.md index 8ef16e41c..787938706 100644 --- a/docs/features/workspace/knowledge.md +++ b/docs/features/workspace/knowledge.md @@ -65,6 +65,21 @@ When native function calling is enabled, the model's access to knowledge bases d | **No KB attached** | Model can access **all** knowledge bases the user has access to (public KBs, user's own KBs) | | **KB attached to model** | Model is **limited** to only the attached knowledge base(s) | +:::warning Knowledge is NOT Auto-Injected with Native Function Calling + +**Important behavioral difference:** When using Native Function Calling, attached knowledge is **not automatically injected** into the conversation. Instead, the model must actively call the knowledge tools to search and retrieve information. + +**If your model isn't using attached knowledge:** + +1. **Add instructions to your system prompt** telling the model to discover and query knowledge bases. For example: + > "When users ask questions, first use list_knowledge_bases to see what knowledge is available, then use query_knowledge_files to search the relevant knowledge base before answering." + +2. **Or disable Native Function Calling** for that model to restore the automatic RAG injection behavior from earlier versions. + +3. **Or use "Full Context" mode** for the attached knowledge (click on the attachment and select "Use Entire Document") which bypasses RAG and always injects the full content. + +::: + :::tip Restricting Knowledge Access If you want a model to focus on specific documents, attach those knowledge bases to the model in **Workspace > Models > Edit**. This prevents the model from searching other available knowledge bases. ::: From 8e7cf943060a06f8efc6b9ebd0158c0cda2e4fd0 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:13:38 +0100 Subject: [PATCH 40/50] Update index.mdx --- docs/features/plugin/tools/index.mdx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/docs/features/plugin/tools/index.mdx b/docs/features/plugin/tools/index.mdx index 0e08e4390..7ad37607f 100644 --- a/docs/features/plugin/tools/index.mdx +++ b/docs/features/plugin/tools/index.mdx @@ -180,11 +180,11 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo | `search_web` | Search the public web for information. Best for current events, external references, or topics not covered in internal documents. | | `fetch_url` | Visits a URL and extracts text content via the Web Loader. | | **Knowledge Base** | *Requires per-model "Knowledge Base" category enabled (default: on).* | -| `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. | -| `query_knowledge_bases` | Search knowledge bases by semantic similarity to query. Finds KBs whose name/description match the meaning of your query. Use this to discover relevant knowledge bases before querying their files. | -| `search_knowledge_bases` | Search knowledge bases by name and description. | -| `query_knowledge_files` | Search knowledge base files using simple vector search. **Note:** Does not use hybrid search or reranking—for full RAG pipeline with reranking, use File Context instead by attaching files via `#` or assigning knowledge bases. | -| `search_knowledge_files` | Search files across accessible knowledge bases by filename. | +| `list_knowledge_bases` | List the user's accessible knowledge bases with file counts. **Use this first** to discover what knowledge is available. | +| `query_knowledge_bases` | Search KB *names and descriptions* by semantic similarity. Use to find which KB is relevant when you don't know which one to query. | +| `search_knowledge_bases` | Search knowledge bases by name/description (text match). | +| `query_knowledge_files` | Search *file contents* inside KBs using vector search. **This is your main tool for finding information.** When a KB is attached to the model, searches are automatically scoped to that KB. | +| `search_knowledge_files` | Search files across accessible knowledge bases by filename (not content). | | `view_knowledge_file` | Get the full content of a file from a knowledge base. | | **Image Gen** | *Requires image generation enabled (per-tool).* | | `generate_image` | Generates a new image based on a prompt. Requires `ENABLE_IMAGE_GENERATION`. | @@ -252,6 +252,15 @@ These models excel at multi-step reasoning, proper JSON formatting, and autonomo Open WebUI automatically detects and stores your timezone when you log in. This allows time-related tools and features to provide accurate local times without any manual configuration. Your timezone is determined from your browser settings. ::: +:::info Recommended KB Tool Workflow +**When an attached KB is returning empty results:** +1. First call `list_knowledge_bases` to confirm the model can see the attached KB +2. Then use `query_knowledge_files` (without specifying `knowledge_ids` — it auto-scopes to attached KBs) +3. If still empty, the files may not be embedded yet, or you may have **Full Context mode enabled** which bypasses the vector store + +**Do NOT use Full Context mode with knowledge tools** — Full Context injects file content directly and doesn't store embeddings, so `query_knowledge_files` will return empty. Use Focused Retrieval (default) for tool-based access. +::: + :::tip Knowledge Base Tools vs RAG Pipeline The native `query_knowledge_files` tool uses **simple vector search** with a default of 5 results. It does **not** use: - Hybrid search (BM25 + vector) From b31ddb85432885c4707c0f19eeb301c04a1a9ba1 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:34:11 +0100 Subject: [PATCH 41/50] Update nginx.md --- docs/tutorials/https/nginx.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/https/nginx.md b/docs/tutorials/https/nginx.md index 88dd3b120..ee0e50831 100644 --- a/docs/tutorials/https/nginx.md +++ b/docs/tutorials/https/nginx.md @@ -144,9 +144,11 @@ large_client_header_buffers 4 32k; |---------|---------------------| | `gzip on` with `application/json` | 🔴 Buffers for compression | | `proxy_buffering on` | 🔴 Buffers entire response | -| `tcp_nopush on` | 🔴 Waits for full packets | +| `proxy_request_buffering on` | Should be turned off | +| `tcp_nodelay on` | 🔴 **Most Critical:** Disables Nagle's algorithm to send packets immediately (prevents 200ms delays) | | `chunked_transfer_encoding on` | 🟡 Can break SSE | | `proxy_cache` enabled on `/api/` | 🟡 Adds overhead | +| `X-Accel-Buffering "yes"` | This header should be set to "no" for extra safety | ### Full Example Configuration From 03b38edfb1959f95b1aba7d988d684bbefaceea7 Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:36:32 +0100 Subject: [PATCH 42/50] Update nginx.md --- docs/tutorials/https/nginx.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorials/https/nginx.md b/docs/tutorials/https/nginx.md index ee0e50831..916c4499a 100644 --- a/docs/tutorials/https/nginx.md +++ b/docs/tutorials/https/nginx.md @@ -149,6 +149,7 @@ large_client_header_buffers 4 32k; | `chunked_transfer_encoding on` | 🟡 Can break SSE | | `proxy_cache` enabled on `/api/` | 🟡 Adds overhead | | `X-Accel-Buffering "yes"` | This header should be set to "no" for extra safety | +| `HTTP/2` | If you experience streaming issues, lag, streaming ending before the last chunk arrived on the frontend, then using HTTP 1.1 instead of HTTP/2 might also help | ### Full Example Configuration From 7f1279916f4ff0846d70f3d20143744c69a93616 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Thu, 5 Feb 2026 21:44:00 +0100 Subject: [PATCH 43/50] NEW FEAT message queue and analytics --- docs/features/analytics/index.mdx | 71 ++++++++++- docs/features/chat-features/message-queue.mdx | 111 ++++++++++++++++++ docs/features/index.mdx | 2 + 3 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 docs/features/chat-features/message-queue.mdx diff --git a/docs/features/analytics/index.mdx b/docs/features/analytics/index.mdx index b9fbe81e6..3a23fad9f 100644 --- a/docs/features/analytics/index.mdx +++ b/docs/features/analytics/index.mdx @@ -44,7 +44,22 @@ At the top right of the Analytics dashboard, you can filter all data by time per - **Last 90 days** - Quarterly trends - **All time** - Complete historical data -All metrics on the page update automatically when you change the time period. +Your selected time period is **automatically saved** and persists across browser sessions. + +### Group Filtering + +If you have [user groups](/features/rbac/groups) configured, the Analytics dashboard allows filtering by group: + +- Use the **group dropdown** next to the time period selector +- Select a specific group to view analytics **only for users in that group** +- Choose "All Users" to see instance-wide analytics + +This is useful for: +- **Department-level reporting** - Track usage for specific teams +- **Cost allocation** - Attribute token consumption to business units +- **Pilot programs** - Monitor adoption within test groups + +All metrics on the page update automatically when you change the time period or group filter. ### Summary Statistics @@ -90,6 +105,7 @@ A detailed breakdown of how each model is being used: - **Sortable columns** - Click column headers to sort by name or message count - **Model icons** - Visual identification with profile images - **Token tracking** - See which models consume the most resources +- **Clickable rows** - Click any model to open the [Model Details Modal](#model-details-modal) **Use cases:** - Identify your most popular models @@ -97,6 +113,42 @@ A detailed breakdown of how each model is being used: - Decide which models to keep or remove - Plan infrastructure upgrades based on usage +### Model Details Modal + +Clicking on any model row opens a detailed modal with two tabs: + +#### Overview Tab + +The Overview tab provides: + +- **Feedback Activity Chart** - Visual history of user feedback (thumbs up/down) over time + - Toggle between **30 days**, **1 year**, or **All time** views + - Weekly aggregation for longer time ranges +- **Tags** - Most common chat tags associated with this model (top 10) + +This helps you understand: +- How users perceive model quality over time +- Which topics/use cases the model is handling +- Trends in user satisfaction + +#### Chats Tab + +:::info Admin Chat Access Required +The Chats tab is only visible when **Admin Chat Access** is enabled in your instance settings. +::: + +The Chats tab shows conversations that used this model: + +- **User info** - Who started each chat +- **Preview** - First message of each conversation +- **Timestamp** - When the chat was last updated +- **Click to open** - Navigate directly to the shared chat view + +This is useful for: +- Understanding how users interact with specific models +- Auditing model usage for quality assurance +- Finding example conversations for training or documentation + ### User Activity Table Track user engagement and token consumption per user: @@ -248,6 +300,7 @@ The following indexes optimize analytics queries: For advanced users and integrations, Analytics provides REST API endpoints: +**Dashboard Endpoints:** ``` GET /api/v1/analytics/summary GET /api/v1/analytics/models @@ -257,13 +310,25 @@ GET /api/v1/analytics/daily GET /api/v1/analytics/tokens ``` -All endpoints support `start_date` and `end_date` parameters (Unix timestamps) for time-range filtering. +**Model Detail Endpoints:** +``` +GET /api/v1/analytics/models/{model_id}/chats # Get chats using this model +GET /api/v1/analytics/models/{model_id}/overview # Get feedback history and tags +``` + +**Common Query Parameters:** + +| Parameter | Type | Description | +|-----------|------|-------------| +| `start_date` | int | Unix timestamp (epoch seconds) - start of range | +| `end_date` | int | Unix timestamp (epoch seconds) - end of range | +| `group_id` | string | Filter to a specific user group (optional) | :::tip API Access All Analytics endpoints require admin authentication. Include your admin bearer token: ```bash curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ - https://your-instance.com/api/v1/analytics/summary + "https://your-instance.com/api/v1/analytics/summary?group_id=abc123" ``` ::: diff --git a/docs/features/chat-features/message-queue.mdx b/docs/features/chat-features/message-queue.mdx new file mode 100644 index 000000000..93e9e356c --- /dev/null +++ b/docs/features/chat-features/message-queue.mdx @@ -0,0 +1,111 @@ +--- +sidebar_position: 10 +title: "Message Queue" +--- + +# Message Queue + +The **Message Queue** feature allows you to continue composing and sending messages while the AI is still generating a response. Instead of blocking your input until the current response completes, your messages are queued and automatically sent in sequence. + +--- + +## How It Works + +When you send a message while the AI is generating a response: + +1. **Your message is queued** - It appears in a compact queue area just above the input box +2. **You can continue working** - Add more messages, edit queued messages, or delete them +3. **Automatic processing** - Once the current response finishes, all queued messages are combined and sent together + +This creates a seamless workflow where you can capture thoughts as they come without waiting for the AI to finish. + +--- + +## Queue Management + +Each queued message shows three action buttons: + +| Action | Icon | Description | +|--------|------|-------------| +| **Send Now** | ↑ | Interrupts the current generation and sends this message immediately | +| **Edit** | ✏️ | Removes the message from the queue and puts it back in the input field | +| **Delete** | 🗑️ | Removes the message from the queue without sending | + +### Combining Messages + +When the AI finishes generating, all queued messages are **combined into a single prompt** (separated by blank lines) and sent together. This means: + +- Multiple quick thoughts become one coherent message +- Context flows naturally between your queued inputs +- The AI receives everything at once for better understanding + +--- + +## Persistence + +The message queue is preserved when you navigate between chats within the same browser session: + +- **Leaving a chat** - Queue is saved to session storage +- **Returning to the chat** - Queue is restored and processed +- **Closing the browser** - Queue is cleared (session storage only) + +This means you can start a thought, switch to another chat to check something, and return to find your queued messages waiting. + +--- + +## Settings + +You can disable the Message Queue feature if you prefer the traditional behavior: + +1. Go to **Settings** → **Interface** +2. Find **Enable Message Queue** under the Chat section +3. Toggle it off + +When disabled, sending a message while the AI is generating will: +- **Interrupt** the current generation +- **Send** your new message immediately + +:::tip Default Behavior +Message Queue is **enabled by default**. The toggle allows you to choose between: +- **Queue mode** (default) - Messages queue up until generation completes +- **Interrupt mode** - New messages stop current generation immediately +::: + +--- + +## Use Cases + +### 1. Stream of Consciousness + +You're reading an AI response and have follow-up questions. Instead of waiting: +- Queue your first follow-up +- Queue a clarification +- Queue another thought + +All are sent together when the AI finishes. + +### 2. Adding Context + +The AI is working on a complex response, but you remember additional context: +- Queue the extra information +- The AI receives it as part of the next message + +### 3. Multitasking + +You're in a long conversation and need to capture quick notes: +- Queue messages as reminders +- Edit or delete before they're sent +- Use "Send Now" for urgent interruptions + +--- + +## Summary + +| Feature | Behavior | +|---------|----------| +| **Enabled** | Messages queue during generation, sent together when complete | +| **Disabled** | New messages interrupt current generation immediately | +| **Persistence** | Queue survives navigation within session | +| **Actions** | Send Now, Edit, Delete for each queued item | + +The Message Queue helps you maintain your flow of thought without the friction of waiting for AI responses to complete. diff --git a/docs/features/index.mdx b/docs/features/index.mdx index 9fbc8a058..b7f44d149 100644 --- a/docs/features/index.mdx +++ b/docs/features/index.mdx @@ -168,6 +168,8 @@ import { TopBanners } from "@site/src/components/TopBanners"; - 🔔 **Chat Completion Notifications**: Stay updated with instant in-UI notifications when a chat finishes in a non-active tab, ensuring you never miss a completed response. +- 📝 **Message Queue**: Continue composing messages while the AI is generating a response. Your messages are queued and automatically sent together when the current response completes. Edit, delete, or send queued messages immediately. [Learn about Message Queue](/features/chat-features/message-queue). + - 🌐 **Notification Webhook Integration**: Receive timely updates for long-running chats or external integration needs with configurable webhook notifications, even when your tab is closed. [Learn more about Webhooks](/features/interface/webhooks). - 📚 **Channels (Beta)**: Explore real-time collaboration between users and AIs with Discord/Slack-style chat rooms, build bots for channels, and unlock asynchronous communication for proactive multi-agent workflows. [See Channels](/features/channels). From b2897f492b6a0e9e9b0ad21b0b3facd3816e48a6 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 00:02:19 +0100 Subject: [PATCH 44/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index a3dacb7c3..0ea27e680 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -1358,6 +1358,41 @@ If enabled, the following headers are forwarded: - `X-OpenWebUI-User-Role` - `X-OpenWebUI-Chat-Id` +#### `FORWARD_USER_INFO_HEADER_NAME` + +- Type: `str` +- Default: `X-OpenWebUI-User-Name` +- Description: Customizes the header name used to forward the user's display name. Change this if your infrastructure requires a specific header prefix. + +#### `FORWARD_USER_INFO_HEADER_ID` + +- Type: `str` +- Default: `X-OpenWebUI-User-Id` +- Description: Customizes the header name used to forward the user's ID. + +#### `FORWARD_USER_INFO_HEADER_EMAIL` + +- Type: `str` +- Default: `X-OpenWebUI-User-Email` +- Description: Customizes the header name used to forward the user's email address. + +#### `FORWARD_USER_INFO_HEADER_ROLE` + +- Type: `str` +- Default: `X-OpenWebUI-User-Role` +- Description: Customizes the header name used to forward the user's role. + +:::tip Custom Header Prefix +Use these variables when integrating with services that require specific header naming conventions. For example, AWS Bedrock AgentCore requires headers prefixed with `X-Amzn-Bedrock-AgentCore-Runtime-Custom-`: + +```bash +FORWARD_USER_INFO_HEADER_NAME=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Name +FORWARD_USER_INFO_HEADER_ID=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Id +FORWARD_USER_INFO_HEADER_EMAIL=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Email +FORWARD_USER_INFO_HEADER_ROLE=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Role +``` +::: + #### `ENABLE_WEB_LOADER_SSL_VERIFICATION` - Type: `bool` From 1dbd80c0cdd0795a9f6cc76cd358b4b738642f23 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 00:32:39 +0100 Subject: [PATCH 45/50] Update env-configuration.mdx --- docs/getting-started/env-configuration.mdx | 27 ++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/getting-started/env-configuration.mdx b/docs/getting-started/env-configuration.mdx index 0ea27e680..8f0c47fb2 100644 --- a/docs/getting-started/env-configuration.mdx +++ b/docs/getting-started/env-configuration.mdx @@ -1350,7 +1350,7 @@ If you have already deployed with `JWT_EXPIRES_IN=-1`, you can rotate or change - type: `bool` - Default: `False` -- Description: Forwards user information (name, ID, email, role and chat-id) as X-headers to OpenAI API and Ollama API. +- Description: Forwards user and session information as HTTP headers to OpenAI API, Ollama API, MCP servers, and Tool servers. If enabled, the following headers are forwarded: - `X-OpenWebUI-User-Name` - `X-OpenWebUI-User-Id` @@ -1358,38 +1358,47 @@ If enabled, the following headers are forwarded: - `X-OpenWebUI-User-Role` - `X-OpenWebUI-Chat-Id` -#### `FORWARD_USER_INFO_HEADER_NAME` +This enables per-user authorization, auditing, rate limiting, and request tracing on external services. + +#### `FORWARD_USER_INFO_HEADER_USER_NAME` - Type: `str` - Default: `X-OpenWebUI-User-Name` - Description: Customizes the header name used to forward the user's display name. Change this if your infrastructure requires a specific header prefix. -#### `FORWARD_USER_INFO_HEADER_ID` +#### `FORWARD_USER_INFO_HEADER_USER_ID` - Type: `str` - Default: `X-OpenWebUI-User-Id` - Description: Customizes the header name used to forward the user's ID. -#### `FORWARD_USER_INFO_HEADER_EMAIL` +#### `FORWARD_USER_INFO_HEADER_USER_EMAIL` - Type: `str` - Default: `X-OpenWebUI-User-Email` - Description: Customizes the header name used to forward the user's email address. -#### `FORWARD_USER_INFO_HEADER_ROLE` +#### `FORWARD_USER_INFO_HEADER_USER_ROLE` - Type: `str` - Default: `X-OpenWebUI-User-Role` - Description: Customizes the header name used to forward the user's role. +#### `FORWARD_SESSION_INFO_HEADER_CHAT_ID` + +- Type: `str` +- Default: `X-OpenWebUI-Chat-Id` +- Description: Customizes the header name used to forward the current chat/session ID. + :::tip Custom Header Prefix Use these variables when integrating with services that require specific header naming conventions. For example, AWS Bedrock AgentCore requires headers prefixed with `X-Amzn-Bedrock-AgentCore-Runtime-Custom-`: ```bash -FORWARD_USER_INFO_HEADER_NAME=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Name -FORWARD_USER_INFO_HEADER_ID=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Id -FORWARD_USER_INFO_HEADER_EMAIL=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Email -FORWARD_USER_INFO_HEADER_ROLE=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Role +FORWARD_USER_INFO_HEADER_USER_NAME=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Name +FORWARD_USER_INFO_HEADER_USER_ID=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Id +FORWARD_USER_INFO_HEADER_USER_EMAIL=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Email +FORWARD_USER_INFO_HEADER_USER_ROLE=X-Amzn-Bedrock-AgentCore-Runtime-Custom-User-Role +FORWARD_SESSION_INFO_HEADER_CHAT_ID=X-Amzn-Bedrock-AgentCore-Runtime-Custom-Chat-Id ``` ::: From a9720eb2e8c71ca50cd4f7b97345a64c246a76cb Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:24:13 +0100 Subject: [PATCH 46/50] TOOLS --- docs/features/plugin/development/events.mdx | 136 +++++++++++++++++++- 1 file changed, 129 insertions(+), 7 deletions(-) diff --git a/docs/features/plugin/development/events.mdx b/docs/features/plugin/development/events.mdx index 53ccdf6fc..31b141e9a 100644 --- a/docs/features/plugin/development/events.mdx +++ b/docs/features/plugin/development/events.mdx @@ -24,15 +24,26 @@ Think of Events like push notifications and modal dialogs that your plugin can t ## 🏁 Availability -:::important -Events are **only available for native Python Tools and Functions** defined directly in Open WebUI. +### Native Python Tools & Functions -Events are **NOT supported** for: -- **OpenAPI tool servers** (external REST APIs) -- **MCP tool servers** (Model Context Protocol) +Events are **fully available** for native Python Tools and Functions defined directly in Open WebUI using the `__event_emitter__` and `__event_call__` helpers. -These external tools communicate via HTTP request/response and cannot emit real-time UI events. -::: +### External Tools (OpenAPI & MCP) + +External tools can emit events via a **dedicated REST endpoint**. Open WebUI passes the following headers to all external tool requests: + +| Header | Description | +|--------|-------------| +| `X-Open-WebUI-Chat-Id` | The chat ID where the tool was invoked | +| `X-Open-WebUI-Message-Id` | The message ID associated with the tool call | + +Your external tool can use these headers to emit events back to the UI via: + +``` +POST /api/v1/chats/{chat_id}/messages/{message_id}/event +``` + +See [External Tool Events](#-external-tool-events) below for details. --- @@ -452,6 +463,117 @@ Yes—emit `"chat:message:delta"` events in a loop, then finish with `"chat:mess --- +## 🌐 External Tool Events + +External tools (OpenAPI and MCP servers) can emit events to the Open WebUI UI via a REST endpoint. This enables features like status updates, notifications, and streaming content from tools running on external servers. + +### Headers Provided by Open WebUI + +When Open WebUI calls your external tool, it includes these headers: + +| Header | Description | +|--------|-------------| +| `X-Open-WebUI-Chat-Id` | The chat ID where the tool was invoked | +| `X-Open-WebUI-Message-Id` | The message ID associated with the tool call | + +### Event Endpoint + +**Endpoint:** `POST /api/v1/chats/{chat_id}/messages/{message_id}/event` + +**Authentication:** Requires a valid Open WebUI API key or session token. + +**Request Body:** + +```json +{ + "type": "status", + "data": { + "description": "Processing your request...", + "done": false + } +} +``` + +### Supported Event Types + +External tools can emit the same event types as native tools: +- `status` – Show progress/status updates +- `notification` – Display toast notifications +- `chat:message:delta` / `message` – Append content to the message +- `chat:message` / `replace` – Replace message content +- `files` / `chat:message:files` – Attach files +- `source` / `citation` – Add citations + +:::note +Interactive events (`input`, `confirmation`, `execute`) require `__event_call__` and are **not supported** for external tools as they need bidirectional WebSocket communication. +::: + +### Example: Python External Tool + +```python +import httpx + +def my_tool_handler(request): + # Extract headers from incoming request + chat_id = request.headers.get("X-Open-WebUI-Chat-Id") + message_id = request.headers.get("X-Open-WebUI-Message-Id") + api_key = "your-open-webui-api-key" + + # Emit a status event + httpx.post( + f"http://your-open-webui-host/api/v1/chats/{chat_id}/messages/{message_id}/event", + headers={"Authorization": f"Bearer {api_key}"}, + json={ + "type": "status", + "data": {"description": "Working on it...", "done": False} + } + ) + + # ... do work ... + + # Emit completion status + httpx.post( + f"http://your-open-webui-host/api/v1/chats/{chat_id}/messages/{message_id}/event", + headers={"Authorization": f"Bearer {api_key}"}, + json={ + "type": "status", + "data": {"description": "Complete!", "done": True} + } + ) + + return {"result": "success"} +``` + +### Example: JavaScript/Node.js External Tool + +```javascript +async function myToolHandler(req) { + const chatId = req.headers['x-open-webui-chat-id']; + const messageId = req.headers['x-open-webui-message-id']; + const apiKey = 'your-open-webui-api-key'; + + // Emit a notification + await fetch( + `http://your-open-webui-host/api/v1/chats/${chatId}/messages/${messageId}/event`, + { + method: 'POST', + headers: { + 'Authorization': `Bearer ${apiKey}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + type: 'notification', + data: { type: 'info', content: 'Tool is processing...' } + }) + } + ); + + return { result: 'success' }; +} +``` + +--- + ## 📝 Conclusion **Events** give you real-time, interactive superpowers inside Open WebUI. They let your code update content, trigger notifications, request user input, stream results, handle code, and much more—seamlessly plugging your backend intelligence into the chat UI. From 3f2c53474e878e8b729ef29f931987127411fb72 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 13:00:05 +0100 Subject: [PATCH 47/50] events --- docs/features/plugin/tools/openapi-servers/index.mdx | 4 ++-- docs/features/plugin/tools/openapi-servers/mcp.mdx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/plugin/tools/openapi-servers/index.mdx b/docs/features/plugin/tools/openapi-servers/index.mdx index 8b57948a6..9ab87319d 100644 --- a/docs/features/plugin/tools/openapi-servers/index.mdx +++ b/docs/features/plugin/tools/openapi-servers/index.mdx @@ -29,10 +29,10 @@ By leveraging OpenAPI, we eliminate the need for a proprietary or unfamiliar com While OpenAPI tools are powerful for extending Open WebUI with external services, they have some constraints compared to native Python tools: -- **No real-time UI events**: OpenAPI tools cannot emit status updates, notifications, or request user input via the [event system](/features/plugin/development/events). They communicate via standard HTTP request/response only. +- **One-way events only**: OpenAPI tools can emit status updates, notifications, and other [one-way events](/features/plugin/development/events#-external-tool-events) via the REST endpoint. Open WebUI passes `X-Open-WebUI-Chat-Id` and `X-Open-WebUI-Message-Id` headers to enable this. However, interactive events (user input prompts, confirmations) are only available for native Python tools. - **No streaming output**: Tool responses are returned as complete results, not streamed token-by-token. -If you need real-time UI feedback (progress updates, confirmations, streaming), consider implementing your tool as a [native Python Tool](/features/plugin/tools/development) instead. +If you need interactive UI feedback (confirmations, user input prompts), consider implementing your tool as a [native Python Tool](/features/plugin/tools/development) instead. ## 🚀 Quickstart diff --git a/docs/features/plugin/tools/openapi-servers/mcp.mdx b/docs/features/plugin/tools/openapi-servers/mcp.mdx index 28bbd09b5..c51743928 100644 --- a/docs/features/plugin/tools/openapi-servers/mcp.mdx +++ b/docs/features/plugin/tools/openapi-servers/mcp.mdx @@ -45,8 +45,8 @@ So even though adding mcpo might at first seem like "just one more layer"—in r ✨ With mcpo, your local-only AI tools become cloud-ready, UI-friendly, and instantly interoperable—without changing a single line of tool server code. -:::note -**Limitation**: Since mcpo exposes MCP tools as OpenAPI endpoints, they inherit OpenAPI's limitations—specifically, they cannot use Open WebUI's [event system](/features/plugin/development/events) for real-time UI updates (status messages, notifications, user input prompts). These features are only available for native Python tools. +:::tip +**Events Supported**: While mcpo exposes MCP tools as OpenAPI endpoints, they can still emit events (status updates, notifications) via Open WebUI's [event REST endpoint](/features/plugin/development/events#-external-tool-events). Open WebUI automatically passes the required `X-Open-WebUI-Chat-Id` and `X-Open-WebUI-Message-Id` headers to your tool. However, interactive events requiring user input are only available for native Python tools. ::: ### ✅ Quickstart: Running the Proxy Locally From 1b16736776273b57aeb19ce07653cb952c03ebb7 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:41:55 +0100 Subject: [PATCH 48/50] OpenResponses --- docs/faq.mdx | 58 ++++++++++- .../chat-features/reasoning-models.mdx | 2 +- docs/getting-started/quick-start/index.mdx | 3 + .../quick-start/starting-with-llama-cpp.mdx | 6 +- .../starting-with-open-responses.mdx | 90 ++++++++++++++++++ .../starting-with-openai-compatible.mdx | 8 +- .../quick-start/starting-with-openai.mdx | 4 +- .../quick-start/starting-with-vllm.mdx | 6 +- .../quick-start/api-type-responses.gif | Bin 0 -> 471107 bytes 9 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 docs/getting-started/quick-start/starting-with-open-responses.mdx create mode 100644 static/images/getting-started/quick-start/api-type-responses.gif diff --git a/docs/faq.mdx b/docs/faq.mdx index 25d3448d8..90f142f16 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -225,15 +225,63 @@ For more optimization tips, see the **[Performance Tips Guide](troubleshooting/p ### Q: Is MCP (Model Context Protocol) supported in Open WebUI? -**A:** Yes, Open WebUI now includes **native support for MCP Streamable HTTP**, enabling direct, first-class integration with MCP tools that communicate over the standard HTTP transport. For any **other MCP transports or non-HTTP implementations**, you should use our official proxy adapter, **MCPO**, available at 👉 [https://github.com/open-webui/mcpo](https://github.com/open-webui/mcpo). MCPO provides a unified OpenAPI-compatible layer that bridges alternative MCP transports into Open WebUI safely and consistently. This architecture ensures maximum compatibility, strict security boundaries, and predictable tool behavior across different environments while keeping Open WebUI backend-agnostic and maintainable. +**A:** Yes, Open WebUI includes **native support for MCP Streamable HTTP**, enabling direct, first-class integration with MCP tools that communicate over the standard HTTP transport. For any **other MCP transports or non-HTTP implementations**, you should use our official proxy adapter, **MCPO**, available at 👉 [https://github.com/open-webui/mcpo](https://github.com/open-webui/mcpo). MCPO provides a unified OpenAPI-compatible layer that bridges alternative MCP transports into Open WebUI safely and consistently. This architecture ensures maximum compatibility, strict security boundaries, and predictable tool behavior across different environments while keeping Open WebUI backend-agnostic and maintainable. -### Q: Why doesn't Open WebUI support [Specific Provider]'s latest API (e.g. OpenAI Responses API)? +### Q: Why doesn't Open WebUI natively support [Provider X]'s proprietary API? -**A:** Open WebUI is built around **universal protocols**, not specific providers. Our core philosophy is to support standard, widely-adopted APIs like the **OpenAI Chat Completions protocol**. +**A:** Open WebUI is highly modular with a plugin system including tools, functions, and most notably **[pipes](/features/plugin/functions/pipe)**. These modular pipes allow you to add support for virtually any provider you want—you can build your own or choose from the many [community-built](https://openwebui.com/) and usually well-maintained ones already available. -This protocol-centric design ensures that Open WebUI remains backend-agnostic and compatible with dozens of providers (like OpenRouter, LiteLLM, vLLM, and Groq) simultaneously. We avoid implementing proprietary, provider-specific APIs (such as OpenAI's stateful Responses API or Anthropic's Messages API) to prevent unsustainable architectural bloat and to maintain a truly open ecosystem. +That said, Open WebUI's core is built around **universal protocols**, not specific providers. Our stance is to support standard, widely-adopted APIs like the **OpenAI Chat Completions protocol**. -If you need functionality exclusive to a proprietary API (like OpenAI's hidden reasoning traces), we recommend using a proxy like **LiteLLM** or **OpenRouter**, which translate those proprietary features into the standard Chat Completions protocol that Open WebUI supports. +This protocol-centric design ensures that Open WebUI remains backend-agnostic and compatible with dozens of providers simultaneously. We avoid implementing proprietary, provider-specific APIs in the core to prevent unsustainable architectural bloat and to maintain a truly open ecosystem. + +:::note Experimental: Open Responses +As new standards emerge that gain broad adoption, we may add experimental support. Connections can now optionally be configured to use **[Open Responses](https://www.openresponses.org/)**—an open specification for multi-provider interoperability with consistent streaming events and tool use patterns. +::: + +We understand this request comes up frequently, especially for major providers. Here's why we've made this deliberate architectural decision: + +#### 1. The Cascading Demand Problem + +Supporting one proprietary API sets a precedent. Once that precedent exists, every other major provider becomes a reasonable request. What starts as "just one provider" quickly becomes many integrations, each with their own quirks, authentication schemes, and breaking changes. + +#### 2. Maintenance is the Real Burden + +Adding integration code is the easy part. **Maintaining it forever** is where the real cost lies: +- Each provider updates their API independently—when a provider changes something, we must update and test immediately +- Changes in one integration can break compatibility with others +- Every integration requires ongoing testing across multiple scenarios +- Bug reports flood in for each provider whenever they make changes + +Contributors are **volunteers with full-time jobs**. Asking them to maintain 10+ provider integrations indefinitely is not sustainable. + +#### 3. Technical Complexity + +Each provider has different approaches to: +- Reasoning/thinking content format and structure +- Authentication and request signing +- Error handling and rate limiting + +This requires provider-specific logic throughout both the backend and frontend, significantly increasing the codebase complexity and tech debt. + +#### 4. Scale and Stability Requirements + +Open WebUI is used by major organizations worldwide. At this scale, stability is paramount—extensive testing and backwards compatibility guarantees become exponentially harder with each added provider. + +#### 5. Pipes are the Modular Solution + +The pipes architecture exists precisely to solve this problem. One-click install a community pipe and you get full provider API support. This is exactly the modularity that allows: +- Community members to maintain provider-specific integrations +- Users to choose only what they need +- The core project to remain stable and maintainable + +:::tip The Recommended Path +For providers that don't follow widely adopted API standards, use: +- **[Open WebUI community](https://openwebui.com/)**: Community-maintained provider integrations (one-click install) +- **Middleware proxies**: Tools like LiteLLM or OpenRouter can translate proprietary APIs to widely adopted API formats + +These solutions exist specifically to bridge the gap, and they're maintained by teams dedicated to that purpose. +::: ### Q: Why is the frontend integrated into the same Docker image? Isn't this unscalable or problematic? diff --git a/docs/features/chat-features/reasoning-models.mdx b/docs/features/chat-features/reasoning-models.mdx index 5233cf596..a39a49127 100644 --- a/docs/features/chat-features/reasoning-models.mdx +++ b/docs/features/chat-features/reasoning-models.mdx @@ -347,7 +347,7 @@ Open WebUI serializes reasoning as text wrapped in tags (e.g., `... OpenAI > Manage** (look for the wrench icon). +3. Click ➕ **Add New Connection** or edit an existing connection. + +--- + +## Step 2: Select the API Type + +In the connection modal, look for the **API Type** setting: + +- **Chat Completions** (default): Uses the standard OpenAI Chat Completions API format. +- **Responses** (experimental): Uses the Open Responses API format. + +Click the toggle to switch to **Responses**. You'll see an "Experimental" label indicating this feature is still in development. + +![API Type Toggle](/images/getting-started/quick-start/api-type-responses.gif) + +--- + +## Step 3: Configure Your Provider + +Enter the connection details for a provider that supports the Open Responses format: + +- **URL**: Your provider's API endpoint +- **API Key**: Your authentication credentials +- **Model IDs**: (Optional) Specify specific models to use + +--- + +## Supported Providers + +Open Responses is a new specification, so provider support is still growing. Check the [Open Responses website](https://www.openresponses.org/) for the latest list of compliant providers and implementations. + +--- + +## Troubleshooting + +### Connection works with Chat Completions but not Responses + +Not all providers support the Open Responses format yet. Try: + +1. Switching back to Chat Completions +2. Checking if your provider explicitly supports Open Responses +3. Using a middleware proxy that can translate to Open Responses format + +### Streaming or tool calls behave unexpectedly + +This feature is experimental. If you encounter issues: + +1. Check the [Open WebUI Discord](https://discord.gg/5rJgQTnV4s) for known issues +2. Report bugs on [GitHub](https://github.com/open-webui/open-webui/issues) + +--- + +## Learn More + +- **[Open Responses Specification](https://www.openresponses.org/specification)**: Full technical specification +- **[Open Responses GitHub](https://github.com/openresponses/openresponses)**: Source code and discussions +- **[FAQ: Why doesn't Open WebUI natively support proprietary APIs?](/faq#q-why-doesnt-open-webui-natively-support-provider-xs-proprietary-api)**: Learn about our protocol-first philosophy diff --git a/docs/getting-started/quick-start/starting-with-openai-compatible.mdx b/docs/getting-started/quick-start/starting-with-openai-compatible.mdx index a4b4de7ca..daa03f9e4 100644 --- a/docs/getting-started/quick-start/starting-with-openai-compatible.mdx +++ b/docs/getting-started/quick-start/starting-with-openai-compatible.mdx @@ -17,10 +17,12 @@ Open WebUI is built around **Standard Protocols**. Instead of building specific This means that while Open WebUI handles the **interface and tools**, it expects your backend to follow the universal Chat Completions standard. -- **We Support Protocols**: Any provider that follows the OpenAI Chat Completions standard (like Groq, OpenRouter, or LiteLLM) is natively supported. -- **We Avoid Proprietary APIs**: We do not implement provider-specific, non-standard APIs (such as OpenAI's stateful Responses API or Anthropic's native Messages API) to maintain a universal, maintainable codebase. +- **We Support Protocols**: Any provider that follows widely adopted API standards (like Groq, OpenRouter, OpenAI, Mistral, Perplexity and many more) is natively supported. We also have experimental support for **[Open Responses](https://www.openresponses.org/)**. +- **We Avoid Proprietary APIs**: We do not implement provider-specific, non-standard APIs in the core to maintain a universal, maintainable codebase. For unsupported providers, use a pipe or middleware proxy. -If you are using a provider that requires a proprietary API, we recommend using a proxy tool like **LiteLLM** or **OpenRouter** to bridge them to the standard OpenAI protocol supported by Open WebUI. +If you are using a provider that requires a proprietary API, we recommend using a **[pipe](/features/plugin/functions/pipe)** (browse [community pipes](https://openwebui.com/)) or a middleware proxy like LiteLLM or OpenRouter to bridge them to a supported protocol. + +For a detailed explanation of why we've made this architectural decision, see our **[FAQ: Why doesn't Open WebUI natively support proprietary APIs?](/faq#q-why-doesnt-open-webui-natively-support-provider-xs-proprietary-api)** ### Popular Compatible Servers and Providers diff --git a/docs/getting-started/quick-start/starting-with-openai.mdx b/docs/getting-started/quick-start/starting-with-openai.mdx index d8485c445..7b86d6e50 100644 --- a/docs/getting-started/quick-start/starting-with-openai.mdx +++ b/docs/getting-started/quick-start/starting-with-openai.mdx @@ -13,9 +13,9 @@ Open WebUI makes it easy to connect and use OpenAI and other OpenAI-compatible A ## Important: Protocols, Not Providers -Open WebUI is a **protocol-centric** platform. While we provide first-class support for OpenAI models, we do so exclusively through the **OpenAI Chat Completions API protocol**. +Open WebUI is a **protocol-centric** platform. While we provide first-class support for OpenAI models, we do so mainly through the **OpenAI Chat Completions API protocol**. -We do **not** support proprietary, non-standard APIs such as OpenAI’s new stateful **Responses API**. Instead, Open WebUI focuses on universal standards that are shared across dozens of providers. This approach keeps Open WebUI fast, stable, and truly open-sourced. +We focus on universal standards shared across dozens of providers, with experimental support for emerging standards like **[Open Responses](https://www.openresponses.org/)**. For a detailed explanation, see our **[FAQ on protocol support](/faq#q-why-doesnt-open-webui-natively-support-provider-xs-proprietary-api)**. --- diff --git a/docs/getting-started/quick-start/starting-with-vllm.mdx b/docs/getting-started/quick-start/starting-with-vllm.mdx index 90a4f1b14..adf2ba41e 100644 --- a/docs/getting-started/quick-start/starting-with-vllm.mdx +++ b/docs/getting-started/quick-start/starting-with-vllm.mdx @@ -5,7 +5,11 @@ title: "Starting With vLLM" ## Overview -vLLM provides an OpenAI-compatible API, making it easy to connect to Open WebUI. This guide will show you how to connect your vLLM server. +vLLM provides an **OpenAI-compatible API** (Chat Completions), making it easy to connect to Open WebUI. This guide will show you how to connect your vLLM server. + +:::tip +Open WebUI also supports the experimental [Open Responses](/getting-started/quick-start/starting-with-open-responses) specification for providers that implement it. +::: --- diff --git a/static/images/getting-started/quick-start/api-type-responses.gif b/static/images/getting-started/quick-start/api-type-responses.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3daae0e05e910a8ec5cf8a6432e97ffa894d0be GIT binary patch literal 471107 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%0AR{A9tcU4JoI$cTXW`I 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 z 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

DKP$J-s(2j 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 K$N$$uUHuQBytpX< literal 0 HcmV?d00001 From 036b53b583f9bdb59938c3d56973121aaa1261af Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:42:01 +0100 Subject: [PATCH 49/50] Update faq.mdx --- docs/faq.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/faq.mdx b/docs/faq.mdx index 90f142f16..2b822a3da 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -259,6 +259,7 @@ Contributors are **volunteers with full-time jobs**. Asking them to maintain 10+ Each provider has different approaches to: - Reasoning/thinking content format and structure +- Tool calling schemas and response formats - Authentication and request signing - Error handling and rate limiting From 05b494add6f38f80c7fe64e025e3faa6af4ac7d9 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Sun, 8 Feb 2026 17:30:21 +0100 Subject: [PATCH 50/50] CoC --- docs/contributing.mdx | 10 +++++++++- docs/faq.mdx | 22 +++++++++++++++++++++- docs/team.mdx | 6 ++++++ docs/troubleshooting/index.mdx | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/docs/contributing.mdx b/docs/contributing.mdx index 23c1c3ae1..d8d7392b5 100644 --- a/docs/contributing.mdx +++ b/docs/contributing.mdx @@ -11,6 +11,12 @@ import { TopBanners } from "@site/src/components/TopBanners"; Your interest in contributing to Open WebUI is greatly appreciated. This document is here to guide you through the process, ensuring your contributions enhance the project effectively. Let's make Open WebUI even better, together! +## 📜 Code of Conduct + +All contributors and community participants are expected to follow our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**. We operate under a **zero-tolerance policy** — disrespectful, demanding, or hostile behavior will result in immediate action without prior warning. + +Our community is built on the work of volunteers who dedicate their free time to this project. Please treat every interaction with professionalism and respect. + ## 💡 Contributing Looking to contribute? Great! Here's how you can help: @@ -79,7 +85,7 @@ Let's make Open WebUI usable for *everyone*. ### 🤔 Questions & Feedback -Got questions or feedback? Join our [Discord community](https://discord.gg/5rJgQTnV4s) or open an issue. We're here to help! +Got questions or feedback? Join our [Discord community](https://discord.gg/5rJgQTnV4s), visit our [Reddit](https://www.reddit.com/r/OpenWebUI/), or open an issue. We're here to help! ### 🚨 Reporting Issues @@ -91,6 +97,8 @@ Noticed something off? Have an idea? Check our [Issues tab](https://github.com/o - **Detail is Key:** To ensure your issue is understood and can be effectively addressed, it's imperative to include comprehensive details. Descriptions should be clear, including steps to reproduce, expected outcomes, and actual results. Lack of sufficient detail may hinder our ability to resolve your issue. +- **Respectful Communication:** All interactions — including issue reports and discussions — fall under our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**. Hostile, entitled, or demanding behavior toward contributors will not be tolerated. + ::: ### 🧭 Scope of Support diff --git a/docs/faq.mdx b/docs/faq.mdx index 2b822a3da..81467d59d 100644 --- a/docs/faq.mdx +++ b/docs/faq.mdx @@ -7,6 +7,26 @@ import { TopBanners } from "@site/src/components/TopBanners"; +### Q: How can I get support or ask for help? + +**A:** Open WebUI is a community-driven, open-source project. Support is provided by **volunteers** who contribute their time and expertise for free — there is no dedicated support team, and no one is obligated to provide personalized or on-demand assistance. + +**To get the best help:** +1. **Search first.** Check these docs, [Discord](https://discord.gg/5rJgQTnV4s), [Reddit](https://www.reddit.com/r/OpenWebUI/), [GitHub Discussions](https://github.com/open-webui/open-webui/discussions), and [Issues](https://github.com/open-webui/open-webui/issues) — your question may already be answered. +2. **Try the Discord bot.** In our [Discord server](https://discord.gg/5rJgQTnV4s)'s **#questions** channel, we have an experimental bot that has access to all issues, all discussions, and the entire documentation. Simply ping the bot with your question in the same message, wait a few seconds, and it will answer you. As our documentation improves, so does the bot. +3. **Provide details.** When asking for help, always include: your Open WebUI version, deployment method (Docker/pip), model provider and model name, relevant settings (screenshots of the Admin Panel section are ideal), and steps to reproduce the issue. +4. **Be respectful.** Contributors are volunteers. Demanding, entitled, or hostile behavior is not tolerated and will result in immediate enforcement under our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**. + +**Where to ask:** +- 🤖 **Quick Answers**: [Discord #questions channel](https://discord.gg/5rJgQTnV4s) — try the bot first, it can answer most Open WebUI questions +- 🐛 **Bugs**: [GitHub Issues](https://github.com/open-webui/open-webui/issues) — you **must** use the issue template and provide all requested information (Open WebUI version, browser, deployment method, expected vs. actual behavior, and logs). Most importantly, your report **must include clear steps to reproduce the issue along with all relevant settings** to replicate the situation. If we cannot reproduce it, we will not investigate it. Reports that skip the template or omit key details will be closed without investigation or converted to discussions. Our contributors are volunteers — incomplete reports waste their limited time. +- 💬 **Questions & Help**: [Discord](https://discord.gg/5rJgQTnV4s) (most active community), [Reddit](https://www.reddit.com/r/OpenWebUI/), or [GitHub Discussions](https://github.com/open-webui/open-webui/discussions) +- 💡 **Feature Requests**: [GitHub Discussions](https://github.com/open-webui/open-webui/discussions/new/choose) + +:::important +All participants in the Open WebUI community are expected to follow our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**, which operates under a **zero-tolerance policy**. Unacceptable behavior — including hostility, entitlement, or persistent negativity toward contributors — will result in immediate action without prior warning. +::: + ### Q: How do I customize the logo and branding? **A:** You can customize the theme, logo, and branding with our **[Enterprise License](https://docs.openwebui.com/enterprise)**, which unlocks exclusive enterprise features. @@ -329,4 +349,4 @@ We review every report in good faith and handle all submissions discreetly. Prot ### Need Further Assistance? -If you have any further questions or concerns, please reach out to our [GitHub Issues page](https://github.com/open-webui/open-webui/issues) or our [Discord channel](https://discord.gg/5rJgQTnV4s) for more help and information. +If you have any further questions or concerns, please reach out on our [Discord server](https://discord.gg/5rJgQTnV4s), [Reddit community](https://www.reddit.com/r/OpenWebUI/), [GitHub Issues](https://github.com/open-webui/open-webui/issues), or [GitHub Discussions](https://github.com/open-webui/open-webui/discussions) for more help and information. Please remember that all community interactions are governed by our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**. diff --git a/docs/team.mdx b/docs/team.mdx index 457195d71..7945eab82 100644 --- a/docs/team.mdx +++ b/docs/team.mdx @@ -38,5 +38,11 @@ Beyond our contributors, Open WebUI, Inc. has an incredible global team working We greatly appreciate enthusiasm and thoughtful suggestions from our community. At the same time, **we're not looking for unsolicited governance recommendations or guidance on how to operate**—we know exactly how we want to run our project (just as, for example, you wouldn't tell OpenAI how to run theirs). Open WebUI maintains strong, opinionated leadership because that's precisely what we believe is necessary to build something truly great, fast-moving, and purposeful. +## 📜 Community Standards + +All community members — contributors, users, and collaborators alike — are expected to uphold our **[Code of Conduct](https://github.com/open-webui/open-webui/blob/main/CODE_OF_CONDUCT.md)**. This project is built by volunteers who dedicate their time and expertise freely. We enforce a **zero-tolerance policy**: disrespectful, entitled, or hostile behavior toward any community member will result in immediate action without prior warning. + +We believe that protecting our contributors from burnout and abuse is essential to the long-term health of this project. A respectful, professional environment isn't optional — it's a requirement for participation. + Thank you for respecting our perspective and for your continued support and contributions. We're excited to keep building with the community around the vision we've established together! diff --git a/docs/troubleshooting/index.mdx b/docs/troubleshooting/index.mdx index bbec3251b..046c3056e 100644 --- a/docs/troubleshooting/index.mdx +++ b/docs/troubleshooting/index.mdx @@ -17,7 +17,7 @@ With this project constantly evolving, updates and fixes are regularly added. Ke ### 🤝 Community Support -This project thrives on community spirit and passion. If you still face problems after updating, we warmly invite you to join our vibrant community on [Discord](https://discord.com/invite/5rJgQTnV4s). There, you can share your experiences, find solutions, and connect with fellow enthusiasts who might be navigating similar challenges. Engaging with our community doesn't just help solve your problems; it strengthens the entire network of support, so we all grow together. 🌱 +This project thrives on community spirit and passion. If you still face problems after updating, we warmly invite you to join our vibrant community on [Discord](https://discord.com/invite/5rJgQTnV4s) or [Reddit](https://www.reddit.com/r/OpenWebUI/). There, you can share your experiences, find solutions, and connect with fellow enthusiasts who might be navigating similar challenges. Engaging with our community doesn't just help solve your problems; it strengthens the entire network of support, so we all grow together. 🌱 🌟 If your issues are pressing and you need a quicker resolution, consider [supporting our project](/sponsorships). Your sponsorship not only fast-tracks your queries in a dedicated sponsor-only channel, but also directly supports the [dedicated maintainer](/mission) who is passionately committed to refining and enhancing this tool for everyone.