管线与 Function 系统(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/13.5-pipeline-and-function-system
翻译时间:2026-06-09T16:11:18.128Z
翻译模型:deepseek-chat
原文字符数:10822
项目:Open WebUI (open-webui)
---
管道与函数系统
相关源文件
以下文件为本 Wiki 页面的生成提供了上下文:
backend/open_webui/functions.pybackend/open_webui/migrations/versions/c1d2e3f4a5b6_add_shared_chat_table.pybackend/open_webui/models/functions.pybackend/open_webui/models/shared_chats.pybackend/open_webui/models/tags.pybackend/open_webui/routers/functions.pybackend/open_webui/routers/terminals.pybackend/open_webui/utils/access_control/__init__.pybackend/open_webui/utils/access_control/files.pybackend/open_webui/utils/chat.pybackend/open_webui/utils/filter.pybackend/open_webui/utils/models.pybackend/open_webui/utils/plugin.pysrc/lib/components/admin/Functions.sveltesrc/lib/components/chat/FileNav/PortList.sveltesrc/lib/components/chat/FileNav/PortPreview.sveltesrc/lib/components/chat/XTerminal.sveltesrc/lib/components/workspace/Knowledge.sveltesrc/lib/components/workspace/Models.sveltesrc/lib/components/workspace/Prompts.sveltesrc/lib/components/workspace/Tools.svelte
Open WebUI 中的管道与函数系统提供了一个模块化框架,用于扩展平台能力。它支持自定义模型实现(Manifold/Pipe)、请求/响应转换(Inlet/Outlet 过滤器)以及高级工具执行。该系统允许开发者将任意逻辑——从外部 API 调用到复杂的内容过滤——直接集成到聊天生命周期中。
系统架构
该系统基于插件架构构建,Python 模块在 FastAPI 后端中被加载和执行。这些模块可以是"函数"(存储在数据库中并在本地执行)或"管道"(托管在独立的管道服务器上)。
核心组件与代码实体
图表:管道与函数系统实体
graph TD
subgraph "自然语言空间"
User["用户/开发者"]
CustomLogic["自定义逻辑/扩展"]
end
subgraph "代码实体空间(后端)"
FunctionsModel["Functions (backend/open_webui/models/functions.py)"]
PluginUtil["插件加载器 (backend/open_webui/utils/plugin.py)"]
FilterUtil["过滤器处理器 (backend/open_webui/utils/filter.py)"]
FunctionsRouter["Functions 路由 (backend/open_webui/routers/functions.py)"]
ChatUtil["聊天工具 (backend/open_webui/utils/chat.py)"]
end
subgraph "外部空间"
PipeServer["管道服务器(外部 Python 进程)"]
end
User -->|创建/管理| FunctionsModel
FunctionsModel -->|由...加载| PluginUtil
ChatUtil -->|调用| FilterUtil
FilterUtil -->|执行| PluginUtil
FunctionsRouter -->|管理| FunctionsModel
ChatUtil -->|使用| FunctionsRouter
FunctionsRouter -->|代理到| PipeServer
来源:backend/open_webui/utils/chat.py:34-51,backend/open_webui/utils/plugin.py:11-20,backend/open_webui/models/functions.py:21-37,backend/open_webui/routers/functions.py:10-31
函数类型
函数根据其在系统中的角色进行分类。它们定义在 Function 数据库模型中,并通过 FunctionsTable 类动态加载。
| 类型 | 代码标识符 | 用途 | 实现点 |
|---|---|---|---|
| 过滤器 | filter | 拦截请求(Inlet)和响应(Outlet)。 | process_filter_functions backend/open_webui/utils/filter.py:66-134 |
| 动作 | action | 为消息添加用于特定任务的 UI 按钮。 | get_functions_by_type('action') backend/open_webui/models/functions.py:230 |
| 管道 | pipe | 定义自定义模型或模型提供商。 | generate_function_chat_completion backend/open_webui/functions.py:153-191 |
来源:backend/open_webui/utils/chat.py:34-37,backend/open_webui/utils/models.py:133-138,backend/open_webui/functions.py:77-150,backend/open_webui/models/functions.py:110-126
过滤器管道(Inlet 和 Outlet)
过滤器是中间件处理的主要机制。它们包裹了标准的 LLM 请求/响应周期。
执行流程
当通过 generate_chat_completion backend/open_webui/utils/chat.py:158 请求聊天补全时,系统遵循严格的顺序:
- Inlet 过滤器: 在请求发送到 LLM 提供商之前,由
process_filter_functionsbackend/open_webui/utils/filter.py:66以filter_type='inlet'执行。 - LLM 处理: 请求被转发到 OpenAI、Ollama 或自定义 Pipe。
- Outlet 过滤器: 在 LLM 返回响应之后、到达用户之前,由
process_filter_functionsbackend/open_webui/utils/filter.py:66以filter_type='outlet'执行。
图表:过滤器中间件序列
sequenceDiagram
participant U as "用户(前端)"
participant M as "generate_chat_completion (backend/open_webui/utils/chat.py)"
participant F as "process_filter_functions (backend/open_webui/utils/filter.py)"
participant L as "LLM 提供商 (OpenAI/Ollama/Pipe)"
U->>M: "发送消息"
M->>F: "process_filter_functions (inlet)"
Note over F: "执行所有活跃的 Filter.inlet() 方法"
F-->>M: "修改后的负载"
M->>L: "生成响应"
L-->>M: "原始响应"
M->>F: "process_filter_functions (outlet)"
Note over F: "执行所有活跃的 Filter.outlet() 方法"
F-->>M: "修改后的响应"
M-->>U: "最终消息"
来源:backend/open_webui/utils/chat.py:158-164,backend/open_webui/utils/chat.py:34-37,backend/open_webui/utils/filter.py:66-134
过滤器实现
过滤器函数必须实现一个名为 Filter 的类,并包含 inlet 和/或 outlet 方法。这些方法接收请求 body 和 __user__ 对象。
系统使用 get_sorted_filter_ids backend/open_webui/utils/filter.py:21-61 根据函数 Valves 中定义的 priority 值确定执行顺序。
# backend/open_webui/utils/filter.py 逻辑
async def process_filter_functions(request, filter_functions, filter_type, form_data, extra_params):
for function in filter_functions:
# ... 加载模块并检查处理程序(inlet/outlet)的逻辑
handler = getattr(function_module, filter_type, None)
# ... 使用检查过的签名参数执行处理程序
form_data = await handler(**params)
return form_data, {}
来源:backend/open_webui/utils/filter.py:21-31,backend/open_webui/utils/filter.py:66-134
Manifold 和 Pipe 系统
Manifold 系统允许开发者创建自定义模型提供商。这用于集成原生不支持的模型,或创建包装其他逻辑的"虚拟"模型。
关键函数
get_function_models:通过检查pipe或pipes属性,发现函数中定义的模型。backend/open_webui/functions.py:77-150generate_function_chat_completion:将聊天请求路由到函数的自定义pipe方法,处理标准和流式响应。backend/open_webui/functions.py:153-191
模型发现
通过 Manifold 系统创建的模型与 Ollama 和 OpenAI 模型一起在 get_all_models backend/open_webui/utils/models.py:80-131 中聚合。函数可以定义一个包含 pipes 属性的 Pipe 类,该属性可以是子管道列表,也可以是返回此类列表的可调用对象。
来源:backend/open_webui/utils/models.py:73-77,backend/open_webui/utils/models.py:176-192,backend/open_webui/functions.py:77-150
工作区集成
前端在"工作区"部分提供了管理这些实体的界面。
- 函数管理: 由
src/lib/components/admin/Functions.sveltesrc/lib/components/admin/Functions.svelte:1-44处理。允许管理员创建、删除和切换过滤器与动作的全局状态。 - 模型配置:
src/lib/components/workspace/Models.sveltesrc/lib/components/workspace/Models.svelte:1-52管理模型设置,包括将特定的filterIds和actionIds与自定义模型关联。 - 工具管理:
src/lib/components/workspace/Tools.sveltesrc/lib/components/workspace/Tools.svelte:1-40允许用户管理函数可以利用的工具包。
来源:src/lib/components/admin/Functions.svelte:10-20,src/lib/components/workspace/Models.svelte:16-23,src/lib/components/workspace/Tools.svelte:12-20
安全与访问控制
- 管理员控制: 函数可以设置为
is_global,应用于所有用户,或进行限制。backend/open_webui/models/functions.py:32 - 绕过: 可以通过
BYPASS_MODEL_ACCESS_CONTROL等环境变量绕过模型访问控制。backend/open_webui/env.py:33 - Valves: 函数使用"Valves"系统进行配置。
resolve_valves_schema_optionsbackend/open_webui/utils/plugin.py:23-144函数允许在 UI 中提供动态选项(例如通过函数调用填充的下拉列表)。
图表:Valves 模式解析
graph TD
A[函数模块] --> B{Valves 类定义};
B --> C[Pydantic BaseModel];
C --> D{带有 json_schema_extra 的字段};
D --> E{input.options: 列表或方法名};
E -- "列表" --> F[直接用作选项];
E -- "方法名(字符串)" --> G{在 Valves 类上调用方法};
G -- "接受 __user__ 参数" --> H[传递用户数据];
G --> I[返回选项列表];
I --> J[模式中解析后的选项];
F --> J;
J --> K["前端 UI(例如 ValvesModal.svelte)"];
来源:backend/open_webui/utils/plugin.py:23-144,backend/open_webui/models/functions.py:30-32,backend/open_webui/utils/models.py:25-34