技能系统(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/19.4-skills-system
翻译时间:2026-06-09T16:12:35.389Z
翻译模型:deepseek-chat
原文字符数:9180
项目:Open WebUI (open-webui)
---
技能系统
相关源文件
以下文件为本 Wiki 页面的生成提供了上下文:
backend/open_webui/tools/builtin.pybackend/open_webui/utils/middleware.pybackend/open_webui/utils/tools.pyscripts/prepare-pyodide.jssrc/lib/components/ImportModal.sveltesrc/lib/components/admin/Functions/FunctionEditor.sveltesrc/lib/components/workspace/Knowledge/KnowledgeBase.sveltesrc/lib/components/workspace/Knowledge/KnowledgeBase/Files.sveltesrc/lib/components/workspace/Models/BuiltinTools.sveltesrc/lib/components/workspace/Prompts/PromptEditor.sveltesrc/lib/components/workspace/Skills/SkillEditor.sveltesrc/lib/components/workspace/Tools/ToolkitEditor.sveltestatic/pyodide/pyodide-lock.json
Open WebUI 中的技能系统是一个工作区功能,用于创建、管理和共享可复用的 AI 能力。技能与标准系统提示词不同;它们被定义为模块化的逻辑块——包括工具、函数和提示词——可以附加到模型上或在聊天会话中触发,以扩展 AI 的基础能力。
系统概述
该系统在工作区中运行,提供统一的界面来管理生命周期,包括创建、克隆、导出和社区共享。它利用基于 frontmatter 的元数据系统来定义技能属性,如标题、版本和作者信息。
关键组件
| 组件 | 角色 | 文件路径 |
|---|---|---|
| 工具工作区 | 编排基于 Python 的工具的列表、筛选和管理。 | src/lib/components/workspace/Tools.svelte:1-40 |
| 工具包编辑器 | 基于 Web 的 IDE,提供 Python 样板代码用于编写自定义工具。 | src/lib/components/workspace/Tools/ToolkitEditor.svelte:1-52 |
| 技能编辑器 | 专用编辑器,用于创建可复用的 AI 技能定义,支持 frontmatter 检测。 | src/lib/components/workspace/Skills/SkillEditor.svelte:1-30 |
| 函数工作区 | 管理员级界面,用于管理全局过滤器和操作管道。 | src/lib/components/admin/Functions.svelte:1-73 |
| 提示词工作区 | 管理可复用的系统提示词模板,支持命令触发。 | src/lib/components/workspace/Prompts.svelte:1-50 |
技术架构
技能系统将用户定义的逻辑(自然语言和 Python)桥接到执行环境中。基于 Python 的技能(工具和函数)在持久化之前,使用 Pyodide 进行浏览器端验证、处理和格式化。
技能数据流:从创建到执行
此图展示了用户定义的技能(工具)如何从 UI 编辑器移动到后端存储,最终进入执行上下文。
技能定义与存储流程
graph TD
User["用户界面 (Svelte)"] -- "编写 Python 代码" --> Editor["ToolkitEditor.svelte"]
Editor -- "formatPythonCodeHandler()" --> Pyodide["Pyodide (WASM)"]
Pyodide -- "格式化后的代码" --> Editor
Editor -- "onSave(toolData)" --> API["tools.ts: createNewTool"]
API -- "POST /api/v1/tools/create" --> Backend["FastAPI 后端"]
Backend -- "SQL 持久化" --> DB[("数据库")]
subgraph "自然语言空间"
User
end
subgraph "代码实体空间"
Editor
Pyodide
API
Backend
DB
end
来源:src/lib/components/workspace/Tools/ToolkitEditor.svelte:160-188、scripts/prepare-pyodide.js:1-25、backend/open_webui/utils/tools.py:164-175
工具实现与执行
工具是使用自定义 Python 逻辑扩展模型功能的主要机制。每个工具被定义为一个名为 Tools 的类,其中包含带有类型提示和文档字符串的方法。
样板代码与结构
标准工具包含从 pydantic 导入的模式定义和从 requests 导入的外部 API 交互。文档字符串被解析以生成用于 LLM 函数调用的 JSON 模式。
class Tools:
def __init__(self):
pass
def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str:
"""
从用户对象中获取用户名、电子邮件和 ID。
"""
# 会话用户对象作为参数自动传入
return f"用户: {__user__.get('name')} (ID: {__user__.get('id')})"
来源:src/lib/components/workspace/Tools/ToolkitEditor.svelte:53-98
后端处理管道
后端通过动态加载工具模块并注入必要的参数(如阀门配置和用户上下文)来处理工具执行。
工具执行管道
graph TD
Request["FastAPI 请求"] --> GetTools["tools.py: get_tools()"]
GetTools --> LoadModule["plugin.py: load_tool_module_by_id()"]
LoadModule --> SetValves["tools.py: get_tool_valves_by_id()"]
SetValves --> ApplyParams["tools.py: get_async_tool_function_and_apply_extra_params()"]
ApplyParams --> Execute["函数调用"]
subgraph "代码实体空间"
GetTools
LoadModule
SetValves
ApplyParams
Execute
end
来源:backend/open_webui/utils/tools.py:111-147、backend/open_webui/utils/tools.py:164-210、backend/open_webui/utils/middleware.py:172-218
技能编辑器与 Frontmatter
SkillEditor.svelte 组件为依赖 frontmatter 元数据的技能提供了专用界面。它会自动从内容块中类似 YAML 的头部检测 name 和 description。
- 自动检测:在创建模式下使用
parseFrontmatter(content)填充字段src/lib/components/workspace/Skills/SkillEditor.svelte:39-57。 - 格式化:应用
formatSkillName(fm.name)来规范化用户提供的标题src/lib/components/workspace/Skills/SkillEditor.svelte:44。 - 持久化:将
id、name、description和content提交到skillsAPIsrc/lib/components/workspace/Skills/SkillEditor.svelte:82-90。
来源:src/lib/components/workspace/Skills/SkillEditor.svelte:39-93、src/lib/utils/index.ts:11-13
提示词与命令系统
提示词允许用户定义可通过 / 命令触发的可复用模板。
- 命令标识:名称会自动转换为 URL 友好的标识,用于聊天命令
src/lib/components/workspace/Prompts/PromptEditor.svelte:69-71。 - 历史与版本管理:支持版本管理,用户可以将特定快照提升为"生产"版本
src/lib/components/workspace/Prompts/PromptEditor.svelte:172-186。 - 元数据管理:标签和命令字符串等元数据可以独立于提示词内容进行更新
src/lib/components/workspace/Prompts/PromptEditor.svelte:213-250。
提示词命令关联
graph LR
subgraph "自然语言空间"
Input["用户输入 '/translate'"]
end
subgraph "代码实体空间"
Editor["PromptEditor.svelte"]
Slugify["utils.ts: slugify()"]
PromptAPI["prompts.py: update_prompt_metadata"]
Editor -- "调用" --> Slugify
Slugify -- "生成" --> CommandID["prompt.command"]
CommandID -- "匹配" --> Input
end
来源:src/lib/components/workspace/Prompts/PromptEditor.svelte:69-75、src/lib/components/workspace/Prompts/PromptEditor.svelte:230-240
访问控制与共享
技能使用统一的 AccessControlModal 通过 AccessGrants 系统管理可见性和执行权限。
| 角色 | 权限 | 代码引用 |
|---|---|---|
| 管理员 | 如果启用了 BYPASS_ADMIN_ACCESS_CONTROL,可以绕过访问控制。 | backend/open_webui/utils/tools.py:45 |
| 用户 | 可以创建个人技能;共享受 permissions.sharing.skills 限制。 | src/lib/components/workspace/Skills/SkillEditor.svelte:115-117 |
| 授权 | 针对特定用户或组的细粒度"读取"/"写入"权限。 | backend/open_webui/utils/tools.py:181-187 |
社区集成
shareHandler 函数通过安全的跨域消息将技能的 JSON 定义发布到 openwebui.com,从而促进社区共享 src/lib/components/workspace/Tools.svelte:93-115。
来源:backend/open_webui/utils/tools.py:172-190、src/lib/components/workspace/Tools/ToolkitEditor.svelte:191-208、src/lib/components/workspace/Skills/SkillEditor.svelte:111-128