Compare commits
12 Commits
infographi
...
github-cop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ba96c6662 | ||
|
|
fbd68ad042 | ||
|
|
b6ce354034 | ||
|
|
df042e471e | ||
|
|
b9f32e72d0 | ||
|
|
bfc2743f3a | ||
|
|
751e255894 | ||
|
|
9deb942208 | ||
|
|
38787351a0 | ||
|
|
ff44d324eb | ||
|
|
f30d3ed12c | ||
|
|
6b5c7f102b |
18
README.md
18
README.md
@@ -24,9 +24,9 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
|
||||
| Rank | Plugin | Version | Downloads | Views | 📅 Updated |
|
||||
| :---: | :--- | :---: | :---: | :---: | :---: |
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
|
||||
@@ -38,23 +38,17 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
|
||||
|
||||
## 🌟 Star Features
|
||||
|
||||
### 1. [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4)    
|
||||
### 1. [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4)    
|
||||
|
||||
**The ultimate autonomous Agent integration for OpenWebUI.** Deeply bridging GitHub Copilot SDK with your OpenWebUI ecosystem. It enables the Agent to autonomously perform **intent recognition**, **web search**, and **context compaction** while reusing your existing tools, skills, and configurations for a professional, full-featured experience.
|
||||
|
||||
> [!TIP]
|
||||
> **No GitHub Copilot subscription required!** Supports **BYOK (Bring Your Own Key)** mode using your own OpenAI/Anthropic API keys.
|
||||
|
||||
#### 🚀 Key Leap (v0.12.0)
|
||||
#### 🚀 Key Leap (v0.12.1)
|
||||
|
||||
- **🚀 High-Performance Shared Pool**: Eliminated 1-2s process startup latency between turns via a persistent client pool.
|
||||
- **🔑 Pure BYOK Mode**: Now supports full operation without a `GH_TOKEN`, relying solely on custom API keys.
|
||||
- **📏 RichUI Stability**: Fixed height calculation issues for a rock-solid interactive component experience.
|
||||
- **🩺 Smart Stall Detection**: Integrated `client.ping()` to rescue heavy tasks from premature timeouts.
|
||||
- **📋 Live TODO Widget**: Compact real-time task tracking synchronized with `session.db`, now automatically hidden when all tasks are completed.
|
||||
- **🔌 Seamless Ecosystem Integration**: Automatically injects and reuses your OpenWebUI **Tools**, **MCP**, **OpenAPI Servers**, and **Skills**.
|
||||
- **🌐 Language Consistency**: System prompts mandate that Agent output language remains strictly consistent with user input.
|
||||
- **🛡️ Secure Isolation**: Strict user/session-level **Workspace Sandboxing** with user-isolated environment variables.
|
||||
- **🛡️ Disable Terminal Tools for AI**: Terminal server tools are now filtered out at the pipe level, preventing AI from calling them while keeping terminal functionality available to users.
|
||||
- **🎨 RichUI Theme-Aware CSS Variables**: Added CSS custom properties that automatically adapt to light/dark themes for better text contrast.
|
||||
- **📊 Interactive Delivery**: Full support for **HTML Artifacts** and **RichUI** rendering, providing instant interactive previews and persistent downloadable results.
|
||||
- **🛠️ Deterministic Toolchain**: Built-in specialized tools for skill lifecycles (`manage_skills`) and system optimization.
|
||||
|
||||
|
||||
18
README_CN.md
18
README_CN.md
@@ -21,9 +21,9 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
||||
| 排名 | 插件 | 版本 | 下载 | 浏览 | 📅 更新 |
|
||||
| :---: | :--- | :---: | :---: | :---: | :---: |
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
|
||||
@@ -42,16 +42,10 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
||||
> [!TIP]
|
||||
> **无需 GitHub Copilot 订阅!** 支持 **BYOK (Bring Your Own Key)** 模式,使用你自己的 OpenAI/Anthropic API Key。
|
||||
|
||||
#### 🚀 核心进化 (v0.12.0)
|
||||
#### 🚀 核心进化 (v0.12.1)
|
||||
|
||||
- **🚀 高性能共享池**:通过单例进程池消除了对话间 1-2 秒的进程冷启动延迟,响应更迅速。
|
||||
- **🔑 纯 BYOK 模式支持**:解除对 `GH_TOKEN` 的强制依赖,仅凭自定义 API Key 即可完整运行。
|
||||
- **📏 RichUI 稳定性修复**:彻底解决高度计算循环导致的页面无限变高问题,交互体验更稳固。
|
||||
- **🩺 智能防挂死探测**:在超时判断中引入 `client.ping()` 探测机制,有效减少复杂任务下的误杀中断。
|
||||
- **📋 Live TODO 小组件**:基于 `session.db` 实时任务状态,现在所有任务完成后将自动隐藏 UI,保持界面整洁。
|
||||
- **🔌 生态深度注入**: 自动读取并复用 OpenWebUI **工具 (Tools)**、**MCP**、**OpenAPI Server** 与 **技能 (Skills)**。
|
||||
- **🛡️ 安全沙箱**: 严格的用户/会话级 **工作区隔离**,并实现用户级环境变量隔离。
|
||||
- **🌐 语言一致性**: 提示词强制要求 Agent 输出语言与用户输入保持一致。
|
||||
- **🛡️ 禁用终端工具 AI 调用**: 终端服务器工具已在管道层面被过滤,AI 无法调用这些工具,但用户仍可通过界面使用终端功能。
|
||||
- **🎨 RichUI 主题感知 CSS 变量**: 新增 CSS 自定义属性,自动适配浅色/深色主题,改善文字对比度。
|
||||
|
||||
> [!TIP]
|
||||
> **💡 进阶实战建议**
|
||||
@@ -132,7 +126,7 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
||||
|
||||
### Pipes (模型管道)
|
||||
|
||||
- **GitHub Copilot SDK** (`github-copilot-sdk`): 深度集成 GitHub Copilot SDK 的强大 Agent (v0.12.0)。支持高性能进程池优化、纯 BYOK 模式、智能意图识别、自主网页搜索与上下文压缩。
|
||||
- **GitHub Copilot SDK** (`github-copilot-sdk`): 深度集成 GitHub Copilot SDK 的强大 Agent (v0.12.1)。支持高性能进程池优化、纯 BYOK 模式、智能意图识别、自主网页搜索与上下文压缩。
|
||||
|
||||
### Pipelines (工作流管道)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "downloads",
|
||||
"message": "10.8k",
|
||||
"message": "11.0k",
|
||||
"color": "blue",
|
||||
"namedLogo": "openwebui"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "followers",
|
||||
"message": "419",
|
||||
"message": "426",
|
||||
"color": "blue"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "points",
|
||||
"message": "407",
|
||||
"message": "408",
|
||||
"color": "orange"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "saves",
|
||||
"message": "468",
|
||||
"message": "469",
|
||||
"color": "lightgrey"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "upvotes",
|
||||
"message": "349",
|
||||
"message": "350",
|
||||
"color": "brightgreen"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "views",
|
||||
"message": "116.4k",
|
||||
"message": "118.4k",
|
||||
"color": "blueviolet"
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"total_posts": 30,
|
||||
"total_downloads": 10803,
|
||||
"total_views": 116397,
|
||||
"total_upvotes": 349,
|
||||
"total_downloads": 10953,
|
||||
"total_views": 118430,
|
||||
"total_upvotes": 350,
|
||||
"total_downvotes": 16,
|
||||
"total_saves": 468,
|
||||
"total_saves": 469,
|
||||
"total_comments": 98,
|
||||
"plugin_contributions": 22,
|
||||
"by_type": {
|
||||
"tool": 3,
|
||||
"action": 12,
|
||||
"prompt": 2,
|
||||
"pipe": 1,
|
||||
"filter": 4
|
||||
"filter": 4,
|
||||
"action": 12,
|
||||
"prompt": 2
|
||||
},
|
||||
"posts": [
|
||||
{
|
||||
@@ -22,8 +22,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
||||
"downloads": 2051,
|
||||
"views": 18115,
|
||||
"downloads": 2068,
|
||||
"views": 18359,
|
||||
"upvotes": 35,
|
||||
"saves": 82,
|
||||
"comments": 23,
|
||||
@@ -36,13 +36,13 @@
|
||||
"title": "Smart Infographic",
|
||||
"slug": "smart_infographic_ad6f0c7f",
|
||||
"type": "action",
|
||||
"version": "1.6.0",
|
||||
"version": "1.6.1",
|
||||
"author": "Fu-Jie",
|
||||
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
||||
"downloads": 1522,
|
||||
"views": 15470,
|
||||
"downloads": 1537,
|
||||
"views": 15674,
|
||||
"upvotes": 30,
|
||||
"saves": 60,
|
||||
"saves": 61,
|
||||
"comments": 12,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
@@ -56,8 +56,8 @@
|
||||
"version": "1.2.8",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A content normalizer filter that fixes common Markdown formatting issues in LLM outputs, such as broken code blocks, LaTeX formulas, and list formatting. Including LaTeX command protection.",
|
||||
"downloads": 974,
|
||||
"views": 9958,
|
||||
"downloads": 983,
|
||||
"views": 10070,
|
||||
"upvotes": 27,
|
||||
"saves": 52,
|
||||
"comments": 6,
|
||||
@@ -70,17 +70,17 @@
|
||||
"title": "Async Context Compression",
|
||||
"slug": "async_context_compression_b1655bc8",
|
||||
"type": "filter",
|
||||
"version": "1.5.0",
|
||||
"version": "1.6.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
|
||||
"downloads": 945,
|
||||
"views": 8634,
|
||||
"downloads": 964,
|
||||
"views": 8804,
|
||||
"upvotes": 22,
|
||||
"saves": 57,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-22",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
|
||||
},
|
||||
{
|
||||
@@ -90,9 +90,9 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Export current conversation from Markdown to Word (.docx) with Mermaid diagrams rendered client-side (Mermaid.js, SVG+PNG), LaTeX math, real hyperlinks, improved tables, syntax highlighting, and blockquote support.",
|
||||
"downloads": 927,
|
||||
"views": 7288,
|
||||
"upvotes": 21,
|
||||
"downloads": 940,
|
||||
"views": 7413,
|
||||
"upvotes": 22,
|
||||
"saves": 41,
|
||||
"comments": 8,
|
||||
"is_published_plugin": true,
|
||||
@@ -107,8 +107,8 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 863,
|
||||
"views": 9511,
|
||||
"downloads": 874,
|
||||
"views": 9652,
|
||||
"upvotes": 11,
|
||||
"saves": 28,
|
||||
"comments": 0,
|
||||
@@ -124,8 +124,8 @@
|
||||
"version": "0.3.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
|
||||
"downloads": 681,
|
||||
"views": 8206,
|
||||
"downloads": 699,
|
||||
"views": 8430,
|
||||
"upvotes": 10,
|
||||
"saves": 31,
|
||||
"comments": 4,
|
||||
@@ -141,8 +141,8 @@
|
||||
"version": "0.3.7",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
|
||||
"downloads": 676,
|
||||
"views": 4119,
|
||||
"downloads": 685,
|
||||
"views": 4194,
|
||||
"upvotes": 13,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
@@ -155,17 +155,17 @@
|
||||
"title": "GitHub Copilot Official SDK Pipe",
|
||||
"slug": "github_copilot_official_sdk_pipe_ce96f7b4",
|
||||
"type": "pipe",
|
||||
"version": "0.12.0",
|
||||
"version": "0.12.1",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A powerful Agent SDK integration for OpenWebUI. It deeply bridges GitHub Copilot SDK with OpenWebUI's ecosystem, enabling the Agent to autonomously perform intent recognition, web search, and context compaction. It seamlessly reuses your existing Tools, MCP servers, OpenAPI servers, and Skills for a professional, full-featured experience.",
|
||||
"downloads": 461,
|
||||
"views": 6662,
|
||||
"downloads": 465,
|
||||
"views": 6732,
|
||||
"upvotes": 17,
|
||||
"saves": 12,
|
||||
"comments": 19,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-26",
|
||||
"updated_at": "2026-03-22",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4"
|
||||
},
|
||||
{
|
||||
@@ -175,8 +175,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
|
||||
"downloads": 363,
|
||||
"views": 5160,
|
||||
"downloads": 368,
|
||||
"views": 5224,
|
||||
"upvotes": 13,
|
||||
"saves": 23,
|
||||
"comments": 2,
|
||||
@@ -192,8 +192,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.",
|
||||
"downloads": 261,
|
||||
"views": 2143,
|
||||
"downloads": 264,
|
||||
"views": 2166,
|
||||
"upvotes": 7,
|
||||
"saves": 17,
|
||||
"comments": 0,
|
||||
@@ -209,8 +209,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
||||
"downloads": 213,
|
||||
"views": 3316,
|
||||
"downloads": 224,
|
||||
"views": 3392,
|
||||
"upvotes": 7,
|
||||
"saves": 10,
|
||||
"comments": 0,
|
||||
@@ -226,8 +226,8 @@
|
||||
"version": "1.1.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.",
|
||||
"downloads": 181,
|
||||
"views": 4017,
|
||||
"downloads": 188,
|
||||
"views": 4143,
|
||||
"upvotes": 9,
|
||||
"saves": 8,
|
||||
"comments": 6,
|
||||
@@ -244,7 +244,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 181,
|
||||
"views": 3275,
|
||||
"views": 3300,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
@@ -261,7 +261,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
|
||||
"downloads": 143,
|
||||
"views": 2392,
|
||||
"views": 2404,
|
||||
"upvotes": 7,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
@@ -278,7 +278,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
|
||||
"downloads": 102,
|
||||
"views": 2632,
|
||||
"views": 2649,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -294,8 +294,8 @@
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 74,
|
||||
"views": 1736,
|
||||
"downloads": 75,
|
||||
"views": 1756,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -311,8 +311,8 @@
|
||||
"version": "0.9.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 59,
|
||||
"views": 871,
|
||||
"downloads": 60,
|
||||
"views": 878,
|
||||
"upvotes": 6,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
@@ -329,7 +329,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 49,
|
||||
"views": 964,
|
||||
"views": 966,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -345,8 +345,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 38,
|
||||
"views": 743,
|
||||
"downloads": 39,
|
||||
"views": 753,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -362,8 +362,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 36,
|
||||
"views": 1016,
|
||||
"downloads": 37,
|
||||
"views": 1038,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -379,8 +379,8 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 3,
|
||||
"views": 169,
|
||||
"downloads": 8,
|
||||
"views": 433,
|
||||
"upvotes": 1,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -397,9 +397,9 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 99,
|
||||
"views": 442,
|
||||
"upvotes": 1,
|
||||
"saves": 0,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
"is_published_plugin": false,
|
||||
"created_at": "2026-03-22",
|
||||
@@ -414,7 +414,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3817,
|
||||
"views": 3828,
|
||||
"upvotes": 8,
|
||||
"saves": 3,
|
||||
"comments": 2,
|
||||
@@ -448,7 +448,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2911,
|
||||
"views": 2917,
|
||||
"upvotes": 9,
|
||||
"saves": 4,
|
||||
"comments": 1,
|
||||
@@ -465,7 +465,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2471,
|
||||
"views": 2472,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -482,9 +482,9 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2149,
|
||||
"views": 2165,
|
||||
"upvotes": 15,
|
||||
"saves": 26,
|
||||
"saves": 27,
|
||||
"comments": 9,
|
||||
"is_published_plugin": false,
|
||||
"created_at": "2026-01-25",
|
||||
@@ -516,7 +516,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1638,
|
||||
"views": 1640,
|
||||
"upvotes": 17,
|
||||
"saves": 14,
|
||||
"comments": 2,
|
||||
@@ -531,10 +531,10 @@
|
||||
"name": "Fu-Jie",
|
||||
"profile_url": "https://openwebui.com/u/Fu-Jie",
|
||||
"profile_image": "https://community.s3.openwebui.com/uploads/users/b15d1348-4347-42b4-b815-e053342d6cb0/profile_d9510745-4bd4-4f8f-a997-4a21847d9300.webp",
|
||||
"followers": 419,
|
||||
"followers": 426,
|
||||
"following": 9,
|
||||
"total_points": 407,
|
||||
"post_points": 336,
|
||||
"total_points": 408,
|
||||
"post_points": 337,
|
||||
"comment_points": 71,
|
||||
"contributions": 89
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"total_posts": 30,
|
||||
"total_downloads": 10705,
|
||||
"total_views": 115160,
|
||||
"total_upvotes": 348,
|
||||
"total_downloads": 10945,
|
||||
"total_views": 118210,
|
||||
"total_upvotes": 350,
|
||||
"total_downvotes": 16,
|
||||
"total_saves": 463,
|
||||
"total_saves": 469,
|
||||
"total_comments": 98,
|
||||
"plugin_contributions": 22,
|
||||
"by_type": {
|
||||
"prompt": 2,
|
||||
"tool": 3,
|
||||
"filter": 4,
|
||||
"action": 12,
|
||||
"pipe": 1,
|
||||
"filter": 4
|
||||
"prompt": 2,
|
||||
"pipe": 1
|
||||
},
|
||||
"posts": [
|
||||
{
|
||||
@@ -22,8 +22,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
||||
"downloads": 2039,
|
||||
"views": 17967,
|
||||
"downloads": 2064,
|
||||
"views": 18332,
|
||||
"upvotes": 35,
|
||||
"saves": 82,
|
||||
"comments": 23,
|
||||
@@ -36,17 +36,17 @@
|
||||
"title": "Smart Infographic",
|
||||
"slug": "smart_infographic_ad6f0c7f",
|
||||
"type": "action",
|
||||
"version": "1.5.0",
|
||||
"version": "1.6.1",
|
||||
"author": "Fu-Jie",
|
||||
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
||||
"downloads": 1516,
|
||||
"views": 15370,
|
||||
"downloads": 1535,
|
||||
"views": 15655,
|
||||
"upvotes": 30,
|
||||
"saves": 59,
|
||||
"saves": 61,
|
||||
"comments": 12,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-03-22",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f"
|
||||
},
|
||||
{
|
||||
@@ -56,8 +56,8 @@
|
||||
"version": "1.2.8",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A content normalizer filter that fixes common Markdown formatting issues in LLM outputs, such as broken code blocks, LaTeX formulas, and list formatting. Including LaTeX command protection.",
|
||||
"downloads": 965,
|
||||
"views": 9872,
|
||||
"downloads": 983,
|
||||
"views": 10060,
|
||||
"upvotes": 27,
|
||||
"saves": 52,
|
||||
"comments": 6,
|
||||
@@ -70,17 +70,17 @@
|
||||
"title": "Async Context Compression",
|
||||
"slug": "async_context_compression_b1655bc8",
|
||||
"type": "filter",
|
||||
"version": "1.5.0",
|
||||
"version": "1.6.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
|
||||
"downloads": 935,
|
||||
"views": 8550,
|
||||
"downloads": 964,
|
||||
"views": 8791,
|
||||
"upvotes": 22,
|
||||
"saves": 56,
|
||||
"saves": 57,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-22",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
|
||||
},
|
||||
{
|
||||
@@ -90,9 +90,9 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Export current conversation from Markdown to Word (.docx) with Mermaid diagrams rendered client-side (Mermaid.js, SVG+PNG), LaTeX math, real hyperlinks, improved tables, syntax highlighting, and blockquote support.",
|
||||
"downloads": 920,
|
||||
"views": 7227,
|
||||
"upvotes": 21,
|
||||
"downloads": 940,
|
||||
"views": 7395,
|
||||
"upvotes": 22,
|
||||
"saves": 41,
|
||||
"comments": 8,
|
||||
"is_published_plugin": true,
|
||||
@@ -107,16 +107,33 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 853,
|
||||
"views": 9424,
|
||||
"downloads": 874,
|
||||
"views": 9646,
|
||||
"upvotes": 11,
|
||||
"saves": 27,
|
||||
"saves": 28,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-28",
|
||||
"updated_at": "2026-03-22",
|
||||
"url": "https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37"
|
||||
},
|
||||
{
|
||||
"title": "OpenWebUI Skills Manager Tool",
|
||||
"slug": "openwebui_skills_manager_tool_b4bce8e4",
|
||||
"type": "tool",
|
||||
"version": "0.3.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
|
||||
"downloads": 698,
|
||||
"views": 8399,
|
||||
"upvotes": 10,
|
||||
"saves": 31,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
|
||||
},
|
||||
{
|
||||
"title": "Export to Excel",
|
||||
"slug": "export_mulit_table_to_excel_244b8f9d",
|
||||
@@ -124,8 +141,8 @@
|
||||
"version": "0.3.7",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
|
||||
"downloads": 671,
|
||||
"views": 4084,
|
||||
"downloads": 685,
|
||||
"views": 4184,
|
||||
"upvotes": 13,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
@@ -134,23 +151,6 @@
|
||||
"updated_at": "2026-03-22",
|
||||
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
|
||||
},
|
||||
{
|
||||
"title": "OpenWebUI Skills Manager Tool",
|
||||
"slug": "openwebui_skills_manager_tool_b4bce8e4",
|
||||
"type": "tool",
|
||||
"version": "0.3.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
|
||||
"downloads": 663,
|
||||
"views": 8022,
|
||||
"upvotes": 10,
|
||||
"saves": 30,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-22",
|
||||
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
|
||||
},
|
||||
{
|
||||
"title": "GitHub Copilot Official SDK Pipe",
|
||||
"slug": "github_copilot_official_sdk_pipe_ce96f7b4",
|
||||
@@ -158,8 +158,8 @@
|
||||
"version": "0.12.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A powerful Agent SDK integration for OpenWebUI. It deeply bridges GitHub Copilot SDK with OpenWebUI's ecosystem, enabling the Agent to autonomously perform intent recognition, web search, and context compaction. It seamlessly reuses your existing Tools, MCP servers, OpenAPI servers, and Skills for a professional, full-featured experience.",
|
||||
"downloads": 460,
|
||||
"views": 6593,
|
||||
"downloads": 465,
|
||||
"views": 6718,
|
||||
"upvotes": 17,
|
||||
"saves": 12,
|
||||
"comments": 19,
|
||||
@@ -175,8 +175,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
|
||||
"downloads": 363,
|
||||
"views": 5148,
|
||||
"downloads": 368,
|
||||
"views": 5217,
|
||||
"upvotes": 13,
|
||||
"saves": 23,
|
||||
"comments": 2,
|
||||
@@ -192,8 +192,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.",
|
||||
"downloads": 259,
|
||||
"views": 2128,
|
||||
"downloads": 264,
|
||||
"views": 2166,
|
||||
"upvotes": 7,
|
||||
"saves": 17,
|
||||
"comments": 0,
|
||||
@@ -209,8 +209,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
|
||||
"downloads": 210,
|
||||
"views": 3264,
|
||||
"downloads": 224,
|
||||
"views": 3392,
|
||||
"upvotes": 7,
|
||||
"saves": 10,
|
||||
"comments": 0,
|
||||
@@ -219,6 +219,23 @@
|
||||
"updated_at": "2026-03-05",
|
||||
"url": "https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d"
|
||||
},
|
||||
{
|
||||
"title": "Batch Install Plugins from GitHub",
|
||||
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
|
||||
"type": "tool",
|
||||
"version": "1.1.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.",
|
||||
"downloads": 187,
|
||||
"views": 4118,
|
||||
"upvotes": 9,
|
||||
"saves": 8,
|
||||
"comments": 6,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-03-15",
|
||||
"updated_at": "2026-03-23",
|
||||
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
|
||||
},
|
||||
{
|
||||
"title": "导出为Word增强版",
|
||||
"slug": "导出为_word_支持公式流程图表格和代码块_8a6306c0",
|
||||
@@ -226,8 +243,8 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 180,
|
||||
"views": 3261,
|
||||
"downloads": 181,
|
||||
"views": 3293,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
@@ -236,23 +253,6 @@
|
||||
"updated_at": "2026-03-22",
|
||||
"url": "https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0"
|
||||
},
|
||||
{
|
||||
"title": "Batch Install Plugins from GitHub",
|
||||
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
|
||||
"type": "tool",
|
||||
"version": "1.1.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.",
|
||||
"downloads": 171,
|
||||
"views": 3940,
|
||||
"upvotes": 9,
|
||||
"saves": 8,
|
||||
"comments": 6,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-03-15",
|
||||
"updated_at": "2026-03-22",
|
||||
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
|
||||
},
|
||||
{
|
||||
"title": "📂 Folder Memory – Auto-Evolving Project Context",
|
||||
"slug": "folder_memory_auto_evolving_project_context_4a9875b2",
|
||||
@@ -260,8 +260,8 @@
|
||||
"version": "0.1.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
|
||||
"downloads": 142,
|
||||
"views": 2370,
|
||||
"downloads": 143,
|
||||
"views": 2404,
|
||||
"upvotes": 7,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
@@ -277,8 +277,8 @@
|
||||
"version": "0.1.3",
|
||||
"author": "Fu-Jie",
|
||||
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
|
||||
"downloads": 101,
|
||||
"views": 2617,
|
||||
"downloads": 102,
|
||||
"views": 2641,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -294,8 +294,8 @@
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 74,
|
||||
"views": 1731,
|
||||
"downloads": 75,
|
||||
"views": 1753,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -311,8 +311,8 @@
|
||||
"version": "0.9.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 59,
|
||||
"views": 871,
|
||||
"downloads": 60,
|
||||
"views": 878,
|
||||
"upvotes": 6,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
@@ -328,8 +328,8 @@
|
||||
"version": "1.2.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 48,
|
||||
"views": 958,
|
||||
"downloads": 49,
|
||||
"views": 965,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -345,8 +345,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 38,
|
||||
"views": 742,
|
||||
"downloads": 39,
|
||||
"views": 753,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -362,8 +362,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 36,
|
||||
"views": 1012,
|
||||
"downloads": 37,
|
||||
"views": 1031,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -379,10 +379,10 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 2,
|
||||
"views": 9,
|
||||
"downloads": 8,
|
||||
"views": 419,
|
||||
"upvotes": 1,
|
||||
"saves": 0,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-03-22",
|
||||
@@ -397,9 +397,9 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 22,
|
||||
"views": 427,
|
||||
"upvotes": 1,
|
||||
"saves": 0,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
"is_published_plugin": false,
|
||||
"created_at": "2026-03-22",
|
||||
@@ -414,7 +414,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3810,
|
||||
"views": 3828,
|
||||
"upvotes": 8,
|
||||
"saves": 3,
|
||||
"comments": 2,
|
||||
@@ -431,7 +431,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1900,
|
||||
"views": 1902,
|
||||
"upvotes": 6,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -448,7 +448,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2906,
|
||||
"views": 2917,
|
||||
"upvotes": 9,
|
||||
"saves": 4,
|
||||
"comments": 1,
|
||||
@@ -465,7 +465,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2470,
|
||||
"views": 2472,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -482,9 +482,9 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2149,
|
||||
"views": 2160,
|
||||
"upvotes": 15,
|
||||
"saves": 26,
|
||||
"saves": 27,
|
||||
"comments": 9,
|
||||
"is_published_plugin": false,
|
||||
"created_at": "2026-01-25",
|
||||
@@ -499,7 +499,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 278,
|
||||
"views": 279,
|
||||
"upvotes": 2,
|
||||
"saves": 0,
|
||||
"comments": 0,
|
||||
@@ -516,8 +516,8 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1630,
|
||||
"upvotes": 16,
|
||||
"views": 1640,
|
||||
"upvotes": 17,
|
||||
"saves": 14,
|
||||
"comments": 2,
|
||||
"is_published_plugin": false,
|
||||
@@ -531,10 +531,10 @@
|
||||
"name": "Fu-Jie",
|
||||
"profile_url": "https://openwebui.com/u/Fu-Jie",
|
||||
"profile_image": "https://community.s3.openwebui.com/uploads/users/b15d1348-4347-42b4-b815-e053342d6cb0/profile_d9510745-4bd4-4f8f-a997-4a21847d9300.webp",
|
||||
"followers": 418,
|
||||
"followers": 425,
|
||||
"following": 9,
|
||||
"total_points": 406,
|
||||
"post_points": 335,
|
||||
"total_points": 408,
|
||||
"post_points": 337,
|
||||
"comment_points": 71,
|
||||
"contributions": 89
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
> *Blue: Downloads | Purple: Views (Real-time dynamic)*
|
||||
|
||||
### 📂 Content Distribution
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 Overview
|
||||
@@ -27,24 +27,24 @@
|
||||
## 📂 By Type
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
|
||||
## 📋 Posts List
|
||||
|
||||
| Rank | Title | Type | Version | Downloads | Views | Upvotes | Saves | Updated |
|
||||
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-23 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-23 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-22 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-22 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-23 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-03-22 |
|
||||
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-23 |
|
||||
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-22 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-23 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool |  |  |  |  |  | 2026-03-05 |
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
||||
|
||||
### 📂 内容分类占比 (Distribution)
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 总览
|
||||
@@ -27,24 +27,24 @@
|
||||
## 📂 按类型分类
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
|
||||
## 📋 发布列表
|
||||
|
||||
| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |
|
||||
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-23 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-23 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-22 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-22 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-23 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-03-22 |
|
||||
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-23 |
|
||||
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-22 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-23 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-03-22 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool |  |  |  |  |  | 2026-03-05 |
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v1.0.0
|
||||
|
||||
- ✨ **Thinking Chain Structure**: Moves from surface understanding to deep strategic action.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 v1.0.0 更新内容
|
||||
|
||||
- ✨ **思维链结构**: 从表面理解一步步深入到战略行动。
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
Export conversation to Word (.docx) with **syntax highlighting**, **native math equations**, **Mermaid diagrams**, **citations**, and **enhanced table formatting**.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v0.4.4
|
||||
|
||||
- 🧹 **Content Cleanup**: Enhanced stripping of `<details>` blocks (often used for tool calls/thinking process) to ensure a clean final document.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
将对话导出为 Word (.docx),支持**代码语法高亮**、**原生数学公式**、**Mermaid 图表**、**引用参考**和**增强表格格式**。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 v0.4.4 更新内容
|
||||
|
||||
- 🧹 **内容清理加强**: 增强了对 `<details>` 块(通常包含工具调用或思考过程)的清理,确保最终文档整洁。
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
Export chat history to an Excel (.xlsx) file directly from the chat interface.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v0.3.6
|
||||
|
||||
- **OpenWebUI-Style Theme**: Modern dark header (#1f2937) with light gray zebra striping for better readability.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
将对话历史直接导出为 Excel (.xlsx) 文件。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v0.3.6
|
||||
|
||||
- **OpenWebUI 风格主题**:现代深灰表头(#1f2937)与浅灰斑马纹,提升可读性。
|
||||
|
||||
@@ -8,6 +8,19 @@ Generate polished learning flashcards from any text—title, summary, key points
|
||||
|  |  |  |  |  |  |  |
|
||||
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## What's New
|
||||
|
||||
### v0.2.4
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|  |  |  |  |  |  |  |
|
||||
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v0.2.4
|
||||
|
||||
* **输出优化**: 移除输出中的调试信息。
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v1.6.0
|
||||
|
||||
- 🌐 **Smart Language Detection**: Automatically detects the accurate UI language from your browser.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
基于 AntV Infographic 引擎的 Open WebUI 插件,能够将长文本内容一键转换为专业、美观的信息图表。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v1.6.0
|
||||
|
||||
- 🌐 **智能语言检测**:自动从浏览器准确识别当前界面语言设置。
|
||||
|
||||
@@ -10,6 +10,19 @@ Smart Mind Map is a powerful OpenWebUI action plugin that intelligently analyzes
|
||||
|
||||
> 🏆 **Featured by OpenWebUI Official** — This plugin was recommended in the official OpenWebUI Community Newsletter: [February 3, 2026](https://openwebui.com/blog/open-webui-community-newsletter-february-3rd-2026)
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## What's New in v1.0.0
|
||||
|
||||
### Direct Embed & UI Refinements
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
|
||||
> 🏆 **OpenWebUI 官方推荐** — 本插件获得 OpenWebUI 社区 Newsletter 官方推荐:[2026 年 2 月 3 日](https://openwebui.com/blog/open-webui-community-newsletter-february-3rd-2026)
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## v1.0.0 最新更新
|
||||
|
||||
### 嵌入式直出与 UI 细节全线重构
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Async Context Compression Filter
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -8,6 +8,25 @@
|
||||
|
||||
This filter reduces token consumption in long conversations through intelligent summarization and message compression while keeping conversations coherent.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## What's new in 1.6.0
|
||||
|
||||
- **Fixed `keep_first` Logic**: Re-defined `keep_first` to protect the first N **non-system** messages plus all interleaved system messages. This ensures initial context (e.g., identity, task instructions) is preserved correctly.
|
||||
- **Absolute System Message Protection**: System messages are now strictly excluded from compression. Any system message encountered in the history (even late-injected ones) is preserved as an original message in the final context.
|
||||
- **Improved Context Assembly**: Summaries now only target User and Assistant dialogue, ensuring that system instructions injected by other plugins are never "eaten" by the summarizer.
|
||||
|
||||
## What's new in 1.5.0
|
||||
|
||||
- **External Chat Reference Summaries**: Added support for referenced chat context blocks that can reuse cached summaries, inject small referenced chats directly, or generate summaries for larger referenced chats before injection.
|
||||
@@ -41,6 +60,10 @@ This filter reduces token consumption in long conversations through intelligent
|
||||
|
||||
## What This Fixes
|
||||
|
||||
- **Problem: System Messages being summarized/lost.**
|
||||
Previously, the filter could include system messages (especially those injected late by other plugins) in its summarization zone, causing important instructions to be lost. Now, all system messages are strictly preserved in their original role and never summarized.
|
||||
- **Problem: Incorrect `keep_first` behavior.**
|
||||
Previously, `keep_first` simply took the first $N$ messages. If those were only system messages, the initial user/assistant messages (which are often important for context) would be summarized. Now, `keep_first` ensures that $N$ non-system messages are protected.
|
||||
- **Problem 1: A referenced chat could break the current request.**
|
||||
Before, if the filter needed to summarize a referenced chat and that LLM call failed, the current chat could fail with it. Now it degrades gracefully and injects direct context instead.
|
||||
- **Problem 2: Some referenced chats were being cut too aggressively.**
|
||||
@@ -128,7 +151,7 @@ flowchart TD
|
||||
| `priority` | `10` | Execution order; lower runs earlier. |
|
||||
| `compression_threshold_tokens` | `64000` | Trigger asynchronous summary when total tokens exceed this value. Set to 50%-70% of your model's context window. |
|
||||
| `max_context_tokens` | `128000` | Hard cap for context; older messages (except protected ones) are dropped if exceeded. |
|
||||
| `keep_first` | `1` | Always keep the first N messages (protects system prompts). |
|
||||
| `keep_first` | `1` | Number of initial **non-system** messages to always keep (plus all preceding system prompts). |
|
||||
| `keep_last` | `6` | Always keep the last N messages to preserve recent context. |
|
||||
| `summary_model` | `None` | Model for summaries. Strongly recommended to set a fast, economical model (e.g., `gemini-2.5-flash`, `deepseek-v3`). Falls back to the current chat model when empty. |
|
||||
| `summary_model_max_context` | `0` | Input context window used to fit summary requests. If `0`, falls back to `model_thresholds` or global `max_context_tokens`. |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 异步上下文压缩过滤器
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -10,6 +10,25 @@
|
||||
|
||||
本过滤器通过智能摘要和消息压缩技术,在保持对话连贯性的同时,显著降低长对话的 Token 消耗。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 1.6.0 版本更新
|
||||
|
||||
- **修正 `keep_first` 逻辑**:重新定义了 `keep_first` 的功能,现在它负责保护前 N 条**非系统消息**(以及它们之前的所有系统提示词)。这确保了初始对话背景(如身份设定、任务说明)能被正确保留。
|
||||
- **系统消息绝对保护**:系统消息现在被严格排除在压缩范围之外。历史记录中遇到的任何系统消息(甚至是后期注入的消息)都会作为原始消息保留在最终上下文中。
|
||||
- **改进的上下文组装**:摘要现在仅针对用户和助手的对话,确保其他插件注入的系统指令永远不会被摘要器“吃掉”。
|
||||
|
||||
## 1.5.0 版本更新
|
||||
|
||||
- **外部聊天引用摘要**: 新增对引用聊天上下文的摘要支持。现在可以复用缓存摘要、直接注入较小引用聊天,或先为较大的引用聊天生成摘要再注入。
|
||||
@@ -39,12 +58,14 @@
|
||||
- ✅ **智能模型匹配**: 自定义模型自动继承基础模型的阈值配置。
|
||||
- ⚠ **多模态支持**: 图片内容会被保留,但其 Token **不参与计算**。请相应调整阈值。
|
||||
|
||||
详细的工作原理和更长说明仍可参考 [工作流程指南](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/WORKFLOW_GUIDE_CN.md)。
|
||||
|
||||
---
|
||||
|
||||
## 这次解决了什么问题(通俗版)
|
||||
|
||||
- **问题:系统消息被摘要或丢失。**
|
||||
以前,过滤器可能会将被引用或后期注入的系统消息包含在摘要区域内,导致重要的指令丢失。现在,所有系统消息都严格按原样保留,永不被摘要。
|
||||
- **问题:`keep_first` 逻辑不符合预期。**
|
||||
以前 `keep_first` 只是简单提取前 N 条消息。如果前几条全是系统消息,初始的问答(通常对上下文很重要)就会被压缩掉。现在 `keep_first` 确保保护 N 条非系统消息。
|
||||
- **问题 1:引用别的聊天时,摘要失败可能把当前对话一起弄挂。**
|
||||
以前如果过滤器需要先帮被引用聊天做摘要,而这一步的 LLM 调用失败了,当前请求也可能直接失败。现在改成了“能摘要就摘要,失败就退回直接塞上下文”,当前对话不会被一起拖死。
|
||||
- **问题 2:有些被引用聊天被截得太早,信息丢得太多。**
|
||||
@@ -72,11 +93,11 @@ flowchart TD
|
||||
F -- 是 --> G[直接复用缓存摘要]
|
||||
F -- 否 --> H{能直接放进当前预算?}
|
||||
H -- 是 --> I[直接注入完整引用聊天文本]
|
||||
H -- 否 --> J[准备引用聊天的摘要输入]
|
||||
H -- No --> J[准备引用聊天的摘要输入]
|
||||
|
||||
J --> K{引用聊天摘要调用成功?}
|
||||
K -- 是 --> L[注入生成后的引用摘要]
|
||||
K -- 否 --> M[回退为直接注入上下文]
|
||||
K -- No --> M[回退为直接注入上下文]
|
||||
|
||||
G --> D
|
||||
I --> D
|
||||
@@ -136,7 +157,7 @@ flowchart TD
|
||||
| `priority` | `10` | 过滤器执行顺序,数值越小越先执行。 |
|
||||
| `compression_threshold_tokens` | `64000` | **重要**: 当上下文总 Token 超过此值时后台生成摘要,建议设为模型上下文窗口的 50%-70%。 |
|
||||
| `max_context_tokens` | `128000` | **重要**: 上下文硬上限,超过即移除最早消息(保留受保护消息)。 |
|
||||
| `keep_first` | `1` | 始终保留对话开始的 N 条消息,保护系统提示或环境变量。 |
|
||||
| `keep_first` | `1` | 始终保留对话开始的 N 条**非系统消息**(以及它们之前的所有系统提示词)。 |
|
||||
| `keep_last` | `6` | 始终保留对话末尾的 N 条消息,确保最近上下文连贯。 |
|
||||
|
||||
### 摘要生成配置
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
A specialized filter for OpenWebUI that displays real-time metadata (display name, token capacity, and remaining quota) for models managed via the Antigravity Auth API.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install "Auth Model Info Filter" from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, confirm this plugin and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## Features
|
||||
|
||||
- **Automatic Metadata Injection**: Displays model details in the status bar of the chat interface.
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
一个专为 OpenWebUI 设计的过滤器插件,用于显示通过 Antigravity Auth API 管理的模型的实时元数据(显示名称、Token 容量和剩余配额)。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装“模型授权信息过滤器 (Auth Model Info Filter)”
|
||||
```
|
||||
|
||||
当选择弹窗打开后,确认当前插件并继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **自动元数据注入**: 在聊天界面的状态栏显示模型详细信息。
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
Automatically tracks and persists the mapping between user IDs and chat IDs for seamless session management.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## Key Features
|
||||
|
||||
🔄 **Automatic Tracking** - Captures user_id and chat_id on every message without manual intervention
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
自动追踪并持久化用户 ID 与聊天 ID 的映射关系,实现无缝的会话管理。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 核心功能
|
||||
|
||||
🔄 **自动追踪** - 无需手动干预,在每条消息上自动捕获 user_id 和 chat_id
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
**Folder Memory** is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v0.1.0
|
||||
|
||||
- **Initial Release**: Automated "Project Rules" management for OpenWebUI folders.
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
|
||||
这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v0.1.0
|
||||
|
||||
- **首个版本发布**:专注于自动化的“项目规则”管理。
|
||||
|
||||
@@ -10,6 +10,19 @@ This is a dedicated **companion filter plugin** designed specifically for the [G
|
||||
|
||||
Its core mission is to **protect user-uploaded files from being "pre-processed" by the OpenWebUI core system, ensuring that the Copilot Agent receives the raw files for autonomous analysis.**
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## ✨ v0.1.3 Updates (What's New)
|
||||
|
||||
- **🔍 BYOK Model ID Matching Fixed**: Now correctly identifies models in `github_copilot_official_sdk_pipe.xxx` format via prefix matching, in addition to keyword fallback for backward compatibility. (v0.1.3)
|
||||
|
||||
@@ -10,6 +10,19 @@
|
||||
|
||||
它的核心使命是:**保护用户上传的文件不被 OpenWebUI 核心系统“抢先处理”,确保 Copilot Agent 能够接收到原始文件并进行自主分析。**
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## ✨ 0.1.3 更新内容 (What's New)
|
||||
|
||||
- **🔍 BYOK 模型 ID 匹配修复**: 新增前缀匹配(`github_copilot_official_sdk_pipe.xxx` 格式),修复 BYOK 模型无法被正确识别的问题,关键词兜底保持向后兼容。(v0.1.3)
|
||||
|
||||
@@ -22,7 +22,7 @@ Filters act as middleware in the message pipeline:
|
||||
|
||||
Reduces token consumption in long conversations with safer summary fallbacks and clearer failure visibility.
|
||||
|
||||
**Version:** 1.5.0
|
||||
**Version:** 1.6.0
|
||||
|
||||
[:octicons-arrow-right-24: Documentation](async-context-compression.md)
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Filter 充当消息管线中的中间件:
|
||||
|
||||
通过更稳健的摘要回退和更清晰的失败提示,降低长对话的 token 消耗并保持连贯性。
|
||||
|
||||
**版本:** 1.5.0
|
||||
**版本:** 1.6.0
|
||||
|
||||
[:octicons-arrow-right-24: 查看文档](async-context-compression.zh.md)
|
||||
|
||||
|
||||
@@ -13,6 +13,19 @@ A powerful, context-aware content normalizer filter for Open WebUI designed to f
|
||||
|
||||
---
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## 🔥 What's New in v1.2.8
|
||||
* **Safe-by-Default Strategy**: The `enable_escape_fix` feature is now **disabled by default**. This prevents unwanted modifications to valid technical text like Windows file paths (`C:\new\test`) or complex LaTeX formulas.
|
||||
* **LaTeX Parsing Fix**: Improved the logic for identifying display math (`$$ ... $$`). Fixed a bug where LaTeX commands starting with `\n` (like `\nabla`) were incorrectly treated as newlines.
|
||||
|
||||
@@ -14,6 +14,19 @@
|
||||
|
||||
---
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v1.2.8
|
||||
* **“默认安全”策略 (Safe-by-Default)**:`enable_escape_fix` 功能现在**默认禁用**。这能有效防止插件在未经授权的情况下误改 Windows 路径 (`C:\new\test`) 或复杂的 LaTeX 公式。
|
||||
* **LaTeX 解析优化**:重构了显示数学公式 (`$$ ... $$`) 的识别逻辑。修复了 LaTeX 命令如果以 `\n` 开头(如 `\nabla`)会被错误识别为换行符的 Bug。
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# GitHub Copilot SDK Pipe for OpenWebUI
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.2 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -39,23 +39,12 @@ When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## ✨ v0.12.0: Adaptive Actions Console, Stream Deduplication & Full TTFT Profiling
|
||||
## ✨ v0.12.2: Multi-line Skill Frontmatter Support for `manage_skills`
|
||||
|
||||
- **📊 Predictive Adaptive Console**: Automatically models continuous decision layouts using `interactive_controls` state tables on the per-session workspace database so visual panels don't go stale.
|
||||
- **🛡️ Stream Overlap Deduplication**: Mitigated overlay dual delivery bugs on `assistant.message_delta` frames using conservative overlap trimming rules during turn resumptions.
|
||||
- **⏱️ Segmented Profiling Loadtimes**: Fine-grained timers identifying local startup overhead and pure cloud network turnaround time tracking calibration.
|
||||
- **🧹 Eliminate Redundancies**: Reduced redundant secondary heavy `_parse_mcp_servers()` loops inside session resumes for faster handshake callbacks.
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.0: Native Prompt Restoration, Live TODO Widget & SDK v0.1.30
|
||||
|
||||
- **⌨️ Authentic Prompt Restoration**: Restored the native Copilot CLI **Plan Mode** for complex task orchestration and native SQLite-backed session management for robust state persistence.
|
||||
- **📋 Live TODO Widget**: Added a compact real-time task tracking widget synchronized with `session.db`, keeping in-progress work visible without cluttering the chat history.
|
||||
- **🧩 OpenWebUI Tool Call Fixes**: Fixed custom tool invocation by syncing injected context with OpenWebUI 0.8.x expectations, including `__request__`, `request`, `body`, `__messages__`, `__metadata__`, `__files__`, `__task__`, and session/chat/message IDs.
|
||||
- **🔒 SDK v0.1.30 + Adaptive Workstyle**: Upgraded the pipe to `github-copilot-sdk==0.1.30`, moving workflow logic into the system prompt for autonomous "Plan-vs-Execute" decisions.
|
||||
- **🐛 Intent + Widget UX Fixes**: Fixed `report_intent` localization and cleaned up TODO widget layout for a more professional look.
|
||||
- **🧾 Better Embedded Tool Results**: Improved HTML/embedded tool outcomes and synchronized documentation surface.
|
||||
- **📝 Multi-line `description` Parsing**: `manage_skills` now understands `description: >` and `description: |` blocks in `SKILL.md`, including CRLF input from external repositories.
|
||||
- **💾 Safer `SKILL.md` Writing**: When a skill description contains line breaks, the pipe now writes YAML block scalars instead of fragile quoted single-line text.
|
||||
- **↩️ Better Metadata Fallbacks**: `title` can now act as the skill name fallback when `name` is absent, reducing generic directory-based names during skill import/sync.
|
||||
- **🧪 Regression Tests**: Added targeted parse/write round-trip coverage so future skill manager updates stay stable.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# GitHub Copilot Official SDK Pipe
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.2 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -40,23 +40,12 @@
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## ✨ v0.12.0:自适应动作面板、流排重拦截与全链路 TTFT 测定
|
||||
## ✨ v0.12.2:`manage_skills` 支持多行 Skill Frontmatter
|
||||
|
||||
- **📊 连续自适应看板 (Adaptive Actions Console)**:自动在 `interactive_controls` 辅助常驻状态表中追踪动作,引导 LLM 有选择性地在最新输出中展示最可能用到的点击控制面板,实现不翻页连续持久化点击操作。
|
||||
- **🛡️ 叠加流排重拦截 (Deduplicate Stream overlap)**:对接 `_dedupe_stream_chunk` 保守重叠裁剪,彻底消除二轮对话流重叠叠加异常。
|
||||
- **⏱️ 分段 ⏱️ Profiling 埋点**:拆装本地预热阻断与云端网络 Trip 数据时间,直观测算 Time-to-First-Byte。
|
||||
- **🧹 消除冗余解析**:剔除 Resume 过程对 MCP 的二次昂贵循环,提效握手微观时延。
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.0 最新更新:原生提示词恢复、Live TODO 小组件与 SDK v0.1.30 完善
|
||||
|
||||
- **⌨️ 原生提示词恢复**:恢复了原生 Copilot CLI **原生计划模式 (Native Plan Mode)** 复杂任务编排能力,并集成了基于 SQLite 的原生会话与持久化管理,提升 Agent 的状态把控能力。
|
||||
- **📋 Live TODO 小组件**:新增基于 `session.db` 实时任务状态的紧凑型嵌入式 TODO 小组件,任务进度常驻可见,无需在正文中重复显示全部待办列表。
|
||||
- **🧩 OpenWebUI 工具调用修复**:修复自定义工具调用时上下文注入不完整的问题,完全对齐 OpenWebUI 0.8.x 所需的系统级上下文(`__request__`、`body`、`__metadata__` 等)。
|
||||
- **🔒 SDK v0.1.30 与自适应工作流**:升级到 `github-copilot-sdk==0.1.30`,将规划与执行逻辑移至系统提示词,让 Agent 根据任务复杂度自主决策工作流。
|
||||
- **🐛 意图与体验优化**:修复 `report_intent` 国际化问题,优化 TODO 小组件的视觉布局,减少冗余空白。
|
||||
- **🧾 嵌入结果与文档更新**:改进 HTML/嵌入式工具结果处理,同步中英 README 与 docs 镜像页,确保发布状态一致。
|
||||
- **📝 多行 `description` 解析**:`manage_skills` 现在可以正确识别 `SKILL.md` 里的 `description: >` 和 `description: |`,并兼容来自外部仓库的 CRLF 输入。
|
||||
- **💾 更安全的 `SKILL.md` 回写**:当技能描述包含换行时,Pipe 会改用 YAML block scalar 写回,而不是脆弱的单行引号文本。
|
||||
- **↩️ 更稳的元数据回退**:当 `name` 缺失时,`title` 现在可以作为技能名回退,减少导入/同步时退回通用目录名的情况。
|
||||
- **🧪 回归测试补齐**:新增针对解析与写回 round-trip 的定向测试,保证后续技能管理改动更稳定。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ Pipes allow you to:
|
||||
|
||||
## Available Pipe Plugins
|
||||
|
||||
- [GitHub Copilot SDK](github-copilot-sdk.md) (v0.12.0) - Official GitHub Copilot SDK integration. Features **Workspace Isolation**, **Zero-config OpenWebUI Tool Bridge**, **BYOK** support, and **dynamic MCP discovery**. **NEW in v0.12.0: Shared Client Pool fix (High Performance), Pure BYOK-only Mode, and Stable RichUI auto-sizing**. [View Deep Dive](github-copilot-sdk-deep-dive.md) | [**View Advanced Tutorial**](github-copilot-sdk-tutorial.md) | [**View Detailed Usage Guide**](github-copilot-sdk-usage-guide.md).
|
||||
- [GitHub Copilot SDK](github-copilot-sdk.md) (v0.12.2) - Official GitHub Copilot SDK integration. Features **Workspace Isolation**, **Zero-config OpenWebUI Tool Bridge**, **BYOK** support, and **dynamic MCP discovery**. **NEW in v0.12.2: `manage_skills` multi-line `SKILL.md` frontmatter support and safer YAML writes**. [View Deep Dive](github-copilot-sdk-deep-dive.md) | [**View Advanced Tutorial**](github-copilot-sdk-tutorial.md) | [**View Detailed Usage Guide**](github-copilot-sdk-usage-guide.md).
|
||||
- **[Case Study: GitHub 100 Star Growth Analysis](star-prediction-example.md)** - Learn how to use the GitHub Copilot SDK Pipe with Minimax 2.1 to automatically analyze CSV data and generate project growth reports.
|
||||
- **[Case Study: High-Quality Video to GIF Conversion](video-processing-example.md)** - See how the model uses system-level FFmpeg to accelerate, scale, and optimize colors for screen recordings.
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ Pipes 可以用于:
|
||||
|
||||
## 可用的 Pipe 插件
|
||||
|
||||
- [GitHub Copilot SDK](github-copilot-sdk.zh.md) (v0.12.0) - GitHub Copilot SDK 官方集成。具备**工作区安全隔离**、**零配置工具桥接**与**BYOK (自带 Key) 支持**。**v0.12.0 更新:单例进程池 Bug 修复 (极速响应)、纯 BYOK 模式支持与 RichUI 自动高度稳定性增强**。[查看深度架构解析](github-copilot-sdk-deep-dive.zh.md) | [**查看进阶 实战教程**](github-copilot-sdk-tutorial.zh.md) | [**查看详细使用手册**](github-copilot-sdk-usage-guide.zh.md)。
|
||||
- [GitHub Copilot SDK](github-copilot-sdk.zh.md) (v0.12.2) - GitHub Copilot SDK 官方集成。具备**工作区安全隔离**、**零配置工具桥接**与**BYOK (自带 Key) 支持**。**v0.12.2 更新:`manage_skills` 支持多行 `SKILL.md` frontmatter,并改进 YAML 回写稳定性**。[查看深度架构解析](github-copilot-sdk-deep-dive.zh.md) | [**查看进阶 实战教程**](github-copilot-sdk-tutorial.zh.md) | [**查看详细使用手册**](github-copilot-sdk-usage-guide.zh.md)。
|
||||
- **[实战案例:GitHub 100 Star 增长预测](star-prediction-example.zh.md)** - 展示如何使用 GitHub Copilot SDK Pipe 结合 Minimax 2.1 模型,自动编写脚本分析 CSV 数据并生成详细的项目增长报告。
|
||||
- **[实战案例:视频高质量 GIF 转换与加速](video-processing-example.zh.md)** - 演示模型如何通过底层 FFmpeg 工具对录屏进行加速、缩放及双阶段色彩优化处理。
|
||||
|
||||
|
||||
@@ -8,6 +8,23 @@
|
||||
|
||||
One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
After you install [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) once, you can also use it to reinstall or update itself with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
> [!TIP]
|
||||
> **💡 Looking to batch install or manage Workspace Skills?**
|
||||
> This plugin specializes in installing global function-based plugins (Pipe, Filter, Tool, Action). If you need to manage your AI assistant's dedicated Skills, use our companion tool [OpenWebUI Skills Manager](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4), which provides full CRUD capabilities, batch discovery, and interactive selection dialogs.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **One-Click Install**: Install all plugins with a single command
|
||||
|
||||
@@ -8,6 +8,23 @@
|
||||
|
||||
一键将 GitHub 仓库中的插件批量安装到你的 OpenWebUI 实例。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
当你已经安装过一次 [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) 后,也可以用同一句来重新安装或更新它自己:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
> [!TIP]
|
||||
> **💡 想要批量安装/管理 Workspace 技能 (Skills)?**
|
||||
> 本插件专注安装全局函数型插件(Pipe/Filter/Tool/Action)。如果你需要管理 AI 助手的专属技能,请使用同系列的 [OpenWebUI Skills Manager](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) 工具,它具备完整的增删改查、批量发现及可视化浮层点选能力。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 一键安装:单个命令安装所有插件
|
||||
|
||||
@@ -5,5 +5,5 @@ OpenWebUI native Tool plugins that can be used across models.
|
||||
## Available Tool Plugins
|
||||
|
||||
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.md) (v1.1.0) - One-click batch install plugins from GitHub repositories with an interactive selection dialog and multi-language support.
|
||||
- [OpenWebUI Skills Manager Tool](openwebui-skills-manager-tool.md) (v0.3.0) - Simple native skill management (`list/show/install/create/update/delete`).
|
||||
- [OpenWebUI Skills Manager Tool](openwebui-skills-manager-tool.md) (v0.3.1) - Native skill management with multi-line `SKILL.md` frontmatter description support.
|
||||
- [Smart Mind Map Tool](smart-mind-map-tool.md) (v1.0.0) - Intelligently analyzes text content and proactively generates interactive mind maps to help users structure and visualize knowledge.
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
## 可用 Tool 插件
|
||||
|
||||
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.zh.md) (v1.1.0) - 一键从 GitHub 仓库批量安装插件,支持交互式选择对话框和多语言。
|
||||
- [OpenWebUI Skills 管理工具](openwebui-skills-manager-tool.zh.md) (v0.3.0) - 简化技能管理(`list/show/install/create/update/delete`)。
|
||||
- [OpenWebUI Skills 管理工具](openwebui-skills-manager-tool.zh.md) (v0.3.1) - 支持多行 `SKILL.md` frontmatter 描述的原生技能管理工具。
|
||||
- [智能思维导图工具 (Smart Mind Map Tool)](smart-mind-map-tool.zh.md) (v1.0.0) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# OpenWebUI Skills Manager Tool
|
||||
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.3.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.3.1 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
|
||||
A standalone OpenWebUI Tool plugin for managing native Workspace Skills across models.
|
||||
|
||||
## What's New
|
||||
|
||||
- Added GitHub skills-directory auto-discovery for `install_skill` (e.g., `.../tree/main/skills`) to install all child skills in one request.
|
||||
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback.
|
||||
- `install_skill` now supports multi-line `description: >` / `description: |` frontmatter blocks when importing remote `SKILL.md` files.
|
||||
- Added metadata fallback to use `title` when `name` is missing, plus regression tests for CRLF and YAML block scalars.
|
||||
|
||||
## Key Features
|
||||
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# OpenWebUI Skills 管理工具
|
||||
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.3.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.3.1 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
|
||||
一个可跨模型使用的 OpenWebUI 原生 Tool 插件,用于管理 Workspace Skills。
|
||||
|
||||
## 最新更新
|
||||
|
||||
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能。
|
||||
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料。
|
||||
- `install_skill` 现已支持远程 `SKILL.md` 中的多行 `description: >` / `description: |` frontmatter 描述。
|
||||
- 新增 `title` 作为 `name` 缺失时的元数据回退,并补齐 CRLF 与 YAML 块标量回归测试。
|
||||
|
||||
## 核心特性
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🧰 OpenWebUI Skills Manager Tool
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.3.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.3.1 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -8,12 +8,28 @@
|
||||
|
||||
A standalone OpenWebUI Tool plugin to manage native **Workspace > Skills** for any model.
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## What's New
|
||||
|
||||
- **🤖 Automatic Repo Root Discovery**: Install any GitHub repo by providing just the root URL (e.g., `https://github.com/owner/repo`). System auto-converts to discovery mode and installs all skills.
|
||||
- **🔄 Batch Deduplication**: Automatically removes duplicate URLs from batch installations and detects duplicate skill names.
|
||||
- Added GitHub skills-directory auto-discovery for `install_skill` (e.g., `.../tree/main/skills`) to install all child skills in one request.
|
||||
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback.
|
||||
- **📝 Multi-line Frontmatter Descriptions**: `install_skill` now correctly parses `description: >` and `description: |` blocks in remote `SKILL.md` files, so imported skill descriptions no longer truncate to a single line.
|
||||
- **↩️ Better Metadata Fallbacks**: If a skill frontmatter provides `title` without `name`, the installer now uses that title before falling back to directory-based names.
|
||||
- **🧪 Regression Coverage**: Added focused tests for folded/literal YAML blocks and CRLF line endings to keep external skill imports stable.
|
||||
|
||||
> [!TIP]
|
||||
> **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?**
|
||||
> This plugin specializes in managing Workspace Skills for your assistants. If you need to install and manage global function-based plugins, use our companion tool [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) for an optimized installation workflow.
|
||||
|
||||
## Key Features
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🧰 OpenWebUI Skills 管理工具
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.3.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.3.1 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -8,12 +8,28 @@
|
||||
|
||||
一个 OpenWebUI 原生 Tool 插件,用于让任意模型直接管理 **Workspace > Skills**。
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 最新更新
|
||||
|
||||
- **🤖 自动发现仓库根目录**:现在可以直接提供 GitHub 仓库根 URL(如 `https://github.com/owner/repo`),系统会自动转换为发现模式并安装所有 skill。
|
||||
- **🔄 批量去重**:自动清除重复 URL,检测重复的 skill 名称。
|
||||
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能。
|
||||
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料。
|
||||
- **📝 支持多行 Frontmatter 描述**:`install_skill` 现在可以正确解析远程 `SKILL.md` 里的 `description: >` 和 `description: |`,导入后的技能描述不再被截断成单行。
|
||||
- **↩️ 更稳的元数据回退**:当 frontmatter 只有 `title` 没有 `name` 时,安装器会优先使用 `title`,避免退回到通用目录名。
|
||||
- **🧪 回归测试补齐**:新增 folded/literal YAML 块和 CRLF 换行场景测试,保证外部技能导入行为稳定。
|
||||
|
||||
> [!TIP]
|
||||
> **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)?**
|
||||
> 本插件专注管理工作区的 AI 技能 (Skills)。如果你需要安装和管理全局函数型插件,请使用同系列的 [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) 工具,不仅安装体验极致,而且完美接轨系统扩展体系。
|
||||
|
||||
## 核心特性
|
||||
|
||||
|
||||
@@ -12,6 +12,19 @@ Smart Mind Map Tool is the tool version of the popular Smart Mind Map action plu
|
||||
|
||||
---
|
||||
|
||||
## Install with Batch Install Plugins
|
||||
|
||||
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
|
||||
|
||||
```text
|
||||
Install plugin from Fu-Jie/openwebui-extensions
|
||||
```
|
||||
|
||||
When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## Why is there a Tool version?
|
||||
|
||||
1. **Powered by OpenWebUI 0.8.0 Rich UI**: Previous versions of OpenWebUI did not support embedding custom HTML/iframes directly into the chat stream. Starting with 0.8.0, the platform introduced full Rich UI rendering support for **both Actions and Tools**, unleashing interactive frontend possibilities.
|
||||
|
||||
@@ -12,6 +12,19 @@
|
||||
|
||||
---
|
||||
|
||||
## 使用 Batch Install Plugins 安装
|
||||
|
||||
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
|
||||
|
||||
```text
|
||||
从 Fu-Jie/openwebui-extensions 安装插件
|
||||
```
|
||||
|
||||
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🚀 为什么会有工具(Tool)版本?
|
||||
|
||||
1. **得益于 OpenWebUI 0.8.0 的 Rich UI 特性**:在以前的版本中,是不支持直接将自定义的 HTML/iframe 嵌入到对话流中的。而从 0.8.0 开始,平台不仅支持了这种顺滑的前端组件直出(Rich UI),而且同时对 **Action** 和 **Tool** 开放了该能力。
|
||||
|
||||
@@ -507,6 +507,7 @@ You are a professional infographic design expert who can analyze user-provided t
|
||||
## Important Language Rule
|
||||
- **GENERATE CONTENT IN INPUT LANGUAGE**: You must generate the text content of the infographic in the **exact same language** as the user's input content (the text you are analyzing).
|
||||
- **Format Consistency**: Even if this system prompt is in English, if the user input is in Chinese, the infographic content must be in Chinese. If input is Japanese, output Japanese.
|
||||
- **If Unsure**: If the language is ambiguous, mixed, or cannot be clearly determined from the context, default to **English** for the infographic content.
|
||||
|
||||
## Infographic Syntax Specification
|
||||
|
||||
@@ -784,7 +785,7 @@ OpenWebUI Theme: {user_theme}
|
||||
Please select the most appropriate infographic template based on text characteristics and output standard infographic syntax. Pay attention to correct indentation format (two spaces).
|
||||
|
||||
⚠️ **Language Consistency Rule (CRITICAL)**:
|
||||
The title, desc, labels, and text items in your output **MUST STRICTLY MATCH the primary language of the original {long_text_content}**. Do NOT translate the content just to match default status parameters. Everything should follow the input flow natively.
|
||||
The title, desc, labels, and text items in your output **MUST STRICTLY MATCH the primary language of the original {long_text_content}**. Do NOT translate the content just to match default status parameters. If the language is ambiguous or mixed, default to **English** for output content nodes.
|
||||
|
||||
**Visual Optimization Guide (MUST FOLLOW):**
|
||||
- **Point-based Generation:** Infographics are not articles. Extract KEYWORDS ONLY, avoid complete sentences.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Async Context Compression Filter
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -21,6 +21,12 @@ When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## What's new in 1.6.0
|
||||
|
||||
- **Fixed `keep_first` Logic**: Re-defined `keep_first` to protect the first N **non-system** messages plus all interleaved system messages. This ensures initial context (e.g., identity, task instructions) is preserved correctly.
|
||||
- **Absolute System Message Protection**: System messages are now strictly excluded from compression. Any system message encountered in the history (even late-injected ones) is preserved as an original message in the final context. This ensures dynamic instructions (like live time/location from other plugins) remain accurate and never summarized.
|
||||
- **Improved Context Assembly**: Summaries now only target User and Assistant dialogue, ensuring that system instructions injected by other plugins are never "eaten" by the summarizer.
|
||||
|
||||
## What's new in 1.5.0
|
||||
|
||||
- **External Chat Reference Summaries**: Added support for referenced chat context blocks that can reuse cached summaries, inject small referenced chats directly, or generate summaries for larger referenced chats before injection.
|
||||
@@ -54,6 +60,10 @@ When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
## What This Fixes
|
||||
|
||||
- **Problem: System Messages being summarized/lost.**
|
||||
Previously, the filter could include system messages (especially those injected late by other plugins) in its summarization zone, causing important instructions to be lost. Now, all system messages are strictly preserved in their original role and never summarized.
|
||||
- **Problem: Incorrect `keep_first` behavior.**
|
||||
Previously, `keep_first` simply took the first $N$ messages. If those were only system messages, the initial user/assistant messages (which are often important for context) would be summarized. Now, `keep_first` ensures that $N$ non-system messages are protected.
|
||||
- **Problem 1: A referenced chat could break the current request.**
|
||||
Before, if the filter needed to summarize a referenced chat and that LLM call failed, the current chat could fail with it. Now it degrades gracefully and injects direct context instead.
|
||||
- **Problem 2: Some referenced chats were being cut too aggressively.**
|
||||
@@ -141,7 +151,7 @@ flowchart TD
|
||||
| `priority` | `10` | Execution order; lower runs earlier. |
|
||||
| `compression_threshold_tokens` | `64000` | Trigger asynchronous summary when total tokens exceed this value. Set to 50%-70% of your model's context window. |
|
||||
| `max_context_tokens` | `128000` | Hard cap for context; older messages (except protected ones) are dropped if exceeded. |
|
||||
| `keep_first` | `1` | Always keep the first N messages (protects system prompts). |
|
||||
| `keep_first` | `0` | Number of initial **non-system** messages to always keep (plus all preceding system prompts). |
|
||||
| `keep_last` | `6` | Always keep the last N messages to preserve recent context. |
|
||||
| `summary_model` | `None` | Model for summaries. Strongly recommended to set a fast, economical model (e.g., `gemini-2.5-flash`, `deepseek-v3`). Falls back to the current chat model when empty. |
|
||||
| `summary_model_max_context` | `0` | Input context window used to fit summary requests. If `0`, falls back to `model_thresholds` or global `max_context_tokens`. |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 异步上下文压缩过滤器
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -23,6 +23,12 @@
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 1.6.0 版本更新
|
||||
|
||||
- **修正 `keep_first` 逻辑**:重新定义了 `keep_first` 的功能,现在它负责保护前 N 条**非系统消息**(以及它们之前的所有系统提示词)。这确保了初始对话背景(如身份设定、任务说明)能被正确保留。
|
||||
- **系统消息绝对保护**:系统消息现在被严格排除在压缩范围之外。历史记录中遇到的任何系统消息(甚至是后期注入的消息)都会作为原始消息保留在最终上下文中。
|
||||
- **改进的上下文组装**:摘要现在仅针对用户和助手的对话,确保其他插件注入的系统指令永远不会被摘要器“吃掉”。
|
||||
|
||||
## 1.5.0 版本更新
|
||||
|
||||
- **外部聊天引用摘要**: 新增对引用聊天上下文的摘要支持。现在可以复用缓存摘要、直接注入较小引用聊天,或先为较大的引用聊天生成摘要再注入。
|
||||
@@ -52,12 +58,14 @@
|
||||
- ✅ **智能模型匹配**: 自定义模型自动继承基础模型的阈值配置。
|
||||
- ⚠ **多模态支持**: 图片内容会被保留,但其 Token **不参与计算**。请相应调整阈值。
|
||||
|
||||
详细的工作原理和更长说明仍可参考 [工作流程指南](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/WORKFLOW_GUIDE_CN.md)。
|
||||
|
||||
---
|
||||
|
||||
## 这次解决了什么问题(通俗版)
|
||||
|
||||
- **问题:系统消息被摘要或丢失。**
|
||||
以前,过滤器可能会将被引用或后期注入的系统消息包含在摘要区域内,导致重要的指令丢失。现在,所有系统消息都严格按原样保留,永不被摘要。
|
||||
- **问题:`keep_first` 逻辑不符合预期。**
|
||||
以前 `keep_first` 只是简单提取前 N 条消息。如果前几条全是系统消息,初始的问答(通常对上下文很重要)就会被压缩掉。现在 `keep_first` 确保保护 N 条非系统消息。
|
||||
- **问题 1:引用别的聊天时,摘要失败可能把当前对话一起弄挂。**
|
||||
以前如果过滤器需要先帮被引用聊天做摘要,而这一步的 LLM 调用失败了,当前请求也可能直接失败。现在改成了“能摘要就摘要,失败就退回直接塞上下文”,当前对话不会被一起拖死。
|
||||
- **问题 2:有些被引用聊天被截得太早,信息丢得太多。**
|
||||
@@ -85,11 +93,11 @@ flowchart TD
|
||||
F -- 是 --> G[直接复用缓存摘要]
|
||||
F -- 否 --> H{能直接放进当前预算?}
|
||||
H -- 是 --> I[直接注入完整引用聊天文本]
|
||||
H -- 否 --> J[准备引用聊天的摘要输入]
|
||||
H -- No --> J[准备引用聊天的摘要输入]
|
||||
|
||||
J --> K{引用聊天摘要调用成功?}
|
||||
K -- 是 --> L[注入生成后的引用摘要]
|
||||
K -- 否 --> M[回退为直接注入上下文]
|
||||
K -- No --> M[回退为直接注入上下文]
|
||||
|
||||
G --> D
|
||||
I --> D
|
||||
@@ -149,7 +157,7 @@ flowchart TD
|
||||
| `priority` | `10` | 过滤器执行顺序,数值越小越先执行。 |
|
||||
| `compression_threshold_tokens` | `64000` | **重要**: 当上下文总 Token 超过此值时后台生成摘要,建议设为模型上下文窗口的 50%-70%。 |
|
||||
| `max_context_tokens` | `128000` | **重要**: 上下文硬上限,超过即移除最早消息(保留受保护消息)。 |
|
||||
| `keep_first` | `1` | 始终保留对话开始的 N 条消息,保护系统提示或环境变量。 |
|
||||
| `keep_first` | `0` | 始终保留对话开始的 N 条**非系统消息**(以及它们之前的所有系统提示词)。 |
|
||||
| `keep_last` | `6` | 始终保留对话末尾的 N 条消息,确保最近上下文连贯。 |
|
||||
|
||||
### 摘要生成配置
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
```
|
||||
|
||||
**关键参数**:
|
||||
- `keep_first`:保留前 N 条消息(默认 1)
|
||||
- `keep_first`:保留前 N 条非系统消息(默认 0)
|
||||
- `keep_last`:保留后 N 条消息(默认 6)
|
||||
- 摘要注入位置:首条消息的内容前
|
||||
|
||||
@@ -432,7 +432,7 @@ Valves(
|
||||
max_context_tokens=128000, # 硬性上限
|
||||
|
||||
# 消息保留策略
|
||||
keep_first=1, # 保留首条(系统提示)
|
||||
keep_first=0, # 不保留首条非系统消息(默认)
|
||||
keep_last=6, # 保留末6条(最近对话)
|
||||
|
||||
# 摘要模型
|
||||
@@ -601,13 +601,13 @@ outlet 阶段:
|
||||
总消息: 20 条
|
||||
预估 Token: 8000 个
|
||||
|
||||
压缩后(keep_first=1, keep_last=6):
|
||||
头部消息: 1 条 (1600 Token)
|
||||
压缩后(keep_first=0, keep_last=6):
|
||||
头部消息: 0 条 (0 Token)
|
||||
摘要: ~800 Token (嵌入在头部)
|
||||
尾部消息: 6 条 (3200 Token)
|
||||
总计: 7 条有效输入 (~5600 Token)
|
||||
总计: 6 条有效输入 (~4000 Token)
|
||||
|
||||
节省:8000 - 5600 = 2400 Token (30% 节省)
|
||||
节省:8000 - 4000 = 4000 Token (50% 节省)
|
||||
|
||||
随对话变长,节省比例可达 65% 以上
|
||||
```
|
||||
|
||||
@@ -5,30 +5,23 @@ author: Fu-Jie
|
||||
author_url: https://github.com/Fu-Jie/openwebui-extensions
|
||||
funding_url: https://github.com/open-webui
|
||||
description: Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.
|
||||
version: 1.5.0
|
||||
version: 1.6.0
|
||||
openwebui_id: b1655bc8-6de9-4cad-8cb5-a6f7829a02ce
|
||||
license: MIT
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
📌 What's new in 1.5.0
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
✅ Stronger Working-Memory Prompt: Refined XML summary instructions to better preserve useful context in general chat and multi-step tool workflows.
|
||||
✅ Clearer Frontend Debug Logs: Reworked browser-console debug output into grouped, structured snapshots for faster diagnosis.
|
||||
✅ Safer Tool Trimming Defaults: Native tool-output trimming is now enabled by default with a configurable 600-character threshold.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
📌 Overview
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
This filter significantly reduces token consumption in long conversations by using intelligent summarization and message compression, while maintaining conversational coherence.
|
||||
This filter reduces token consumption in long conversations through intelligent
|
||||
summarization and message compression while maintaining conversational coherence.
|
||||
|
||||
Core Features:
|
||||
✅ Automatic compression triggered by Token count threshold
|
||||
✅ Automatic compression triggered by token count threshold
|
||||
✅ Asynchronous summary generation (does not block user response)
|
||||
✅ Persistent storage with database support (PostgreSQL and SQLite)
|
||||
✅ Flexible retention policy (configurable to keep first and last N messages)
|
||||
✅ Smart summary injection to maintain context
|
||||
✅ Flexible retention policy (keep first N non-system messages + last N messages)
|
||||
✅ Absolute system message protection (never compressed or discarded)
|
||||
✅ Structure-aware trimming to preserve document skeleton
|
||||
✅ Native tool output trimming for function calling support
|
||||
|
||||
@@ -41,21 +34,51 @@ Phase 1: Inlet (Pre-request processing)
|
||||
1. Receives all messages in the current conversation.
|
||||
2. Checks for a previously saved summary.
|
||||
3. If a summary exists and the message count exceeds the retention threshold:
|
||||
├─ Extracts the first N messages to be kept.
|
||||
├─ Extracts the first N non-system messages to be kept (plus all
|
||||
│ interleaved system messages).
|
||||
├─ Injects the summary into the first message.
|
||||
├─ Extracts the last N messages to be kept.
|
||||
└─ Combines them into a new message list: [Kept First Messages + Summary] + [Kept Last Messages].
|
||||
└─ Combines them into: [Kept First + Summary + Gap System Messages + Kept Last]
|
||||
4. Sends the compressed message list to the LLM.
|
||||
|
||||
Phase 2: Outlet (Post-response processing)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
1. Triggered after the LLM response is complete.
|
||||
2. Checks if the Token count has reached the compression threshold.
|
||||
3. If the threshold is met, an asynchronous background task is started to generate a summary:
|
||||
├─ Extracts messages to be summarized (excluding the kept first and last messages).
|
||||
2. Checks if the token count has reached the compression threshold.
|
||||
3. If the threshold is met, an asynchronous background task is started:
|
||||
├─ Extracts messages to be summarized (excluding the kept first and last).
|
||||
├─ Calls the LLM to generate a concise summary.
|
||||
└─ Saves the summary to the database.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
🛡️ System Message Protection
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
System messages are strictly excluded from compression and always preserved in
|
||||
the final context. This ensures that dynamic instructions injected by other
|
||||
plugins (e.g., live time/location context) remain accurate throughout the
|
||||
conversation.
|
||||
|
||||
Protection Rules:
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
1. `keep_first` counts only non-system messages. System messages within the
|
||||
first N non-system messages are automatically preserved.
|
||||
2. System messages in the compression gap (between kept-first and kept-last)
|
||||
are extracted and preserved as original messages, not summarized.
|
||||
3. During forced trimming (when exceeding `max_context_tokens`), system
|
||||
messages from dropped atomic groups are re-inserted into the final output.
|
||||
|
||||
Example:
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
Messages: [sys, user1, sys(injected), user2, ..., user10, user11]
|
||||
keep_first=0, keep_last=2
|
||||
|
||||
Effective keep_first=0 (no non-system messages protected)
|
||||
Gap: [sys, user1, sys(injected), user2, ..., user9]
|
||||
Preserved from gap: [sys, sys(injected)]
|
||||
|
||||
Final output: [sys, summary, sys(injected), user10, user11]
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
💾 Storage
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
@@ -80,7 +103,7 @@ Open WebUI's database settings automatically.
|
||||
📊 Compression Example
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Scenario: A 20-message conversation (Default settings: keep first 1, keep last 6)
|
||||
Scenario: A 20-message conversation (Default settings: keep first 0, keep last 6)
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
Before Compression:
|
||||
Message 1: [Initial prompt + First question]
|
||||
@@ -104,75 +127,89 @@ Scenario: A 20-message conversation (Default settings: keep first 1, keep last 6
|
||||
|
||||
priority
|
||||
Default: 10
|
||||
Description: The execution order of the filter. Lower numbers run first.
|
||||
Description: Priority level for the filter operations. Lower numbers run first.
|
||||
|
||||
compression_threshold_tokens
|
||||
Default: 64000
|
||||
Description: When the total context Token count exceeds this value, compression is triggered.
|
||||
Recommendation: Adjust based on your model's context window and cost.
|
||||
Description: When total context Token count exceeds this value, trigger compression (Global Default).
|
||||
|
||||
max_context_tokens
|
||||
Default: 128000
|
||||
Description: Hard limit for context. Exceeding this value will force removal of the earliest messages.
|
||||
Description: Hard limit for context. Exceeding this value will force removal of earliest messages (Global Default).
|
||||
|
||||
model_thresholds
|
||||
Default: {}
|
||||
Description: Threshold override configuration for specific models.
|
||||
Example: {"gpt-4": {"compression_threshold_tokens": 8000, "max_context_tokens": 32000}}
|
||||
Default: "" (empty string)
|
||||
Description: Per-model threshold overrides.
|
||||
Format: model_id:compression_threshold:max_context (comma-separated).
|
||||
Example: gpt-4:8000:32000,claude-3:100000:200000
|
||||
|
||||
keep_first
|
||||
Default: 0
|
||||
Description: Keep the first N non-system messages plus all interleaved system messages. Set to 0 to disable.
|
||||
|
||||
keep_last
|
||||
Default: 6
|
||||
Description: Always keep the last N full messages.
|
||||
|
||||
summary_model
|
||||
Default: None
|
||||
Description: The model ID used to generate the summary. If empty, uses the current conversation's model.
|
||||
Recommendation:
|
||||
- Configure a fast, economical, and compatible model, such as `deepseek-v3`, `gemini-2.5-flash`, `gpt-4.1`.
|
||||
- If the current conversation uses a pipeline (Pipe) model or a model that does not support standard generation APIs, this field must be specified.
|
||||
|
||||
summary_model_max_context
|
||||
Default: 0
|
||||
Description: Max context tokens for the summary model. If 0, falls back to model_thresholds or global max_context_tokens.
|
||||
Example: gemini-flash=1000000, gpt-4o-mini=128000
|
||||
|
||||
max_summary_tokens
|
||||
Default: 16384
|
||||
Description: The maximum number of tokens for the summary.
|
||||
|
||||
summary_temperature
|
||||
Default: 0.1
|
||||
Description: The temperature for summary generation. Lower values produce more deterministic output.
|
||||
|
||||
enable_tool_output_trimming
|
||||
Default: true
|
||||
Description: When enabled and `function_calling: "native"` is active, collapses oversized native tool outputs to a short placeholder while preserving the tool-call chain structure.
|
||||
Description: Enable trimming of large tool outputs (only works with native function calling).
|
||||
|
||||
tool_trim_threshold_chars
|
||||
Default: 600
|
||||
Description: Trim native tool outputs when their total content length reaches this many characters.
|
||||
|
||||
keep_first
|
||||
Default: 1
|
||||
Description: Always keep the first N messages of the conversation. Set to 0 to disable. The first message often contains important system prompts.
|
||||
show_token_usage_status
|
||||
Default: true
|
||||
Description: Show token usage status notification.
|
||||
|
||||
keep_last
|
||||
Default: 6
|
||||
Description: Always keep the last N full messages of the conversation to ensure context coherence.
|
||||
|
||||
summary_model
|
||||
Default: None
|
||||
Description: The LLM used to generate the summary.
|
||||
Recommendation:
|
||||
- It is strongly recommended to configure a fast, economical, and compatible model, such as `deepseek-v3`, `gemini-2.5-flash`, `gpt-4.1`.
|
||||
- If left empty, the filter will attempt to use the model from the current conversation.
|
||||
Note:
|
||||
- If the current conversation uses a pipeline (Pipe) model or a model that does not support standard generation APIs, leaving this field empty may cause summary generation to fail. In this case, you must specify a valid model.
|
||||
|
||||
max_summary_tokens
|
||||
Default: 16384
|
||||
Description: The maximum number of tokens allowed for the generated summary.
|
||||
|
||||
summary_temperature
|
||||
Default: 0.1
|
||||
Description: Controls the randomness of the summary generation. Lower values produce more deterministic output.
|
||||
token_usage_status_threshold
|
||||
Default: 80
|
||||
Description: Only show token usage status when usage exceeds this percentage (0-100). Set to 0 to always show.
|
||||
|
||||
debug_mode
|
||||
Default: false
|
||||
Description: Prints detailed debug information to the log. Recommended to set to `false` in production.
|
||||
Description: Enable detailed logging for debugging. Recommended to set to `false` in production.
|
||||
|
||||
show_debug_log
|
||||
Default: false
|
||||
Description: Print debug logs to browser console (F12). Useful for frontend debugging.
|
||||
Description: Show debug logs in the frontend console (F12). Useful for frontend debugging.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
🔧 Deployment
|
||||
═══════════════════════════════════════════════════════
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
The plugin automatically uses Open WebUI's shared database connection.
|
||||
No additional database configuration is required.
|
||||
|
||||
Suggested Filter Installation Order:
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
It is recommended to set the priority of this filter relatively high (a smaller number) to ensure it runs before other filters that might modify message content. A typical order might be:
|
||||
It is recommended to set the priority of this filter relatively high (a smaller
|
||||
number) to ensure it runs before other filters that might modify message content.
|
||||
A typical order might be:
|
||||
|
||||
1. Filters that need access to the full, uncompressed history (priority < 10)
|
||||
(e.g., a filter that injects a system-level prompt)
|
||||
(e.g., a filter that injects a system-level prompt like live context)
|
||||
2. This compression filter (priority = 10)
|
||||
3. Filters that run after compression (priority > 10)
|
||||
(e.g., a final output formatting filter)
|
||||
@@ -216,7 +253,8 @@ Statistics:
|
||||
✓ The `chat_summary` table will be created automatically on first run.
|
||||
|
||||
2. Retention Policy
|
||||
⚠ The `keep_first` setting is crucial for preserving initial messages that contain system prompts. Configure it as needed.
|
||||
⚠ `keep_first` counts only non-system messages. System messages are always
|
||||
preserved regardless of this setting.
|
||||
|
||||
3. Performance
|
||||
⚠ Summary generation is asynchronous and will not block the user response.
|
||||
@@ -252,7 +290,8 @@ Solution:
|
||||
|
||||
Problem: Initial system prompt is lost
|
||||
Solution:
|
||||
- Ensure `keep_first` is set to a value greater than 0 to preserve the initial messages containing this information.
|
||||
- System messages are always preserved. If a system prompt is missing, check
|
||||
whether another filter is modifying or removing it.
|
||||
|
||||
Problem: Compression effect is not significant
|
||||
Solution:
|
||||
@@ -1249,13 +1288,25 @@ class Filter:
|
||||
return groups
|
||||
|
||||
def _get_effective_keep_first(self, messages: List[Dict]) -> int:
|
||||
"""Protect configured head messages and all leading system messages."""
|
||||
last_system_index = -1
|
||||
"""
|
||||
Calculate the index to protect the first N NON-SYSTEM messages.
|
||||
All system messages encountered before reaching the Nth non-system message are also kept.
|
||||
"""
|
||||
if not messages:
|
||||
return 0
|
||||
|
||||
non_system_count = 0
|
||||
target_index = 0
|
||||
|
||||
for i, msg in enumerate(messages):
|
||||
if msg.get("role") == "system":
|
||||
last_system_index = i
|
||||
|
||||
return max(self.valves.keep_first, last_system_index + 1)
|
||||
if msg.get("role") != "system":
|
||||
non_system_count += 1
|
||||
|
||||
target_index = i + 1
|
||||
if non_system_count >= self.valves.keep_first:
|
||||
break
|
||||
|
||||
return target_index
|
||||
|
||||
def _align_tail_start_to_atomic_boundary(
|
||||
self, messages: List[Dict], raw_start_index: int, protected_prefix: int
|
||||
@@ -1475,9 +1526,9 @@ class Filter:
|
||||
)
|
||||
|
||||
keep_first: int = Field(
|
||||
default=1,
|
||||
default=0,
|
||||
ge=0,
|
||||
description="Always keep the first N messages. Set to 0 to disable.",
|
||||
description="Keep the first N non-system messages plus all interleaved system messages. Set to 0 to disable.",
|
||||
)
|
||||
keep_last: int = Field(
|
||||
default=6, ge=0, description="Always keep the last N full messages."
|
||||
@@ -3047,6 +3098,14 @@ class Filter:
|
||||
messages, raw_start_index, effective_keep_first
|
||||
)
|
||||
|
||||
# --- Extract Preserved System Messages from the Gap ---
|
||||
# Any system message in the gap (messages[effective_keep_first:start_index])
|
||||
# must be preserved according to policy.
|
||||
gap_messages = messages[effective_keep_first:start_index]
|
||||
preserved_system_messages = [
|
||||
msg for msg in gap_messages if isinstance(msg, dict) and msg.get("role") == "system"
|
||||
]
|
||||
|
||||
# 3. Summary message (Inserted as Assistant message)
|
||||
external_refs = body.pop("__external_references__", None)
|
||||
summary_msg = self._build_summary_message(
|
||||
@@ -3105,7 +3164,7 @@ class Filter:
|
||||
# --- Preflight Check & Budgeting (Simplified) ---
|
||||
|
||||
# Assemble candidate messages (for output)
|
||||
candidate_messages = head_messages + [summary_msg] + tail_messages
|
||||
candidate_messages = head_messages + [summary_msg] + preserved_system_messages + tail_messages
|
||||
|
||||
# Prepare messages for token calculation (include system prompt if missing)
|
||||
calc_messages = candidate_messages
|
||||
@@ -3189,7 +3248,7 @@ class Filter:
|
||||
)
|
||||
|
||||
# Re-assemble
|
||||
candidate_messages = head_messages + [summary_msg] + tail_messages
|
||||
candidate_messages = head_messages + [summary_msg] + preserved_system_messages + tail_messages
|
||||
|
||||
await self._log(
|
||||
"[Inlet] ✂️ Sent-context history reduced\n"
|
||||
@@ -3209,6 +3268,7 @@ class Filter:
|
||||
)
|
||||
head_tokens = self._estimate_messages_tokens(head_messages)
|
||||
summary_tokens = self._estimate_content_tokens(summary_content)
|
||||
preserved_system_tokens = self._estimate_messages_tokens(preserved_system_messages)
|
||||
tail_tokens = self._estimate_messages_tokens(tail_messages)
|
||||
else:
|
||||
system_tokens = (
|
||||
@@ -3218,14 +3278,15 @@ class Filter:
|
||||
)
|
||||
head_tokens = self._calculate_messages_tokens(head_messages)
|
||||
summary_tokens = self._count_tokens(summary_content)
|
||||
preserved_system_tokens = self._calculate_messages_tokens(preserved_system_messages)
|
||||
tail_tokens = self._calculate_messages_tokens(tail_messages)
|
||||
|
||||
system_info = (
|
||||
f"System({system_tokens}t)" if system_prompt_msg else "System(0t)"
|
||||
f"System({system_tokens + preserved_system_tokens}t)" if (system_prompt_msg or preserved_system_messages) else "System(0t)"
|
||||
)
|
||||
|
||||
total_section_tokens = (
|
||||
system_tokens + head_tokens + summary_tokens + tail_tokens
|
||||
system_tokens + head_tokens + summary_tokens + preserved_system_tokens + tail_tokens
|
||||
)
|
||||
|
||||
await self._log(
|
||||
@@ -3371,15 +3432,33 @@ class Filter:
|
||||
# Use atomic grouping to preserve tool-calling integrity
|
||||
trimmable = candidate_messages[effective_keep_first:]
|
||||
atomic_groups = self._get_atomic_groups(trimmable)
|
||||
|
||||
# To follow policy "system messages never lost", we maintain a list of
|
||||
# system messages that were part of dropped groups.
|
||||
dropped_but_preserved_systems = []
|
||||
|
||||
while total_tokens > max_context_tokens and len(atomic_groups) > 1:
|
||||
dropped_group_indices = atomic_groups.pop(0)
|
||||
dropped_tokens = 0
|
||||
for _ in range(len(dropped_group_indices)):
|
||||
dropped = trimmable.pop(0)
|
||||
|
||||
# Absolute protections:
|
||||
# 1. External references (often large and specialized)
|
||||
# 2. System messages (instructions)
|
||||
if self._is_external_reference_message(dropped):
|
||||
trimmable.insert(0, dropped)
|
||||
# Stop dropping this group if we hit a protected message
|
||||
# (Though groups should be pure, this is a safety net)
|
||||
break
|
||||
|
||||
if isinstance(dropped, dict) and dropped.get("role") == "system":
|
||||
dropped_but_preserved_systems.append(dropped)
|
||||
# Even if preserved, it counts as "dropped" from the trimmable flow
|
||||
# to avoid infinite loop, but its tokens remain in the budget.
|
||||
# We don't subtract its tokens here.
|
||||
continue
|
||||
|
||||
if total_tokens == estimated_tokens:
|
||||
dropped_tokens += self._estimate_content_tokens(
|
||||
dropped.get("content", "")
|
||||
@@ -3390,8 +3469,9 @@ class Filter:
|
||||
)
|
||||
total_tokens -= dropped_tokens
|
||||
|
||||
# Re-assemble: [Head] + [Preserved Systems from Dropped Groups] + [Remaining Trimmable/Tail]
|
||||
candidate_messages = (
|
||||
candidate_messages[:effective_keep_first] + trimmable
|
||||
candidate_messages[:effective_keep_first] + dropped_but_preserved_systems + trimmable
|
||||
)
|
||||
|
||||
await self._log(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# GitHub Copilot SDK Pipe for OpenWebUI
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.2 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -39,23 +39,12 @@ When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
> [!IMPORTANT]
|
||||
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
|
||||
|
||||
## ✨ v0.12.0: Adaptive Actions Console, Stream Deduplication & Full TTFT Profiling
|
||||
## ✨ v0.12.2: Multi-line Skill Frontmatter Support for `manage_skills`
|
||||
|
||||
- **📊 Predictive Adaptive Console**: Automatically models continuous decision layouts using `interactive_controls` state tables on the per-session workspace database so visual panels don't go stale.
|
||||
- **🛡️ Stream Overlap Deduplication**: Mitigated overlay dual delivery bugs on `assistant.message_delta` frames using conservative overlap trimming rules during turn resumptions.
|
||||
- **⏱️ Segmented Profiling Loadtimes**: Fine-grained timers identifying local startup overhead and pure cloud network turnaround time tracking calibration.
|
||||
- **🧹 Eliminate Redundancies**: Reduced redundant secondary heavy `_parse_mcp_servers()` loops inside session resumes for faster handshake callbacks.
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.0: Native Prompt Restoration, Live TODO Widget & SDK v0.1.30
|
||||
|
||||
- **⌨️ Authentic Prompt Restoration**: Restored the native Copilot CLI **Plan Mode** for complex task orchestration and native SQLite-backed session management for robust state persistence.
|
||||
- **📋 Live TODO Widget**: Added a compact real-time task tracking widget synchronized with `session.db`, keeping in-progress work visible without cluttering the chat history.
|
||||
- **🧩 OpenWebUI Tool Call Fixes**: Fixed custom tool invocation by syncing injected context with OpenWebUI 0.8.x expectations, including `__request__`, `request`, `body`, `__messages__`, `__metadata__`, `__files__`, `__task__`, and session/chat/message IDs.
|
||||
- **🔒 SDK v0.1.30 + Adaptive Workstyle**: Upgraded the pipe to `github-copilot-sdk==0.1.30`, moving workflow logic into the system prompt for autonomous "Plan-vs-Execute" decisions.
|
||||
- **🐛 Intent + Widget UX Fixes**: Fixed `report_intent` localization and cleaned up TODO widget layout for a more professional look.
|
||||
- **🧾 Better Embedded Tool Results**: Improved HTML/embedded tool outcomes and synchronized documentation surface.
|
||||
- **📝 Multi-line `description` Parsing**: `manage_skills` now understands `description: >` and `description: |` blocks in `SKILL.md`, including CRLF input from external repositories.
|
||||
- **💾 Safer `SKILL.md` Writing**: When a skill description contains line breaks, the pipe now writes YAML block scalars instead of fragile quoted single-line text.
|
||||
- **↩️ Better Metadata Fallbacks**: `title` can now act as the skill name fallback when `name` is absent, reducing generic directory-based names during skill import/sync.
|
||||
- **🧪 Regression Tests**: Added targeted parse/write round-trip coverage so future skill manager updates stay stable.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# GitHub Copilot Official SDK Pipe
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.2 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -40,23 +40,12 @@
|
||||
> [!IMPORTANT]
|
||||
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本,请先删除旧版本,否则重新安装时可能报错。删除后,Batch Install Plugins 后续就可以继续负责更新这个插件。
|
||||
|
||||
## ✨ v0.12.0:自适应动作面板、流排重拦截与全链路 TTFT 测定
|
||||
## ✨ v0.12.2:`manage_skills` 支持多行 Skill Frontmatter
|
||||
|
||||
- **📊 连续自适应看板 (Adaptive Actions Console)**:自动在 `interactive_controls` 辅助常驻状态表中追踪动作,引导 LLM 有选择性地在最新输出中展示最可能用到的点击控制面板,实现不翻页连续持久化点击操作。
|
||||
- **🛡️ 叠加流排重拦截 (Deduplicate Stream overlap)**:对接 `_dedupe_stream_chunk` 保守重叠裁剪,彻底消除二轮对话流重叠叠加异常。
|
||||
- **⏱️ 分段 ⏱️ Profiling 埋点**:拆装本地预热阻断与云端网络 Trip 数据时间,直观测算 Time-to-First-Byte。
|
||||
- **🧹 消除冗余解析**:剔除 Resume 过程对 MCP 的二次昂贵循环,提效握手微观时延。
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.0 最新更新:原生提示词恢复、Live TODO 小组件与 SDK v0.1.30 完善
|
||||
|
||||
- **⌨️ 原生提示词恢复**:恢复了原生 Copilot CLI **原生计划模式 (Native Plan Mode)** 复杂任务编排能力,并集成了基于 SQLite 的原生会话与持久化管理,提升 Agent 的状态把控能力。
|
||||
- **📋 Live TODO 小组件**:新增基于 `session.db` 实时任务状态的紧凑型嵌入式 TODO 小组件,任务进度常驻可见,无需在正文中重复显示全部待办列表。
|
||||
- **🧩 OpenWebUI 工具调用修复**:修复自定义工具调用时上下文注入不完整的问题,完全对齐 OpenWebUI 0.8.x 所需的系统级上下文(`__request__`、`body`、`__metadata__` 等)。
|
||||
- **🔒 SDK v0.1.30 与自适应工作流**:升级到 `github-copilot-sdk==0.1.30`,将规划与执行逻辑移至系统提示词,让 Agent 根据任务复杂度自主决策工作流。
|
||||
- **🐛 意图与体验优化**:修复 `report_intent` 国际化问题,优化 TODO 小组件的视觉布局,减少冗余空白。
|
||||
- **🧾 嵌入结果与文档更新**:改进 HTML/嵌入式工具结果处理,同步中英 README 与 docs 镜像页,确保发布状态一致。
|
||||
- **📝 多行 `description` 解析**:`manage_skills` 现在可以正确识别 `SKILL.md` 里的 `description: >` 和 `description: |`,并兼容来自外部仓库的 CRLF 输入。
|
||||
- **💾 更安全的 `SKILL.md` 回写**:当技能描述包含换行时,Pipe 会改用 YAML block scalar 写回,而不是脆弱的单行引号文本。
|
||||
- **↩️ 更稳的元数据回退**:当 `name` 缺失时,`title` 现在可以作为技能名回退,减少导入/同步时退回通用目录名的情况。
|
||||
- **🧪 回归测试补齐**:新增针对解析与写回 round-trip 的定向测试,保证后续技能管理改动更稳定。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ author_url: https://github.com/Fu-Jie/openwebui-extensions
|
||||
funding_url: https://github.com/open-webui
|
||||
openwebui_id: ce96f7b4-12fc-4ac3-9a01-875713e69359
|
||||
description: A powerful Agent SDK integration for OpenWebUI. It deeply bridges GitHub Copilot SDK with OpenWebUI's ecosystem, enabling the Agent to autonomously perform intent recognition, web search, and context compaction. It seamlessly reuses your existing Tools, MCP servers, OpenAPI servers, and Skills for a professional, full-featured experience.
|
||||
version: 0.12.0
|
||||
version: 0.12.2
|
||||
requirements: github-copilot-sdk==0.1.30
|
||||
"""
|
||||
|
||||
@@ -78,10 +78,74 @@ RICHUI_BRIDGE_STYLE = """
|
||||
<style id="openwebui-richui-bridge-style" data-openwebui-richui-bridge="1">
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
/* Theme-aware CSS variables for AI-generated content */
|
||||
--richui-text: #1a202c;
|
||||
--richui-text-secondary: #4a5568;
|
||||
--richui-text-muted: #718096;
|
||||
--richui-bg: #ffffff;
|
||||
--richui-bg-secondary: #f7fafc;
|
||||
--richui-bg-tertiary: #edf2f7;
|
||||
--richui-border: #e2e8f0;
|
||||
--richui-border-subtle: #edf2f7;
|
||||
--richui-accent: #3182ce;
|
||||
--richui-accent-hover: #2b6cb0;
|
||||
--richui-success: #38a169;
|
||||
--richui-warning: #d69e2e;
|
||||
--richui-error: #e53e3e;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--richui-text: #f7fafc;
|
||||
--richui-text-secondary: #cbd5e0;
|
||||
--richui-text-muted: #a0aec0;
|
||||
--richui-bg: #1a202c;
|
||||
--richui-bg-secondary: #2d3748;
|
||||
--richui-bg-tertiary: #4a5568;
|
||||
--richui-border: #4a5568;
|
||||
--richui-border-subtle: #2d3748;
|
||||
--richui-accent: #63b3ed;
|
||||
--richui-accent-hover: #90cdf4;
|
||||
--richui-success: #68d391;
|
||||
--richui-warning: #f6e05e;
|
||||
--richui-error: #fc8181;
|
||||
}
|
||||
}
|
||||
html[data-openwebui-applied-theme="dark"],
|
||||
html.dark {
|
||||
--richui-text: #f7fafc;
|
||||
--richui-text-secondary: #cbd5e0;
|
||||
--richui-text-muted: #a0aec0;
|
||||
--richui-bg: #1a202c;
|
||||
--richui-bg-secondary: #2d3748;
|
||||
--richui-bg-tertiary: #4a5568;
|
||||
--richui-border: #4a5568;
|
||||
--richui-border-subtle: #2d3748;
|
||||
--richui-accent: #63b3ed;
|
||||
--richui-accent-hover: #90cdf4;
|
||||
--richui-success: #68d391;
|
||||
--richui-warning: #f6e05e;
|
||||
--richui-error: #fc8181;
|
||||
}
|
||||
html[data-openwebui-applied-theme="light"],
|
||||
html.light {
|
||||
--richui-text: #1a202c;
|
||||
--richui-text-secondary: #4a5568;
|
||||
--richui-text-muted: #718096;
|
||||
--richui-bg: #ffffff;
|
||||
--richui-bg-secondary: #f7fafc;
|
||||
--richui-bg-tertiary: #edf2f7;
|
||||
--richui-border: #e2e8f0;
|
||||
--richui-border-subtle: #edf2f7;
|
||||
--richui-accent: #3182ce;
|
||||
--richui-accent-hover: #2b6cb0;
|
||||
--richui-success: #38a169;
|
||||
--richui-warning: #d69e2e;
|
||||
--richui-error: #e53e3e;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
background: transparent !important;
|
||||
color: var(--richui-text) !important;
|
||||
overflow-x: hidden !important;
|
||||
width: 100% !important;
|
||||
margin: 0 !important;
|
||||
@@ -1655,7 +1719,7 @@ class Pipe:
|
||||
description="Copilot CLI log level: none, error, warning, info, debug, all",
|
||||
)
|
||||
TIMEOUT: int = Field(
|
||||
default=300,
|
||||
default=3600,
|
||||
description="Timeout for each stream chunk (seconds)",
|
||||
)
|
||||
|
||||
@@ -2051,12 +2115,12 @@ class Pipe:
|
||||
+ "".join(button_html)
|
||||
+ "</div></section>\n"
|
||||
"<style>\n"
|
||||
".openwebui-richui-fallback-actions{margin:20px auto 0;max-width:1200px;padding:14px 16px;border:1px solid rgba(148,163,184,.18);border-radius:14px;background:rgba(15,23,42,.04);}\n"
|
||||
".openwebui-richui-fallback-title{font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--color-text-secondary, #64748b);margin-bottom:10px;}\n"
|
||||
".openwebui-richui-fallback-actions{margin:20px auto 0;max-width:1200px;padding:14px 16px;border:1px solid var(--richui-border, rgba(148,163,184,.18));border-radius:14px;background:var(--richui-bg-secondary, rgba(15,23,42,.04));}\n"
|
||||
".openwebui-richui-fallback-title{font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--richui-text-secondary, #64748b);margin-bottom:10px;}\n"
|
||||
".openwebui-richui-fallback-row{display:flex;flex-wrap:wrap;gap:10px;}\n"
|
||||
".openwebui-richui-action-btn{appearance:none;border:1px solid rgba(148,163,184,.24);background:var(--color-bg-secondary, rgba(255,255,255,.9));color:var(--color-text-primary, #0f172a);border-radius:999px;padding:8px 14px;font:500 13px/1.2 var(--font-sans, system-ui);cursor:pointer;transition:all .18s ease;}\n"
|
||||
".openwebui-richui-action-btn:hover{transform:translateY(-1px);border-color:rgba(59,130,246,.55);}\n"
|
||||
".openwebui-richui-action-btn:focus-visible{outline:2px solid rgba(59,130,246,.6);outline-offset:2px;}\n"
|
||||
".openwebui-richui-action-btn{appearance:none;border:1px solid var(--richui-border, rgba(148,163,184,.24));background:var(--richui-bg, rgba(255,255,255,.9));color:var(--richui-text, #0f172a);border-radius:999px;padding:8px 14px;font:500 13px/1.2 var(--font-sans, system-ui);cursor:pointer;transition:all .18s ease;}\n"
|
||||
".openwebui-richui-action-btn:hover{transform:translateY(-1px);border-color:var(--richui-accent, rgba(59,130,246,.55));}\n"
|
||||
".openwebui-richui-action-btn:focus-visible{outline:2px solid var(--richui-accent, rgba(59,130,246,.6));outline-offset:2px;}\n"
|
||||
"</style>\n"
|
||||
)
|
||||
|
||||
@@ -5108,6 +5172,10 @@ class Pipe:
|
||||
__event_call__,
|
||||
)
|
||||
continue
|
||||
tool_type = t_dict.get("type", "")
|
||||
tool_id = t_dict.get("tool_id", "")
|
||||
if tool_type == "terminal" or str(tool_id).startswith("terminal:"):
|
||||
continue
|
||||
try:
|
||||
copilot_tool = self._convert_openwebui_tool_to_sdk(
|
||||
tool_name,
|
||||
@@ -6105,36 +6173,149 @@ class Pipe:
|
||||
shared_dir.mkdir(parents=True, exist_ok=True)
|
||||
return str(shared_dir)
|
||||
|
||||
def _normalize_skill_md_newlines(self, text: str) -> str:
|
||||
"""Normalize CRLF/CR text to LF for stable SKILL.md parsing."""
|
||||
return text.replace("\r\n", "\n").replace("\r", "\n")
|
||||
|
||||
def _strip_skill_meta_quotes(self, value: str) -> str:
|
||||
"""Remove matching wrapping quotes from a frontmatter scalar."""
|
||||
value = (value or "").strip()
|
||||
if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}:
|
||||
return value[1:-1]
|
||||
return value
|
||||
|
||||
def _collect_skill_meta_block(
|
||||
self, lines: List[str], start_index: int
|
||||
) -> Tuple[List[str], int]:
|
||||
"""Collect indented frontmatter block lines until the next top-level key."""
|
||||
block_lines: List[str] = []
|
||||
index = start_index
|
||||
|
||||
while index < len(lines):
|
||||
line = lines[index]
|
||||
if not line.strip():
|
||||
block_lines.append("")
|
||||
index += 1
|
||||
continue
|
||||
|
||||
indent = len(line) - len(line.lstrip(" "))
|
||||
if indent == 0 and re.match(r"^[A-Za-z0-9_-]+:(.*)$", line):
|
||||
break
|
||||
if indent == 0:
|
||||
break
|
||||
|
||||
block_lines.append(line)
|
||||
index += 1
|
||||
|
||||
non_empty_indents = [
|
||||
len(line) - len(line.lstrip(" ")) for line in block_lines if line.strip()
|
||||
]
|
||||
min_indent = min(non_empty_indents) if non_empty_indents else 0
|
||||
dedented = [line[min_indent:] if line else "" for line in block_lines]
|
||||
return dedented, index
|
||||
|
||||
def _fold_skill_meta_block(self, lines: List[str]) -> str:
|
||||
"""Fold YAML `>` block lines into paragraphs separated by blank lines."""
|
||||
parts: List[str] = []
|
||||
paragraph: List[str] = []
|
||||
|
||||
for line in lines:
|
||||
if line == "":
|
||||
if paragraph:
|
||||
parts.append(" ".join(segment.strip() for segment in paragraph))
|
||||
paragraph = []
|
||||
if parts and parts[-1] != "":
|
||||
parts.append("")
|
||||
continue
|
||||
paragraph.append(line.strip())
|
||||
|
||||
if paragraph:
|
||||
parts.append(" ".join(segment.strip() for segment in paragraph))
|
||||
|
||||
return "\n".join(parts).strip()
|
||||
|
||||
def _parse_skill_frontmatter_scalars(self, frontmatter_text: str) -> Dict[str, str]:
|
||||
"""Parse simple top-level YAML frontmatter scalars, including block scalars."""
|
||||
lines = self._normalize_skill_md_newlines(frontmatter_text).split("\n")
|
||||
metadata: Dict[str, str] = {}
|
||||
index = 0
|
||||
|
||||
while index < len(lines):
|
||||
line = lines[index]
|
||||
stripped = line.strip()
|
||||
|
||||
if not stripped or stripped.startswith("#") or line.startswith(" "):
|
||||
index += 1
|
||||
continue
|
||||
|
||||
match = re.match(r"^([A-Za-z0-9_-]+):(.*)$", line)
|
||||
if not match:
|
||||
index += 1
|
||||
continue
|
||||
|
||||
key = match.group(1)
|
||||
raw_value = match.group(2).lstrip()
|
||||
|
||||
if raw_value[:1] in {"|", ">"}:
|
||||
block_lines, index = self._collect_skill_meta_block(lines, index + 1)
|
||||
metadata[key] = (
|
||||
"\n".join(block_lines).strip()
|
||||
if raw_value.startswith("|")
|
||||
else self._fold_skill_meta_block(block_lines)
|
||||
)
|
||||
continue
|
||||
|
||||
block_lines, next_index = self._collect_skill_meta_block(lines, index + 1)
|
||||
if block_lines:
|
||||
segments = [self._strip_skill_meta_quotes(raw_value)] + [
|
||||
segment.strip() for segment in block_lines
|
||||
]
|
||||
metadata[key] = self._fold_skill_meta_block(segments)
|
||||
index = next_index
|
||||
continue
|
||||
|
||||
metadata[key] = self._strip_skill_meta_quotes(raw_value)
|
||||
index += 1
|
||||
|
||||
return metadata
|
||||
|
||||
def _parse_skill_md_meta(self, content: str, fallback_name: str) -> tuple:
|
||||
"""Parse SKILL.md content into (name, description, body).
|
||||
|
||||
Handles files with or without YAML frontmatter.
|
||||
Strips quotes from frontmatter string values.
|
||||
"""
|
||||
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", content, re.DOTALL)
|
||||
normalized_content = self._normalize_skill_md_newlines(content)
|
||||
fm_match = re.match(
|
||||
r"^---\s*\n(.*?)\n---\s*(?:\n|$)", normalized_content, re.DOTALL
|
||||
)
|
||||
if fm_match:
|
||||
fm_text = fm_match.group(1)
|
||||
body = content[fm_match.end() :].strip()
|
||||
name = fallback_name
|
||||
description = ""
|
||||
for line in fm_text.split("\n"):
|
||||
m = re.match(r"^name:\s*(.+)$", line)
|
||||
if m:
|
||||
name = m.group(1).strip().strip("\"'")
|
||||
m = re.match(r"^description:\s*(.+)$", line)
|
||||
if m:
|
||||
description = m.group(1).strip().strip("\"'")
|
||||
body = normalized_content[fm_match.end() :].strip()
|
||||
metadata = self._parse_skill_frontmatter_scalars(fm_text)
|
||||
name = (
|
||||
metadata.get("name") or metadata.get("title") or fallback_name
|
||||
).strip()
|
||||
description = (metadata.get("description") or "").strip()
|
||||
return name, description, body
|
||||
# No frontmatter: try to extract H1 as name
|
||||
h1_match = re.search(r"^#\s+(.+)$", content.strip(), re.MULTILINE)
|
||||
stripped_content = normalized_content.strip()
|
||||
h1_match = re.search(r"^#\s+(.+)$", stripped_content, re.MULTILINE)
|
||||
name = h1_match.group(1).strip() if h1_match else fallback_name
|
||||
return name, "", content.strip()
|
||||
return name, "", stripped_content
|
||||
|
||||
def _build_skill_md_content(self, name: str, description: str, body: str) -> str:
|
||||
"""Construct a SKILL.md file string from name, description, and body."""
|
||||
desc_line = description or name
|
||||
if any(c in desc_line for c in ":#\n"):
|
||||
desc_line = f'"{desc_line}"'
|
||||
desc_value = (description or name).strip()
|
||||
if "\n" in desc_value:
|
||||
desc_body = "\n".join(
|
||||
f" {line}" if line else "" for line in desc_value.split("\n")
|
||||
)
|
||||
desc_line = f"|\n{desc_body}"
|
||||
else:
|
||||
desc_line = desc_value
|
||||
if any(c in desc_line for c in ":#"):
|
||||
desc_line = f'"{desc_line}"'
|
||||
return (
|
||||
f"---\n"
|
||||
f"name: {name}\n"
|
||||
@@ -9608,7 +9789,7 @@ class Pipe:
|
||||
break
|
||||
|
||||
now_ts = time.monotonic()
|
||||
no_progress_timeout = min(float(self.valves.TIMEOUT), 90.0)
|
||||
no_progress_timeout = float(self.valves.TIMEOUT)
|
||||
time_since_last_event = now_ts - state.get(
|
||||
"last_event_ts", stream_start_ts
|
||||
)
|
||||
|
||||
24
plugins/pipes/github-copilot-sdk/v0.12.1.md
Normal file
24
plugins/pipes/github-copilot-sdk/v0.12.1.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# GitHub Copilot SDK Pipe v0.12.1
|
||||
|
||||
This release disables terminal server tools from being exposed to AI while keeping terminal functionality available to users, and improves RichUI theme compatibility with automatic light/dark mode adaptation.
|
||||
|
||||
## New Features
|
||||
|
||||
- **Disable Terminal Tools for AI**: Terminal server tools (e.g., `run_command`) are now filtered out at the pipe level, preventing AI from calling them while preserving terminal functionality for users through the OpenWebUI interface.
|
||||
- **RichUI Theme-Aware CSS Variables**: Added CSS custom properties (`--richui-text`, `--richui-bg`, etc.) that automatically adapt to light/dark themes, improving text contrast and readability in AI-generated HTML content.
|
||||
|
||||
## Improvements
|
||||
|
||||
- **Fallback Actions Styling**: Updated fallback action buttons to use theme-aware CSS variables for consistent appearance across themes.
|
||||
- **Default Timeout**: Increased default stream timeout from 300s to 3600s for better handling of long-running tasks.
|
||||
|
||||
## Version Changes
|
||||
|
||||
### Plugin Updates
|
||||
|
||||
- **GitHub Copilot SDK Pipe**: v0.12.0 → v0.12.1 | [📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/README.md)
|
||||
|
||||
---
|
||||
|
||||
📚 [Documentation Portal](https://fu-jie.github.io/openwebui-extensions/)
|
||||
🐛 [Report Issues](https://github.com/Fu-Jie/openwebui-extensions/issues)
|
||||
24
plugins/pipes/github-copilot-sdk/v0.12.1_CN.md
Normal file
24
plugins/pipes/github-copilot-sdk/v0.12.1_CN.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# GitHub Copilot SDK Pipe v0.12.1
|
||||
|
||||
本次发布在管道层面禁用了终端服务器工具的 AI 调用,同时保留用户通过界面使用终端的功能,并改进了 RichUI 主题兼容性,支持自动浅色/深色模式适配。
|
||||
|
||||
## 新功能
|
||||
|
||||
- **禁用终端工具 AI 调用**: 终端服务器工具(如 `run_command`)已在管道层面被过滤,AI 无法调用这些工具,但用户仍可通过 OpenWebUI 界面使用终端功能。
|
||||
- **RichUI 主题感知 CSS 变量**: 新增 CSS 自定义属性(`--richui-text`、`--richui-bg` 等),自动适配浅色/深色主题,改善 AI 生成 HTML 内容的文字对比度和可读性。
|
||||
|
||||
## 改进
|
||||
|
||||
- **Fallback Actions 样式优化**: 更新 fallback action 按钮使用主题感知 CSS 变量,确保跨主题一致性。
|
||||
- **默认超时时间**: 将默认流超时从 300 秒增加到 3600 秒,更好地处理长时间运行的任务。
|
||||
|
||||
## 版本变更
|
||||
|
||||
### 插件更新
|
||||
|
||||
- **GitHub Copilot SDK Pipe**: v0.12.0 → v0.12.1 | [📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/README_CN.md)
|
||||
|
||||
---
|
||||
|
||||
📚 [文档门户](https://fu-jie.github.io/openwebui-extensions/)
|
||||
🐛 [报告问题](https://github.com/Fu-Jie/openwebui-extensions/issues)
|
||||
29
plugins/pipes/github-copilot-sdk/v0.12.2.md
Normal file
29
plugins/pipes/github-copilot-sdk/v0.12.2.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# GitHub Copilot SDK Pipe v0.12.2
|
||||
|
||||
This patch release hardens the built-in `manage_skills` workflow so the pipe can reliably read and write `SKILL.md` metadata with multi-line descriptions.
|
||||
|
||||
## New Features
|
||||
|
||||
- **Multi-line Frontmatter Parsing**: `manage_skills` now supports folded (`description: >`) and literal (`description: |`) frontmatter blocks, including CRLF input.
|
||||
- **Stable `SKILL.md` Writes**: Multi-line descriptions are now written back as YAML block scalars when creating or editing skills through the pipe.
|
||||
|
||||
## Bug Fixes
|
||||
|
||||
- Fixed imported skill descriptions being truncated or flattened when source `SKILL.md` files used multi-line YAML frontmatter.
|
||||
- Added `title` fallback when `name` is missing, reducing generic directory-name fallbacks during skill import and sync.
|
||||
|
||||
## Improvements
|
||||
|
||||
- Added regression tests covering parse/write round-trips for multi-line descriptions.
|
||||
- Synced README and docs mirrors so the latest release messaging matches the updated skill metadata behavior.
|
||||
|
||||
## Version Changes
|
||||
|
||||
### Plugin Updates
|
||||
|
||||
- **GitHub Copilot SDK Pipe**: v0.12.1 → v0.12.2 | [📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/README.md)
|
||||
|
||||
---
|
||||
|
||||
📚 [Documentation Portal](https://fu-jie.github.io/openwebui-extensions/)
|
||||
🐛 [Report Issues](https://github.com/Fu-Jie/openwebui-extensions/issues)
|
||||
29
plugins/pipes/github-copilot-sdk/v0.12.2_CN.md
Normal file
29
plugins/pipes/github-copilot-sdk/v0.12.2_CN.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# GitHub Copilot SDK Pipe v0.12.2
|
||||
|
||||
这个补丁版本重点加固了内置 `manage_skills` 工作流,让 Pipe 能更可靠地读写带有多行描述的 `SKILL.md` 元数据。
|
||||
|
||||
## 新功能
|
||||
|
||||
- **多行 Frontmatter 解析**:`manage_skills` 现已支持 folded(`description: >`)和 literal(`description: |`)两种 frontmatter 描述格式,并兼容 CRLF 输入。
|
||||
- **稳定的 `SKILL.md` 回写**:当通过 Pipe 创建或编辑技能且描述包含换行时,现在会自动写成 YAML block scalar。
|
||||
|
||||
## 问题修复
|
||||
|
||||
- 修复源 `SKILL.md` 使用多行 YAML frontmatter 时,导入后的技能描述被截断或压平成单段文本的问题。
|
||||
- 当 `name` 缺失时新增 `title` 回退,减少技能导入/同步时退回通用目录名的情况。
|
||||
|
||||
## 优化提升
|
||||
|
||||
- 新增覆盖多行描述 parse/write round-trip 的回归测试。
|
||||
- 同步更新 README 与 docs 镜像页,确保最新发布说明与技能元数据行为一致。
|
||||
|
||||
## 版本变更
|
||||
|
||||
### 插件更新
|
||||
|
||||
- **GitHub Copilot SDK Pipe**: v0.12.1 → v0.12.2 | [📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/README_CN.md)
|
||||
|
||||
---
|
||||
|
||||
📚 [文档门户](https://fu-jie.github.io/openwebui-extensions/)
|
||||
🐛 [报告问题](https://github.com/Fu-Jie/openwebui-extensions/issues)
|
||||
@@ -44,7 +44,7 @@ METADATA_KEY_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_-]*$")
|
||||
|
||||
TRANSLATIONS = {
|
||||
"en-US": {
|
||||
"status_fetching": "Fetching plugin list from GitHub...",
|
||||
"status_fetching": "Discovering plugins from {repo}...",
|
||||
"status_installing": "Installing [{type}] {title}...",
|
||||
"status_done": "Installation complete: {success}/{total} plugins installed.",
|
||||
"status_list_title": "Available Plugins ({count} total)",
|
||||
@@ -67,7 +67,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "No plugins match the specified types.",
|
||||
},
|
||||
"zh-CN": {
|
||||
"status_fetching": "正在从 GitHub 获取插件列表...",
|
||||
"status_fetching": "正在从 {repo} 发现插件...",
|
||||
"status_installing": "正在安装 [{type}] {title}...",
|
||||
"status_done": "安装完成:成功安装 {success}/{total} 个插件。",
|
||||
"status_list_title": "可用插件(共 {count} 个)",
|
||||
@@ -90,7 +90,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "没有符合指定类型的插件。",
|
||||
},
|
||||
"zh-HK": {
|
||||
"status_fetching": "正在從 GitHub 取得外掛列表...",
|
||||
"status_fetching": "正在從 {repo} 發現外掛...",
|
||||
"status_installing": "正在安裝 [{type}] {title}...",
|
||||
"status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。",
|
||||
"status_list_title": "可用外掛(共 {count} 個)",
|
||||
@@ -113,7 +113,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "沒有符合指定類型的外掛。",
|
||||
},
|
||||
"zh-TW": {
|
||||
"status_fetching": "正在從 GitHub 取得外掛列表...",
|
||||
"status_fetching": "正在從 {repo} 發現外掛...",
|
||||
"status_installing": "正在安裝 [{type}] {title}...",
|
||||
"status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。",
|
||||
"status_list_title": "可用外掛(共 {count} 個)",
|
||||
@@ -136,7 +136,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "沒有符合指定類型的外掛。",
|
||||
},
|
||||
"ko-KR": {
|
||||
"status_fetching": "GitHub에서 플러그인 목록을 가져오는 중...",
|
||||
"status_fetching": "{repo}에서 플러그인 검색 중...",
|
||||
"status_installing": "[{type}] {title} 설치 중...",
|
||||
"status_done": "설치 완료: {success}/{total}개 플러그인 설치됨.",
|
||||
"status_list_title": "사용 가능한 플러그인 (총 {count}개)",
|
||||
@@ -159,7 +159,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "지정된 유형과 일치하는 플러그인이 없습니다.",
|
||||
},
|
||||
"ja-JP": {
|
||||
"status_fetching": "GitHubからプラグインリストを取得中...",
|
||||
"status_fetching": "{repo}からプラグインを検索中...",
|
||||
"status_installing": "[{type}] {title} をインストール中...",
|
||||
"status_done": "インストール完了: {success}/{total}個のプラグインがインストールされました。",
|
||||
"status_list_title": "利用可能なプラグイン (合計{count}個)",
|
||||
@@ -182,7 +182,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "指定されたタイプのプラグインがありません。",
|
||||
},
|
||||
"fr-FR": {
|
||||
"status_fetching": "Récupération de la liste des plugins depuis GitHub...",
|
||||
"status_fetching": "Recherche de plugins dans {repo}...",
|
||||
"status_installing": "Installation de [{type}] {title}...",
|
||||
"status_done": "Installation terminée: {success}/{total} plugins installés.",
|
||||
"status_list_title": "Plugins disponibles ({count} au total)",
|
||||
@@ -205,7 +205,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "Aucun plugin ne correspond aux types spécifiés.",
|
||||
},
|
||||
"de-DE": {
|
||||
"status_fetching": "Plugin-Liste wird von GitHub abgerufen...",
|
||||
"status_fetching": "Plugins werden in {repo} gesucht...",
|
||||
"status_installing": "[{type}] {title} wird installiert...",
|
||||
"status_done": "Installation abgeschlossen: {success}/{total} Plugins installiert.",
|
||||
"status_list_title": "Verfügbare Plugins (insgesamt {count})",
|
||||
@@ -228,7 +228,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "Keine Plugins entsprechen den angegebenen Typen.",
|
||||
},
|
||||
"es-ES": {
|
||||
"status_fetching": "Obteniendo lista de plugins de GitHub...",
|
||||
"status_fetching": "Buscando plugins en {repo}...",
|
||||
"status_installing": "Instalando [{type}] {title}...",
|
||||
"status_done": "Instalación completada: {success}/{total} plugins instalados.",
|
||||
"status_list_title": "Plugins disponibles ({count} en total)",
|
||||
@@ -251,7 +251,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "No hay plugins que coincidan con los tipos especificados.",
|
||||
},
|
||||
"it-IT": {
|
||||
"status_fetching": "Recupero lista plugin da GitHub...",
|
||||
"status_fetching": "Ricerca plugin in {repo}...",
|
||||
"status_installing": "Installazione di [{type}] {title}...",
|
||||
"status_done": "Installazione completata: {success}/{total} plugin installati.",
|
||||
"status_list_title": "Plugin disponibili ({count} totali)",
|
||||
@@ -274,7 +274,7 @@ TRANSLATIONS = {
|
||||
"err_no_match": "Nessun plugin corrisponde ai tipi specificati.",
|
||||
},
|
||||
"vi-VN": {
|
||||
"status_fetching": "Đang lấy danh sách plugin từ GitHub...",
|
||||
"status_fetching": "Đang tìm kiếm plugin trong {repo}...",
|
||||
"status_installing": "Đang cài đặt [{type}] {title}...",
|
||||
"status_done": "Cài đặt hoàn tất: {success}/{total} plugin đã được cài đặt.",
|
||||
"status_list_title": "Plugin khả dụng ({count} tổng cộng)",
|
||||
@@ -983,7 +983,7 @@ def _filter_candidates(
|
||||
if not (c.source_repo.lower() == DEFAULT_REPO.lower() and _matches_self_plugin(c))
|
||||
]
|
||||
|
||||
exclude_list = [item.strip().lower() for item in exclude_keywords.split(",") if item.strip()]
|
||||
exclude_list = [item.strip().lower() for item in (exclude_keywords or "").split(",") if item.strip()]
|
||||
if exclude_list:
|
||||
filtered = [
|
||||
c
|
||||
@@ -1458,6 +1458,19 @@ async def discover_plugins(
|
||||
skip_keywords: str = "test",
|
||||
source_repo: str = "",
|
||||
) -> Tuple[List[PluginCandidate], List[Tuple[str, str]]]:
|
||||
"""Fetch and parse all plugins from a single GitHub repository.
|
||||
|
||||
Scans the repo's file tree for Python files, validates each as a plugin,
|
||||
and extracts metadata (title, description, type, version).
|
||||
|
||||
Args:
|
||||
url: GitHub repository URL (e.g. https://github.com/owner/repo).
|
||||
skip_keywords: Comma-separated keywords to skip in filenames.
|
||||
source_repo: Override the repo identifier (owner/repo format).
|
||||
|
||||
Returns:
|
||||
Tuple of (valid_plugins, skipped_files_with_reasons).
|
||||
"""
|
||||
parsed = parse_github_url(url)
|
||||
if not parsed:
|
||||
return [], [("url", "invalid github url")]
|
||||
@@ -1539,6 +1552,15 @@ async def discover_plugins_from_repos(
|
||||
repos: List[str],
|
||||
skip_keywords: str = "test",
|
||||
) -> Tuple[List[PluginCandidate], List[Tuple[str, str]]]:
|
||||
"""Fetch plugins from multiple repositories in parallel.
|
||||
|
||||
Args:
|
||||
repos: List of owner/repo strings (e.g. ["Fu-Jie/openwebui-extensions"]).
|
||||
skip_keywords: Comma-separated keywords to skip in filenames.
|
||||
|
||||
Returns:
|
||||
Tuple of (all_plugins, all_skipped_files_with_reasons).
|
||||
"""
|
||||
tasks = [
|
||||
discover_plugins(f"https://github.com/{repo}", skip_keywords, source_repo=repo)
|
||||
for repo in repos
|
||||
@@ -1604,10 +1626,18 @@ class Tools:
|
||||
repo: str = DEFAULT_REPO,
|
||||
plugin_types: List[str] = ["pipe", "action", "filter", "tool"],
|
||||
) -> str:
|
||||
"""List plugins from one or more repositories in a single call.
|
||||
"""List all available plugins without installing.
|
||||
|
||||
If a user request mentions multiple repositories, combine them into the
|
||||
`repo` argument instead of calling this tool multiple times.
|
||||
Use this to preview what plugins are available before installation.
|
||||
For installation, use install_all_plugins instead.
|
||||
|
||||
Args:
|
||||
repo: One or more GitHub repositories (owner/repo format), comma or
|
||||
semicolon separated. Defaults to Fu-Jie/openwebui-extensions.
|
||||
plugin_types: Filter by plugin type (pipe, action, filter, tool).
|
||||
|
||||
Returns:
|
||||
Markdown formatted list of available plugins grouped by repository.
|
||||
"""
|
||||
user_ctx = await _get_user_context(__user__, __event_call__, __request__)
|
||||
lang = user_ctx.get("user_language", "en-US")
|
||||
@@ -1650,11 +1680,25 @@ class Tools:
|
||||
exclude_keywords: str = "",
|
||||
timeout: int = DEFAULT_TIMEOUT,
|
||||
) -> str:
|
||||
"""Install plugins from one or more repositories in a single call.
|
||||
"""Discover and install plugins interactively.
|
||||
|
||||
If a user request mentions multiple repositories, combine them into the
|
||||
`repo` argument and call this tool once instead of making parallel
|
||||
calls for each repository.
|
||||
Always fetches all available plugins regardless of user input, then
|
||||
presents a selection dialog for the user to choose which to install.
|
||||
|
||||
Workflow:
|
||||
1. Discover all plugins from repo(s)
|
||||
2. Present interactive selection dialog
|
||||
3. Install selected plugins to OpenWebUI
|
||||
|
||||
Args:
|
||||
repo: One or more GitHub repositories (owner/repo format), comma or
|
||||
semicolon separated. Defaults to Fu-Jie/openwebui-extensions.
|
||||
plugin_types: Filter by plugin type (pipe, action, filter, tool).
|
||||
exclude_keywords: Comma-separated keywords to skip matching plugins.
|
||||
timeout: HTTP request timeout in seconds.
|
||||
|
||||
Returns:
|
||||
Status message with installation results.
|
||||
"""
|
||||
user_ctx = await _get_user_context(__user__, __event_call__, __request__)
|
||||
lang = user_ctx.get("user_language", "en-US")
|
||||
@@ -1705,9 +1749,10 @@ class Tools:
|
||||
|
||||
base_url = base_url.rstrip("/")
|
||||
|
||||
await _emit_status(event_emitter, _t(lang, "status_fetching"), done=False)
|
||||
|
||||
repo_list = _parse_repo_inputs(repo)
|
||||
repo_display = repo_list[0] if len(repo_list) == 1 else f"{repo_list[0]} +{len(repo_list)-1}"
|
||||
await _emit_status(event_emitter, _t(lang, "status_fetching", repo=repo_display), done=False)
|
||||
|
||||
candidates, _ = await discover_plugins_from_repos(repo_list, skip_keywords)
|
||||
|
||||
if not candidates:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🧰 OpenWebUI Skills Manager Tool
|
||||
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.3.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.3.1 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -23,10 +23,9 @@ When the selection dialog opens, search for this plugin, check it, and continue.
|
||||
|
||||
## What's New
|
||||
|
||||
- **🤖 Automatic Repo Root Discovery**: Install any GitHub repo by providing just the root URL (e.g., `https://github.com/owner/repo`). System auto-converts to discovery mode and installs all skills.
|
||||
- **🔄 Batch Deduplication**: Automatically removes duplicate URLs from batch installations and detects duplicate skill names.
|
||||
- Added GitHub skills-directory auto-discovery for `install_skill` (e.g., `.../tree/main/skills`) to install all child skills in one request.
|
||||
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback.
|
||||
- **📝 Multi-line Frontmatter Descriptions**: `install_skill` now correctly parses `description: >` and `description: |` blocks in remote `SKILL.md` files, so imported skill descriptions no longer truncate to a single line.
|
||||
- **↩️ Better Metadata Fallbacks**: If a skill frontmatter provides `title` without `name`, the installer now uses that title before falling back to directory-based names.
|
||||
- **🧪 Regression Coverage**: Added focused tests for folded/literal YAML blocks and CRLF line endings to keep external skill imports stable.
|
||||
|
||||
> [!TIP]
|
||||
> **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?**
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 🧰 OpenWebUI Skills 管理工具
|
||||
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.3.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.3.1 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -23,10 +23,9 @@
|
||||
|
||||
## 最新更新
|
||||
|
||||
- **🤖 自动发现仓库根目录**:现在可以直接提供 GitHub 仓库根 URL(如 `https://github.com/owner/repo`),系统会自动转换为发现模式并安装所有 skill。
|
||||
- **🔄 批量去重**:自动清除重复 URL,检测重复的 skill 名称。
|
||||
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能。
|
||||
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料。
|
||||
- **📝 支持多行 Frontmatter 描述**:`install_skill` 现在可以正确解析远程 `SKILL.md` 里的 `description: >` 和 `description: |`,导入后的技能描述不再被截断成单行。
|
||||
- **↩️ 更稳的元数据回退**:当 frontmatter 只有 `title` 没有 `name` 时,安装器会优先使用 `title`,避免退回到通用目录名。
|
||||
- **🧪 回归测试补齐**:新增 folded/literal YAML 块和 CRLF 换行场景测试,保证外部技能导入行为稳定。
|
||||
|
||||
> [!TIP]
|
||||
> **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)?**
|
||||
|
||||
@@ -3,7 +3,7 @@ title: OpenWebUI Skills Manager Tool
|
||||
author: Fu-Jie
|
||||
author_url: https://github.com/Fu-Jie/openwebui-extensions
|
||||
funding_url: https://github.com/open-webui
|
||||
version: 0.3.0
|
||||
version: 0.3.1
|
||||
openwebui_id: b4bce8e4-08e7-4f90-bea7-dc31d463a0bb
|
||||
requirements:
|
||||
description: Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.
|
||||
@@ -846,26 +846,138 @@ async def _fetch_bytes(valves, url: str) -> bytes:
|
||||
)
|
||||
|
||||
|
||||
_FRONTMATTER_KEY_RE = re.compile(r"^([A-Za-z0-9_-]+):(.*)$")
|
||||
|
||||
|
||||
def _normalize_newlines(text: str) -> str:
|
||||
"""Normalize CRLF/CR text to LF for stable frontmatter parsing."""
|
||||
return text.replace("\r\n", "\n").replace("\r", "\n")
|
||||
|
||||
|
||||
def _strip_matching_quotes(value: str) -> str:
|
||||
"""Remove matching wrapping quotes from a scalar value."""
|
||||
value = (value or "").strip()
|
||||
if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}:
|
||||
return value[1:-1]
|
||||
return value
|
||||
|
||||
|
||||
def _collect_frontmatter_block(lines: List[str], start_index: int) -> Tuple[List[str], int]:
|
||||
"""Collect indented block lines until the next top-level frontmatter key."""
|
||||
block_lines: List[str] = []
|
||||
index = start_index
|
||||
|
||||
while index < len(lines):
|
||||
line = lines[index]
|
||||
if not line.strip():
|
||||
block_lines.append("")
|
||||
index += 1
|
||||
continue
|
||||
|
||||
indent = len(line) - len(line.lstrip(" "))
|
||||
if indent == 0 and _FRONTMATTER_KEY_RE.match(line):
|
||||
break
|
||||
if indent == 0:
|
||||
break
|
||||
|
||||
block_lines.append(line)
|
||||
index += 1
|
||||
|
||||
non_empty_indents = [
|
||||
len(line) - len(line.lstrip(" ")) for line in block_lines if line.strip()
|
||||
]
|
||||
min_indent = min(non_empty_indents) if non_empty_indents else 0
|
||||
dedented = [line[min_indent:] if line else "" for line in block_lines]
|
||||
return dedented, index
|
||||
|
||||
|
||||
def _fold_yaml_block(lines: List[str]) -> str:
|
||||
"""Fold YAML `>` block lines into paragraphs separated by blank lines."""
|
||||
parts: List[str] = []
|
||||
paragraph: List[str] = []
|
||||
|
||||
for line in lines:
|
||||
if line == "":
|
||||
if paragraph:
|
||||
parts.append(" ".join(segment.strip() for segment in paragraph))
|
||||
paragraph = []
|
||||
if parts and parts[-1] != "":
|
||||
parts.append("")
|
||||
continue
|
||||
paragraph.append(line.strip())
|
||||
|
||||
if paragraph:
|
||||
parts.append(" ".join(segment.strip() for segment in paragraph))
|
||||
|
||||
return "\n".join(parts).strip()
|
||||
|
||||
|
||||
def _parse_frontmatter_scalars(frontmatter_text: str) -> Dict[str, str]:
|
||||
"""Parse simple top-level YAML frontmatter scalars, including block scalars."""
|
||||
lines = _normalize_newlines(frontmatter_text).split("\n")
|
||||
metadata: Dict[str, str] = {}
|
||||
index = 0
|
||||
|
||||
while index < len(lines):
|
||||
line = lines[index]
|
||||
stripped = line.strip()
|
||||
|
||||
if not stripped or stripped.startswith("#") or line.startswith(" "):
|
||||
index += 1
|
||||
continue
|
||||
|
||||
match = _FRONTMATTER_KEY_RE.match(line)
|
||||
if not match:
|
||||
index += 1
|
||||
continue
|
||||
|
||||
key = match.group(1)
|
||||
raw_value = match.group(2).lstrip()
|
||||
|
||||
if raw_value[:1] in {"|", ">"}:
|
||||
block_lines, index = _collect_frontmatter_block(lines, index + 1)
|
||||
metadata[key] = (
|
||||
"\n".join(block_lines).strip()
|
||||
if raw_value.startswith("|")
|
||||
else _fold_yaml_block(block_lines)
|
||||
)
|
||||
continue
|
||||
|
||||
block_lines, next_index = _collect_frontmatter_block(lines, index + 1)
|
||||
if block_lines:
|
||||
segments = [_strip_matching_quotes(raw_value)] + [
|
||||
segment.strip() for segment in block_lines
|
||||
]
|
||||
metadata[key] = _fold_yaml_block(segments)
|
||||
index = next_index
|
||||
continue
|
||||
|
||||
metadata[key] = _strip_matching_quotes(raw_value)
|
||||
index += 1
|
||||
|
||||
return metadata
|
||||
|
||||
|
||||
def _parse_skill_md_meta(content: str, fallback_name: str) -> Tuple[str, str, str]:
|
||||
"""Parse markdown skill content into (name, description, body)."""
|
||||
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", content, re.DOTALL)
|
||||
normalized_content = _normalize_newlines(content)
|
||||
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*(?:\n|$)", normalized_content, re.DOTALL)
|
||||
if fm_match:
|
||||
fm_text = fm_match.group(1)
|
||||
body = content[fm_match.end() :].strip()
|
||||
name = fallback_name
|
||||
description = ""
|
||||
for line in fm_text.split("\n"):
|
||||
m_name = re.match(r"^name:\s*(.+)$", line)
|
||||
if m_name:
|
||||
name = m_name.group(1).strip().strip("\"'")
|
||||
m_desc = re.match(r"^description:\s*(.+)$", line)
|
||||
if m_desc:
|
||||
description = m_desc.group(1).strip().strip("\"'")
|
||||
body = normalized_content[fm_match.end() :].strip()
|
||||
metadata = _parse_frontmatter_scalars(fm_text)
|
||||
name = (
|
||||
metadata.get("name")
|
||||
or metadata.get("title")
|
||||
or fallback_name
|
||||
).strip()
|
||||
description = (metadata.get("description") or "").strip()
|
||||
return name, description, body
|
||||
|
||||
h1_match = re.search(r"^#\s+(.+)$", content.strip(), re.MULTILINE)
|
||||
stripped_content = normalized_content.strip()
|
||||
h1_match = re.search(r"^#\s+(.+)$", stripped_content, re.MULTILINE)
|
||||
name = h1_match.group(1).strip() if h1_match else fallback_name
|
||||
return name, "", content.strip()
|
||||
return name, "", stripped_content
|
||||
|
||||
|
||||
def _append_source_url_to_content(content: str, url: str, lang: str = "en-US") -> str:
|
||||
|
||||
15
plugins/tools/openwebui-skills-manager/v0.3.1.md
Normal file
15
plugins/tools/openwebui-skills-manager/v0.3.1.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# OpenWebUI Skills Manager v0.3.1 Release Notes
|
||||
|
||||
This patch release improves compatibility when importing external `SKILL.md` files by correctly handling multi-line YAML frontmatter descriptions and safer metadata fallbacks.
|
||||
|
||||
### New Features
|
||||
- Support folded (`description: >`) and literal (`description: |`) multi-line descriptions during `install_skill`.
|
||||
- Normalize CRLF/CR line endings before parsing skill frontmatter metadata.
|
||||
|
||||
### Bug Fixes
|
||||
- Fixed imported skill descriptions being truncated or reduced to a single line when source frontmatter used YAML block scalars.
|
||||
- Added `title` as a name fallback when `name` is absent, reducing generic directory-name fallbacks for third-party skills.
|
||||
|
||||
### Enhancements
|
||||
- Added focused regression tests for folded/literal YAML blocks and CRLF inputs.
|
||||
- Synced README and docs mirrors so the latest release surface documents the new metadata compatibility.
|
||||
15
plugins/tools/openwebui-skills-manager/v0.3.1_CN.md
Normal file
15
plugins/tools/openwebui-skills-manager/v0.3.1_CN.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# OpenWebUI Skills Manager v0.3.1 版本发布说明
|
||||
|
||||
这个补丁版本重点增强了外部 `SKILL.md` 导入兼容性,能够正确处理多行 YAML frontmatter 描述,并提供更稳健的元数据回退逻辑。
|
||||
|
||||
### 新功能
|
||||
- `install_skill` 现已支持 folded(`description: >`)和 literal(`description: |`)两种多行描述格式。
|
||||
- 在解析技能 frontmatter 之前,统一规范化 CRLF/CR 换行,提升跨平台兼容性。
|
||||
|
||||
### 问题修复
|
||||
- 修复第三方 `SKILL.md` 使用 YAML 块标量时,导入后的技能描述被截断或压缩成单行的问题。
|
||||
- 当 frontmatter 缺少 `name` 但提供了 `title` 时,新增 `title` 回退逻辑,避免退回到通用目录名。
|
||||
|
||||
### 优化提升
|
||||
- 新增 folded/literal YAML 块与 CRLF 输入的定向回归测试。
|
||||
- 同步更新 README 与 docs 镜像页,确保最新发布文案与元数据兼容行为保持一致。
|
||||
62
tests/plugins/pipes/test_github_copilot_sdk_skill_meta.py
Normal file
62
tests/plugins/pipes/test_github_copilot_sdk_skill_meta.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import importlib.util
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
MODULE_PATH = (
|
||||
Path(__file__).resolve().parents[3]
|
||||
/ "plugins"
|
||||
/ "pipes"
|
||||
/ "github-copilot-sdk"
|
||||
/ "github_copilot_sdk.py"
|
||||
)
|
||||
SPEC = importlib.util.spec_from_file_location("github_copilot_sdk", MODULE_PATH)
|
||||
github_copilot_sdk = importlib.util.module_from_spec(SPEC)
|
||||
assert SPEC.loader is not None
|
||||
sys.modules[SPEC.name] = github_copilot_sdk
|
||||
SPEC.loader.exec_module(github_copilot_sdk)
|
||||
|
||||
PIPE = github_copilot_sdk.Pipe()
|
||||
|
||||
|
||||
def test_pipe_parse_skill_md_meta_supports_folded_multiline_description():
|
||||
content = (
|
||||
"---\r\n"
|
||||
"name: persona-selector\r\n"
|
||||
"description: >\r\n"
|
||||
" Two-step persona picker.\r\n"
|
||||
" Step 2 provides persona options.\r\n"
|
||||
"---\r\n\r\n"
|
||||
"# Persona Selector\r\n\r\n"
|
||||
"Body content.\r\n"
|
||||
)
|
||||
|
||||
name, description, body = PIPE._parse_skill_md_meta(content, "fallback-skill")
|
||||
|
||||
assert name == "persona-selector"
|
||||
assert description == "Two-step persona picker. Step 2 provides persona options."
|
||||
assert body == "# Persona Selector\n\nBody content."
|
||||
|
||||
|
||||
def test_pipe_build_skill_md_content_round_trips_multiline_description():
|
||||
content = PIPE._build_skill_md_content(
|
||||
"Data Storyteller",
|
||||
"First line.\nSecond line.\n\nThird paragraph.",
|
||||
"Explain how to turn analysis into a narrative.",
|
||||
)
|
||||
|
||||
assert (
|
||||
"description: |\n"
|
||||
" First line.\n"
|
||||
" Second line.\n"
|
||||
"\n"
|
||||
" Third paragraph.\n"
|
||||
) in content
|
||||
|
||||
name, description, body = PIPE._parse_skill_md_meta(content, "fallback-skill")
|
||||
|
||||
assert name == "Data Storyteller"
|
||||
assert description == "First line.\nSecond line.\n\nThird paragraph."
|
||||
assert body == (
|
||||
"# Data Storyteller\n\nExplain how to turn analysis into a narrative."
|
||||
)
|
||||
63
tests/plugins/tools/test_openwebui_skills_manager.py
Normal file
63
tests/plugins/tools/test_openwebui_skills_manager.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import importlib.util
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
MODULE_PATH = (
|
||||
Path(__file__).resolve().parents[3]
|
||||
/ "plugins"
|
||||
/ "tools"
|
||||
/ "openwebui-skills-manager"
|
||||
/ "openwebui_skills_manager.py"
|
||||
)
|
||||
SPEC = importlib.util.spec_from_file_location("openwebui_skills_manager", MODULE_PATH)
|
||||
openwebui_skills_manager = importlib.util.module_from_spec(SPEC)
|
||||
assert SPEC.loader is not None
|
||||
sys.modules[SPEC.name] = openwebui_skills_manager
|
||||
SPEC.loader.exec_module(openwebui_skills_manager)
|
||||
|
||||
|
||||
def test_parse_skill_md_meta_supports_folded_multiline_description():
|
||||
content = (
|
||||
"---\r\n"
|
||||
"name: persona-selector\r\n"
|
||||
"description: >\r\n"
|
||||
" Two-step persona picker. Step 1: numbered category list.\r\n"
|
||||
" Step 2: numbered persona list. 160 personas + Custom.\r\n"
|
||||
"---\r\n\r\n"
|
||||
"# Persona Selector\r\n\r\n"
|
||||
"Body content.\r\n"
|
||||
)
|
||||
|
||||
name, description, body = openwebui_skills_manager._parse_skill_md_meta(
|
||||
content, "fallback-skill"
|
||||
)
|
||||
|
||||
assert name == "persona-selector"
|
||||
assert description == (
|
||||
"Two-step persona picker. Step 1: numbered category list. "
|
||||
"Step 2: numbered persona list. 160 personas + Custom."
|
||||
)
|
||||
assert body == "# Persona Selector\n\nBody content."
|
||||
|
||||
|
||||
def test_parse_skill_md_meta_supports_literal_multiline_description_and_title_fallback():
|
||||
content = (
|
||||
"---\n"
|
||||
'title: "Data Storyteller"\n'
|
||||
"description: |\n"
|
||||
" First line.\n"
|
||||
" Second line.\n"
|
||||
"\n"
|
||||
" Third paragraph.\n"
|
||||
"---\n\n"
|
||||
"Explain how to turn analysis into a narrative.\n"
|
||||
)
|
||||
|
||||
name, description, body = openwebui_skills_manager._parse_skill_md_meta(
|
||||
content, "fallback-skill"
|
||||
)
|
||||
|
||||
assert name == "Data Storyteller"
|
||||
assert description == "First line.\nSecond line.\n\nThird paragraph."
|
||||
assert body == "Explain how to turn analysis into a narrative."
|
||||
Reference in New Issue
Block a user