跳到主要内容

🧩 Functions(函数插件)

⚠️ 关键安全警告

Functions 会在你的服务器上执行任意 Python 代码。 只有管理员才能创建或导入 Function。你必须只从可信来源安装,并在导入前审阅代码。恶意 Function 可能访问文件系统、外传数据,甚至直接接管整个实例。完整背景见 Plugin Security Warning

Functions 是 OPL 数据空间的 Python 插件扩展机制。和主要让模型在推理时调用外部 API 的 Tools 不同,Functions 更深入地改变平台行为:它可以新增自定义“模型”、拦截和改写消息流、或把交互按钮直接挂到聊天界面上。

你可以用它接入私有模型提供商、实现数据库查询界面、做翻译/审计/合规中间层、添加导出或工作流触发按钮,甚至构建完全不依赖 LLM 的交互型服务。只要能用 Python 写出来,就可以封装成 Function。

Functions 的源码以 Python 文本形式保存在数据库中,运行时动态加载,并在服务端执行。管理员负责创建和管理,普通用户只消费其结果。

Function 类型

OPL 数据空间支持三类 Function。类型由代码中的类名自动识别,无需手工指定。

类型类名作用用户看到的形态
Pipeclass Pipe增加一个自定义模型或代理在聊天侧栏中显示为可选模型
Filterclass Filter拦截模型前后数据流作为中间件透明运行在现有模型上
Actionclass Action为消息增加交互按钮出现在聊天消息工具栏

Pipe

Pipe 会把自己注册成 OPL 数据空间中的一个“模型”。当用户选择它并发送消息时,由 pipe() 方法完整处理请求,不一定需要真实的 LLM 后端。

典型场景:

  • 接入非 OpenAI 协议的模型 API
  • 构建多步骤 agent 或业务工作流
  • 封装搜索、数据库、智能家居、代码执行器等非 LLM 接口
  • 做模型路由、缓存、负载均衡、成本跟踪

一个 Pipe 也可以通过 pipes() 暴露多个模型入口(manifold)。

Pipe Function 指南

Filter

Filter 位于用户与模型之间,可在三个阶段介入:

  • inlet():请求发给模型前处理输入
  • stream():实时处理模型流式输出
  • outlet():模型生成完成后再处理结果

典型用途包括:

  • 实时翻译
  • 内容审核与脱敏
  • Prompt Injection 检测
  • A/B 测试
  • 合规日志
  • 响应后处理与缓存

Filter 可以全局应用,也可以只绑定给特定模型。支持按聊天开关的 Filter,允许用户在某次会话中启用或关闭。

Filter Function 指南

Action

Action 会在聊天消息工具栏中增加一个自定义按钮。用户点击后,action() 方法执行,并可利用事件系统给 UI 实时反馈、提示或确认。

典型场景包括:

  • 总结或翻译某条消息
  • 导出结构化内容
  • 发送 Slack 通知
  • 触发 CI/CD 或外部工作流
  • 生成 PDF 报告
  • 运行附加自动化逻辑

Action Function 指南

Functions 的工作方式

类型识别

当你保存一个 Function 时, OPL 数据空间会扫描源码里的顶层类名 PipeFilterAction。第一个命中的类型就是这个 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

模块加载与缓存

OPL 数据空间通过 exec() 把 Python 源码加载到临时模块命名空间中。加载后会缓存在内存里,只有当源码发生变化时才重新加载。代码里的 import 也会自动重写,以便在 OPL 数据空间包命名空间内正确解析。

Frontmatter 元数据

文件顶部的三引号 docstring 会被解析为 YAML frontmatter:

