Compare commits
3 Commits
async-cont
...
batch-inst
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cea31fed38 | ||
|
|
8f8147828b | ||
|
|
158792d82f |
@@ -26,8 +26,8 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 5️⃣ | [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) |  |  |  |  |
|
||||
|
||||
### 📈 Total Downloads Trend
|
||||
|
||||
@@ -23,8 +23,8 @@ 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) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 5️⃣ | [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) |  |  |  |  |
|
||||
|
||||
### 📈 总下载量累计趋势
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "downloads",
|
||||
"message": "8.9k",
|
||||
"message": "9.1k",
|
||||
"color": "blue",
|
||||
"namedLogo": "openwebui"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "followers",
|
||||
"message": "348",
|
||||
"message": "353",
|
||||
"color": "blue"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "points",
|
||||
"message": "352",
|
||||
"message": "359",
|
||||
"color": "orange"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "upvotes",
|
||||
"message": "301",
|
||||
"message": "305",
|
||||
"color": "brightgreen"
|
||||
}
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"total_posts": 27,
|
||||
"total_downloads": 8947,
|
||||
"total_views": 94188,
|
||||
"total_upvotes": 301,
|
||||
"total_downloads": 9120,
|
||||
"total_views": 95785,
|
||||
"total_upvotes": 305,
|
||||
"total_downvotes": 4,
|
||||
"total_saves": 444,
|
||||
"total_comments": 75,
|
||||
"total_saves": 452,
|
||||
"total_comments": 77,
|
||||
"by_type": {
|
||||
"tool": 2,
|
||||
"filter": 4,
|
||||
"tool": 2,
|
||||
"pipe": 1,
|
||||
"action": 12,
|
||||
"prompt": 1
|
||||
@@ -21,11 +21,11 @@
|
||||
"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": 1772,
|
||||
"views": 15047,
|
||||
"upvotes": 30,
|
||||
"saves": 70,
|
||||
"comments": 21,
|
||||
"downloads": 1797,
|
||||
"views": 15350,
|
||||
"upvotes": 31,
|
||||
"saves": 72,
|
||||
"comments": 23,
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-27",
|
||||
"url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a"
|
||||
@@ -37,10 +37,10 @@
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
||||
"downloads": 1350,
|
||||
"views": 13453,
|
||||
"upvotes": 27,
|
||||
"saves": 52,
|
||||
"downloads": 1362,
|
||||
"views": 13589,
|
||||
"upvotes": 28,
|
||||
"saves": 53,
|
||||
"comments": 12,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
@@ -53,15 +53,31 @@
|
||||
"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": 824,
|
||||
"views": 8622,
|
||||
"downloads": 838,
|
||||
"views": 8739,
|
||||
"upvotes": 21,
|
||||
"saves": 45,
|
||||
"saves": 46,
|
||||
"comments": 5,
|
||||
"created_at": "2026-01-12",
|
||||
"updated_at": "2026-03-08",
|
||||
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
|
||||
},
|
||||
{
|
||||
"title": "Async Context Compression",
|
||||
"slug": "async_context_compression_b1655bc8",
|
||||
"type": "filter",
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
|
||||
"downloads": 801,
|
||||
"views": 7258,
|
||||
"upvotes": 18,
|
||||
"saves": 54,
|
||||
"comments": 0,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-14",
|
||||
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
|
||||
},
|
||||
{
|
||||
"title": "Export to Word Enhanced",
|
||||
"slug": "export_to_word_enhanced_formatting_fca6a315",
|
||||
@@ -69,31 +85,15 @@
|
||||
"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": 780,
|
||||
"views": 6015,
|
||||
"upvotes": 19,
|
||||
"saves": 39,
|
||||
"downloads": 799,
|
||||
"views": 6146,
|
||||
"upvotes": 20,
|
||||
"saves": 41,
|
||||
"comments": 5,
|
||||
"created_at": "2026-01-03",
|
||||
"updated_at": "2026-02-13",
|
||||
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
|
||||
},
|
||||
{
|
||||
"title": "Async Context Compression",
|
||||
"slug": "async_context_compression_b1655bc8",
|
||||
"type": "filter",
|
||||
"version": "1.4.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
|
||||
"downloads": 776,
|
||||
"views": 7102,
|
||||
"upvotes": 17,
|
||||
"saves": 53,
|
||||
"comments": 0,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-13",
|
||||
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
|
||||
},
|
||||
{
|
||||
"title": "AI Task Instruction Generator",
|
||||
"slug": "ai_task_instruction_generator_9bab8b37",
|
||||
@@ -101,10 +101,10 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 676,
|
||||
"views": 7619,
|
||||
"downloads": 692,
|
||||
"views": 7783,
|
||||
"upvotes": 10,
|
||||
"saves": 19,
|
||||
"saves": 20,
|
||||
"comments": 0,
|
||||
"created_at": "2026-01-28",
|
||||
"updated_at": "2026-01-28",
|
||||
@@ -117,8 +117,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": 612,
|
||||
"views": 3475,
|
||||
"downloads": 616,
|
||||
"views": 3508,
|
||||
"upvotes": 11,
|
||||
"saves": 12,
|
||||
"comments": 0,
|
||||
@@ -133,13 +133,13 @@
|
||||
"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": 463,
|
||||
"views": 5862,
|
||||
"downloads": 500,
|
||||
"views": 6112,
|
||||
"upvotes": 8,
|
||||
"saves": 23,
|
||||
"comments": 4,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-13",
|
||||
"updated_at": "2026-03-14",
|
||||
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
|
||||
},
|
||||
{
|
||||
@@ -149,8 +149,8 @@
|
||||
"version": "0.10.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": 402,
|
||||
"views": 5629,
|
||||
"downloads": 403,
|
||||
"views": 5699,
|
||||
"upvotes": 16,
|
||||
"saves": 12,
|
||||
"comments": 8,
|
||||
@@ -165,8 +165,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
|
||||
"downloads": 327,
|
||||
"views": 4685,
|
||||
"downloads": 331,
|
||||
"views": 4722,
|
||||
"upvotes": 13,
|
||||
"saves": 22,
|
||||
"comments": 2,
|
||||
@@ -181,8 +181,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": 228,
|
||||
"views": 1874,
|
||||
"downloads": 229,
|
||||
"views": 1887,
|
||||
"upvotes": 6,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
@@ -198,7 +198,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 172,
|
||||
"views": 3019,
|
||||
"views": 3038,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
@@ -213,8 +213,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": 128,
|
||||
"views": 2154,
|
||||
"downloads": 130,
|
||||
"views": 2181,
|
||||
"upvotes": 7,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
@@ -229,8 +229,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": 106,
|
||||
"views": 2284,
|
||||
"downloads": 116,
|
||||
"views": 2375,
|
||||
"upvotes": 5,
|
||||
"saves": 4,
|
||||
"comments": 0,
|
||||
@@ -246,7 +246,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": 93,
|
||||
"views": 2462,
|
||||
"views": 2474,
|
||||
"upvotes": 4,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -262,7 +262,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 72,
|
||||
"views": 1566,
|
||||
"views": 1572,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -278,7 +278,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 56,
|
||||
"views": 807,
|
||||
"views": 814,
|
||||
"upvotes": 6,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
@@ -294,7 +294,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 42,
|
||||
"views": 892,
|
||||
"views": 904,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -302,6 +302,22 @@
|
||||
"updated_at": "2026-02-13",
|
||||
"url": "https://openwebui.com/posts/异步上下文压缩_5c0617cb"
|
||||
},
|
||||
{
|
||||
"title": "精读",
|
||||
"slug": "精读_99830b0f",
|
||||
"type": "action",
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 37,
|
||||
"views": 708,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"created_at": "2026-01-08",
|
||||
"updated_at": "2026-01-08",
|
||||
"url": "https://openwebui.com/posts/精读_99830b0f"
|
||||
},
|
||||
{
|
||||
"title": "闪记卡 (Flash Card)",
|
||||
"slug": "闪记卡生成插件_4a31eac3",
|
||||
@@ -310,7 +326,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 34,
|
||||
"views": 922,
|
||||
"views": 926,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -318,22 +334,6 @@
|
||||
"updated_at": "2026-02-13",
|
||||
"url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3"
|
||||
},
|
||||
{
|
||||
"title": "精读",
|
||||
"slug": "精读_99830b0f",
|
||||
"type": "action",
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 34,
|
||||
"views": 699,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"created_at": "2026-01-08",
|
||||
"updated_at": "2026-01-08",
|
||||
"url": "https://openwebui.com/posts/精读_99830b0f"
|
||||
},
|
||||
{
|
||||
"title": "An Unconventional Use of Open Terminal ⚡",
|
||||
"slug": "an_unconventional_use_of_open_terminal_35498f8f",
|
||||
@@ -342,7 +342,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3205,
|
||||
"views": 3335,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 2,
|
||||
@@ -358,7 +358,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1781,
|
||||
"views": 1803,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -374,7 +374,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2775,
|
||||
"views": 2797,
|
||||
"upvotes": 8,
|
||||
"saves": 4,
|
||||
"comments": 1,
|
||||
@@ -390,7 +390,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2441,
|
||||
"views": 2442,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -406,7 +406,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1999,
|
||||
"views": 2014,
|
||||
"upvotes": 13,
|
||||
"saves": 23,
|
||||
"comments": 9,
|
||||
@@ -422,7 +422,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 267,
|
||||
"views": 271,
|
||||
"upvotes": 2,
|
||||
"saves": 0,
|
||||
"comments": 0,
|
||||
@@ -438,7 +438,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1583,
|
||||
"views": 1588,
|
||||
"upvotes": 16,
|
||||
"saves": 13,
|
||||
"comments": 2,
|
||||
@@ -452,11 +452,11 @@
|
||||
"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": 348,
|
||||
"followers": 353,
|
||||
"following": 6,
|
||||
"total_points": 352,
|
||||
"post_points": 299,
|
||||
"comment_points": 53,
|
||||
"contributions": 67
|
||||
"total_points": 359,
|
||||
"post_points": 303,
|
||||
"comment_points": 56,
|
||||
"contributions": 68
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"total_posts": 27,
|
||||
"total_downloads": 8765,
|
||||
"total_views": 92460,
|
||||
"total_upvotes": 300,
|
||||
"total_downloads": 8947,
|
||||
"total_views": 94188,
|
||||
"total_upvotes": 301,
|
||||
"total_downvotes": 4,
|
||||
"total_saves": 431,
|
||||
"total_comments": 73,
|
||||
"total_saves": 444,
|
||||
"total_comments": 75,
|
||||
"by_type": {
|
||||
"tool": 2,
|
||||
"filter": 4,
|
||||
@@ -21,13 +21,13 @@
|
||||
"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": 1730,
|
||||
"views": 14700,
|
||||
"downloads": 1772,
|
||||
"views": 15047,
|
||||
"upvotes": 30,
|
||||
"saves": 67,
|
||||
"saves": 70,
|
||||
"comments": 21,
|
||||
"created_at": "2025-12-31",
|
||||
"updated_at": "2026-02-28",
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-27",
|
||||
"url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a"
|
||||
},
|
||||
{
|
||||
@@ -37,11 +37,11 @@
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
|
||||
"downloads": 1330,
|
||||
"views": 13250,
|
||||
"downloads": 1350,
|
||||
"views": 13453,
|
||||
"upvotes": 27,
|
||||
"saves": 50,
|
||||
"comments": 10,
|
||||
"saves": 52,
|
||||
"comments": 12,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
"url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f"
|
||||
@@ -53,13 +53,13 @@
|
||||
"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": 807,
|
||||
"views": 8499,
|
||||
"downloads": 824,
|
||||
"views": 8622,
|
||||
"upvotes": 21,
|
||||
"saves": 44,
|
||||
"saves": 45,
|
||||
"comments": 5,
|
||||
"created_at": "2026-01-12",
|
||||
"updated_at": "2026-03-09",
|
||||
"updated_at": "2026-03-08",
|
||||
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
|
||||
},
|
||||
{
|
||||
@@ -69,10 +69,10 @@
|
||||
"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": 767,
|
||||
"views": 5898,
|
||||
"upvotes": 18,
|
||||
"saves": 38,
|
||||
"downloads": 780,
|
||||
"views": 6015,
|
||||
"upvotes": 19,
|
||||
"saves": 39,
|
||||
"comments": 5,
|
||||
"created_at": "2026-01-03",
|
||||
"updated_at": "2026-02-13",
|
||||
@@ -82,16 +82,16 @@
|
||||
"title": "Async Context Compression",
|
||||
"slug": "async_context_compression_b1655bc8",
|
||||
"type": "filter",
|
||||
"version": "1.4.1",
|
||||
"version": "1.4.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
|
||||
"downloads": 760,
|
||||
"views": 6985,
|
||||
"downloads": 776,
|
||||
"views": 7102,
|
||||
"upvotes": 17,
|
||||
"saves": 50,
|
||||
"saves": 53,
|
||||
"comments": 0,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-11",
|
||||
"updated_at": "2026-03-13",
|
||||
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
|
||||
},
|
||||
{
|
||||
@@ -101,8 +101,8 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 666,
|
||||
"views": 7490,
|
||||
"downloads": 676,
|
||||
"views": 7619,
|
||||
"upvotes": 10,
|
||||
"saves": 19,
|
||||
"comments": 0,
|
||||
@@ -117,10 +117,10 @@
|
||||
"version": "0.3.7",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
|
||||
"downloads": 604,
|
||||
"views": 3426,
|
||||
"downloads": 612,
|
||||
"views": 3475,
|
||||
"upvotes": 11,
|
||||
"saves": 11,
|
||||
"saves": 12,
|
||||
"comments": 0,
|
||||
"created_at": "2025-05-30",
|
||||
"updated_at": "2026-02-13",
|
||||
@@ -133,13 +133,13 @@
|
||||
"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": 434,
|
||||
"views": 5597,
|
||||
"downloads": 463,
|
||||
"views": 5862,
|
||||
"upvotes": 8,
|
||||
"saves": 22,
|
||||
"saves": 23,
|
||||
"comments": 4,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-11",
|
||||
"updated_at": "2026-03-13",
|
||||
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
|
||||
},
|
||||
{
|
||||
@@ -149,10 +149,10 @@
|
||||
"version": "0.10.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": 399,
|
||||
"views": 5542,
|
||||
"downloads": 402,
|
||||
"views": 5629,
|
||||
"upvotes": 16,
|
||||
"saves": 11,
|
||||
"saves": 12,
|
||||
"comments": 8,
|
||||
"created_at": "2026-01-26",
|
||||
"updated_at": "2026-03-07",
|
||||
@@ -165,8 +165,8 @@
|
||||
"version": "0.2.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
|
||||
"downloads": 325,
|
||||
"views": 4650,
|
||||
"downloads": 327,
|
||||
"views": 4685,
|
||||
"upvotes": 13,
|
||||
"saves": 22,
|
||||
"comments": 2,
|
||||
@@ -181,8 +181,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": 224,
|
||||
"views": 1852,
|
||||
"downloads": 228,
|
||||
"views": 1874,
|
||||
"upvotes": 6,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
@@ -197,8 +197,8 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 171,
|
||||
"views": 2974,
|
||||
"downloads": 172,
|
||||
"views": 3019,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
@@ -213,8 +213,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": 125,
|
||||
"views": 2137,
|
||||
"downloads": 128,
|
||||
"views": 2154,
|
||||
"upvotes": 7,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
@@ -229,8 +229,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": 100,
|
||||
"views": 2203,
|
||||
"downloads": 106,
|
||||
"views": 2284,
|
||||
"upvotes": 5,
|
||||
"saves": 4,
|
||||
"comments": 0,
|
||||
@@ -246,12 +246,12 @@
|
||||
"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": 93,
|
||||
"views": 2452,
|
||||
"views": 2462,
|
||||
"upvotes": 4,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"created_at": "2026-02-09",
|
||||
"updated_at": "2026-03-04",
|
||||
"updated_at": "2026-03-03",
|
||||
"url": "https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee"
|
||||
},
|
||||
{
|
||||
@@ -261,8 +261,8 @@
|
||||
"version": "1.5.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 71,
|
||||
"views": 1545,
|
||||
"downloads": 72,
|
||||
"views": 1566,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -277,8 +277,8 @@
|
||||
"version": "0.9.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 53,
|
||||
"views": 789,
|
||||
"downloads": 56,
|
||||
"views": 807,
|
||||
"upvotes": 6,
|
||||
"saves": 2,
|
||||
"comments": 0,
|
||||
@@ -293,8 +293,8 @@
|
||||
"version": "1.2.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 40,
|
||||
"views": 876,
|
||||
"downloads": 42,
|
||||
"views": 892,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -310,7 +310,7 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 34,
|
||||
"views": 917,
|
||||
"views": 922,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -325,8 +325,8 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 32,
|
||||
"views": 678,
|
||||
"downloads": 34,
|
||||
"views": 699,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
@@ -342,11 +342,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3009,
|
||||
"views": 3205,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 2,
|
||||
"created_at": "2026-03-07",
|
||||
"created_at": "2026-03-06",
|
||||
"updated_at": "2026-03-07",
|
||||
"url": "https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f"
|
||||
},
|
||||
@@ -358,11 +358,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1762,
|
||||
"views": 1781,
|
||||
"upvotes": 5,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"created_at": "2026-02-28",
|
||||
"created_at": "2026-02-27",
|
||||
"updated_at": "2026-02-28",
|
||||
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452"
|
||||
},
|
||||
@@ -374,11 +374,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2758,
|
||||
"views": 2775,
|
||||
"upvotes": 8,
|
||||
"saves": 4,
|
||||
"comments": 1,
|
||||
"created_at": "2026-02-23",
|
||||
"created_at": "2026-02-22",
|
||||
"updated_at": "2026-02-28",
|
||||
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131"
|
||||
},
|
||||
@@ -390,7 +390,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2430,
|
||||
"views": 2441,
|
||||
"upvotes": 7,
|
||||
"saves": 5,
|
||||
"comments": 0,
|
||||
@@ -406,12 +406,12 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1989,
|
||||
"views": 1999,
|
||||
"upvotes": 13,
|
||||
"saves": 23,
|
||||
"comments": 9,
|
||||
"created_at": "2026-01-25",
|
||||
"updated_at": "2026-01-29",
|
||||
"updated_at": "2026-01-28",
|
||||
"url": "https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e"
|
||||
},
|
||||
{
|
||||
@@ -422,7 +422,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 263,
|
||||
"views": 267,
|
||||
"upvotes": 2,
|
||||
"saves": 0,
|
||||
"comments": 0,
|
||||
@@ -438,7 +438,7 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1579,
|
||||
"views": 1583,
|
||||
"upvotes": 16,
|
||||
"saves": 13,
|
||||
"comments": 2,
|
||||
@@ -452,11 +452,11 @@
|
||||
"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": 344,
|
||||
"followers": 348,
|
||||
"following": 6,
|
||||
"total_points": 351,
|
||||
"post_points": 298,
|
||||
"total_points": 352,
|
||||
"post_points": 299,
|
||||
"comment_points": 53,
|
||||
"contributions": 66
|
||||
"contributions": 67
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
> *Blue: Downloads | Purple: Views (Real-time dynamic)*
|
||||
|
||||
### 📂 Content Distribution
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 Overview
|
||||
@@ -25,8 +25,8 @@
|
||||
|
||||
## 📂 By Type
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
@@ -38,11 +38,11 @@
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-02-27 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-08 |
|
||||
| 4 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 5 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-13 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-14 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-01-28 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-13 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-14 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-07 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
@@ -53,8 +53,8 @@
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 17 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 19 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 20 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 21 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action |  |  |  |  |  | 2026-03-07 |
|
||||
| 22 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe |  |  |  |  |  | 2026-02-28 |
|
||||
| 23 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe |  |  |  |  |  | 2026-02-28 |
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
||||
|
||||
### 📂 内容分类占比 (Distribution)
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 总览
|
||||
@@ -25,8 +25,8 @@
|
||||
|
||||
## 📂 按类型分类
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
@@ -38,11 +38,11 @@
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-02-27 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-08 |
|
||||
| 4 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 5 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-13 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-14 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-01-28 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-13 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-14 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-07 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
@@ -53,8 +53,8 @@
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 17 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 19 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 20 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 21 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action |  |  |  |  |  | 2026-03-07 |
|
||||
| 22 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe |  |  |  |  |  | 2026-02-28 |
|
||||
| 23 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe |  |  |  |  |  | 2026-02-28 |
|
||||
|
||||
139
docs/plugins/tools/batch-install-plugins-tool.md
Normal file
139
docs/plugins/tools/batch-install-plugins-tool.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# Batch Install Plugins from GitHub
|
||||
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie) | **Version:** 1.0.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **License:** MIT
|
||||
|
||||
---
|
||||
|
||||
One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **One-Click Install**: Install all plugins with a single command
|
||||
- **Auto-Update**: Automatically updates previously installed plugins
|
||||
- **GitHub Support**: Install plugins from any GitHub repository
|
||||
- **Multi-Type Support**: Supports Pipe, Action, Filter, and Tool plugins
|
||||
- **Confirmation**: Shows plugin list before installing, allows selective installation
|
||||
- **i18n**: Supports 11 languages
|
||||
|
||||
## Flow
|
||||
|
||||
```
|
||||
User Input
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Discover Plugins from GitHub │
|
||||
│ (fetch file tree + parse .py) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Filter by Type & Keywords │
|
||||
│ (tool/filter/pipe/action) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Show Confirmation Dialog │
|
||||
│ (list plugins + exclude hint) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [Cancel] → End
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Install to OpenWebUI │
|
||||
│ (update or create each plugin) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
Done
|
||||
```
|
||||
|
||||
## How to Use
|
||||
|
||||
1. Open OpenWebUI and go to **Workspace > Tools**
|
||||
2. Install **Batch Install Plugins from GitHub** from the official marketplace
|
||||
3. Enable this tool for your model/chat
|
||||
4. Ask the model to install plugins
|
||||
|
||||
## Usage Examples
|
||||
|
||||
```
|
||||
"Install all plugins"
|
||||
"Install all plugins from github.com/username/repo"
|
||||
"Install only pipe plugins"
|
||||
"Install action and filter plugins"
|
||||
"Install all plugins, exclude_keywords=copilot"
|
||||
```
|
||||
|
||||
## Popular Plugin Repositories
|
||||
|
||||
Here are some popular repositories with many plugins you can install:
|
||||
|
||||
### Community Collections
|
||||
|
||||
```
|
||||
# Install all plugins from iChristGit's collection
|
||||
"Install all plugins from iChristGit/OpenWebui-Tools"
|
||||
|
||||
# Install all tools from Haervwe's tools collection
|
||||
"Install all plugins from Haervwe/open-webui-tools"
|
||||
|
||||
# Install all plugins from Classic298's repository
|
||||
"Install all plugins from Classic298/open-webui-plugins"
|
||||
|
||||
# Install all functions from suurt8ll's collection
|
||||
"Install all plugins from suurt8ll/open_webui_functions"
|
||||
|
||||
# Install only specific types (e.g., only tools)
|
||||
"Install only tool plugins from iChristGit/OpenWebui-Tools"
|
||||
|
||||
# Exclude certain keywords while installing
|
||||
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
|
||||
```
|
||||
|
||||
### Supported Repositories
|
||||
|
||||
- `Fu-Jie/openwebui-extensions` - Default, official plugin collection
|
||||
- `iChristGit/OpenWebui-Tools` - Comprehensive tool and plugin collection
|
||||
- `Haervwe/open-webui-tools` - Specialized tools and utilities
|
||||
- `Classic298/open-webui-plugins` - Various plugin implementations
|
||||
- `suurt8ll/open_webui_functions` - Function-based plugins
|
||||
|
||||
## Default Repository
|
||||
|
||||
When no repository is specified, defaults to `Fu-Jie/openwebui-extensions`.
|
||||
|
||||
## Plugin Detection Rules
|
||||
|
||||
### Fu-Jie/openwebui-extensions (Strict)
|
||||
|
||||
For the default repository, plugins must have:
|
||||
1. A `.py` file containing `class Tools:`, `class Filter:`, `class Pipe:`, or `class Action:`
|
||||
2. A docstring with `title:`, `description:`, and **`openwebui_id:`** fields
|
||||
3. Filename must not end with `_cn`
|
||||
|
||||
### Other GitHub Repositories
|
||||
|
||||
For other repositories:
|
||||
1. A `.py` file containing `class Tools:`, `class Filter:`, `class Pipe:`, or `class Action:`
|
||||
2. A docstring with `title:` and `description:` fields
|
||||
|
||||
## Configuration (Valves)
|
||||
|
||||
| Parameter | Default | Description |
|
||||
| --- | --- | --- |
|
||||
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | Comma-separated keywords to skip |
|
||||
| `TIMEOUT` | `20` | Request timeout in seconds |
|
||||
|
||||
## Confirmation Timeout
|
||||
|
||||
User confirmation dialogs have a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
|
||||
- Read and review the plugin list
|
||||
- Make installation decisions
|
||||
- Handle network delays
|
||||
|
||||
## Support
|
||||
|
||||
If this plugin has been useful, a star on [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) is a big motivation for me. Thank you for the support.
|
||||
139
docs/plugins/tools/batch-install-plugins-tool.zh.md
Normal file
139
docs/plugins/tools/batch-install-plugins-tool.zh.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# Batch Install Plugins from GitHub - 从 GitHub 批量安装插件
|
||||
|
||||
**作者:** [Fu-Jie](https://github.com/Fu-Jie) | **版本:** 1.0.0 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **许可:** MIT
|
||||
|
||||
---
|
||||
|
||||
一键从 GitHub 仓库批量安装插件到你的 OpenWebUI 实例。
|
||||
|
||||
## ✨ 主要特性
|
||||
|
||||
- **一键安装**: 一条命令安装所有插件
|
||||
- **自动更新**: 自动更新之前已安装的插件
|
||||
- **GitHub 支持**: 支持从任何 GitHub 仓库安装插件
|
||||
- **多类型支持**: 支持 Pipe、Action、Filter 和 Tool 插件
|
||||
- **确认机制**: 安装前显示插件列表,允许选择性安装
|
||||
- **国际化**: 支持 11 种语言
|
||||
|
||||
## 工作流
|
||||
|
||||
```
|
||||
用户输入
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 从 GitHub 发现插件 │
|
||||
│ (获取文件树 + 解析 .py) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 按类型和关键词过滤 │
|
||||
│ (tool/filter/pipe/action) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 显示确认对话框 │
|
||||
│ (插件列表 + 排除提示) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [取消] → 结束
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 安装到 OpenWebUI │
|
||||
│ (更新或创建每个插件) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
完成
|
||||
```
|
||||
|
||||
## 🚀 使用方法
|
||||
|
||||
1. 打开 OpenWebUI,进入 **工作区 > 工具**
|
||||
2. 从官方市场安装 **Batch Install Plugins from GitHub**
|
||||
3. 为你的模型/聊天启用此工具
|
||||
4. 让模型安装插件
|
||||
|
||||
## 使用示例
|
||||
|
||||
```
|
||||
"安装所有插件"
|
||||
"从 github.com/username/repo 安装所有插件"
|
||||
"仅安装 pipe 插件"
|
||||
"安装 action 和 filter 插件"
|
||||
"安装所有插件,exclude_keywords=copilot"
|
||||
```
|
||||
|
||||
## 热门插件仓库
|
||||
|
||||
这些是包含大量插件的热门仓库,你可以从中安装插件:
|
||||
|
||||
### 社区合集
|
||||
|
||||
```
|
||||
# 从 iChristGit 的集合安装所有插件
|
||||
"从 iChristGit/OpenWebui-Tools 安装所有插件"
|
||||
|
||||
# 从 Haervwe 的工具集合只安装工具
|
||||
"从 Haervwe/open-webui-tools 安装所有插件"
|
||||
|
||||
# 从 Classic298 的仓库安装所有插件
|
||||
"从 Classic298/open-webui-plugins 安装所有插件"
|
||||
|
||||
# 从 suurt8ll 的集合安装所有函数
|
||||
"从 suurt8ll/open_webui_functions 安装所有插件"
|
||||
|
||||
# 仅安装特定类型的插件(比如只安装工具)
|
||||
"从 iChristGit/OpenWebui-Tools 仅安装 tool 插件"
|
||||
|
||||
# 安装时排除特定关键词
|
||||
"从 Haervwe/open-webui-tools 安装所有插件,exclude_keywords=test,deprecated"
|
||||
```
|
||||
|
||||
### 支持的仓库
|
||||
|
||||
- `Fu-Jie/openwebui-extensions` - 默认的官方插件集合
|
||||
- `iChristGit/OpenWebui-Tools` - 全面的工具和插件集合
|
||||
- `Haervwe/open-webui-tools` - 专业的工具和实用程序
|
||||
- `Classic298/open-webui-plugins` - 各种插件实现
|
||||
- `suurt8ll/open_webui_functions` - 基于函数的插件
|
||||
|
||||
## 默认仓库
|
||||
|
||||
未指定仓库时,默认使用 `Fu-Jie/openwebui-extensions`。
|
||||
|
||||
## 插件检测规则
|
||||
|
||||
### Fu-Jie/openwebui-extensions(严格模式)
|
||||
|
||||
对于默认仓库,插件必须有:
|
||||
1. 包含 `class Tools:`、`class Filter:`、`class Pipe:` 或 `class Action:` 的 `.py` 文件
|
||||
2. 包含 `title:`、`description:` 和 **`openwebui_id:`** 字段的文档字符串
|
||||
3. 文件名不能以 `_cn` 结尾
|
||||
|
||||
### 其他 GitHub 仓库
|
||||
|
||||
对于其他仓库:
|
||||
1. 包含 `class Tools:`、`class Filter:`、`class Pipe:` 或 `class Action:` 的 `.py` 文件
|
||||
2. 包含 `title:` 和 `description:` 字段的文档字符串
|
||||
|
||||
## 配置 (Valves)
|
||||
|
||||
| 参数 | 默认值 | 描述 |
|
||||
| --- | --- | --- |
|
||||
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 要跳过的关键词,用逗号分隔 |
|
||||
| `TIMEOUT` | `20` | 请求超时时间(秒) |
|
||||
|
||||
## 确认超时时间
|
||||
|
||||
用户确认对话框的默认超时时间为 **2 分钟(120 秒)**,为用户提供充足的时间来:
|
||||
- 阅读和查看插件列表
|
||||
- 做出安装决定
|
||||
- 处理网络延迟
|
||||
|
||||
## 支持
|
||||
|
||||
如果这个插件对你有帮助,欢迎到 [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) 点个 Star,这将是我持续改进的动力,感谢支持。
|
||||
@@ -4,5 +4,6 @@ OpenWebUI native Tool plugins that can be used across models.
|
||||
|
||||
## Available Tool Plugins
|
||||
|
||||
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.md) (v1.0.0) - One-click batch install plugins from GitHub repositories with confirmation 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`).
|
||||
- [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.
|
||||
|
||||
@@ -4,5 +4,6 @@
|
||||
|
||||
## 可用 Tool 插件
|
||||
|
||||
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.zh.md) (v1.0.0) - 一键从 GitHub 仓库批量安装插件,支持确认和多语言。
|
||||
- [OpenWebUI Skills 管理工具](openwebui-skills-manager-tool.zh.md) (v0.3.0) - 简化技能管理(`list/show/install/create/update/delete`)。
|
||||
- [智能思维导图工具 (Smart Mind Map Tool)](smart-mind-map-tool.zh.md) (v1.0.0) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。
|
||||
|
||||
270
plugins/filters/async-context-compression/community_post.md
Normal file
270
plugins/filters/async-context-compression/community_post.md
Normal file
@@ -0,0 +1,270 @@
|
||||
[](https://openwebui.com/posts/async_context_compression_b1655bc8)
|
||||
|
||||
# Async Context Compression: A Production-Scale Working-Memory Filter for OpenWebUI
|
||||
|
||||
Long chats do not just get expensive. They also get fragile.
|
||||
|
||||
Once a conversation grows large enough, you usually have to choose between two bad options:
|
||||
|
||||
- keep the full history and pay a heavy context cost
|
||||
- trim aggressively and risk losing continuity, tool state, or important prior decisions
|
||||
|
||||
`Async Context Compression` is built to avoid that tradeoff.
|
||||
|
||||
It is not a simple “summarize old messages” utility. It is a structure-aware, async, database-backed working-memory system for OpenWebUI that can compress long conversations while preserving conversational continuity, tool-calling integrity, and now, as of `v1.5.0`, referenced-chat context injection as well.
|
||||
|
||||
This plugin has now reached the point where it feels complete enough to be described as a serious, high-capability filter rather than a small convenience add-on.
|
||||
|
||||
**[📖 Full README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/README.md)**
|
||||
**[📝 v1.5.0 Release Notes](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/v1.5.0.md)**
|
||||
|
||||
---
|
||||
|
||||
## Why This Plugin Exists
|
||||
|
||||
OpenWebUI conversations often contain much more than plain chat:
|
||||
|
||||
- long-running planning threads
|
||||
- coding sessions with repeated tool use
|
||||
- model-specific context limits
|
||||
- multimodal messages
|
||||
- external referenced chats
|
||||
- custom models with different context windows
|
||||
|
||||
A naive compression strategy is not enough in those environments.
|
||||
|
||||
If a filter only drops earlier messages based on length, it can:
|
||||
|
||||
- break native tool-calling chains
|
||||
- lose critical task state
|
||||
- destroy continuity in old chats
|
||||
- make debugging impossible
|
||||
- hide important provider-side failures
|
||||
|
||||
`Async Context Compression` is designed around a stronger premise:
|
||||
|
||||
> compress history without treating conversation structure as disposable
|
||||
|
||||
That means it tries to preserve what actually matters for the next turn:
|
||||
|
||||
- the current goal
|
||||
- durable user preferences
|
||||
- recent progress
|
||||
- tool outputs that still matter
|
||||
- error state
|
||||
- summary continuity
|
||||
- referenced context from other chats
|
||||
|
||||
---
|
||||
|
||||
## What Makes It Different
|
||||
|
||||
This plugin now combines several capabilities that are usually split across separate systems:
|
||||
|
||||
### 1. Asynchronous working-memory generation
|
||||
|
||||
The current reply is not blocked while the plugin generates a new summary in the background.
|
||||
|
||||
### 2. Persistent summary storage
|
||||
|
||||
Summaries are stored in OpenWebUI's shared database and reused across turns, instead of being regenerated from scratch every time.
|
||||
|
||||
### 3. Structure-aware trimming
|
||||
|
||||
The filter respects atomic message boundaries so native tool-calling history is not corrupted by compression.
|
||||
|
||||
### 4. External chat reference summarization
|
||||
|
||||
New in `v1.5.0`: referenced chats can now be reused as cached summaries, injected directly if small enough, or summarized before injection if too large.
|
||||
|
||||
### 5. Mixed-script token estimation
|
||||
|
||||
The plugin now uses a much stronger multilingual token estimation path before falling back to exact counting, which helps reduce unnecessary expensive token calculations while staying much closer to real usage.
|
||||
|
||||
### 6. Real failure visibility
|
||||
|
||||
Important background summary failures are surfaced to the browser console and status messages instead of disappearing silently.
|
||||
|
||||
---
|
||||
|
||||
## Workflow Overview
|
||||
|
||||
This is the current high-level flow:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Request enters inlet] --> B[Normalize tool IDs and optionally trim large tool outputs]
|
||||
B --> C{Referenced chats attached?}
|
||||
C -- No --> D[Load current chat summary if available]
|
||||
C -- Yes --> E[Inspect each referenced chat]
|
||||
|
||||
E --> F{Existing cached summary?}
|
||||
F -- Yes --> G[Reuse cached summary]
|
||||
F -- No --> H{Fits direct budget?}
|
||||
H -- Yes --> I[Inject full referenced chat text]
|
||||
H -- No --> J[Prepare referenced-chat summary input]
|
||||
|
||||
J --> K{Referenced-chat summary call succeeds?}
|
||||
K -- Yes --> L[Inject generated referenced summary]
|
||||
K -- No --> M[Fallback to direct contextual injection]
|
||||
|
||||
G --> D
|
||||
I --> D
|
||||
L --> D
|
||||
M --> D
|
||||
|
||||
D --> N[Build current-chat Head + Summary + Tail]
|
||||
N --> O{Over max_context_tokens?}
|
||||
O -- Yes --> P[Trim oldest atomic groups]
|
||||
O -- No --> Q[Send final context to the model]
|
||||
P --> Q
|
||||
|
||||
Q --> R[Model returns the reply]
|
||||
R --> S[Outlet rebuilds the full history]
|
||||
S --> T{Reached compression threshold?}
|
||||
T -- No --> U[Finish]
|
||||
T -- Yes --> V[Fit summary input to the summary model context]
|
||||
|
||||
V --> W{Background summary call succeeds?}
|
||||
W -- Yes --> X[Save new chat summary and update status]
|
||||
W -- No --> Y[Force browser-console error and show status hint]
|
||||
```
|
||||
|
||||
This is why I consider the plugin “powerful” now: it is no longer solving a single problem. It is coordinating context reduction, summary persistence, tool safety, referenced-chat handling, and model-budget control inside one filter.
|
||||
|
||||
---
|
||||
|
||||
## New in v1.5.0
|
||||
|
||||
This release is important because it turns the plugin from “long-chat compression with strong tool safety” into something closer to a reusable context-management layer.
|
||||
|
||||
### External chat reference summaries
|
||||
|
||||
This is a new feature in `v1.5.0`, not just a small adjustment.
|
||||
|
||||
When a user references another chat:
|
||||
|
||||
- the plugin can reuse an existing cached summary
|
||||
- inject the full referenced chat if it is small enough
|
||||
- or generate a summary first if the referenced chat is too large
|
||||
|
||||
That means the filter can now carry relevant context across chats, not just across turns inside the same chat.
|
||||
|
||||
### Fast multilingual token estimation
|
||||
|
||||
Also new in `v1.5.0`.
|
||||
|
||||
The plugin no longer relies on a rough one-size-fits-all character ratio. It now estimates token usage with mixed-script heuristics that behave much better for:
|
||||
|
||||
- English
|
||||
- Chinese
|
||||
- Japanese
|
||||
- Korean
|
||||
- Cyrillic
|
||||
- Arabic
|
||||
- Thai
|
||||
- mixed-language conversations
|
||||
|
||||
This matters because the plugin makes context decisions constantly. Better estimation means fewer unnecessary exact counts and fewer bad preflight assumptions.
|
||||
|
||||
### Stronger final-prompt budgeting
|
||||
|
||||
The summary path now fits the **real final summary request**, not just an intermediate estimate. That includes:
|
||||
|
||||
- prompt wrapper
|
||||
- formatted conversation text
|
||||
- previous summary
|
||||
- reserved output budget
|
||||
- safety margin
|
||||
|
||||
This directly improves reliability in the large old-chat cases that are hardest to handle.
|
||||
|
||||
---
|
||||
|
||||
## Why It Feels Complete Now
|
||||
|
||||
I would describe the current plugin as “feature-complete for the main problem space,” because it now covers the major operational surfaces that matter in real usage:
|
||||
|
||||
- long plain-chat conversations
|
||||
- multi-step coding threads
|
||||
- native tool-calling conversations
|
||||
- persistent summaries
|
||||
- custom model thresholds
|
||||
- background async generation
|
||||
- external chat references
|
||||
- multilingual token estimation
|
||||
- failure surfacing for debugging
|
||||
|
||||
That does not mean it is finished forever. It means the plugin has crossed the line from a narrow experimental filter into a robust context-management system with enough breadth to support demanding OpenWebUI usage patterns.
|
||||
|
||||
---
|
||||
|
||||
## Scale and Engineering Depth
|
||||
|
||||
For people who care about implementation depth, this plugin is not small anymore.
|
||||
|
||||
Current code size:
|
||||
|
||||
- main plugin: **4,573 lines**
|
||||
- focused test file: **1,037 lines**
|
||||
- combined visible implementation + regression coverage: **5,610 lines**
|
||||
|
||||
Line count is not a quality metric by itself, but at this scale it does say something real:
|
||||
|
||||
- the plugin has grown well beyond a toy filter
|
||||
- the behavior surface is large enough to require explicit regression testing
|
||||
- the plugin now encodes a lot of edge-case handling that only shows up after repeated real-world usage
|
||||
|
||||
In other words: this is no longer “just summarize old messages.” It is a fairly serious stateful filter.
|
||||
|
||||
---
|
||||
|
||||
## Practical Benefits
|
||||
|
||||
If you use OpenWebUI heavily, the value is straightforward:
|
||||
|
||||
- lower token consumption in long chats
|
||||
- better continuity across long-running sessions
|
||||
- safer native tool-calling history
|
||||
- fewer broken conversations after compression
|
||||
- more stable summary generation on large histories
|
||||
- better visibility when the provider rejects a summary request
|
||||
- useful reuse of context from referenced chats
|
||||
|
||||
This plugin is especially valuable if you:
|
||||
|
||||
- regularly work in long coding chats
|
||||
- use models with strict context budgets
|
||||
- rely on native tool calling
|
||||
- revisit old project chats
|
||||
- want summaries to behave like working memory, not like lossy notes
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
- OpenWebUI Community: <https://openwebui.com/posts/async_context_compression_b1655bc8>
|
||||
- Source: <https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/filters/async-context-compression>
|
||||
|
||||
If you want the full valve list, deployment notes, and troubleshooting details, the README is the best reference.
|
||||
|
||||
---
|
||||
|
||||
## Final Note
|
||||
|
||||
Do I think this plugin is powerful?
|
||||
|
||||
Yes, genuinely.
|
||||
|
||||
Not because it is large, but because it now solves the right combination of problems at once:
|
||||
|
||||
- cost control
|
||||
- continuity
|
||||
- structural safety
|
||||
- async persistence
|
||||
- cross-chat reuse
|
||||
- operational debuggability
|
||||
|
||||
That combination is what makes it feel strong.
|
||||
|
||||
If you have been looking for a serious long-conversation memory/compression filter for OpenWebUI, `Async Context Compression` is now in that category.
|
||||
282
plugins/filters/async-context-compression/community_post_CN.md
Normal file
282
plugins/filters/async-context-compression/community_post_CN.md
Normal file
@@ -0,0 +1,282 @@
|
||||
[](https://openwebui.com/posts/async_context_compression_b1655bc8)
|
||||
|
||||
# Async Context Compression:一个面向生产场景的 OpenWebUI 工作记忆过滤器
|
||||
|
||||
长对话的问题,从来不只是“贵”。
|
||||
|
||||
当聊天足够长时,通常只剩下两个都不太好的选择:
|
||||
|
||||
- 保留完整历史,继续承担很高的上下文成本
|
||||
- 粗暴裁剪旧消息,但冒着丢失上下文、工具状态和关键决策的风险
|
||||
|
||||
`Async Context Compression` 的目标,就是尽量避免这个二选一。
|
||||
|
||||
它不是一个简单的“把老消息总结一下”的小工具,而是一个带有结构感知、异步摘要、数据库持久化能力的 OpenWebUI 工作记忆系统。它的任务不是单纯缩短上下文,而是在压缩长对话的同时,尽量保留:
|
||||
|
||||
- 对话连续性
|
||||
- 工具调用状态完整性
|
||||
- 历史摘要进度
|
||||
- 跨聊天引用上下文
|
||||
- 出错时的可诊断性
|
||||
|
||||
到 `v1.5.0` 这个阶段,我认为它已经不再只是一个“方便的小过滤器”,而是一个足够完整、足够强、也足够有工程深度的上下文管理插件。
|
||||
|
||||
**[📖 完整 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/README_CN.md)**
|
||||
**[📝 v1.5.0 发布说明](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/filters/async-context-compression/v1.5.0_CN.md)**
|
||||
|
||||
---
|
||||
|
||||
## 为什么会有这个插件
|
||||
|
||||
OpenWebUI 里的真实对话,通常并不只是“用户问一句,模型答一句”。
|
||||
|
||||
它常常还包含:
|
||||
|
||||
- 很长的项目型对话
|
||||
- 多轮编码与调试
|
||||
- 原生工具调用
|
||||
- 多模态消息
|
||||
- 不同模型上下文窗口差异
|
||||
- 其他聊天的引用上下文
|
||||
|
||||
在这种环境里,单纯靠“按长度裁掉旧消息”其实不够。
|
||||
|
||||
如果一个过滤器只会按长度或索引裁剪消息,它很容易:
|
||||
|
||||
- 把原生 tool-calling 历史裁坏
|
||||
- 丢掉仍然会影响下一轮回复的关键信息
|
||||
- 在老聊天里破坏连续性
|
||||
- 出问题时几乎无法排查
|
||||
- 把上游 provider 报错伪装成模糊的内部错误
|
||||
|
||||
`Async Context Compression` 的核心思路更强一些:
|
||||
|
||||
> 可以压缩历史,但不能把“对话结构”当成无关紧要的东西一起压掉
|
||||
|
||||
它真正想保留的是下一轮最需要的状态:
|
||||
|
||||
- 当前目标
|
||||
- 持久偏好
|
||||
- 最近进展
|
||||
- 仍然有效的工具结果
|
||||
- 错误状态
|
||||
- 已有摘要的连续性
|
||||
- 来自其他聊天的相关上下文
|
||||
|
||||
---
|
||||
|
||||
## 它和普通摘要插件有什么不同
|
||||
|
||||
现在这个插件,实际上已经把几个通常要分散在不同系统里的能力组合到了一起:
|
||||
|
||||
### 1. 异步工作记忆生成
|
||||
|
||||
用户当前这次回复不会被后台摘要阻塞。
|
||||
|
||||
### 2. 持久化摘要存储
|
||||
|
||||
摘要会写入 OpenWebUI 共享数据库,并在后续轮次中复用,而不是每次都从头重算。
|
||||
|
||||
### 3. 结构感知裁剪
|
||||
|
||||
裁剪逻辑会尊重原子消息边界,避免把原生 tool-calling 历史裁坏。
|
||||
|
||||
### 4. 外部聊天引用摘要
|
||||
|
||||
这是 `v1.5.0` 新增的重要能力:被引用聊天现在可以直接复用缓存摘要、在小体量时直接注入、或者在过大时先生成摘要再注入。
|
||||
|
||||
### 5. 多语言 Token 预估
|
||||
|
||||
插件现在具备更强的多脚本文本 Token 预估逻辑,在很多情况下可以减少不必要的精确计数,同时明显比旧的粗略字符比值更贴近真实用量。
|
||||
|
||||
### 6. 失败可见性
|
||||
|
||||
关键的后台摘要失败现在会出现在浏览器控制台和状态提示里,不再悄悄消失。
|
||||
|
||||
---
|
||||
|
||||
## 工作流总览
|
||||
|
||||
下面是当前的高层流程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Request enters inlet] --> B[Normalize tool IDs and optionally trim large tool outputs]
|
||||
B --> C{Referenced chats attached?}
|
||||
C -- No --> D[Load current chat summary if available]
|
||||
C -- Yes --> E[Inspect each referenced chat]
|
||||
|
||||
E --> F{Existing cached summary?}
|
||||
F -- Yes --> G[Reuse cached summary]
|
||||
F -- No --> H{Fits direct budget?}
|
||||
H -- Yes --> I[Inject full referenced chat text]
|
||||
H -- No --> J[Prepare referenced-chat summary input]
|
||||
|
||||
J --> K{Referenced-chat summary call succeeds?}
|
||||
K -- Yes --> L[Inject generated referenced summary]
|
||||
K -- No --> M[Fallback to direct contextual injection]
|
||||
|
||||
G --> D
|
||||
I --> D
|
||||
L --> D
|
||||
M --> D
|
||||
|
||||
D --> N[Build current-chat Head + Summary + Tail]
|
||||
N --> O{Over max_context_tokens?}
|
||||
O -- Yes --> P[Trim oldest atomic groups]
|
||||
O -- No --> Q[Send final context to the model]
|
||||
P --> Q
|
||||
|
||||
Q --> R[Model returns the reply]
|
||||
R --> S[Outlet rebuilds the full history]
|
||||
S --> T{Reached compression threshold?}
|
||||
T -- No --> U[Finish]
|
||||
T -- Yes --> V[Fit summary input to the summary model context]
|
||||
|
||||
V --> W{Background summary call succeeds?}
|
||||
W -- Yes --> X[Save new chat summary and update status]
|
||||
W -- No --> Y[Force browser-console error and show status hint]
|
||||
```
|
||||
|
||||
这也是为什么我会觉得它现在“强”:它已经不再只解决一个问题,而是在一个过滤器里同时协调:
|
||||
|
||||
- 上下文压缩
|
||||
- 历史摘要复用
|
||||
- 工具调用安全性
|
||||
- 被引用聊天上下文
|
||||
- 模型预算控制
|
||||
|
||||
---
|
||||
|
||||
## v1.5.0 为什么重要
|
||||
|
||||
这个版本的重要性在于,它把插件从“长对话压缩器”推进成了一个更接近“上下文管理层”的东西。
|
||||
|
||||
### 外部聊天引用摘要
|
||||
|
||||
这是 `v1.5.0` 的新功能,不是小修小补。
|
||||
|
||||
当用户引用另一个聊天时,插件现在可以:
|
||||
|
||||
- 直接复用已有缓存摘要
|
||||
- 如果聊天足够小,直接把完整内容注入
|
||||
- 如果聊天太大,先生成摘要再注入
|
||||
|
||||
这意味着它现在不仅能跨“轮次”保留上下文,也能开始跨“聊天”携带相关上下文。
|
||||
|
||||
### 快速多语言 Token 预估
|
||||
|
||||
这同样是 `v1.5.0` 的新能力。
|
||||
|
||||
插件不再依赖简单粗暴的统一字符比值,而是改用更适合混合语言文本的估算方式,尤其对下面这些场景更有意义:
|
||||
|
||||
- 英文
|
||||
- 中文
|
||||
- 日文
|
||||
- 韩文
|
||||
- 西里尔字符
|
||||
- 阿拉伯语
|
||||
- 泰语
|
||||
- 中英混合或多语言混合对话
|
||||
|
||||
这很重要,因为上下文管理类插件会不断做预算判断。预估更准,就意味着更少无意义的精确计算,也更不容易在预检阶段做出错误判断。
|
||||
|
||||
### 更强的最终请求预算控制
|
||||
|
||||
现在的摘要路径会去拟合“真实最终 summary request”,而不是只看一个中间估算值。它会把这些内容都算进去:
|
||||
|
||||
- prompt 包装
|
||||
- 格式化后的对话文本
|
||||
- previous summary
|
||||
- 预留输出预算
|
||||
- 安全余量
|
||||
|
||||
这对老聊天、大聊天和最难处理的边界情况特别关键。
|
||||
|
||||
---
|
||||
|
||||
## 为什么我觉得它现在已经足够完整
|
||||
|
||||
如果把“问题空间”列出来,我会说这个插件现在对主要场景已经覆盖得比较完整了:
|
||||
|
||||
- 很长的普通聊天
|
||||
- 多轮编码与调试对话
|
||||
- 原生工具调用
|
||||
- 历史摘要持久化
|
||||
- 自定义模型阈值
|
||||
- 异步后台摘要
|
||||
- 外部聊天引用
|
||||
- 多语言 Token 预估
|
||||
- 调试可见性
|
||||
|
||||
这并不代表它永远不会再迭代,而是说它已经越过了“窄功能实验品”的阶段,进入了一个更像“通用上下文管理系统”的形态。
|
||||
|
||||
---
|
||||
|
||||
## 代码规模与工程深度
|
||||
|
||||
如果你关心实现深度,这个插件现在已经不小了。
|
||||
|
||||
当前代码规模:
|
||||
|
||||
- 主插件文件:**4,573 行**
|
||||
- 聚焦测试文件:**1,037 行**
|
||||
- 可见实现 + 回归测试合计:**5,610 行**
|
||||
|
||||
代码行数本身不等于质量,但在这个量级上,它至少说明了几件真实的事:
|
||||
|
||||
- 这已经不是一个玩具级过滤器
|
||||
- 这个插件的行为面足够大,必须靠专门回归测试兜住
|
||||
- 它已经积累了很多只有在真实使用中才会暴露出来的边界处理逻辑
|
||||
|
||||
也就是说,它现在做的事情,已经明显不是“把老消息总结一下”那么简单。
|
||||
|
||||
---
|
||||
|
||||
## 实际价值
|
||||
|
||||
如果你是 OpenWebUI 的重度用户,这个插件的价值其实很直接:
|
||||
|
||||
- 长聊天更省 Token
|
||||
- 长会话连续性更好
|
||||
- 原生 tool-calling 更安全
|
||||
- 压缩后更不容易把会话搞坏
|
||||
- 大历史摘要生成更稳定
|
||||
- provider 拒绝摘要请求时更容易看到真错误
|
||||
- 能复用其他聊天里的有效上下文
|
||||
|
||||
尤其适合这些用户:
|
||||
|
||||
- 经常做长时间编码聊天
|
||||
- 使用上下文窗口比较紧的模型
|
||||
- 依赖原生工具调用
|
||||
- 经常回看旧项目聊天
|
||||
- 希望摘要更像“工作记忆”而不是“丢失细节的简要笔记”
|
||||
|
||||
---
|
||||
|
||||
## 安装
|
||||
|
||||
- OpenWebUI 社区:<https://openwebui.com/posts/async_context_compression_b1655bc8>
|
||||
- 源码目录:<https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/filters/async-context-compression>
|
||||
|
||||
如果你想看完整的 valves、部署说明和故障排查,README 仍然是最完整的参考入口。
|
||||
|
||||
---
|
||||
|
||||
## 最后一句
|
||||
|
||||
你问我这个插件是不是强大。
|
||||
|
||||
我的答案是:**是,确实强,而且现在已经不是“看起来强”,而是“问题空间覆盖得比较完整”的那种强。**
|
||||
|
||||
不是因为它代码多,而是因为它现在同时解决的是一组真正相关的问题:
|
||||
|
||||
- 成本控制
|
||||
- 连续性
|
||||
- 结构安全
|
||||
- 异步持久化
|
||||
- 跨聊天上下文复用
|
||||
- 出错时的可诊断性
|
||||
|
||||
正是这几个东西一起成立,才让它现在像一个真正成熟的长对话上下文管理插件。
|
||||
137
plugins/tools/batch-install-plugins/README.md
Normal file
137
plugins/tools/batch-install-plugins/README.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# Batch Install Plugins from GitHub
|
||||
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie) | **Version:** 1.0.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
|
||||
One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
|
||||
|
||||
## Key Features
|
||||
|
||||
- **One-Click Install**: Install all plugins with a single command
|
||||
- **Auto-Update**: Automatically updates previously installed plugins
|
||||
- **GitHub Support**: Install plugins from any GitHub repository
|
||||
- **Multi-Type Support**: Supports Pipe, Action, Filter, and Tool plugins
|
||||
- **Confirmation**: Shows plugin list before installing, allows selective installation
|
||||
- **i18n**: Supports 11 languages
|
||||
|
||||
## Flow
|
||||
|
||||
```
|
||||
User Input
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Discover Plugins from GitHub │
|
||||
│ (fetch file tree + parse .py) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Filter by Type & Keywords │
|
||||
│ (tool/filter/pipe/action) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Show Confirmation Dialog │
|
||||
│ (list plugins + exclude hint) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [Cancel] → End
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Install to OpenWebUI │
|
||||
│ (update or create each plugin) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
Done
|
||||
```
|
||||
|
||||
## How to Use
|
||||
|
||||
1. Open OpenWebUI and go to **Workspace > Tools**
|
||||
2. Install **Batch Install Plugins from GitHub** from the official marketplace
|
||||
3. Enable this tool for your model/chat
|
||||
4. Ask the model to install plugins
|
||||
|
||||
## Usage Examples
|
||||
|
||||
```
|
||||
"Install all plugins"
|
||||
"Install all plugins from github.com/username/repo"
|
||||
"Install only pipe plugins"
|
||||
"Install action and filter plugins"
|
||||
"Install all plugins, exclude_keywords=copilot"
|
||||
```
|
||||
|
||||
## Popular Plugin Repositories
|
||||
|
||||
Here are some popular repositories with many plugins you can install:
|
||||
|
||||
### Community Collections
|
||||
|
||||
```
|
||||
# Install all plugins from iChristGit's collection
|
||||
"Install all plugins from iChristGit/OpenWebui-Tools"
|
||||
|
||||
# Install all tools from Haervwe's tools collection
|
||||
"Install all plugins from Haervwe/open-webui-tools"
|
||||
|
||||
# Install all plugins from Classic298's repository
|
||||
"Install all plugins from Classic298/open-webui-plugins"
|
||||
|
||||
# Install all functions from suurt8ll's collection
|
||||
"Install all plugins from suurt8ll/open_webui_functions"
|
||||
|
||||
# Install only specific types (e.g., only tools)
|
||||
"Install only tool plugins from iChristGit/OpenWebui-Tools"
|
||||
|
||||
# Exclude certain keywords while installing
|
||||
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
|
||||
```
|
||||
|
||||
### Supported Repositories
|
||||
|
||||
- `Fu-Jie/openwebui-extensions` - Default, official plugin collection
|
||||
- `iChristGit/OpenWebui-Tools` - Comprehensive tool and plugin collection
|
||||
- `Haervwe/open-webui-tools` - Specialized tools and utilities
|
||||
- `Classic298/open-webui-plugins` - Various plugin implementations
|
||||
- `suurt8ll/open_webui_functions` - Function-based plugins
|
||||
|
||||
## Default Repository
|
||||
|
||||
When no repository is specified, defaults to `Fu-Jie/openwebui-extensions`.
|
||||
|
||||
## Plugin Detection Rules
|
||||
|
||||
### Fu-Jie/openwebui-extensions (Strict)
|
||||
|
||||
For the default repository, plugins must have:
|
||||
1. A `.py` file containing `class Tools:`, `class Filter:`, `class Pipe:`, or `class Action:`
|
||||
2. A docstring with `title:`, `description:`, and **`openwebui_id:`** fields
|
||||
3. Filename must not end with `_cn`
|
||||
|
||||
### Other GitHub Repositories
|
||||
|
||||
For other repositories:
|
||||
1. A `.py` file containing `class Tools:`, `class Filter:`, `class Pipe:`, or `class Action:`
|
||||
2. A docstring with `title:` and `description:` fields
|
||||
|
||||
## Configuration (Valves)
|
||||
|
||||
| Parameter | Default | Description |
|
||||
| --- | --- | --- |
|
||||
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | Comma-separated keywords to skip |
|
||||
| `TIMEOUT` | `20` | Request timeout in seconds |
|
||||
|
||||
## Confirmation Timeout
|
||||
|
||||
User confirmation dialogs have a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
|
||||
- Read and review the plugin list
|
||||
- Make installation decisions
|
||||
- Handle network delays
|
||||
|
||||
## Support
|
||||
|
||||
If this plugin has been useful, a star on [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) is a big motivation for me. Thank you for the support.
|
||||
137
plugins/tools/batch-install-plugins/README_CN.md
Normal file
137
plugins/tools/batch-install-plugins/README_CN.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# Batch Install Plugins from GitHub
|
||||
|
||||
**作者:** [Fu-Jie](https://github.com/Fu-Jie) | **版本:** 1.0.0 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
|
||||
|
||||
一键将 GitHub 仓库中的插件批量安装到你的 OpenWebUI 实例。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 一键安装:单个命令安装所有插件
|
||||
- 自动更新:自动更新之前安装过的插件
|
||||
- GitHub 支持:从任意 GitHub 仓库安装插件
|
||||
- 多类型支持:支持 Pipe、Action、Filter 和 Tool 插件
|
||||
- 安装确认:安装前显示插件列表,支持选择性安装
|
||||
- 国际化:支持 11 种语言
|
||||
|
||||
## 流程
|
||||
|
||||
```
|
||||
用户输入
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 从 GitHub 发现插件 │
|
||||
│ (获取文件树 + 解析 .py 文件) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 按类型和关键词过滤 │
|
||||
│ (tool/filter/pipe/action) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 显示确认对话框 │
|
||||
│ (插件列表 + 排除提示) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [取消] → 结束
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 安装到 OpenWebUI │
|
||||
│ (更新或创建每个插件) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
完成
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 打开 OpenWebUI,进入 **Workspace > Tools**
|
||||
2. 从官方市场安装 **Batch Install Plugins from GitHub**
|
||||
3. 为你的模型/对话启用此工具
|
||||
4. 让模型调用工具方法
|
||||
|
||||
## 使用示例
|
||||
|
||||
```
|
||||
"安装所有插件"
|
||||
"从 github.com/username/repo 安装所有插件"
|
||||
"只安装 pipe 插件"
|
||||
"安装 action 和 filter 插件"
|
||||
"安装所有插件, exclude_keywords=copilot"
|
||||
```
|
||||
|
||||
## 热门插件仓库
|
||||
|
||||
这些是包含大量插件的热门仓库,你可以从中安装插件:
|
||||
|
||||
### 社区合集
|
||||
|
||||
```
|
||||
# 从 iChristGit 的集合安装所有插件
|
||||
"从 iChristGit/OpenWebui-Tools 安装所有插件"
|
||||
|
||||
# 从 Haervwe 的工具集合只安装工具
|
||||
"从 Haervwe/open-webui-tools 安装所有插件"
|
||||
|
||||
# 从 Classic298 的仓库安装所有插件
|
||||
"从 Classic298/open-webui-plugins 安装所有插件"
|
||||
|
||||
# 从 suurt8ll 的集合安装所有函数
|
||||
"从 suurt8ll/open_webui_functions 安装所有插件"
|
||||
|
||||
# 只安装特定类型的插件(比如只安装工具)
|
||||
"从 iChristGit/OpenWebui-Tools 只安装 tool 插件"
|
||||
|
||||
# 安装时排除特定关键词
|
||||
"从 Haervwe/open-webui-tools 安装所有插件, exclude_keywords=test,deprecated"
|
||||
```
|
||||
|
||||
### 支持的仓库
|
||||
|
||||
- `Fu-Jie/openwebui-extensions` - 默认的官方插件集合
|
||||
- `iChristGit/OpenWebui-Tools` - 全面的工具和插件集合
|
||||
- `Haervwe/open-webui-tools` - 专业的工具和实用程序
|
||||
- `Classic298/open-webui-plugins` - 各种插件实现
|
||||
- `suurt8ll/open_webui_functions` - 基于函数的插件
|
||||
|
||||
## 默认仓库
|
||||
|
||||
未指定仓库时,默认为 `Fu-Jie/openwebui-extensions`。
|
||||
|
||||
## 插件检测规则
|
||||
|
||||
### Fu-Jie/openwebui-extensions(严格模式)
|
||||
|
||||
默认仓库的插件必须满足:
|
||||
1. 包含 `class Tools:`、`class Filter:`、`class Pipe:` 或 `class Action:` 的 `.py` 文件
|
||||
2. Docstring 中包含 `title:`、`description:` 和 **`openwebui_id:`** 字段
|
||||
3. 文件名不能以 `_cn` 结尾
|
||||
|
||||
### 其他 GitHub 仓库
|
||||
|
||||
其他仓库的插件必须满足:
|
||||
1. 包含 `class Tools:`、`class Filter:`、`class Pipe:` 或 `class Action:` 的 `.py` 文件
|
||||
2. Docstring 中包含 `title:` 和 `description:` 字段
|
||||
|
||||
## 配置(Valves)
|
||||
|
||||
| 参数 | 默认值 | 描述 |
|
||||
| --- | --- | --- |
|
||||
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 逗号分隔的跳过关键词 |
|
||||
| `TIMEOUT` | `20` | 请求超时时间(秒)|
|
||||
|
||||
## 确认超时时间
|
||||
|
||||
用户确认对话框的默认超时时间为 **2 分钟(120 秒)**,为用户提供充足的时间来:
|
||||
- 阅读和查看插件列表
|
||||
- 做出安装决定
|
||||
- 处理网络延迟
|
||||
|
||||
## 支持
|
||||
|
||||
如果这个插件对你有帮助,欢迎到 [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) 点个 Star,这将是我持续改进的动力,感谢支持。
|
||||
1262
plugins/tools/batch-install-plugins/batch_install_plugins.py
Normal file
1262
plugins/tools/batch-install-plugins/batch_install_plugins.py
Normal file
File diff suppressed because it is too large
Load Diff
67
plugins/tools/batch-install-plugins/v1.0.0.md
Normal file
67
plugins/tools/batch-install-plugins/v1.0.0.md
Normal file
@@ -0,0 +1,67 @@
|
||||
[](https://openwebui.com/t/fujie/batch_install_plugins)
|
||||
|
||||
## Overview
|
||||
|
||||
Batch Install Plugins from GitHub is a new tool for OpenWebUI that enables one-click installation of multiple plugins directly from GitHub repositories. This initial release includes comprehensive features for discovering, filtering, and installing plugins with user confirmation, extensive multi-language support, and robust debugging capabilities for container deployments.
|
||||
|
||||
**[📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/README.md)**
|
||||
|
||||
## Features
|
||||
|
||||
- **One-Click Installation**: Install all plugins from a repository with a single command
|
||||
- **Smart Plugin Discovery**: Parse Python files to extract metadata and validate plugins automatically
|
||||
- **Multi-Type Support**: Support Pipe, Action, Filter, and Tool plugins in a single operation
|
||||
- **Confirmation Dialog**: Display plugin list before installation for user review and approval
|
||||
- **Selective Installation**: Exclude specific plugins using keyword-based filtering
|
||||
- **Smart Fallback**: Container deployments auto-retry with localhost:8080 if primary connection fails
|
||||
- **Enhanced Debugging**: Rich frontend JavaScript and backend Python logs for troubleshooting
|
||||
- **Extended Timeout**: 120-second confirmation window for thoughtful decision-making
|
||||
- **Async Architecture**: Non-blocking I/O operations for better performance
|
||||
- **Full Internationalization**: Complete support for 11 languages with proper fallback maps
|
||||
- **Auto-Update**: Automatically updates previously installed plugins
|
||||
- **Self-Exclusion**: Automatically excludes the tool itself from batch operations
|
||||
|
||||
## Technical Highlights
|
||||
|
||||
- **httpx Integration**: Modern async HTTP client for reliable, non-blocking requests
|
||||
- **Event Emitter Support**: Proper handling of OpenWebUI event injection with fallbacks
|
||||
- **Timeout Protection**: Wrapped frontend execution with timeout guards to prevent hanging
|
||||
- **Filtered List Consistency**: Uses single source of truth for confirmation and installation
|
||||
- **Error Localization**: All error messages are user-facing and properly localized across languages
|
||||
- **Deployment Resilience**: Intelligent base URL resolution handles domain, localhost, and containerized environments
|
||||
|
||||
## Supported Repositories
|
||||
|
||||
- **Default**: Fu-Jie/openwebui-extensions (strict validation)
|
||||
- **Custom**: Any GitHub repository with Python plugin files
|
||||
|
||||
## Testing
|
||||
|
||||
Comprehensive regression tests included:
|
||||
- Filtered installation list consistency
|
||||
- Missing event emitter handling
|
||||
- Confirmation timeout verification
|
||||
- Full failure scenarios
|
||||
- Localization completeness
|
||||
- Connection error debug logging and smart fallback
|
||||
|
||||
All 6 tests pass successfully.
|
||||
|
||||
## Documentation
|
||||
|
||||
- English README with flow diagrams and usage examples
|
||||
- Chinese README (README_CN.md) with complete translations
|
||||
- Mirrored documentation for official docs site
|
||||
- Plugin index entries in both English and Chinese
|
||||
|
||||
## Compatibility
|
||||
|
||||
- OpenWebUI: 0.2.x - 0.8.x
|
||||
- Python: 3.9+
|
||||
- Dependencies: httpx (async HTTP client), pydantic (type validation)
|
||||
|
||||
## Release Notes
|
||||
|
||||
- This initial v1.0.0 release includes complete plugin infrastructure with smart deployment handling.
|
||||
- The plugin is designed to handle diverse deployment scenarios (domain, localhost, containerized) with minimal configuration.
|
||||
|
||||
67
plugins/tools/batch-install-plugins/v1.0.0_CN.md
Normal file
67
plugins/tools/batch-install-plugins/v1.0.0_CN.md
Normal file
@@ -0,0 +1,67 @@
|
||||
[](https://openwebui.com/t/fujie/batch_install_plugins)
|
||||
|
||||
## 概述
|
||||
|
||||
从 GitHub 批量安装插件是一款全新的 OpenWebUI 工具,支持直接从 GitHub 仓库一键安装多个插件。此首个发布版本包含了全面的插件发现、过滤和安装功能,支持用户确认流程、广泛的多语言支持,以及针对容器部署的健壮调试能力。
|
||||
|
||||
**[📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/README_CN.md)**
|
||||
|
||||
## 主要功能
|
||||
|
||||
- **一键安装**:通过单个命令安装仓库中的所有插件
|
||||
- **智能插件发现**:解析 Python 文件提取元数据并自动验证插件
|
||||
- **多类型支持**:在单个操作中支持 Pipe、Action、Filter 和 Tool 插件
|
||||
- **确认对话框**:安装前显示插件列表供用户审查和批准
|
||||
- **选择性安装**:通过基于关键词的过滤排除特定插件
|
||||
- **智能降级**:容器环境中主 URL 连接失败时自动重试 localhost:8080
|
||||
- **增强调试**:前端 JavaScript 和后端 Python 富日志输出,便于排查问题
|
||||
- **延长超时**:120 秒确认窗口,给用户充分的思考时间
|
||||
- **异步架构**:非阻塞 I/O 操作,性能更优
|
||||
- **完整国际化**:支持 11 种语言,包含适当的回退机制
|
||||
- **自动更新**:自动更新之前安装过的插件
|
||||
- **自排除机制**:自动排除工具自身,避免在批量操作中重复安装
|
||||
|
||||
## 技术亮点
|
||||
|
||||
- **httpx 集成**:现代化的异步 HTTP 客户端,请求更可靠且非阻塞
|
||||
- **事件注入支持**:正确处理 OpenWebUI 事件注入,提供回退支持
|
||||
- **超时保护**:前端执行周围包装了超时保护,防止进程挂起
|
||||
- **过滤列表一致性**:确认和安装使用同一份过滤列表
|
||||
- **错误本地化**:所有错误消息都是面向用户的,已正确本地化到各语言
|
||||
- **部署弹性**:智能 Base URL 解析处理域名、localhost 和容器化环境
|
||||
|
||||
## 支持的仓库
|
||||
|
||||
- **默认**:Fu-Jie/openwebui-extensions(严格验证)
|
||||
- **自定义**:任意 GitHub 仓库中的 Python 插件文件
|
||||
|
||||
## 测试覆盖
|
||||
|
||||
包含全面的回归测试:
|
||||
- 过滤安装列表一致性
|
||||
- 缺少事件注入器时的处理
|
||||
- 确认超时验证
|
||||
- 完全失败场景
|
||||
- 本地化完整性
|
||||
- 连接错误调试日志和智能降级
|
||||
|
||||
所有 6 个测试均通过。
|
||||
|
||||
## 文档
|
||||
|
||||
- 英文 README,包含流程图和使用示例
|
||||
- 中文 README (README_CN.md),完整翻译
|
||||
- 官方文档站点的镜像文档
|
||||
- 英文和中文的插件索引条目
|
||||
|
||||
## 兼容性
|
||||
|
||||
- OpenWebUI:0.2.x - 0.8.x
|
||||
- Python:3.9+
|
||||
- 依赖:httpx(异步 HTTP 客户端)、pydantic(类型验证)
|
||||
|
||||
## 发布说明
|
||||
|
||||
- 本首发 v1.0.0 版本包含完整的插件基础设施和智能部署处理能力。
|
||||
- 该插件设计用于处理多种部署场景(域名、localhost、容器化),配置最少。
|
||||
|
||||
302
tests/plugins/tools/test_batch_install_plugins.py
Normal file
302
tests/plugins/tools/test_batch_install_plugins.py
Normal file
@@ -0,0 +1,302 @@
|
||||
import asyncio
|
||||
import importlib.util
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import httpx
|
||||
import pytest
|
||||
|
||||
|
||||
MODULE_PATH = (
|
||||
Path(__file__).resolve().parents[3]
|
||||
/ "plugins"
|
||||
/ "tools"
|
||||
/ "batch-install-plugins"
|
||||
/ "batch_install_plugins.py"
|
||||
)
|
||||
SPEC = importlib.util.spec_from_file_location("batch_install_plugins", MODULE_PATH)
|
||||
batch_install_plugins = importlib.util.module_from_spec(SPEC)
|
||||
assert SPEC.loader is not None
|
||||
sys.modules[SPEC.name] = batch_install_plugins
|
||||
SPEC.loader.exec_module(batch_install_plugins)
|
||||
|
||||
|
||||
def make_candidate(title: str, file_path: str, function_id: str):
|
||||
return batch_install_plugins.PluginCandidate(
|
||||
plugin_type="tool",
|
||||
file_path=file_path,
|
||||
metadata={"title": title, "description": f"{title} description"},
|
||||
content="class Tools:\n pass\n",
|
||||
function_id=function_id,
|
||||
)
|
||||
|
||||
|
||||
def make_request():
|
||||
class Request:
|
||||
base_url = "http://localhost:3000/"
|
||||
headers = {"Authorization": "Bearer token"}
|
||||
|
||||
return Request()
|
||||
|
||||
|
||||
class DummyResponse:
|
||||
def __init__(self, status_code: int, json_data=None, text: str = ""):
|
||||
self.status_code = status_code
|
||||
self._json_data = json_data
|
||||
self.text = text
|
||||
|
||||
def json(self):
|
||||
if self._json_data is None:
|
||||
raise ValueError("no json body")
|
||||
return self._json_data
|
||||
|
||||
|
||||
class FakeAsyncClient:
|
||||
posts = []
|
||||
responses = []
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
async def __aenter__(self):
|
||||
return self
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb):
|
||||
return False
|
||||
|
||||
async def post(self, url, headers=None, json=None):
|
||||
type(self).posts.append((url, headers, json))
|
||||
if not type(self).responses:
|
||||
raise AssertionError("No fake response configured for POST request")
|
||||
response = type(self).responses.pop(0)
|
||||
if isinstance(response, Exception):
|
||||
raise response
|
||||
return response
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_only_installs_filtered_candidates(monkeypatch):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
exclude = make_candidate(
|
||||
"Exclude Me",
|
||||
"plugins/tools/exclude-me/exclude_me.py",
|
||||
"exclude_me",
|
||||
)
|
||||
self_plugin = make_candidate(
|
||||
"Batch Install Plugins from GitHub",
|
||||
"plugins/tools/batch-install-plugins/batch_install_plugins.py",
|
||||
"batch_install_plugins",
|
||||
)
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep, exclude, self_plugin], []
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
FakeAsyncClient.posts = []
|
||||
FakeAsyncClient.responses = [DummyResponse(404), DummyResponse(201)]
|
||||
monkeypatch.setattr(batch_install_plugins.httpx, "AsyncClient", FakeAsyncClient)
|
||||
|
||||
events = []
|
||||
captured = {}
|
||||
|
||||
async def event_call(payload):
|
||||
if payload["type"] == "confirmation":
|
||||
captured["message"] = payload["data"]["message"]
|
||||
elif payload["type"] == "execute":
|
||||
captured.setdefault("execute_codes", []).append(payload["data"]["code"])
|
||||
return True
|
||||
|
||||
async def emitter(event):
|
||||
events.append(event)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "en-US"},
|
||||
__event_call__=event_call,
|
||||
__request__=make_request(),
|
||||
__event_emitter__=emitter,
|
||||
repo=batch_install_plugins.DEFAULT_REPO,
|
||||
plugin_types=["tool"],
|
||||
exclude_keywords="exclude",
|
||||
)
|
||||
|
||||
assert "Created: Keep Plugin" in result
|
||||
assert "Exclude Me" not in result
|
||||
assert "1/1" in result
|
||||
assert captured["message"].count("[tool]") == 1
|
||||
assert "Keep Plugin" in captured["message"]
|
||||
assert "Exclude Me" not in captured["message"]
|
||||
assert "Batch Install Plugins from GitHub" not in captured["message"]
|
||||
assert "exclude, batch-install-plugins" in captured["message"]
|
||||
|
||||
urls = [url for url, _, _ in FakeAsyncClient.posts]
|
||||
assert urls == [
|
||||
"http://localhost:3000/api/v1/tools/id/keep_plugin/update",
|
||||
"http://localhost:3000/api/v1/tools/create",
|
||||
]
|
||||
assert any(
|
||||
"Starting OpenWebUI install requests" in code
|
||||
for code in captured.get("execute_codes", [])
|
||||
)
|
||||
assert events[-1]["type"] == "notification"
|
||||
assert events[-1]["data"]["type"] == "success"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_supports_missing_event_emitter(monkeypatch):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep], []
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
FakeAsyncClient.posts = []
|
||||
FakeAsyncClient.responses = [DummyResponse(404), DummyResponse(201)]
|
||||
monkeypatch.setattr(batch_install_plugins.httpx, "AsyncClient", FakeAsyncClient)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "en-US"},
|
||||
__request__=make_request(),
|
||||
repo="example/repo",
|
||||
plugin_types=["tool"],
|
||||
)
|
||||
|
||||
assert "Created: Keep Plugin" in result
|
||||
assert "1/1" in result
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_handles_confirmation_timeout(monkeypatch):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep], []
|
||||
|
||||
async def fake_wait_for(awaitable, timeout):
|
||||
awaitable.close()
|
||||
raise asyncio.TimeoutError
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
monkeypatch.setattr(batch_install_plugins.asyncio, "wait_for", fake_wait_for)
|
||||
|
||||
events = []
|
||||
|
||||
async def event_call(payload):
|
||||
return True
|
||||
|
||||
async def emitter(event):
|
||||
events.append(event)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "en-US"},
|
||||
__event_call__=event_call,
|
||||
__request__=make_request(),
|
||||
__event_emitter__=emitter,
|
||||
repo="example/repo",
|
||||
plugin_types=["tool"],
|
||||
)
|
||||
|
||||
assert result == "Confirmation timed out or failed. Installation cancelled."
|
||||
assert events[-1]["type"] == "notification"
|
||||
assert events[-1]["data"]["type"] == "warning"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_marks_total_failure_as_error(monkeypatch):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep], []
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
FakeAsyncClient.posts = []
|
||||
FakeAsyncClient.responses = [
|
||||
DummyResponse(500, {"detail": "update failed"}, "update failed"),
|
||||
DummyResponse(500, {"detail": "create failed"}, "create failed"),
|
||||
]
|
||||
monkeypatch.setattr(batch_install_plugins.httpx, "AsyncClient", FakeAsyncClient)
|
||||
|
||||
events = []
|
||||
|
||||
async def emitter(event):
|
||||
events.append(event)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "en-US"},
|
||||
__request__=make_request(),
|
||||
__event_emitter__=emitter,
|
||||
repo="example/repo",
|
||||
plugin_types=["tool"],
|
||||
)
|
||||
|
||||
assert "Failed: Keep Plugin - status 500:" in result
|
||||
assert "0/1" in result
|
||||
assert events[-1]["type"] == "notification"
|
||||
assert events[-1]["data"]["type"] == "error"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_localizes_timeout_errors(monkeypatch):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep], []
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
FakeAsyncClient.posts = []
|
||||
FakeAsyncClient.responses = [httpx.TimeoutException("timed out")]
|
||||
monkeypatch.setattr(batch_install_plugins.httpx, "AsyncClient", FakeAsyncClient)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "zh-CN"},
|
||||
__request__=make_request(),
|
||||
repo="example/repo",
|
||||
plugin_types=["tool"],
|
||||
)
|
||||
|
||||
assert "失败:Keep Plugin - 请求超时" in result
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_install_all_plugins_emits_frontend_debug_logs_on_connect_error(
|
||||
monkeypatch,
|
||||
):
|
||||
keep = make_candidate("Keep Plugin", "plugins/tools/keep/keep.py", "keep_plugin")
|
||||
|
||||
async def fake_discover_plugins(url, skip_keywords):
|
||||
return [keep], []
|
||||
|
||||
monkeypatch.setattr(batch_install_plugins, "discover_plugins", fake_discover_plugins)
|
||||
FakeAsyncClient.posts = []
|
||||
# Both initial attempt and fallback retry should fail
|
||||
FakeAsyncClient.responses = [httpx.ConnectError("connect failed"), httpx.ConnectError("connect failed")]
|
||||
monkeypatch.setattr(batch_install_plugins.httpx, "AsyncClient", FakeAsyncClient)
|
||||
|
||||
execute_codes = []
|
||||
events = []
|
||||
|
||||
async def event_call(payload):
|
||||
if payload["type"] == "execute":
|
||||
execute_codes.append(payload["data"]["code"])
|
||||
return True
|
||||
if payload["type"] == "confirmation":
|
||||
return True
|
||||
raise AssertionError(f"Unexpected event_call payload type: {payload['type']}")
|
||||
|
||||
async def emitter(event):
|
||||
events.append(event)
|
||||
|
||||
result = await batch_install_plugins.Tools().install_all_plugins(
|
||||
__user__={"id": "u1", "language": "en-US"},
|
||||
__event_call__=event_call,
|
||||
__request__=make_request(),
|
||||
__event_emitter__=emitter,
|
||||
repo="example/repo",
|
||||
plugin_types=["tool"],
|
||||
)
|
||||
|
||||
assert result == "Cannot connect to OpenWebUI. Is it running?"
|
||||
assert any("OpenWebUI connection failed" in code for code in execute_codes)
|
||||
assert any("console.error" in code for code in execute_codes)
|
||||
assert any("http://localhost:3000" in code for code in execute_codes)
|
||||
assert events[-1]["type"] == "notification"
|
||||
assert events[-1]["data"]["type"] == "error"
|
||||
Reference in New Issue
Block a user