🚚 迁移指南:Open WebUI 0.4到0.5
欢迎来到Open WebUI 0.5迁移指南!如果您正在处理现有项目或构建新项目,本指南将引导您了解从版本0.4到0.5的关键变化,并提供易于遵循的升级函数路线图。让我们尽可能顺利地进行这个过渡!😊
🧐 发生了什么变化以及为什么?
在Open WebUI 0.5中,我们彻底改革了架构,使项目更简单、更统一和可扩展。这里是大图景:
- 旧架构:🎯 以前,Open WebUI建立在子应用架构上,其中每个应用(例如,
ollama
、openai
)都是一个独立的FastAPI应用程序。这在管理应用程序时造成了碎片化和额外的复杂 性。 - 新架构:🚀 在版本0.5中,我们已经转换为具有多个路由器的单一FastAPI应用。这意味着更好的组织、集中化流程和减少冗余。
关键变化:
以下是变化的概述:
-
应用已移动到路由器。
- 之前:
open_webui.apps
- 现在:
open_webui.routers
- 之前:
-
简化了主应用结构。
- 旧的
open_webui.apps.webui
已转换为open_webui.main
,使其成为项目的中央入口点。
- 旧的
-
统一API端点
- Open WebUI 0.5在
open_webui.main
中引入了统一函数chat_completion
,取代了像ollama
和openai
这样的模型的单独函数。这提供了一致和简化的API体验。但是,这些单独函数的直接继承者是来自open_webui.utils.chat
的generate_chat_completion
。如果您更喜欢轻量级的POST请求而不处理额外的解析(例如,文件、工具或杂项),这个实用函数可能是您想要的。
- Open WebUI 0.5在
示例:
# 具有解析的完整API流程(新函数):
from open_webui.main import chat_completion
# 轻量级、直接POST请求(直接继承者):
from open_webui.utils.chat import generate_chat_completion
选择最适合您用例的方法!
- 更新的函数签名。
- 函数签名现在遵循新格式,需要一个
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.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 |
📜 一个重要的示例
为了澄清主应用(webui
)的特殊情况,这里有一个简单的经验法则:
- **在
webui
中吗?**现在在项目的根目录或open_webui.main
中。 - 例如:
- 之前(0.4):
from open_webui.apps.webui.models import SomeModel
- 之后(0.5):
from open_webui.models import SomeModel
- 之前(0.4):
一般来说,只需将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_completion
和utils.chat.generate_chat_completion
之间选择
根据您的用例,您可以选择:
-
open_webui.main.chat_completion
:- 模拟向
/api/chat/completions
发出POST请求。 - 处理文件、工具和其他杂项任务。
- 当您希望自动处理完整的API流程时最佳。
- 模拟向
-
open_webui.utils.chat.generate_chat_completion
:- 直接发出POST请求而不处理额外的解析或任务。
- 这是Open WebUI 0.4中之前的
main.generate_chat_completions
、ollama.generate_chat_completion
和openai.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)