# Migration Guide: Open WebUI 0.4 to 0.5

Source: https://docs.openwebui.com/features/extensibility/plugin/migration/to-0.5.0

Welcome to the Open WebUI 0.5 migration guide! If you're working on existing projects or building new ones, this guide will walk you through the key changes from **version 0.4 to 0.5** and provide an easy-to-follow roadmap for upgrading your Functions. Let's make this transition as smooth as possible! 😊

---

## 🧐 What Has Changed and Why?

With Open WebUI 0.5, we’ve overhauled the architecture to make the project **simpler, more unified, and scalable**. Here's the big picture:

- **Old Architecture:** 🎯 Previously, Open WebUI was built on a **sub-app architecture** where each app (e.g., `ollama`, `openai`) was a separate FastAPI application. This caused fragmentation and extra complexity when managing apps.
- **New Architecture:** 🚀 With version 0.5, we have transitioned to a **single FastAPI app** with multiple **routers**. This means better organization, centralized flow, and reduced redundancy.

### Key Changes:

Here’s an overview of what changed:

1. **Apps have been moved to Routers.**

- Previous: `open_webui.apps`
- Now: `open_webui.routers`
2. **Main app structure simplified.**

- The old `open_webui.apps.webui` has been transformed into `open_webui.main`, making it the central entry point for the project.
3. **Unified API Endpoint**

- Open WebUI 0.5 introduces a **unified function**, `chat_completion`, in `open_webui.main`, replacing separate functions for models like `ollama` and `openai`. This offers a consistent and streamlined API experience. However, the **direct successor** of these individual functions is `generate_chat_completion` from `open_webui.utils.chat`. If you prefer a lightweight POST request without handling additional parsing (e.g., files, tools, or misc), this utility function is likely what you want.

#### Example:

```

# Full API flow with parsing (new function):
from open_webui.main import chat_completion

# Lightweight, direct POST request (direct successor):
from open_webui.utils.chat import generate_chat_completion
```

Choose the approach that best fits your use case!

1. **Updated Function Signatures.**
- Function signatures now adhere to a new format, requiring a `request` object.
- The `request` object can be obtained using the `__request__` parameter in the function signature. Below is an example:

```
class Pipe:
    def __init__(self):
        pass

    async def pipe(
        self,
        body: dict,
        __user__: dict,
        __request__: Request, # New parameter
    ) -> str:
# Write your function here
```

📌 **Why did we make these changes?**

- To simplify the codebase, making it easier to extend and maintain.
- To unify APIs for a more streamlined developer experience.
- To enhance performance by consolidating redundant elements.

---

## ✅ Step-by-Step Migration Guide

Follow this guide to smoothly update your project.

---

### 🔄 1. Shifting from `apps` to `routers`

All apps have been renamed and relocated under `open_webui.routers`. This affects imports in your codebase.

Quick changes for import paths:

| Old Path | New Path |
| --- | --- |
| open_webui.apps.ollama | open_webui.routers.ollama |
| open_webui.apps.openai | open_webui.routers.openai |
| open_webui.apps.audio | open_webui.routers.audio |
| open_webui.apps.retrieval | open_webui.routers.retrieval |
| open_webui.apps.webui | open_webui.main |

### 📜 An Important Example

To clarify the special case of the main app (`webui`), here’s a simple rule of thumb:

- **Was in `webui`?** It’s now in the project’s root or `open_webui.main`.
- For example:
- **Before (0.4):**

```
from open_webui.apps.webui.models.chats import Chats
```
- **After (0.5):**

```
from open_webui.models.chats import Chats
```

In general, **just replace `open_webui.apps` with `open_webui.routers`, except for `webui`, which is now `open_webui.main`!**

---

### 👩‍💻 2. Updating Import Statements

Let’s look at what this update looks like in your code:

#### Before:

```
from open_webui.apps.ollama import main as ollama
from open_webui.apps.openai import main as openai
```

#### After:

```

# Separate router imports
from open_webui.routers.ollama import generate_chat_completion
from open_webui.routers.openai import generate_chat_completion

# Or use the unified endpoint
from open_webui.main import chat_completion
```