"""
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图标 URL
required_open_webui_version最低兼容版本
requirements需要自动安装的 pip 包列表
自动安装依赖

当 frontmatter 中声明了 requirements 时, OPL 数据空间会在第一次加载 Function 时自动通过 pip 安装依赖。这个行为由 PIP_INSTALL_FRONTMATTER_REQUIREMENTS 控制,默认启用。

安装 Functions

从社区库导入

  1. 访问 社区 Function Library
  2. 找到目标 Function,点击 Get
  3. 输入你的 OPL 数据空间实例地址,例如 http://localhost:3000
  4. 点击 Import到OPL 数据空间,系统会跳转到 Function Editor。
  5. 审阅代码后点击 Save
注意

社区 Function 由用户贡献,并且会直接在你的服务器上运行。导入前务必审阅源码。

通过 URL 导入

  1. 打开 管理员面板 → Functions
  2. 点击 Import from URL,粘贴 Python 文件链接。
  3. GitHub 普通页面链接会自动转成 raw URL。
  4. 审阅后保存。

手动创建

  1. 打开 管理员面板 → Functions
  2. 点击 Create
  3. 填写 ID、名称和描述。
  4. 在编辑器中编写 Python 代码。
  5. 点击 Save

保存时类型会自动识别。

管理 Functions

管理员控制项

所有 Function 都在 管理员面板 → Functions 中管理。

控件说明
Active toggle启用或禁用 Function。禁用后不会加载和执行。
Global toggle对 Filter / Action 可用。启用后自动作用于所有模型。
Valves(⚙️)打开此 Function 的管理员配置项。
Export / Delete导出文件或删除 Function。

绑定到特定模型

如果你不想把 Filter 或 Action 全局生效,也可以只把它们绑定到某些模型:

  1. 打开 Workspace → Models
  2. 编辑目标模型。
  3. FiltersActions 区域里选中需要附加的 Function。

这样不同模型可以使用不同的过滤器或动作按钮。

可切换 Filter

若在 __init__ 中设置 self.toggle = True,这个 Filter 就会成为“用户可切换”的 Filter。用户会在聊天输入区域看到一个开关,可以按会话启用或关闭。没有设置 self.toggle 的 Filter,只要激活就始终生效。

Valves 与 UserValves

Functions 支持基于 Pydantic 的双层配置体系:

层级类名谁来配置位置
管理员级Valves管理员管理员面板 → Functions → ⚙️
用户级UserValves任意用户聊天界面内

Valves 适合保存 API Key、模型端点和全局行为参数。UserValves 允许每位用户自定义自己的偏好,例如输出语言、格式、个人 API Key 等。

这两种配置都通过嵌套的 Pydantic BaseModel 定义在 PipeFilterAction 类中。管理员保存的值会写入数据库,并在运行时自动加载。

Valves 开发指南

Functions 与 Tools 该怎么选

场景选择原因
让模型访问天气、股票、外部 API 等实时数据ToolTool 在模型推理过程中被调用
接入不兼容 OpenAI 协议的模型提供商Pipe FunctionPipe 会注册成模型
构建非 LLM 接口,例如搜索、数据库、智能家居Pipe FunctionPipe 可以完整处理请求,无需 LLM
构建多步骤 agent 或复杂业务流程Pipe FunctionPipe 掌控整个请求/响应循环
实时翻译、审核、脱敏Filter FunctionFilter 能透明拦截每条消息
接入观测平台或审计日志Filter Functioninlet / outlet 可以观察所有流量
限流、策略校验、准入控制Filter Functioninlet 可在模型执行前拒绝请求
给消息增加导出、总结、分享按钮Action FunctionAction 挂在消息工具栏上
从聊天 UI 触发外部工作流Action FunctionAction 在点击时执行任意 Python

开发资源

指南说明
Pipe Function 指南构建自定义模型、Agent 与非 LLM 接口
Filter Function 指南拦截、翻译、审核、记录消息
Action Function 指南为消息添加工作流和交互按钮
Valves为 Function 提供管理员和用户配置
Events向前端 UI 发送实时事件
Reserved Arguments__user____event_emitter____metadata__ 等保留参数
Rich UI在响应中嵌入交互式 HTML / JS 内容