Compare commits

..

3 Commits

Author SHA1 Message Date
fujie
fbd68ad042 chore(openwebui-skills-manager): release v0.3.1
- support multi-line SKILL.md frontmatter descriptions during install

- sync README, docs, and release notes for v0.3.1

- add regression coverage for YAML block scalars and CRLF inputs
2026-03-25 19:26:44 +08:00
fujie
b6ce354034 fix(batch-install-plugins): handle null exclude_keywords and improve docstrings
- Fix AttributeError when LLM passes null for exclude_keywords parameter (issue #63)
- Improve function docstrings to clarify unified workflow
- Optimize status messages to show repository name
2026-03-24 18:54:01 +08:00
github-actions[bot]
df042e471e chore: update community stats - plugin versions updated 2026-03-23 20:18:28 +00:00
20 changed files with 398 additions and 152 deletions

View File

@@ -1,7 +1,7 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "downloads", "label": "downloads",
"message": "10.9k", "message": "11.0k",
"color": "blue", "color": "blue",
"namedLogo": "openwebui" "namedLogo": "openwebui"
} }

View File

@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "followers", "label": "followers",
"message": "425", "message": "426",
"color": "blue" "color": "blue"
} }

View File

@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "views", "label": "views",
"message": "118.2k", "message": "118.4k",
"color": "blueviolet" "color": "blueviolet"
} }

View File

