2025-12-30 01:22:29 +00:00
|
|
|
|
# 开发指南
|
|
|
|
|
|
|
2026-02-13 11:10:48 +08:00
|
|
|
|
了解如何开发插件并为 OpenWebUI Extensions 做出贡献。
|
2025-12-30 01:22:29 +00:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
<div class="grid cards" markdown>
|
|
|
|
|
|
|
|
|
|
|
|
- :material-book-open-page-variant:{ .lg .middle } **插件开发指南**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
从入门到高级模式、最佳实践的完整指南。
|
|
|
|
|
|
|
|
|
|
|
|
[:octicons-arrow-right-24: 阅读指南](plugin-guide.md)
|
|
|
|
|
|
|
|
|
|
|
|
- :material-file-document-edit:{ .lg .middle } **文档编写指南**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
学习如何使用 MkDocs 与 Material 主题编写和贡献文档。
|
|
|
|
|
|
|
|
|
|
|
|
[:octicons-arrow-right-24: 阅读指南](documentation-guide.md)
|
|
|
|
|
|
|
2026-02-24 15:13:52 +08:00
|
|
|
|
- :material-robot:{ .lg .middle } **Copilot 工程化配置**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
面向 GitHub Copilot + Gemini CLI + 反重力开发模式的工程化设计文档。
|
|
|
|
|
|
|
|
|
|
|
|
[:octicons-arrow-right-24: 阅读文档](copilot-engineering-plan.md)
|
|
|
|
|
|
|
2025-12-30 01:22:29 +00:00
|
|
|
|
- :material-github:{ .lg .middle } **贡献指南**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
了解如何贡献插件、提示词与文档。
|
|
|
|
|
|
|
|
|
|
|
|
[:octicons-arrow-right-24: 贡献说明](../contributing.md)
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 插件类型概览
|
|
|
|
|
|
|
|
|
|
|
|
OpenWebUI 支持三种主要插件类型:
|
|
|
|
|
|
|
|
|
|
|
|
| 类型 | 目的 | 入口方法 |
|
|
|
|
|
|
|------|---------|--------------|
|
|
|
|
|
|
| **Action** | 为消息添加按钮 | `action()` |
|
|
|
|
|
|
| **Filter** | 处理消息 | `inlet()` / `outlet()` |
|
|
|
|
|
|
| **Pipe** | 自定义模型集成 | `pipe()` |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 快速开始模板
|
|
|
|
|
|
|
|
|
|
|
|
### Action 插件
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
"""
|
|
|
|
|
|
title: My Action
|
|
|
|
|
|
author: Your Name
|
|
|
|
|
|
version: 1.0.0
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
class Action:
|
|
|
|
|
|
async def action(self, body: dict, __event_emitter__=None):
|
|
|
|
|
|
await __event_emitter__({"type": "notification", "data": {"content": "Hello!"}})
|
|
|
|
|
|
return body
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Filter 插件
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
"""
|
|
|
|
|
|
title: My Filter
|
|
|
|
|
|
author: Your Name
|
|
|
|
|
|
version: 1.0.0
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
class Filter:
|
|
|
|
|
|
async def inlet(self, body: dict, __metadata__: dict) -> dict:
|
|
|
|
|
|
# 发送到 LLM 之前处理
|
|
|
|
|
|
return body
|
|
|
|
|
|
|
|
|
|
|
|
async def outlet(self, body: dict, __metadata__: dict) -> dict:
|
|
|
|
|
|
# LLM 返回后处理
|
|
|
|
|
|
return body
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Pipe 插件
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
"""
|
|
|
|
|
|
title: My Pipe
|
|
|
|
|
|
author: Your Name
|
|
|
|
|
|
version: 1.0.0
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
class Pipe:
|
|
|
|
|
|
def pipes(self):
|
|
|
|
|
|
return [{"id": "my-model", "name": "My Model"}]
|
|
|
|
|
|
|
|
|
|
|
|
def pipe(self, body: dict):
|
|
|
|
|
|
return "Response from custom pipe"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 核心概念
|
|
|
|
|
|
|
|
|
|
|
|
### Valves 配置
|
|
|
|
|
|
|
|
|
|
|
|
Valves 允许用户在界面中配置插件:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
|
|
|
|
|
|
class Action:
|
|
|
|
|
|
class Valves(BaseModel):
|
|
|
|
|
|
api_key: str = Field(default="", description="API Key")
|
|
|
|
|
|
enabled: bool = Field(default=True, description="Enable plugin")
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
self.valves = self.Valves()
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 事件发送器
|
|
|
|
|
|
|
|
|
|
|
|
发送通知与状态更新:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# Notification
|
|
|
|
|
|
await __event_emitter__({
|
|
|
|
|
|
"type": "notification",
|
|
|
|
|
|
"data": {"type": "success", "content": "Done!"}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
# Status update
|
|
|
|
|
|
await __event_emitter__({
|
|
|
|
|
|
"type": "status",
|
|
|
|
|
|
"data": {"description": "Processing...", "done": False}
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 用户上下文
|
|
|
|
|
|
|
|
|
|
|
|
获取用户信息:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
user_name = __user__.get("name", "User")
|
|
|
|
|
|
user_id = __user__.get("id")
|
|
|
|
|
|
user_language = __user__.get("language", "en-US")
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 最佳实践
|
|
|
|
|
|
|
|
|
|
|
|
1. **异步操作**:I/O 请使用 `async/await`
|
|
|
|
|
|
2. **错误处理**:捕获异常并通知用户
|
|
|
|
|
|
3. **状态反馈**:长耗时操作提供进度提示
|
|
|
|
|
|
4. **配置化**:使用 Valves 暴露可调参数
|
|
|
|
|
|
5. **文档**:提供清晰的 docstring 与 README
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 资源
|
|
|
|
|
|
|
|
|
|
|
|
- [完整开发指南](plugin-guide.md)
|
2026-02-24 15:13:52 +08:00
|
|
|
|
- [Copilot 工程化配置](copilot-engineering-plan.md)
|
2026-02-13 11:10:48 +08:00
|
|
|
|
- [插件示例](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins)
|
2025-12-30 01:22:29 +00:00
|
|
|
|
- [OpenWebUI 文档](https://docs.openwebui.com/)
|