Skip to main content

🚚 迁移指南:Open WebUI 0.4到0.5

欢迎来到Open WebUI 0.5迁移指南!如果您正在处理现有项目或构建新项目,本指南将引导您了解从版本0.4到0.5的关键变化,并提供易于遵循的升级函数路线图。让我们尽可能顺利地进行这个过渡!😊


🧐 发生了什么变化以及为什么?

在Open WebUI 0.5中,我们彻底改革了架构,使项目更简单、更统一和可扩展。这里是大图景:

  • 旧架构:🎯 以前,Open WebUI建立在子应用架构上,其中每个应用(例如,ollamaopenai)都是一个独立的FastAPI应用程序。这在管理应用程序时造成了碎片化和额外的复杂性。
  • 新架构:🚀 在版本0.5中,我们已经转换为具有多个路由器单一FastAPI应用。这意味着更好的组织、集中化流程和减少冗余。

关键变化:

以下是变化的概述:

  1. 应用已移动到路由器。

    • 之前:open_webui.apps
    • 现在:open_webui.routers
  2. 简化了主应用结构。

    • 旧的open_webui.apps.webui已转换为open_webui.main,使其成为项目的中央入口点。
  3. 统一API端点

    • Open WebUI 0.5在open_webui.main中引入了统一函数chat_completion,取代了像ollamaopenai这样的模型的单独函数。这提供了一致和简化的API体验。但是,这些单独函数的直接继承者是来自open_webui.utils.chatgenerate_chat_completion。如果您更喜欢轻量级的POST请求而不处理额外的解析(例如,文件、工具或杂项),这个实用函数可能是您想要的。

示例:

# 具有解析的完整API流程(新函数):
from open_webui.main import chat_completion

# 轻量级、直接POST请求(直接继承者):
from open_webui.utils.chat import generate_chat_completion

选择最适合您用例的方法!

  1. 更新的函数签名。
    • 函数签名现在遵循新格式,需要一个request对象。
    • 可以使用函数签名中的__request__参数获取request对象。以下是一个示例:
class Pipe:
def __init__(self):
pass

async def pipe(
self,
body: dict,
__user__: dict,
__request__: Request, # 新参数
) -> str:
# 在这里编写您的函数

📌 我们为什么做这些更改?

  • 简化代码库,使其更易于扩展和维护。
  • 统一API以获得更简化的开发人员体验。
  • 通过整合冗余元素来提高性能。

✅ 分步迁移指南

遵循本指南以顺利更新您的项目。


🔄 1. 从apps转移到routers

所有应用已重命名并重新定位在open_webui.routers下。这影响代码库中的导入。

导入路径的快速更改:

旧路径新路径
open_webui.apps.ollamaopen_webui.routers.ollama
open_webui.apps.openaiopen_webui.routers.openai
open_webui.apps.audioopen_webui.routers.audio
open_webui.apps.retrievalopen_webui.routers.retrieval
open_webui.apps.webuiopen_webui.main

📜 一个重要的示例

为了澄清主应用(webui)的特殊情况,这里有一个简单的经验法则:

  • **在webui中吗?**现在在项目的根目录或open_webui.main中。
  • 例如:
    • 之前(0.4):
      from open_webui.apps.webui.models import SomeModel
    • 之后(0.5):
      from open_webui.models import SomeModel

一般来说,只需将open_webui.apps替换为open_webui.routers——除了webui,现在是open_webui.main


👩‍💻 2. 更新导入语句

让我们看看这个更新在您的代码中是什么样子的:

之前:

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

之后:

# 单独的路由器导入
from open_webui.routers.ollama import generate_chat_completion
from open_webui.routers.openai import generate_chat_completion

# 或使用统一端点
from open_webui.main import chat_completion

**💡 专业提示:**为了简单性和未来兼容性,优先使用统一端点(chat_completion)。

📝 附加说明:在main.chat_completionutils.chat.generate_chat_completion之间选择

根据您的用例,您可以选择:

  1. open_webui.main.chat_completion

    • 模拟向/api/chat/completions发出POST请求。
    • 处理文件、工具和其他杂项任务。
    • 当您希望自动处理完整的API流程时最佳。
  2. open_webui.utils.chat.generate_chat_completion

    • 直接发出POST请求而不处理额外的解析或任务。
    • 这是Open WebUI 0.4中之前的main.generate_chat_completionsollama.generate_chat_completionopenai.generate_chat_completion函数的直接继承者
    • 最适合简化和更轻量级的场景。

示例:

# 为具有解析的完整API流程使用此:
from open_webui.main import chat_completion

# 为精简的直接POST请求使用此:
from open_webui.utils.chat import generate_chat_completion

📋 3. 适应更新的函数签名

我们已经更新了函数签名以更好地适应新架构。如果您正在寻找直接替代品,请从open_webui.utils.chat的轻量级实用函数generate_chat_completion开始。对于完整的API流程,使用open_webui.main中的新统一chat_completion函数。

函数签名更改:

直接继承者(新)统一选项(新)
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)
  • 直接继承者(generate_chat_completion:之前ollama/openai方法的轻量级1:1替代品。
  • 统一选项(chat_completion:为完整的API流程使用此选项,包括文件解析和附加功能。

示例:

如果您使用chat_completion,以下是您的函数现在应该的样子:

🛠️ 如何重构您的自定义函数

让我们重写一个示例函数以匹配新结构:

之前(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:
# 调用OpenAI端点
user = User(**__user__)
body["model"] = "llama3.2:latest"
return await ollama.generate_chat_completion(body, user)

之后(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:
# 使用更新签名的统一端点
user = User(**__user__)
body["model"] = "llama3.2:latest"
return await generate_chat_completion(__request__, body, user)

重要注意事项:

  • 您必须在新函数签名中传递Request对象(__request__)。
  • 其他可选参数(如__user____event_emitter__)确保了更复杂用例的灵活性。

🌟 4. 回顾:简单术语中的关键概念

这里有一个快速备忘单要记住:

  • **应用到路由器:**将所有导入从open_webui.apps➡️open_webui.routers更新。
  • **统一端点:**如果涉及ollamaopenai,使用open_webui.main.chat_completion以获得简单性。
  • **适应函数签名:**确保您的函数传递所需的request对象。

🎉 万岁!您准备好了!

就这样!您已经成功从Open WebUI 0.4迁移到0.5。通过重构您的导入、使用统一端点和更新函数签名,您将完全准备好利用版本0.5中的最新功能和改进。


💬 问题或反馈? 如果您遇到任何问题或有建议,请随时打开GitHub问题或在社区论坛中询问!

编程愉快!✨