Skip to content
Merged

Dev #940

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ Open WebUI also supports image generation through the **Google AI Studio API** a

### Initial Setup

1. Obtain an [API key](https://aistudio.google.com/api-keys) from Google AI Studio.
2. You may need to create a project and enable the `Generative Language API` in addition to adding billing information.
1. Obtain an [API key](https://aistudio.google.com/api-keys) from Google AI Studio - alternatively an API Key from Google Cloud and activate the `Generative Language API` for the project.
2. You most likely need to create a project and enable the `Generative Language API` in addition to adding billing information, because the image generation API is not available for free.

:::warning
If you are utilizing a free API key, it is vital to have a payment method on file. The absence of a valid payment method is a frequent cause of errors during the setup process.
:::

:::tip
Alternatively, if you are using Vertex AI, you can create an API key in Google Cloud instead of a service account. This key will function correctly, provided it is assigned the appropriate permissions.
Alternatively, if you are using Vertex AI, you can create an API key in Google Cloud instead of a service account. This key will function correctly, provided it is assigned the appropriate permissions. And given the Generative Language API is enabled for the project.
:::

### Configuring Open WebUI
Expand All @@ -31,12 +31,34 @@ Alternatively, if you are using Vertex AI, you can create an API key in Google C
5. Enter the model you wish to use from these [available models](https://ai.google.dev/gemini-api/docs/imagen#model-versions).
6. Set the image size to one of the available [image sizes](https://ai.google.dev/gemini-api/docs/image-generation#aspect_ratios).

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

### Example Minimal Setup

One minimalistic working setup for Gemini can look like this:
<Tabs>
<TabItem value="gemini-3-pro" label="Gemini 3.0 Pro (aka Nano Banana Pro)" default>

#### Create Image
**Create Image**
- **Create Image Model**: `gemini-3-pro-image-preview`
- **Image Size**: `2816x1536`
- **Image Prompt Generation**: on
- **Image Generation Engine**: `Gemini`
- **Gemini Base URL**: `https://generativelanguage.googleapis.com/v1beta`
- **Gemini API Key**: Enter your API Key
- **Gemini Endpoint Method**: `generateContent`

**Edit Image**
- **Image Edit Engine**: `Gemini`
- **Model**: `gemini-3-pro-image-preview`
- **Image Size**: (can be left empty)
- **Gemini Base URL**: `https://generativelanguage.googleapis.com/v1beta`
- **Gemini API Key**: Enter your API Key

</TabItem>
<TabItem value="gemini-2.5-flash" label="Gemini 2.5 Flash (aka Nano Banana)">

**Create Image**
- **Create Image Model**: `gemini-2.5-flash-image`
- **Image Size**: `2816x1536`
- **Image Prompt Generation**: on
Expand All @@ -45,14 +67,16 @@ One minimalistic working setup for Gemini can look like this:
- **Gemini API Key**: Enter your API Key
- **Gemini Endpoint Method**: `generateContent`

#### Edit Image

**Edit Image**
- **Image Edit Engine**: `Gemini`
- **Model**: `gemini-2.5-flash-image`
- **Image Size**: (can be left empty)
- **Gemini Base URL**: `https://generativelanguage.googleapis.com/v1beta`
- **Gemini API Key**: Enter your API Key

</TabItem>
</Tabs>

![Screenshot of the Open WebUI Images settings page with Gemini selected and the API key, model, and image size fields highlighted.](/images/image-generation-and-editing/gemini-settings.png)

:::info
Expand All @@ -69,12 +93,12 @@ Imagen model endpoint example:

Gemini model endpoint example:

- `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-image:generateContent`.
- `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContent`.
- [Documentation for Gemini models](https://ai.google.dev/gemini-api/docs/image-generation)

Trying to call a Gemini model, such as gemini-2.5-flash-image aka *Nano Banana* would result in an error due to the difference in supported endpoints for Image Generation.
Trying to call a Gemini model, such as `gemini-3-pro-image-preview` would result in an error due to the difference in supported endpoints for Image Generation.

`400: [ERROR: models/gemini-2.5-flash-image is not found for API version v1beta, or is not supported for predict. Call ListModels to see the list of available models and their supported methods.]`
`400: [ERROR: models/gemini-3-pro-image-preview is not found for API version v1beta, or is not supported for predict. Call ListModels to see the list of available models and their supported methods.]`

:::

Expand Down
30 changes: 22 additions & 8 deletions docs/features/image-generation-and-editing/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,38 @@ Before you can use image generation, you must ensure that the **Image Generation

## Using Image Generation

### Method 1

1. Toggle the `Image Generation` switch to on.
2. Enter your image generation prompt.
3. Click `Send`.

![Image Generation Tutorial](/images/tutorial_image_generation_2.png)

### Method 2

![Image Generation Tutorial](/images/tutorial_image_generation.png)

1. First, use a text generation model to write a prompt for image generation.
2. After the response has finished, you can click the Picture icon to generate an image.
3. After the image has finished generating, it will be returned automatically in chat.

:::tip

You can also edit the LLM's response and enter your image generation prompt as the message to send off for image generation instead of using the actual response provided by the LLM.


:::


:::info
**Requirement:** To use **Image Editing** or **Image+Image Generation**, you must have an **Image Generation Model** configured in the Admin Settings that supports these features (e.g., OpenAI DALL-E, or a ComfyUI/Automatic1111 model with appropriate inpainting/img2img capabilities).
:::

## Image Editing (Inpainting)

You can edit an image by providing the image and a text prompt directly in the chat.

1. **Upload an image** to the chat.
2. **Enter a prompt** describing the change you want to make (e.g., "Change the background to a sunset" or "Add a hat").
3. The model will generate a new version of the image based on your prompt.

## Image Compositing (Multi-Image Fusion)

Seamlessly combine multiple images into a single cohesive scene—a process professionally known as **Image Compositing** or **Multi-Image Fusion**. This allows you to merge elements from different sources (e.g., placing a subject from one image into the background of another) while harmonizing lighting, perspective, and style.

1. **Upload images** to the chat (e.g., upload an image of a subject and an image of a background).
2. **Enter a prompt** describing the desired composition (e.g., "Combine these images to show the cat sitting on the park bench, ensuring consistent lighting").
3. The model will generate a new composite image that fuses the elements according to your instructions.
2 changes: 1 addition & 1 deletion docs/features/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ import { TopBanners } from "@site/src/components/TopBanners";

- 🌐 **Web Browsing Capabilities**: Integrate websites seamlessly into your chat experience by using the `#` command followed by a URL. This feature enables the incorporation of web content directly into your conversations, thereby enhancing the richness and depth of your interactions.

- 🎨 **Image Generation & Editing Integration**: Seamlessly create and edit images using multiple engines including OpenAI's DALL-E (generation and editing), Gemini (generation and editing), ComfyUI (local, generation and editing), and AUTOMATIC1111 (local, generation). Support for both text-to-image generation and prompt-based image editing workflows with dynamic visual content. [Learn more about Image Gen](/category/create--edit-images).
- 🎨 **Image Generation & Editing Integration**: Seamlessly create and edit images using multiple engines including OpenAI's DALL-E, Gemini, ComfyUI, and AUTOMATIC1111. Open WebUI now supports **Image Compositing** and **Image Editing** (inpainting/editing), allowing you to transform existing images and refine your creations with ease. [Learn more about Image Gen](/category/create--edit-images).

- ⚙️ **Concurrent Model Utilization**: Effortlessly engage with multiple models simultaneously, harnessing their unique strengths for optimal responses. Leverage a diverse set of model modalities in parallel to enhance your experience.

Expand Down
10 changes: 10 additions & 0 deletions docs/features/web-search/brave.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,13 @@ This means that even if your connection is fast enough to send multiple sequenti
:::tip
If you are on Brave's paid tier with higher rate limits, you can increase `RAG_WEB_SEARCH_CONCURRENT_REQUESTS` for faster parallel searches.
:::

:::info Understanding Concurrency & Rate Limits

The `RAG_WEB_SEARCH_CONCURRENT_REQUESTS` setting controls concurrency **per individual search request**, not globally across the entire application.

- **When this is NOT an issue**: For single-user instances or low-traffic setups where users rarely hit "Enter" at the exact same second, setting concurrency to `1` is usually sufficient to stay within the Free Tier limits (1 req/sec).
- **When this IS an issue**: If multiple users trigger web searches at the exact same moment (e.g., 3 users searching in the same second), Open WebUI will process these requests in parallel. Each user's request creates its own connection pool, meaning 3 requests will be sent to the API simultaneously, triggering a rate limit error on the Free Tier.

**Note:** If you are running an environment with multiple concurrent users actively using web search, it is highly recommended to upgrade to a paid API tier. The Free Tier is not designed to support the throughput of a multi-user deployment.
:::
4 changes: 3 additions & 1 deletion docs/features/web-search/jina.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ To enable the Jina web search integration, follow these steps in the Open WebUI
2. **Navigate to Web Search Settings:** Go to the **Admin Panel**, then click on **Settings** > **Web Search**.
3. **Select Jina as the Search Engine:** In the "Web Search Engine" dropdown menu, select **Jina**.
4. **Enter Your API Key:** Paste your Jina API key into the **Jina API Key** input field.
5. **Save Changes:** Scroll down and click the **Save** button to apply the changes.
5. **(Optional) Enter Jina API Base URL:** If you need to use a specific endpoint (e.g., for EU data processing), enter it in the **Jina API Base URL** field. Default is `https://s.jina.ai/`.
6. **Save Changes:** Scroll down and click the **Save** button to apply the changes.

### 3. Environment Variable Configuration

Expand All @@ -66,6 +67,7 @@ For Docker-based deployments, you can configure the Jina integration using an en
Set the following environment variable for your Open WebUI instance:

- `JINA_API_KEY`: Your Jina API key.
- `JINA_API_BASE_URL`: (Optional) Custom Jina API endpoint.

**Example Docker `run` command:**

Expand Down
64 changes: 47 additions & 17 deletions docs/getting-started/env-configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,13 @@ is also being used and set to `True`. **Never disable this if OAUTH/SSO is not b
- Description: Enables or disables the folders feature, allowing users to organize their chats into folders in the sidebar.
- Persistence: This environment variable is a `PersistentConfig` variable.

#### `FOLDER_MAX_FILE_COUNT`

- Type: `int`
- Default: `100`
- Description: Sets the maximum number of files processing allowed per folder.
- Persistence: This environment variable is a `PersistentConfig` variable. It can be configured in the **Admin Panel > Settings > General > Folder Max File Count**.

#### `ENABLE_NOTES`

- Type: `bool`
Expand Down Expand Up @@ -504,7 +511,7 @@ See the [Model List Loading Issues](/troubleshooting/connection-error#️-model-

- Type: `bool`
- Default: `True`
- Description: Controls SSL/TLS verification for AIOHTTP client sessions when connecting to external APIs.
- Description: Controls SSL/TLS verification for AIOHTTP client sessions when connecting to external APIs (e.g., Ollama Embeddings).

#### `AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA`

Expand All @@ -518,6 +525,12 @@ See the [Model List Loading Issues](/troubleshooting/connection-error#️-model-
- Default: `True`
- Description: Controls SSL/TLS verification specifically for tool server connections via AIOHTTP client.

#### `REQUESTS_VERIFY`

- Type: `bool`
- Default: `True`
- Description: Controls SSL/TLS verification for synchronous `requests` (e.g., Tika, External Reranker). Set to `False` to bypass certificate verification for self-signed certificates.

### Directories

#### `DATA_DIR`
Expand Down Expand Up @@ -551,6 +564,18 @@ See the [Model List Loading Issues](/troubleshooting/connection-error#️-model-
- Default: `INFO`
- Description: Sets the global logging level for all Open WebUI components. Valid values: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`.

#### `ENABLE_AUDIT_STDOUT`

- Type: `bool`
- Default: `False`
- Description: Controls whether audit logs are output to stdout (console). Useful for containerized environments where logs are collected from stdout.

#### `ENABLE_AUDIT_LOGS_FILE`

- Type: `bool`
- Default: `True`
- Description: Controls whether audit logs are written to a file. When enabled, logs are written to the location specified by `AUDIT_LOGS_FILE_PATH`.

#### `AUDIT_LOGS_FILE_PATH`

- Type: `str`
Expand Down Expand Up @@ -2741,6 +2766,12 @@ If you are embedding externally via API, ensure your rate limits are high enough
- Description: Sets a model for reranking results. Locally, a Sentence-Transformer model is used.
- Persistence: This environment variable is a `PersistentConfig` variable.

#### `SENTENCE_TRANSFORMERS_CROSS_ENCODER_SIGMOID_ACTIVATION_FUNCTION`

- Type: `bool`
- Default: `True`
- Description: When enabled (default), applies sigmoid normalization to local CrossEncoder reranking scores to ensure they fall within the 0-1 range. This allows the relevance threshold setting to work correctly with models like MS MARCO that output raw logits.

#### `RAG_EXTERNAL_RERANKER_TIMEOUT`

- Type: `str`
Expand Down Expand Up @@ -3184,6 +3215,13 @@ Brave's free tier enforces a rate limit of 1 request per second. Open WebUI auto
- Description: Sets the API key for Jina.
- Persistence: This environment variable is a `PersistentConfig` variable.

#### `JINA_API_BASE_URL`

- Type: `str`
- Default: `https://s.jina.ai/`
- Description: Sets the Base URL for Jina Search API. Useful for specifying custom or regional endpoints (e.g., `https://eu-s-beta.jina.ai/`).
- Persistence: This environment variable is a `PersistentConfig` variable. It can be configured in the **Admin Panel > Settings > Web Search > Jina API Base URL**.

#### `BING_SEARCH_V7_ENDPOINT`

- Type: `str`
Expand Down Expand Up @@ -3416,6 +3454,13 @@ Using a remote Playwright browser via `PLAYWRIGHT_WS_URL` can be beneficial for:
- Description: Sets the API key for Firecrawl API.
- Persistence: This environment variable is a `PersistentConfig` variable.

#### `FIRECRAWL_TIMEOUT`

- Type: `int`
- Default: `None`
- Description: Specifies the timeout in milliseconds for Firecrawl requests. If not set, the default Firecrawl timeout is used.
- Persistence: This environment variable is a `PersistentConfig` variable. It can be configured in the **Admin Panel > Settings > Web Search > Firecrawl Timeout**.

#### `PLAYWRIGHT_TIMEOUT`

- Type: `int`
Expand Down Expand Up @@ -3904,22 +3949,7 @@ Strictly return in JSON format:

:::tip

One minimalistic working setup for Gemini can look like this:

- Create Image
- Model: `gemini-2.5-flash-image`
- Image Size: `2816x1536`
- Image Prompt Generation: on
- Image Generation Engine: `Gemini`
- Gemini Base URL: `https://generativelanguage.googleapis.com/v1beta`
- Gemini API Key: Enter your API Key
- Gemini Endpoint Method: `generateContent`
- Edit Image
- Image Edit Engine: `Gemini`
- Model: `gemini-2.5-flash-image`
- Image Size: (can be left empty)
- Gemini Base URL: `https://generativelanguage.googleapis.com/v1beta`
- Gemini API Key: Enter your API Key
For a detailed setup guide and example configuration, please refer to the [Gemini Image Generation Guide](/features/image-generation-and-editing/gemini).

:::

Expand Down
54 changes: 49 additions & 5 deletions docs/troubleshooting/connection-error.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,35 @@ Encountered an SSL error? It could be an issue with the Hugging Face server. Her
docker run -d -p 3000:8080 -e HF_ENDPOINT=https://hf-mirror.com/ --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
```

## 🔐 SSL Certificate Issues with Internal Tools

If you are using external tools like Tika, Ollama (for embeddings), or an external reranker with self-signed certificates, you might encounter SSL verification errors.

### Common Symptoms

- Logs show `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate`
- Tika document ingestion fails
- Embedding generation fails with SSL errors
- Reranking fails with SSL errors

### Solution

You can disable SSL verification for these internal tool connections using the following environment variables:

1. **For synchronous requests (Tika, External Reranker):**
```bash
REQUESTS_VERIFY=false
```

2. **For asynchronous requests (Ollama Embeddings):**
```bash
AIOHTTP_CLIENT_SESSION_SSL=false
```

:::warning
Disabling SSL verification reduces security. Only do this if you trust the network and the services you are connecting to (e.g., functioning within a secure internal network).
:::

## 🍏 Podman on MacOS

Running on MacOS with Podman? Here’s how to ensure connectivity:
Expand All @@ -255,17 +284,32 @@ If you are having trouble connecting to MCP tools (e.g. "Failed to connect to MC

See the [MCP Feature Documentation](/features/mcp#troubleshooting) for detailed troubleshooting steps.

## 🔐 SSL/TLS Errors with Web Search (Proxy Issues)
## 🔐 SSL/TLS Errors with Web Search

If you are encountering SSL errors while using the Web Search feature, they usually fall into two categories: Proxy configuration issues or Certificate verification issues.

### Certificate Verification Issues

If you are seeing SSL verification errors when Open WebUI tries to fetch content from websites (Web Loader):

- **Symptom**: `[SSL: CERTIFICATE_VERIFY_FAILED]` when loading search results.
- **Solution**: You can disable SSL verification for the Web Loader (scraper) specifically.
```bash
ENABLE_WEB_LOADER_SSL_VERIFICATION=false
```
> **Note**: This setting applies to the *fetching* of web pages. If you are having SSL issues with the Search Engine itself (e.g., local SearXNG) or subsequent steps (Embedding/Reranking), see the sections below.

### Proxy Configuration Issues

If you're seeing SSL errors like `UNEXPECTED_EOF_WHILE_READING` or `Max retries exceeded` when using web search providers (Bocha, Tavily, etc.):

### Common Symptoms
#### Common Symptoms

- `SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING]'))`
- `Max retries exceeded with url: /v1/web-search`
- Web search works in standalone Python scripts but fails in Open WebUI

### Cause: HTTP Proxy Configured for HTTPS Traffic
#### Cause: HTTP Proxy Configured for HTTPS Traffic

This typically happens when you have an **HTTP proxy** configured for **HTTPS traffic**. The HTTP proxy cannot properly handle TLS connections, causing SSL handshake failures.

Expand All @@ -275,7 +319,7 @@ Check your environment for these variables:

If your `https_proxy` points to `http://...` (HTTP) instead of `https://...` (HTTPS), SSL handshakes will fail because the proxy terminates the connection unexpectedly.

### Solutions
#### Solutions

1. **Fix proxy configuration**: Use an HTTPS-capable proxy for HTTPS traffic, or configure your HTTP proxy to properly support CONNECT tunneling for SSL
2. **Bypass proxy for specific hosts**: Set `NO_PROXY` environment variable:
Expand All @@ -284,6 +328,6 @@ If your `https_proxy` points to `http://...` (HTTP) instead of `https://...` (HT
```
3. **Disable proxy if not needed**: Unset the proxy environment variables entirely

### Why Standalone Scripts Work
#### Why Standalone Scripts Work

When you run a Python script directly, it may not inherit the same proxy environment variables that your Open WebUI service is using. The service typically inherits environment variables from systemd, Docker, or your shell profile, which may have different proxy settings.
Loading