@@ -1,7 +1,7 @@
{ {
"total_posts": 30, "total_posts": 30,
"total_downloads": 10945, "total_downloads": 10953,
"total_views": 118210, "total_views": 118430,
"total_upvotes": 350, "total_upvotes": 350,
"total_downvotes": 16, "total_downvotes": 16,
"total_saves": 469, "total_saves": 469,
@@ -9,10 +9,10 @@
"plugin_contributions": 22, "plugin_contributions": 22,
"by_type": { "by_type": {
"tool": 3, "tool": 3,
"pipe": 1,
"filter": 4, "filter": 4,
"action": 12, "action": 12,
"prompt": 2, "prompt": 2
"pipe": 1
}, },
"posts": [ "posts": [
{ {
@@ -22,8 +22,8 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.", "description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 2064, "downloads": 2068,
"views": 18332, "views": 18359,
"upvotes": 35, "upvotes": 35,
"saves": 82, "saves": 82,
"comments": 23, "comments": 23,
@@ -39,8 +39,8 @@
"version": "1.6.1", "version": "1.6.1",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.", "description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
"downloads": 1535, "downloads": 1537,
"views": 15655, "views": 15674,
"upvotes": 30, "upvotes": 30,
"saves": 61, "saves": 61,
"comments": 12, "comments": 12,
@@ -57,7 +57,7 @@
"author": "Fu-Jie", "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.", "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": 983, "downloads": 983,
"views": 10060, "views": 10070,
"upvotes": 27, "upvotes": 27,
"saves": 52, "saves": 52,
"comments": 6, "comments": 6,
@@ -74,7 +74,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.", "description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
"downloads": 964, "downloads": 964,
"views": 8791, "views": 8804,
"upvotes": 22, "upvotes": 22,
"saves": 57, "saves": 57,
"comments": 0, "comments": 0,
@@ -91,7 +91,7 @@
"author": "Fu-Jie", "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.", "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": 940, "downloads": 940,
"views": 7395, "views": 7413,
"upvotes": 22, "upvotes": 22,
"saves": 41, "saves": 41,
"comments": 8, "comments": 8,
@@ -108,7 +108,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 874, "downloads": 874,
"views": 9646, "views": 9652,
"upvotes": 11, "upvotes": 11,
"saves": 28, "saves": 28,
"comments": 0, "comments": 0,
@@ -124,8 +124,8 @@
"version": "0.3.0", "version": "0.3.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.", "description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
"downloads": 698, "downloads": 699,
"views": 8399, "views": 8430,
"upvotes": 10, "upvotes": 10,
"saves": 31, "saves": 31,
"comments": 4, "comments": 4,
@@ -142,7 +142,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.", "description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
"downloads": 685, "downloads": 685,
"views": 4184, "views": 4194,
"upvotes": 13, "upvotes": 13,
"saves": 13, "saves": 13,
"comments": 0, "comments": 0,
@@ -155,17 +155,17 @@
"title": "GitHub Copilot Official SDK Pipe", "title": "GitHub Copilot Official SDK Pipe",
"slug": "github_copilot_official_sdk_pipe_ce96f7b4", "slug": "github_copilot_official_sdk_pipe_ce96f7b4",
"type": "pipe", "type": "pipe",
"version": "0.12.0", "version": "0.12.1",
"author": "Fu-Jie", "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.", "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": 465, "downloads": 465,
"views": 6718, "views": 6732,
"upvotes": 17, "upvotes": 17,
"saves": 12, "saves": 12,
"comments": 19, "comments": 19,
"is_published_plugin": true, "is_published_plugin": true,
"created_at": "2026-01-26", "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" "url": "https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4"
}, },
{ {
@@ -176,7 +176,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.", "description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
"downloads": 368, "downloads": 368,
"views": 5217, "views": 5224,
"upvotes": 13, "upvotes": 13,
"saves": 23, "saves": 23,
"comments": 2, "comments": 2,
@@ -226,8 +226,8 @@
"version": "1.1.0", "version": "1.1.0",
"author": "Fu-Jie", "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.", "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, "downloads": 188,
"views": 4118, "views": 4143,
"upvotes": 9, "upvotes": 9,
"saves": 8, "saves": 8,
"comments": 6, "comments": 6,
@@ -244,7 +244,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。", "description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 181, "downloads": 181,
"views": 3293, "views": 3300,
"upvotes": 14, "upvotes": 14,
"saves": 7, "saves": 7,
"comments": 4, "comments": 4,
@@ -278,7 +278,7 @@
"author": "Fu-Jie", "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.", "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, "downloads": 102,
"views": 2641, "views": 2649,
"upvotes": 5, "upvotes": 5,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -295,7 +295,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。", "description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 75, "downloads": 75,
"views": 1753, "views": 1756,
"upvotes": 10, "upvotes": 10,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -329,7 +329,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。", "description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
"downloads": 49, "downloads": 49,
"views": 965, "views": 966,
"upvotes": 7, "upvotes": 7,
"saves": 5, "saves": 5,
"comments": 0, "comments": 0,
@@ -363,7 +363,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。", "description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 37, "downloads": 37,
"views": 1031, "views": 1038,
"upvotes": 7, "upvotes": 7,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -380,7 +380,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 8, "downloads": 8,
"views": 419, "views": 433,
"upvotes": 1, "upvotes": 1,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -397,7 +397,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 427, "views": 442,
"upvotes": 1, "upvotes": 1,
"saves": 2, "saves": 2,
"comments": 0, "comments": 0,
@@ -482,7 +482,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 2160, "views": 2165,
"upvotes": 15, "upvotes": 15,
"saves": 27, "saves": 27,
"comments": 9, "comments": 9,
@@ -531,7 +531,7 @@
"name": "Fu-Jie", "name": "Fu-Jie",
"profile_url": "https://openwebui.com/u/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", "profile_image": "https://community.s3.openwebui.com/uploads/users/b15d1348-4347-42b4-b815-e053342d6cb0/profile_d9510745-4bd4-4f8f-a997-4a21847d9300.webp",
"followers": 425, "followers": 426,
"following": 9, "following": 9,
"total_points": 408, "total_points": 408,
"post_points": 337, "post_points": 337,

View File

@@ -1,18 +1,18 @@
{ {
"total_posts": 30, "total_posts": 30,
"total_downloads": 10862, "total_downloads": 10945,
"total_views": 117161, "total_views": 118210,
"total_upvotes": 350, "total_upvotes": 350,
"total_downvotes": 16, "total_downvotes": 16,
"total_saves": 468, "total_saves": 469,
"total_comments": 98, "total_comments": 98,
"plugin_contributions": 22, "plugin_contributions": 22,
"by_type": { "by_type": {
"tool": 3, "tool": 3,
"filter": 4,
"action": 12, "action": 12,
"prompt": 2, "prompt": 2,
"pipe": 1, "pipe": 1
"filter": 4
}, },
"posts": [ "posts": [
{ {
@@ -22,8 +22,8 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.", "description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 2054, "downloads": 2064,
"views": 18204, "views": 18332,
"upvotes": 35, "upvotes": 35,
"saves": 82, "saves": 82,
"comments": 23, "comments": 23,
@@ -39,10 +39,10 @@
"version": "1.6.1", "version": "1.6.1",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.", "description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
"downloads": 1528, "downloads": 1535,
"views": 15541, "views": 15655,
"upvotes": 30, "upvotes": 30,
"saves": 60, "saves": 61,
"comments": 12, "comments": 12,
"is_published_plugin": true, "is_published_plugin": true,
"created_at": "2025-12-28", "created_at": "2025-12-28",
@@ -56,8 +56,8 @@
"version": "1.2.8", "version": "1.2.8",
"author": "Fu-Jie", "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.", "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": 978, "downloads": 983,
"views": 10009, "views": 10060,
"upvotes": 27, "upvotes": 27,
"saves": 52, "saves": 52,
"comments": 6, "comments": 6,
@@ -70,17 +70,17 @@
"title": "Async Context Compression", "title": "Async Context Compression",
"slug": "async_context_compression_b1655bc8", "slug": "async_context_compression_b1655bc8",
"type": "filter", "type": "filter",
"version": "1.5.0", "version": "1.6.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.", "description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
"downloads": 952, "downloads": 964,
"views": 8693, "views": 8791,
"upvotes": 22, "upvotes": 22,
"saves": 57, "saves": 57,
"comments": 0, "comments": 0,
"is_published_plugin": true, "is_published_plugin": true,
"created_at": "2025-11-08", "created_at": "2025-11-08",
"updated_at": "2026-03-22", "updated_at": "2026-03-23",
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8" "url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
}, },
{ {
@@ -90,8 +90,8 @@
"version": "0.4.4", "version": "0.4.4",
"author": "Fu-Jie", "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.", "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": 935, "downloads": 940,
"views": 7345, "views": 7395,
"upvotes": 22, "upvotes": 22,
"saves": 41, "saves": 41,
"comments": 8, "comments": 8,
@@ -107,8 +107,8 @@
"version": "", "version": "",
"author": "", "author": "",
"description": "", "description": "",
"downloads": 867, "downloads": 874,
"views": 9569, "views": 9646,
"upvotes": 11, "upvotes": 11,
"saves": 28, "saves": 28,
"comments": 0, "comments": 0,
@@ -124,8 +124,8 @@
"version": "0.3.0", "version": "0.3.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.", "description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
"downloads": 689, "downloads": 698,
"views": 8285, "views": 8399,
"upvotes": 10, "upvotes": 10,
"saves": 31, "saves": 31,
"comments": 4, "comments": 4,
@@ -141,8 +141,8 @@
"version": "0.3.7", "version": "0.3.7",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.", "description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
"downloads": 680, "downloads": 685,
"views": 4151, "views": 4184,
"upvotes": 13, "upvotes": 13,
"saves": 13, "saves": 13,
"comments": 0, "comments": 0,
@@ -158,8 +158,8 @@
"version": "0.12.0", "version": "0.12.0",
"author": "Fu-Jie", "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.", "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": 462, "downloads": 465,
"views": 6682, "views": 6718,
"upvotes": 17, "upvotes": 17,
"saves": 12, "saves": 12,
"comments": 19, "comments": 19,
@@ -175,8 +175,8 @@
"version": "0.2.4", "version": "0.2.4",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.", "description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
"downloads": 366, "downloads": 368,
"views": 5193, "views": 5217,
"upvotes": 13, "upvotes": 13,
"saves": 23, "saves": 23,
"comments": 2, "comments": 2,
@@ -192,8 +192,8 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.", "description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.",
"downloads": 261, "downloads": 264,
"views": 2145, "views": 2166,
"upvotes": 7, "upvotes": 7,
"saves": 17, "saves": 17,
"comments": 0, "comments": 0,
@@ -209,8 +209,8 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.", "description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 216, "downloads": 224,
"views": 3341, "views": 3392,
"upvotes": 7, "upvotes": 7,
"saves": 10, "saves": 10,
"comments": 0, "comments": 0,
@@ -226,8 +226,8 @@
"version": "1.1.0", "version": "1.1.0",
"author": "Fu-Jie", "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.", "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": 183, "downloads": 187,
"views": 4066, "views": 4118,
"upvotes": 9, "upvotes": 9,
"saves": 8, "saves": 8,
"comments": 6, "comments": 6,
@@ -244,7 +244,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。", "description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 181, "downloads": 181,
"views": 3289, "views": 3293,
"upvotes": 14, "upvotes": 14,
"saves": 7, "saves": 7,
"comments": 4, "comments": 4,
@@ -261,7 +261,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.", "description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
"downloads": 143, "downloads": 143,
"views": 2394, "views": 2404,
"upvotes": 7, "upvotes": 7,
"saves": 15, "saves": 15,
"comments": 0, "comments": 0,
@@ -278,7 +278,7 @@
"author": "Fu-Jie", "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.", "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, "downloads": 102,
"views": 2638, "views": 2641,
"upvotes": 5, "upvotes": 5,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -295,7 +295,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。", "description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 75, "downloads": 75,
"views": 1747, "views": 1753,
"upvotes": 10, "upvotes": 10,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -312,7 +312,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。", "description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
"downloads": 60, "downloads": 60,
"views": 876, "views": 878,
"upvotes": 6, "upvotes": 6,
"saves": 2, "saves": 2,
"comments": 0, "comments": 0,
@@ -363,7 +363,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。", "description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 37, "downloads": 37,
"views": 1026, "views": 1031,
"upvotes": 7, "upvotes": 7,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -379,8 +379,8 @@
"version": "", "version": "",
"author": "", "author": "",
"description": "", "description": "",
"downloads": 5, "downloads": 8,
"views": 249, "views": 419,
"upvotes": 1, "upvotes": 1,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -397,9 +397,9 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 223, "views": 427,
"upvotes": 1, "upvotes": 1,
"saves": 0, "saves": 2,
"comments": 0, "comments": 0,
"is_published_plugin": false, "is_published_plugin": false,
"created_at": "2026-03-22", "created_at": "2026-03-22",
@@ -414,7 +414,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 3820, "views": 3828,
"upvotes": 8, "upvotes": 8,
"saves": 3, "saves": 3,
"comments": 2, "comments": 2,
@@ -448,7 +448,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 2915, "views": 2917,
"upvotes": 9, "upvotes": 9,
"saves": 4, "saves": 4,
"comments": 1, "comments": 1,
@@ -482,9 +482,9 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 2153, "views": 2160,
"upvotes": 15, "upvotes": 15,
"saves": 26, "saves": 27,
"comments": 9, "comments": 9,
"is_published_plugin": false, "is_published_plugin": false,
"created_at": "2026-01-25", "created_at": "2026-01-25",
@@ -516,7 +516,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 1638, "views": 1640,
"upvotes": 17, "upvotes": 17,
"saves": 14, "saves": 14,
"comments": 2, "comments": 2,
@@ -531,7 +531,7 @@
"name": "Fu-Jie", "name": "Fu-Jie",
"profile_url": "https://openwebui.com/u/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", "profile_image": "https://community.s3.openwebui.com/uploads/users/b15d1348-4347-42b4-b815-e053342d6cb0/profile_d9510745-4bd4-4f8f-a997-4a21847d9300.webp",
"followers": 422, "followers": 425,
"following": 9, "following": 9,
"total_points": 408, "total_points": 408,
"post_points": 337, "post_points": 337,

View File

@@ -8,7 +8,7 @@
> *Blue: Downloads | Purple: Views (Real-time dynamic)* > *Blue: Downloads | Purple: Views (Real-time dynamic)*
### 📂 Content Distribution ### 📂 Content Distribution
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINy0zpyS1CCRgAhFITAYrBgoYGkFECorycwtKQCIwgcyCVLACAFo_IFA=) ![Distribution](https://kroki.io/mermaid/svg/eNoti7ENgDAMBHumsLIBgYqaAShYAJBBlkxsJaZgezDhuzv9KSEYGSOEia-DEsy3YoGRimVaLyNJoYF3wUQ4wABdRSVFx7biTmyYXfRVLNvX-iP-RZZTzU18AEYCIFA=)
## 📈 Overview ## 📈 Overview
@@ -27,10 +27,10 @@
## 📂 By Type ## 📂 By Type
- ![tool](https://img.shields.io/badge/tool-3-teal) - ![tool](https://img.shields.io/badge/tool-3-teal)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen) - ![filter](https://img.shields.io/badge/filter-4-brightgreen)
- ![action](https://img.shields.io/badge/action-12-orange) - ![action](https://img.shields.io/badge/action-12-orange)
- ![prompt](https://img.shields.io/badge/prompt-2-lightgrey) - ![prompt](https://img.shields.io/badge/prompt-2-lightgrey)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
## 📋 Posts List ## 📋 Posts List
@@ -44,7 +44,7 @@
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 | | 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 |
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 | | 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 |
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 | | 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-22 | | 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.1-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-23 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 | | 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 |
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 2026-01-08 | | 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 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 | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 | | 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |

View File

@@ -8,7 +8,7 @@
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)* > *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
### 📂 内容分类占比 (Distribution) ### 📂 内容分类占比 (Distribution)
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINy0zpyS1CCRgAhFITAYrBgoYGkFECorycwtKQCIwgcyCVLACAFo_IFA=) ![Distribution](https://kroki.io/mermaid/svg/eNoti7ENgDAMBHumsLIBgYqaAShYAJBBlkxsJaZgezDhuzv9KSEYGSOEia-DEsy3YoGRimVaLyNJoYF3wUQ4wABdRSVFx7biTmyYXfRVLNvX-iP-RZZTzU18AEYCIFA=)
## 📈 总览 ## 📈 总览
@@ -27,10 +27,10 @@
## 📂 按类型分类 ## 📂 按类型分类
- ![tool](https://img.shields.io/badge/tool-3-teal) - ![tool](https://img.shields.io/badge/tool-3-teal)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen) - ![filter](https://img.shields.io/badge/filter-4-brightgreen)
- ![action](https://img.shields.io/badge/action-12-orange) - ![action](https://img.shields.io/badge/action-12-orange)
- ![prompt](https://img.shields.io/badge/prompt-2-lightgrey) - ![prompt](https://img.shields.io/badge/prompt-2-lightgrey)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
## 📋 发布列表 ## 📋 发布列表
@@ -44,7 +44,7 @@
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 | | 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 |
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 | | 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 |
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 | | 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-22 | | 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.1-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-23 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 | | 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 |
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 2026-01-08 | | 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 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 | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 | | 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |

View File

@@ -5,5 +5,5 @@ OpenWebUI native Tool plugins that can be used across models.
## Available Tool Plugins ## 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. - [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. - [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.

View File

@@ -5,5 +5,5 @@
## 可用 Tool 插件 ## 可用 Tool 插件
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.zh.md) (v1.1.0) - 一键从 GitHub 仓库批量安装插件,支持交互式选择对话框和多语言。 - [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) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。 - [智能思维导图工具 (Smart Mind Map Tool)](smart-mind-map-tool.zh.md) (v1.0.0) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。

View File

@@ -1,13 +1,13 @@
# OpenWebUI Skills Manager Tool # 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. A standalone OpenWebUI Tool plugin for managing native Workspace Skills across models.
## What's New ## 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. - `install_skill` now supports multi-line `description: >` / `description: |` frontmatter blocks when importing remote `SKILL.md` files.
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback. - Added metadata fallback to use `title` when `name` is missing, plus regression tests for CRLF and YAML block scalars.
## Key Features ## Key Features

View File

@@ -1,13 +1,13 @@
# OpenWebUI Skills 管理工具 # 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。 一个可跨模型使用的 OpenWebUI 原生 Tool 插件,用于管理 Workspace Skills。
## 最新更新 ## 最新更新
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能 - `install_skill` 现已支持远程 `SKILL.md` 中的多行 `description: >` / `description: |` frontmatter 描述
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料 - 新增 `title` 作为 `name` 缺失时的元数据回退,并补齐 CRLF 与 YAML 块标量回归测试
## 核心特性 ## 核心特性

View File

@@ -1,6 +1,6 @@
# 🧰 OpenWebUI Skills Manager Tool # 🧰 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) |
| :--- | ---: | | :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) | | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -23,10 +23,9 @@ When the selection dialog opens, search for this plugin, check it, and continue.
## What's New ## 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. - **📝 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.
- **🔄 Batch Deduplication**: Automatically removes duplicate URLs from batch installations and detects duplicate skill names. - **↩️ Better Metadata Fallbacks**: If a skill frontmatter provides `title` without `name`, the installer now uses that title before falling back to directory-based names.
- Added GitHub skills-directory auto-discovery for `install_skill` (e.g., `.../tree/main/skills`) to install all child skills in one request. - **🧪 Regression Coverage**: Added focused tests for folded/literal YAML blocks and CRLF line endings to keep external skill imports stable.
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback.
> [!TIP] > [!TIP]
> **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?** > **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?**

View File

@@ -1,6 +1,6 @@
# 🧰 OpenWebUI Skills 管理工具 # 🧰 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) |
| :--- | ---: | | :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) | | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -23,10 +23,9 @@
## 最新更新 ## 最新更新
- **🤖 自动发现仓库根目录**:现在可以直接提供 GitHub 仓库根 URL`https://github.com/owner/repo`),系统会自动转换为发现模式并安装所有 skill - **📝 支持多行 Frontmatter 描述**`install_skill` 现在可以正确解析远程 `SKILL.md` 里的 `description: >``description: |`,导入后的技能描述不再被截断成单行
- **🔄 批量去重**:自动清除重复 URL检测重复的 skill 名称 - **↩️ 更稳的元数据回退**:当 frontmatter 只有 `title` 没有 `name` 时,安装器会优先使用 `title`,避免退回到通用目录名
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能 - **🧪 回归测试补齐**:新增 folded/literal YAML 块和 CRLF 换行场景测试,保证外部技能导入行为稳定
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料。
> [!TIP] > [!TIP]
> **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)** > **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)**

View File

@@ -44,7 +44,7 @@ METADATA_KEY_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_-]*$")
TRANSLATIONS = { TRANSLATIONS = {
"en-US": { "en-US": {
"status_fetching": "Fetching plugin list from GitHub...", "status_fetching": "Discovering plugins from {repo}...",
"status_installing": "Installing [{type}] {title}...", "status_installing": "Installing [{type}] {title}...",
"status_done": "Installation complete: {success}/{total} plugins installed.", "status_done": "Installation complete: {success}/{total} plugins installed.",
"status_list_title": "Available Plugins ({count} total)", "status_list_title": "Available Plugins ({count} total)",
@@ -67,7 +67,7 @@ TRANSLATIONS = {
"err_no_match": "No plugins match the specified types.", "err_no_match": "No plugins match the specified types.",
}, },
"zh-CN": { "zh-CN": {
"status_fetching": "正在从 GitHub 获取插件列表...", "status_fetching": "正在从 {repo} 发现插件...",
"status_installing": "正在安装 [{type}] {title}...", "status_installing": "正在安装 [{type}] {title}...",
"status_done": "安装完成:成功安装 {success}/{total} 个插件。", "status_done": "安装完成:成功安装 {success}/{total} 个插件。",
"status_list_title": "可用插件(共 {count} 个)", "status_list_title": "可用插件(共 {count} 个)",
@@ -90,7 +90,7 @@ TRANSLATIONS = {
"err_no_match": "没有符合指定类型的插件。", "err_no_match": "没有符合指定类型的插件。",
}, },
"zh-HK": { "zh-HK": {
"status_fetching": "正在從 GitHub 取得外掛列表...", "status_fetching": "正在從 {repo} 發現外掛...",
"status_installing": "正在安裝 [{type}] {title}...", "status_installing": "正在安裝 [{type}] {title}...",
"status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。", "status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。",
"status_list_title": "可用外掛(共 {count} 個)", "status_list_title": "可用外掛(共 {count} 個)",
@@ -113,7 +113,7 @@ TRANSLATIONS = {
"err_no_match": "沒有符合指定類型的外掛。", "err_no_match": "沒有符合指定類型的外掛。",
}, },
"zh-TW": { "zh-TW": {
"status_fetching": "正在從 GitHub 取得外掛列表...", "status_fetching": "正在從 {repo} 發現外掛...",
"status_installing": "正在安裝 [{type}] {title}...", "status_installing": "正在安裝 [{type}] {title}...",
"status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。", "status_done": "安裝完成:成功安裝 {success}/{total} 個外掛。",
"status_list_title": "可用外掛(共 {count} 個)", "status_list_title": "可用外掛(共 {count} 個)",
@@ -136,7 +136,7 @@ TRANSLATIONS = {
"err_no_match": "沒有符合指定類型的外掛。", "err_no_match": "沒有符合指定類型的外掛。",
}, },
"ko-KR": { "ko-KR": {
"status_fetching": "GitHub에서 플러그인 목록을 가져오는 중...", "status_fetching": "{repo}에서 플러그인 검색 중...",
"status_installing": "[{type}] {title} 설치 중...", "status_installing": "[{type}] {title} 설치 중...",
"status_done": "설치 완료: {success}/{total}개 플러그인 설치됨.", "status_done": "설치 완료: {success}/{total}개 플러그인 설치됨.",
"status_list_title": "사용 가능한 플러그인 (총 {count}개)", "status_list_title": "사용 가능한 플러그인 (총 {count}개)",
@@ -159,7 +159,7 @@ TRANSLATIONS = {
"err_no_match": "지정된 유형과 일치하는 플러그인이 없습니다.", "err_no_match": "지정된 유형과 일치하는 플러그인이 없습니다.",
}, },
"ja-JP": { "ja-JP": {
"status_fetching": "GitHubからプラグインリストを取得中...", "status_fetching": "{repo}からプラグインを検索中...",
"status_installing": "[{type}] {title} をインストール中...", "status_installing": "[{type}] {title} をインストール中...",
"status_done": "インストール完了: {success}/{total}個のプラグインがインストールされました。", "status_done": "インストール完了: {success}/{total}個のプラグインがインストールされました。",
"status_list_title": "利用可能なプラグイン (合計{count}個)", "status_list_title": "利用可能なプラグイン (合計{count}個)",
@@ -182,7 +182,7 @@ TRANSLATIONS = {
"err_no_match": "指定されたタイプのプラグインがありません。", "err_no_match": "指定されたタイプのプラグインがありません。",
}, },
"fr-FR": { "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_installing": "Installation de [{type}] {title}...",
"status_done": "Installation terminée: {success}/{total} plugins installés.", "status_done": "Installation terminée: {success}/{total} plugins installés.",
"status_list_title": "Plugins disponibles ({count} au total)", "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.", "err_no_match": "Aucun plugin ne correspond aux types spécifiés.",
}, },
"de-DE": { "de-DE": {
"status_fetching": "Plugin-Liste wird von GitHub abgerufen...", "status_fetching": "Plugins werden in {repo} gesucht...",
"status_installing": "[{type}] {title} wird installiert...", "status_installing": "[{type}] {title} wird installiert...",
"status_done": "Installation abgeschlossen: {success}/{total} Plugins installiert.", "status_done": "Installation abgeschlossen: {success}/{total} Plugins installiert.",
"status_list_title": "Verfügbare Plugins (insgesamt {count})", "status_list_title": "Verfügbare Plugins (insgesamt {count})",
@@ -228,7 +228,7 @@ TRANSLATIONS = {
"err_no_match": "Keine Plugins entsprechen den angegebenen Typen.", "err_no_match": "Keine Plugins entsprechen den angegebenen Typen.",
}, },
"es-ES": { "es-ES": {
"status_fetching": "Obteniendo lista de plugins de GitHub...", "status_fetching": "Buscando plugins en {repo}...",
"status_installing": "Instalando [{type}] {title}...", "status_installing": "Instalando [{type}] {title}...",
"status_done": "Instalación completada: {success}/{total} plugins instalados.", "status_done": "Instalación completada: {success}/{total} plugins instalados.",
"status_list_title": "Plugins disponibles ({count} en total)", "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.", "err_no_match": "No hay plugins que coincidan con los tipos especificados.",
}, },
"it-IT": { "it-IT": {
"status_fetching": "Recupero lista plugin da GitHub...", "status_fetching": "Ricerca plugin in {repo}...",
"status_installing": "Installazione di [{type}] {title}...", "status_installing": "Installazione di [{type}] {title}...",
"status_done": "Installazione completata: {success}/{total} plugin installati.", "status_done": "Installazione completata: {success}/{total} plugin installati.",
"status_list_title": "Plugin disponibili ({count} totali)", "status_list_title": "Plugin disponibili ({count} totali)",
@@ -274,7 +274,7 @@ TRANSLATIONS = {
"err_no_match": "Nessun plugin corrisponde ai tipi specificati.", "err_no_match": "Nessun plugin corrisponde ai tipi specificati.",
}, },
"vi-VN": { "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_installing": "Đang cài đặt [{type}] {title}...",
"status_done": "Cài đặt hoàn tất: {success}/{total} plugin đã được cài đặt.", "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)", "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)) 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: if exclude_list:
filtered = [ filtered = [
c c
@@ -1458,6 +1458,19 @@ async def discover_plugins(
skip_keywords: str = "test", skip_keywords: str = "test",
source_repo: str = "", source_repo: str = "",
) -> Tuple[List[PluginCandidate], List[Tuple[str, 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) parsed = parse_github_url(url)
if not parsed: if not parsed:
return [], [("url", "invalid github url")] return [], [("url", "invalid github url")]
@@ -1539,6 +1552,15 @@ async def discover_plugins_from_repos(
repos: List[str], repos: List[str],
skip_keywords: str = "test", skip_keywords: str = "test",
) -> Tuple[List[PluginCandidate], List[Tuple[str, str]]]: ) -> 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 = [ tasks = [
discover_plugins(f"https://github.com/{repo}", skip_keywords, source_repo=repo) discover_plugins(f"https://github.com/{repo}", skip_keywords, source_repo=repo)
for repo in repos for repo in repos
@@ -1604,10 +1626,18 @@ class Tools:
repo: str = DEFAULT_REPO, repo: str = DEFAULT_REPO,
plugin_types: List[str] = ["pipe", "action", "filter", "tool"], plugin_types: List[str] = ["pipe", "action", "filter", "tool"],
) -> str: ) -> 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 Use this to preview what plugins are available before installation.
`repo` argument instead of calling this tool multiple times. 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__) user_ctx = await _get_user_context(__user__, __event_call__, __request__)
lang = user_ctx.get("user_language", "en-US") lang = user_ctx.get("user_language", "en-US")
@@ -1650,11 +1680,25 @@ class Tools:
exclude_keywords: str = "", exclude_keywords: str = "",
timeout: int = DEFAULT_TIMEOUT, timeout: int = DEFAULT_TIMEOUT,
) -> str: ) -> 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 Always fetches all available plugins regardless of user input, then
`repo` argument and call this tool once instead of making parallel presents a selection dialog for the user to choose which to install.
calls for each repository.
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__) user_ctx = await _get_user_context(__user__, __event_call__, __request__)
lang = user_ctx.get("user_language", "en-US") lang = user_ctx.get("user_language", "en-US")
@@ -1705,9 +1749,10 @@ class Tools:
base_url = base_url.rstrip("/") base_url = base_url.rstrip("/")
await _emit_status(event_emitter, _t(lang, "status_fetching"), done=False)
repo_list = _parse_repo_inputs(repo) 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) candidates, _ = await discover_plugins_from_repos(repo_list, skip_keywords)
if not candidates: if not candidates:

View File

@@ -1,6 +1,6 @@
# 🧰 OpenWebUI Skills Manager Tool # 🧰 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) |
| :--- | ---: | | :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) | | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -23,10 +23,9 @@ When the selection dialog opens, search for this plugin, check it, and continue.
## What's New ## 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. - **📝 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.
- **🔄 Batch Deduplication**: Automatically removes duplicate URLs from batch installations and detects duplicate skill names. - **↩️ Better Metadata Fallbacks**: If a skill frontmatter provides `title` without `name`, the installer now uses that title before falling back to directory-based names.
- Added GitHub skills-directory auto-discovery for `install_skill` (e.g., `.../tree/main/skills`) to install all child skills in one request. - **🧪 Regression Coverage**: Added focused tests for folded/literal YAML blocks and CRLF line endings to keep external skill imports stable.
- Fixed language detection with robust frontend-first fallback (`__event_call__` + timeout), request header fallback, and profile fallback.
> [!TIP] > [!TIP]
> **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?** > **💡 Looking to batch install global plugins (Actions, Filters, Pipes, Tools)?**

View File

@@ -1,6 +1,6 @@
# 🧰 OpenWebUI Skills 管理工具 # 🧰 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) |
| :--- | ---: | | :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) | | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -23,10 +23,9 @@
## 最新更新 ## 最新更新
- **🤖 自动发现仓库根目录**:现在可以直接提供 GitHub 仓库根 URL`https://github.com/owner/repo`),系统会自动转换为发现模式并安装所有 skill - **📝 支持多行 Frontmatter 描述**`install_skill` 现在可以正确解析远程 `SKILL.md` 里的 `description: >``description: |`,导入后的技能描述不再被截断成单行
- **🔄 批量去重**:自动清除重复 URL检测重复的 skill 名称 - **↩️ 更稳的元数据回退**:当 frontmatter 只有 `title` 没有 `name` 时,安装器会优先使用 `title`,避免退回到通用目录名
- `install_skill` 新增 GitHub 技能目录自动发现(例如 `.../tree/main/skills`),可一键安装目录下所有子技能 - **🧪 回归测试补齐**:新增 folded/literal YAML 块和 CRLF 换行场景测试,保证外部技能导入行为稳定
- 修复语言获取逻辑:前端优先(`__event_call__` + 超时保护),并回退到请求头与用户资料。
> [!TIP] > [!TIP]
> **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)** > **💡 想要批量安装/管理全局插件 (Actions, Filters, Pipes, Tools)**

View File

@@ -3,7 +3,7 @@ title: OpenWebUI Skills Manager Tool
author: Fu-Jie author: Fu-Jie
author_url: https://github.com/Fu-Jie/openwebui-extensions author_url: https://github.com/Fu-Jie/openwebui-extensions
funding_url: https://github.com/open-webui funding_url: https://github.com/open-webui
version: 0.3.0 version: 0.3.1
openwebui_id: b4bce8e4-08e7-4f90-bea7-dc31d463a0bb openwebui_id: b4bce8e4-08e7-4f90-bea7-dc31d463a0bb
requirements: requirements:
description: Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model. 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]: def _parse_skill_md_meta(content: str, fallback_name: str) -> Tuple[str, str, str]:
"""Parse markdown skill content into (name, description, body).""" """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: if fm_match:
fm_text = fm_match.group(1) fm_text = fm_match.group(1)
body = content[fm_match.end() :].strip() body = normalized_content[fm_match.end() :].strip()
name = fallback_name metadata = _parse_frontmatter_scalars(fm_text)
description = "" name = (
for line in fm_text.split("\n"): metadata.get("name")
m_name = re.match(r"^name:\s*(.+)$", line) or metadata.get("title")
if m_name: or fallback_name
name = m_name.group(1).strip().strip("\"'") ).strip()
m_desc = re.match(r"^description:\s*(.+)$", line) description = (metadata.get("description") or "").strip()
if m_desc:
description = m_desc.group(1).strip().strip("\"'")
return name, description, body 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 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: def _append_source_url_to_content(content: str, url: str, lang: str = "en-US") -> str:

View 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.

View 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 镜像页,确保最新发布文案与元数据兼容行为保持一致。

View 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."