🧩 Functions
Functions 会在您的服务器上执行任意 Python 代码。 函数的创建权限仅限于管理员。请仅安装来自信任源的函数,并在导入前仔细审核代码。恶意的 Function 可能会访问您的文件系统、窃取数据或破坏您的整个系统。有关完整详情,请参阅 Plugin 安全警告。
Functions 是模块化的 Python 插件,用于扩展 Open WebUI 本身的功能。虽然 Tools 赋予了 LLM 在推理期间调用外部 API 的能力,但 Functions 则在更深层次上改变了平台的行为。它们可以添加由任何 Python 逻辑驱动的全新“模型”、拦截并转换系统中流动的每一条消息,或者直接在聊天 UI 中放置交互式按钮。
应用场景非常广泛:连接私有 AI 提供商、构建能响应自然语言的智能家居控制器、创建数据库查询接口、为每次对话添加实时翻译、执行合规性政策、基于数据生成图表,或通过点击按钮触发外部工作流。只要您能用 Python 编写,就可以将其转换为 Function。
Functions 以 Python 源码的形式存储在数据库中,在运行时动态加载,并在服务器端执行。管理员负责创建和管理它们;常规用户则与结果进行交互。
Function 类型
Open WebUI 支持三种类型的 Functions。其类型是根据您 Python 代码中的类名自动检测的,因此您无需进行手动配置。
| 类型 | 类名 (Class Name) | 作用 | 用户如何看到它 |
|---|---|---|---|
| Pipe | class Pipe | 添加自定义模型或 Agent | 在聊天侧边栏中显示为可选择的模型 |
| Filter | class Filter | 拦截往返于模型的数据 | 作为中间件(Middleware)透明地运行在现有模型上 |
| Action | class Action | 为消息添加交互式按钮 | 在聊天消息上显示为可点击的按钮 |
Pipe 函数
Pipe 会在 Open WebUI 中注册为一个全新的“模型”。当用户选择它并发送消息时,pipe() 方法将处理整个请求,而不需要 LLM 后端。这使得 Pipes 极其多才多艺:
- 模型提供商:集成不遵循 OpenAI 协议的 API(Anthropic 原生接口、Google Vertex、自定义推理服务器)。
- Agents & 工作流:构建多步骤的 Agents,使其能够调用 tools、联网搜索并开展多轮推理。
- 非 LLM 接口:创建智能家居控制器、数据库查询工具、搜索引擎、计算器或代码执行器。任何能接收用户输入并返回响应的逻辑。
- 代理与路由 器 (Proxies & routers):通过您自己的逻辑路由请求,添加缓存、负载均衡或成本追踪。
单个 Pipe 还可以通过定义返回模型标识符列表的 pipes() 方法,从而暴露多个模型(这被称为 "manifold" 岐管)。
Filter 函数
Filter 位于用户与模型之间,可在三个阶段拦截数据:
inlet():在请求到达模型之前对其进行修改(添加上下文、净化输入、检测语言、执行速率限制、估算 token 成本)。stream():实时拦截模型输出的流式块(streamed chunks)(过滤审查内容、替换术语、追踪 token 使用情况)。outlet():在完成生成之后处理已完成的响应(记录日志到可观测性平台、格式化引用来源、追加免责声明、缓存响应)。
Filters 实现了强大的横切关注点(cross-cutting concerns),例如实时翻译、内容审核、提示词注入检测、A/B 测试、合规性日志记录以及 PII 脱敏,所有这些都无需修改底层的模型。
Filters 可以全局应用(针对所有模型),也可以附加到特定模型上。可切换的 filters 允许用户针对每场对话启用/禁用它们。
Action 函数
Action 会在聊天消息工具栏中添加一个自定义按钮。当用户点击它时,action() 方法将运行,并拥有对事件系统的完整访问权限,以实现实时 UI 反馈、用户提示和确认操作。
Actions 可以做 Python 能做的任何事情:总结或翻译消息、复制格式化输出、置顶重要消息、将对话导出到外部系统、触发 CI/CD 管道、发送 Slack 通知、生成 PDF 报告、运行代码片段或启动外部工作流。
Functions 的工作原理
类型检测
当您保存 Function 时,Open WebUI 会扫描 Python 源码,查找名为 Pipe、Filter 或 Action 的顶级类。第一个匹配项将决定 function 的类型。您永远不需要手动设置类型,因为它会从代码中推断出来。
# 这被检测为 Pipe 函数:
class Pipe:
async def pipe(self, body: dict) -> str:
return "Hello from my custom model!"
# 这被检测为 Filter 函数:
class Filter:
async def inlet(self, body: dict) -> dict:
return body模块加载与缓存
Python 源码会通过 exec() 被加载到临时的模块命名空间中。一旦加载,该模块就会缓存到内存中(request.app.state.FUNCTIONS),并且只有当源码发生改变时才会重新加载。您代码中的 import 语句会被自动重写,以便在 Open WebUI 包的命名空间中进行解析。
Frontmatter 前置元数据
文件顶部用三引号括起来的文档字符串会被解析为 YAML 前置元数据以获取属性:
"""
title: My Custom Function
author: your_name
author_url: https://github.com/your_name
version: 1.0.0
icon_url: https://example.com/icon.svg
required_open_webui_version: 0.4.0
requirements: requests, beautifulsoup4
"""| 字段 | 用途 |
|---|---|
title | 在管理员 UI 中的显示名称 |
author / author_url | 创作者归属元数据 |
version | 版本标识符 |
icon_url | 显示在 function 名称旁的图标(请使用 URL,不要使用 base64) |
required_open_webui_version | Open WebUI 最低兼容版本 |
requirements | 英文逗号分隔的 pip 依赖包列表,用于自动安装 |
当在前置元数据中指定了 requirements 时,Open WebUI 会在函数首次加载时,自动通过 pip 安装列出的包。这由 PIP_INSTALL_FRONTMATTER_REQUIREMENTS 环境变量控制(默认启用)。
安装 Functions
从社区库安装
- 浏览 社区 Function 库。
- 在您想要的函数上点击 Get。
- 输入您的 Open WebUI 实例 URL(例如
http://localhost:3000)。 - 点击 Import to Open WebUI。您将被重定向到 Function 编辑器。
- 审核代码,然后点击 Save。
在导入之前,务必仔细审核源码。社区函数由用户贡献,且直接运行在您的服务器上。
从 URL 安装
- 前往 管理员面板 → Functions。
- 点击 Import from URL 并粘贴 Python 文件的链接。
- GitHub 链接会被自动转换为原始文件(raw)链接。
- 审核并保存。
手动创建
- 前往 管理员面板 → Functions。
- 点击 Create。
- 输入 ID(仅支持字母、数字和下划线)、名称及描述。
- 在编辑器中编写您的 Python 代码。
- 点击 Save。函数类型会从您的代码中自动检测。
管理 Functions
管理员控制项
可在 管理员面板 → Functions 管理所有的 Functions。每个函数都包含以下控制项:
| 控制项 | 描述 |
|---|---|
| Active 切换开关 | 启用或禁用该函数。被禁用的函数不会被加载或执行。 |
| Global 切换开关 | 启用后,该函数会自动应用到所有模型 |