> **tip**
>
> Prioritize the unified endpoint (`chat_completion`) for simplicity and future compatibility.

### 📝 **Additional Note: Choosing Between `main.chat_completion` and `utils.chat.generate_chat_completion`**

Depending on your use case, you can choose between:

1. **`open_webui.main.chat_completion`:**

- Simulates making a POST request to `/api/chat/completions`.
- Processes files, tools, and other miscellaneous tasks.
- Best when you want the complete API flow handled automatically.
2. **`open_webui.utils.chat.generate_chat_completion`:**

- Directly makes a POST request without handling extra parsing or tasks.
- This is the **direct successor** to the previous `main.generate_chat_completions`, `ollama.generate_chat_completion` and `openai.generate_chat_completion` functions in Open WebUI 0.4.
- Best for simplified and more lightweight scenarios.

#### Example:

```

# Use this for the full API flow with parsing:
from open_webui.main import chat_completion

# Use this for a stripped-down, direct POST request:
from open_webui.utils.chat import generate_chat_completion
```

---

### 📋 3. Adapting to Updated Function Signatures

We’ve updated the **function signatures** to better fit the new architecture. If you're looking for a direct replacement, start with the lightweight utility function `generate_chat_completion` from `open_webui.utils.chat`. For the full API flow, use the new unified `chat_completion` function in `open_webui.main`.

#### Function Signature Changes:

| Old | Direct Successor (New) | Unified Option (New) |
| --- | --- | --- |
| openai.generate_chat_completion(form_data: dict, user: UserModel) | generate_chat_completion(request: Request, form_data: dict, user: UserModel) | chat_completion(request: Request, form_data: dict, user: UserModel) |

- **Direct Successor (`generate_chat_completion`)**: A lightweight, 1:1 replacement for previous `ollama`/`openai` methods.
- **Unified Option (`chat_completion`)**: Use this for the complete API flow, including file parsing and additional functionality.

#### Example:

If you're using `chat_completion`, here’s how your function should look now:

### 🛠️ How to Refactor Your Custom Function

Let’s rewrite a sample function to match the new structure:

#### Before (0.4):

```
from pydantic import BaseModel
from open_webui.apps.ollama import generate_chat_completion

class User(BaseModel):
    id: str
    email: str
    name: str
    role: str

class Pipe:
    def __init__(self):
        pass

    async def pipe(self, body: dict, __user__: dict) -> str:
# Calls OpenAI endpoint
        user = User(**__user__)
        body["model"] = "qwen3.6:27b"
        return await ollama.generate_chat_completion(body, user)
```

#### After (0.5):

```
from pydantic import BaseModel
from fastapi import Request

from open_webui.utils.chat import generate_chat_completion

class User(BaseModel):
    id: str
    email: str
    name: str
    role: str

class Pipe:
    def __init__(self):
        pass

    async def pipe(
        self,
        body: dict,
        __user__: dict,
        __request__: Request,
    ) -> str:
# Uses the unified endpoint with updated signature
        user = User(**__user__)
        body["model"] = "qwen3.6:27b"
        return await generate_chat_completion(__request__, body, user)
```

### Important Notes:

- You must pass a `Request` object (`__request__`) in the new function signature.
- Other optional parameters (like `__user__` and `__event_emitter__`) ensure flexibility for more complex use cases.

---

### 🌟 4. Recap: Key Concepts in Simple Terms

Here’s a quick cheat sheet to remember:

- **Apps to Routers:** Update all imports from `open_webui.apps` ➡️ `open_webui.routers`.
- **Unified Endpoint:** Use `open_webui.main.chat_completion` for simplicity if both `ollama` and `openai` are involved.
- **Adapt Function Signatures:** Ensure your functions pass the required `request` object.

---

## 🎉 Hooray! You're Ready!

That's it! You've successfully migrated from **Open WebUI 0.4 to 0.5**. By refactoring your imports, using the unified endpoint, and updating function signatures, you'll be fully equipped to leverage the latest features and improvements in version 0.5.

---

💬 **Questions or Feedback?** If you run into any issues or have suggestions, feel free to open a [GitHub issue](https://github.com/open-webui/open-webui) or ask in the community forums!

Happy coding! ✨
