From a63d3e89fff43f46ebb5be97a102d1782f2053f7 Mon Sep 17 00:00:00 2001 From: fujie Date: Wed, 11 Feb 2026 11:41:12 +0800 Subject: [PATCH] feat: implement stats history, growth tracking, and mermaid trend charts --- README.md | 18 +-- README_CN.md | 18 +-- docs/community-stats.json | 66 +++++------ docs/community-stats.md | 75 +++++++----- docs/community-stats.zh.md | 75 +++++++----- docs/stats-history.json | 29 +++++ scripts/openwebui_stats.py | 226 +++++++++++++++++++++++++++++++++---- 7 files changed, 378 insertions(+), 129 deletions(-) create mode 100644 docs/stats-history.json diff --git a/README.md b/README.md index 3854a45..f47e412 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A collection of enhancements, plugins, and prompts for [OpenWebUI](https://githu ## 📊 Community Stats -> 🕐 Auto-updated: 2026-02-11 11:11 +> 🕐 Auto-updated: 2026-02-11 11:40 | 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions | | :---: | :---: | :---: | :---: | @@ -16,20 +16,20 @@ A collection of enhancements, plugins, and prompts for [OpenWebUI](https://githu | 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves | | :---: | :---: | :---: | :---: | :---: | -| **22** | **4154** | **49223** | **231** | **274** | +| **22** | **4154** | **45888** | **231** | **274** | ### 🔥 Top 6 Popular Plugins -> 🕐 Auto-updated: 2026-02-11 11:11 +> 🕐 Auto-updated: 2026-02-11 11:40 | Rank | Plugin | Version | Downloads | Views | Updated | | :---: | :--- | :---: | :---: | :---: | :---: | -| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.2 | 953 | 8381 | 2026-01-28 | -| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.5.0 | 706 | 6695 | 2026-01-30 | -| 🥉 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.4 | 383 | 3022 | 2026-02-07 | -| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.2 | 363 | 3750 | 2026-01-28 | -| 5️⃣ | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 342 | 1670 | 2026-02-09 | -| 6️⃣ | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | 1.2.4 | 341 | 4706 | 2026-01-29 | +| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.2 | 953 | 8381 | 2026-01-29 | +| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.5.0 | 706 | 6698 | 2026-01-31 | +| 🥉 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.4 | 383 | 3026 | 2026-02-07 | +| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.2 | 363 | 3754 | 2026-01-29 | +| 5️⃣ | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 342 | 1670 | 2026-02-10 | +| 6️⃣ | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | 1.2.4 | 341 | 4710 | 2026-01-29 | *See full stats in [Community Stats Report](./docs/community-stats.md)* diff --git a/README_CN.md b/README_CN.md index 1472d9e..1d17710 100644 --- a/README_CN.md +++ b/README_CN.md @@ -7,7 +7,7 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词 ## 📊 社区统计 -> 🕐 自动更新于 2026-02-11 11:11 +> 🕐 自动更新于 2026-02-11 11:40 | 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 | | :---: | :---: | :---: | :---: | @@ -15,20 +15,20 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词 | 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 | | :---: | :---: | :---: | :---: | :---: | -| **22** | **4154** | **49223** | **231** | **274** | +| **22** | **4154** | **45888** | **231** | **274** | ### 🔥 热门插件 Top 6 -> 🕐 自动更新于 2026-02-11 11:11 +> 🕐 自动更新于 2026-02-11 11:40 | 排名 | 插件 | 版本 | 下载 | 浏览 | 更新日期 | | :---: | :--- | :---: | :---: | :---: | :---: | -| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.2 | 953 | 8381 | 2026-01-28 | -| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.5.0 | 706 | 6695 | 2026-01-30 | -| 🥉 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.4 | 383 | 3022 | 2026-02-07 | -| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.2 | 363 | 3750 | 2026-01-28 | -| 5️⃣ | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 342 | 1670 | 2026-02-09 | -| 6️⃣ | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | 1.2.4 | 341 | 4706 | 2026-01-29 | +| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.2 | 953 | 8381 | 2026-01-29 | +| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.5.0 | 706 | 6698 | 2026-01-31 | +| 🥉 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.4 | 383 | 3026 | 2026-02-07 | +| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.2 | 363 | 3754 | 2026-01-29 | +| 5️⃣ | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 342 | 1670 | 2026-02-10 | +| 6️⃣ | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | 1.2.4 | 341 | 4710 | 2026-01-29 | *完整统计请查看 [社区统计报告](./docs/community-stats.zh.md)* diff --git a/docs/community-stats.json b/docs/community-stats.json index 93e0303..2a9cbac 100644 --- a/docs/community-stats.json +++ b/docs/community-stats.json @@ -1,16 +1,18 @@ { "total_posts": 22, "total_downloads": 4154, - "total_views": 49223, + "total_views": 45888, "total_upvotes": 231, "total_downvotes": 2, "total_saves": 274, "total_comments": 55, "by_type": { - "unknown": 5, - "filter": 2, + "post": 3, + "filter": 4, "pipe": 1, - "action": 14 + "action": 12, + "prompt": 1, + "review": 1 }, "posts": [ { @@ -25,8 +27,8 @@ "upvotes": 22, "saves": 50, "comments": 13, - "created_at": "2025-12-30", - "updated_at": "2026-01-28", + "created_at": "2025-12-31", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a" }, { @@ -37,12 +39,12 @@ "author": "Fu-Jie", "description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.", "downloads": 706, - "views": 6695, + "views": 6698, "upvotes": 24, "saves": 34, "comments": 10, "created_at": "2025-12-28", - "updated_at": "2026-01-30", + "updated_at": "2026-01-31", "url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f" }, { @@ -53,7 +55,7 @@ "author": "Fu-Jie", "description": "Export current conversation from Markdown to Word (.docx) with Mermaid diagrams rendered client-side (Mermaid.js, SVG+PNG), LaTeX math, real hyperlinks, improved tables, syntax highlighting, and blockquote support.", "downloads": 383, - "views": 3022, + "views": 3026, "upvotes": 14, "saves": 26, "comments": 5, @@ -64,17 +66,17 @@ { "title": "Async Context Compression", "slug": "async_context_compression_b1655bc8", - "type": "action", + "type": "filter", "version": "1.2.2", "author": "Fu-Jie", "description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.", "downloads": 363, - "views": 3750, + "views": 3754, "upvotes": 14, "saves": 34, "comments": 0, "created_at": "2025-11-08", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/async_context_compression_b1655bc8" }, { @@ -90,18 +92,18 @@ "saves": 6, "comments": 0, "created_at": "2025-05-30", - "updated_at": "2026-02-09", + "updated_at": "2026-02-10", "url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d" }, { "title": "Markdown Normalizer", "slug": "markdown_normalizer_baaa8732", - "type": "action", + "type": "filter", "version": "1.2.4", "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.", "downloads": 341, - "views": 4706, + "views": 4710, "upvotes": 17, "saves": 30, "comments": 5, @@ -117,18 +119,18 @@ "author": "Fu-Jie", "description": "Quickly generates beautiful flashcards from text, extracting key points and categories.", "downloads": 226, - "views": 3385, + "views": 3387, "upvotes": 13, "saves": 14, "comments": 2, "created_at": "2025-12-30", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/flash_card_65a2ea8f" }, { "title": "AI Task Instruction Generator", "slug": "ai_task_instruction_generator_9bab8b37", - "type": "unknown", + "type": "prompt", "version": "", "author": "", "description": "", @@ -165,7 +167,7 @@ "author": "Fu-Jie", "description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。", "downloads": 128, - "views": 2218, + "views": 2219, "upvotes": 13, "saves": 7, "comments": 4, @@ -181,7 +183,7 @@ "author": "Fu-Jie", "description": "Integrate GitHub Copilot SDK. Supports dynamic models, multi-turn conversation, streaming, multimodal input, infinite sessions, and frontend debug logging.", "downloads": 107, - "views": 2401, + "views": 2402, "upvotes": 14, "saves": 9, "comments": 6, @@ -234,7 +236,7 @@ "saves": 2, "comments": 0, "created_at": "2025-12-31", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b" }, { @@ -250,7 +252,7 @@ "saves": 5, "comments": 0, "created_at": "2025-11-08", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/异步上下文压缩_5c0617cb" }, { @@ -266,7 +268,7 @@ "saves": 1, "comments": 0, "created_at": "2025-12-30", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3" }, { @@ -293,7 +295,7 @@ "author": "Fu-Jie", "description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.", "downloads": 16, - "views": 840, + "views": 847, "upvotes": 3, "saves": 0, "comments": 0, @@ -304,12 +306,12 @@ { "title": "🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks", "slug": "github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293", - "type": "unknown", + "type": "post", "version": "", "author": "", "description": "", "downloads": 0, - "views": 261, + "views": 268, "upvotes": 5, "saves": 0, "comments": 0, @@ -320,28 +322,28 @@ { "title": "🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager", "slug": "open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e", - "type": "unknown", + "type": "post", "version": "", "author": "", "description": "", "downloads": 0, - "views": 1522, + "views": 1523, "upvotes": 12, "saves": 19, "comments": 8, "created_at": "2026-01-25", - "updated_at": "2026-01-28", + "updated_at": "2026-01-29", "url": "https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e" }, { "title": "Review of Claude Haiku 4.5", "slug": "review_of_claude_haiku_45_41b0db39", - "type": "unknown", + "type": "review", "version": "", "author": "", "description": "", "downloads": 0, - "views": 157, + "views": 159, "upvotes": 2, "saves": 0, "comments": 0, @@ -352,7 +354,7 @@ { "title": " 🛠️ Debug Open WebUI Plugins in Your Browser", "slug": "debug_open_webui_plugins_in_your_browser_81bf7960", - "type": "unknown", + "type": "post", "version": "", "author": "", "description": "", diff --git a/docs/community-stats.md b/docs/community-stats.md index 1b8ca59..a366830 100644 --- a/docs/community-stats.md +++ b/docs/community-stats.md @@ -1,48 +1,63 @@ # 📊 OpenWebUI Community Stats Report -> 📅 Updated: 2026-02-11 11:11 +> 📅 Updated: 2026-02-11 11:40 + +### 📈 增长趋势 (14天) + +```mermaid +xychart-beta + title "Downloads Trend" + x-axis ["02-09", "02-10", "02-11"] + y-axis "Downloads" + line [3800, 4000, 4154] +``` + ## 📈 Overview -| Metric | Value | -|------|------| -| 📝 Total Posts | 22 | -| ⬇️ Total Downloads | 4154 | -| 👁️ Total Views | 49223 | -| 👍 Total Upvotes | 231 | -| 💾 Total Saves | 274 | -| 💬 Total Comments | 55 | +| Metric | Value | Growth (24h) | +|------|------|:---:| +| 📝 Total Posts | 22 | - | +| ⬇️ Total Downloads | 4154 | **+154** 🚀 | +| 👁️ Total Views | 45888 | **+1888** 🚀 | +| 👍 Total Upvotes | 231 | **+11** 🚀 | +| 💾 Total Saves | 274 | - | +| 💬 Total Comments | 55 | - | +| ⭐ Author Points | 271 | - | +| 👥 Followers | 220 | **+2** 🚀 | ## 📂 By Type -- **unknown**: 5 -- **filter**: 2 +- **post**: 3 +- **filter**: 4 - **pipe**: 1 -- **action**: 14 +- **action**: 12 +- **prompt**: 1 +- **review**: 1 ## 📋 Posts List | Rank | Title | Type | Version | Downloads | Views | Upvotes | Saves | Updated | |:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.2 | 953 | 8381 | 22 | 50 | 2026-01-28 | -| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.5.0 | 706 | 6695 | 24 | 34 | 2026-01-30 | -| 3 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.4 | 383 | 3022 | 14 | 26 | 2026-02-07 | -| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.2 | 363 | 3750 | 14 | 34 | 2026-01-28 | -| 5 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 342 | 1670 | 7 | 6 | 2026-02-09 | -| 6 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 341 | 4706 | 17 | 30 | 2026-01-29 | -| 7 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 226 | 3385 | 13 | 14 | 2026-01-28 | -| 8 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | unknown | | 200 | 2774 | 9 | 6 | 2026-01-28 | +| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.2 | 953 | 8381 | 22 | 50 | 2026-01-29 | +| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.5.0 | 706 | 6698 | 24 | 34 | 2026-01-31 | +| 3 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.4 | 383 | 3026 | 14 | 26 | 2026-02-07 | +| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | 1.2.2 | 363 | 3754 | 14 | 34 | 2026-01-29 | +| 5 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 342 | 1670 | 7 | 6 | 2026-02-10 | +| 6 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | 1.2.4 | 341 | 4710 | 17 | 30 | 2026-01-29 | +| 7 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 226 | 3387 | 13 | 14 | 2026-01-29 | +| 8 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | | 200 | 2774 | 9 | 6 | 2026-01-28 | | 9 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 147 | 1250 | 6 | 11 | 2026-01-08 | -| 10 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.4 | 128 | 2218 | 13 | 7 | 2026-02-07 | -| 11 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | 0.6.2 | 107 | 2401 | 14 | 9 | 2026-02-10 | +| 10 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.4 | 128 | 2219 | 13 | 7 | 2026-02-07 | +| 11 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | 0.6.2 | 107 | 2402 | 14 | 9 | 2026-02-10 | | 12 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | 0.1.0 | 61 | 1316 | 6 | 8 | 2026-01-20 | | 13 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.5.0 | 58 | 1065 | 10 | 1 | 2026-01-29 | -| 14 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.2 | 39 | 589 | 6 | 2 | 2026-01-28 | -| 15 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.2 | 33 | 668 | 7 | 5 | 2026-01-28 | -| 16 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 27 | 690 | 8 | 1 | 2026-01-28 | +| 14 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.2 | 39 | 589 | 6 | 2 | 2026-01-29 | +| 15 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.2 | 33 | 668 | 7 | 5 | 2026-01-29 | +| 16 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 27 | 690 | 8 | 1 | 2026-01-29 | | 17 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 24 | 442 | 5 | 1 | 2026-01-08 | -| 18 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | 0.1.2 | 16 | 840 | 3 | 0 | 2026-02-10 | -| 19 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | unknown | | 0 | 261 | 5 | 0 | 2026-02-10 | -| 20 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | unknown | | 0 | 1522 | 12 | 19 | 2026-01-28 | -| 21 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 157 | 2 | 0 | 2026-01-14 | -| 22 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1421 | 14 | 10 | 2026-01-10 | +| 18 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | 0.1.2 | 16 | 847 | 3 | 0 | 2026-02-10 | +| 19 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | post | | 0 | 268 | 5 | 0 | 2026-02-10 | +| 20 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | post | | 0 | 1523 | 12 | 19 | 2026-01-29 | +| 21 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | | 0 | 159 | 2 | 0 | 2026-01-14 | +| 22 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | post | | 0 | 1421 | 14 | 10 | 2026-01-10 | diff --git a/docs/community-stats.zh.md b/docs/community-stats.zh.md index 17b875b..74f56ad 100644 --- a/docs/community-stats.zh.md +++ b/docs/community-stats.zh.md @@ -1,48 +1,63 @@ # 📊 OpenWebUI 社区统计报告 -> 📅 更新时间: 2026-02-11 11:11 +> 📅 更新时间: 2026-02-11 11:40 + +### 📈 增长趋势 (14天) + +```mermaid +xychart-beta + title "Downloads Trend" + x-axis ["02-09", "02-10", "02-11"] + y-axis "Downloads" + line [3800, 4000, 4154] +``` + ## 📈 总览 -| 指标 | 数值 | -|------|------| -| 📝 发布数量 | 22 | -| ⬇️ 总下载量 | 4154 | -| 👁️ 总浏览量 | 49223 | -| 👍 总点赞数 | 231 | -| 💾 总收藏数 | 274 | -| 💬 总评论数 | 55 | +| 指标 | 数值 | 增长 (24h) | +|------|------|:---:| +| 📝 发布数量 | 22 | - | +| ⬇️ 总下载量 | 4154 | **+154** 🚀 | +| 👁️ 总浏览量 | 45888 | **+1888** 🚀 | +| 👍 总点赞数 | 231 | **+11** 🚀 | +| 💾 总收藏数 | 274 | - | +| 💬 总评论数 | 55 | - | +| ⭐ 作者总积分 | 271 | - | +| 👥 粉丝数量 | 220 | **+2** 🚀 | ## 📂 按类型分类 -- **unknown**: 5 -- **filter**: 2 +- **post**: 3 +- **filter**: 4 - **pipe**: 1 -- **action**: 14 +- **action**: 12 +- **prompt**: 1 +- **review**: 1 ## 📋 发布列表 | 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 | |:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.2 | 953 | 8381 | 22 | 50 | 2026-01-28 | -| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.5.0 | 706 | 6695 | 24 | 34 | 2026-01-30 | -| 3 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.4 | 383 | 3022 | 14 | 26 | 2026-02-07 | -| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.2 | 363 | 3750 | 14 | 34 | 2026-01-28 | -| 5 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 342 | 1670 | 7 | 6 | 2026-02-09 | -| 6 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 341 | 4706 | 17 | 30 | 2026-01-29 | -| 7 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 226 | 3385 | 13 | 14 | 2026-01-28 | -| 8 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | unknown | | 200 | 2774 | 9 | 6 | 2026-01-28 | +| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.2 | 953 | 8381 | 22 | 50 | 2026-01-29 | +| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.5.0 | 706 | 6698 | 24 | 34 | 2026-01-31 | +| 3 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.4 | 383 | 3026 | 14 | 26 | 2026-02-07 | +| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | 1.2.2 | 363 | 3754 | 14 | 34 | 2026-01-29 | +| 5 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 342 | 1670 | 7 | 6 | 2026-02-10 | +| 6 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | 1.2.4 | 341 | 4710 | 17 | 30 | 2026-01-29 | +| 7 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 226 | 3387 | 13 | 14 | 2026-01-29 | +| 8 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | | 200 | 2774 | 9 | 6 | 2026-01-28 | | 9 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 147 | 1250 | 6 | 11 | 2026-01-08 | -| 10 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.4 | 128 | 2218 | 13 | 7 | 2026-02-07 | -| 11 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | 0.6.2 | 107 | 2401 | 14 | 9 | 2026-02-10 | +| 10 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.4 | 128 | 2219 | 13 | 7 | 2026-02-07 | +| 11 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | 0.6.2 | 107 | 2402 | 14 | 9 | 2026-02-10 | | 12 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | 0.1.0 | 61 | 1316 | 6 | 8 | 2026-01-20 | | 13 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.5.0 | 58 | 1065 | 10 | 1 | 2026-01-29 | -| 14 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.2 | 39 | 589 | 6 | 2 | 2026-01-28 | -| 15 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.2 | 33 | 668 | 7 | 5 | 2026-01-28 | -| 16 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 27 | 690 | 8 | 1 | 2026-01-28 | +| 14 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.2 | 39 | 589 | 6 | 2 | 2026-01-29 | +| 15 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.2 | 33 | 668 | 7 | 5 | 2026-01-29 | +| 16 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 27 | 690 | 8 | 1 | 2026-01-29 | | 17 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 24 | 442 | 5 | 1 | 2026-01-08 | -| 18 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | 0.1.2 | 16 | 840 | 3 | 0 | 2026-02-10 | -| 19 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | unknown | | 0 | 261 | 5 | 0 | 2026-02-10 | -| 20 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | unknown | | 0 | 1522 | 12 | 19 | 2026-01-28 | -| 21 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 157 | 2 | 0 | 2026-01-14 | -| 22 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1421 | 14 | 10 | 2026-01-10 | +| 18 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | 0.1.2 | 16 | 847 | 3 | 0 | 2026-02-10 | +| 19 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | post | | 0 | 268 | 5 | 0 | 2026-02-10 | +| 20 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | post | | 0 | 1523 | 12 | 19 | 2026-01-29 | +| 21 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | | 0 | 159 | 2 | 0 | 2026-01-14 | +| 22 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | post | | 0 | 1421 | 14 | 10 | 2026-01-10 | diff --git a/docs/stats-history.json b/docs/stats-history.json new file mode 100644 index 0000000..f4d4f90 --- /dev/null +++ b/docs/stats-history.json @@ -0,0 +1,29 @@ +[ + { + "date": "2026-02-09", + "total_posts": 20, + "total_downloads": 3800, + "total_views": 42000, + "total_upvotes": 200, + "followers": 215, + "points": 48000 + }, + { + "date": "2026-02-10", + "total_posts": 21, + "total_downloads": 4000, + "total_views": 44000, + "total_upvotes": 220, + "followers": 218, + "points": 50000 + }, + { + "date": "2026-02-11", + "total_posts": 22, + "total_downloads": 4154, + "total_views": 45888, + "total_upvotes": 231, + "followers": 220, + "points": 271 + } +] \ No newline at end of file diff --git a/scripts/openwebui_stats.py b/scripts/openwebui_stats.py index 7b5af59..9e055cb 100644 --- a/scripts/openwebui_stats.py +++ b/scripts/openwebui_stats.py @@ -65,6 +65,129 @@ class OpenWebUIStats: "Content-Type": "application/json", } ) + self.history_file = Path("docs/stats-history.json") + + # 定义下载类别的判定(这些类别会计入总浏览量/下载量统计) + DOWNLOADABLE_TYPES = [ + "action", + "filter", + "pipe", + "toolkit", + "function", + "prompt", + "model", + ] + + def load_history(self) -> list: + """从文件加载历史记录""" + if self.history_file.exists(): + try: + with open(self.history_file, "r", encoding="utf-8") as f: + return json.load(f) + except Exception as e: + print(f"⚠️ 无法加载历史记录: {e}") + return [] + + def save_history(self, stats: dict): + """保存当前快照到历史记录""" + history = self.load_history() + today = get_beijing_time().strftime("%Y-%m-%d") + + # 构造快照 + snapshot = { + "date": today, + "total_posts": stats["total_posts"], + "total_downloads": stats["total_downloads"], + "total_views": stats["total_views"], + "total_upvotes": stats["total_upvotes"], + "followers": stats.get("user", {}).get("followers", 0), + "points": stats.get("user", {}).get("total_points", 0), + } + + # 如果今天已存在,则更新;否则追加 + for i, item in enumerate(history): + if item.get("date") == today: + history[i] = snapshot + break + else: + history.append(snapshot) + + # 只保留最近 90 天的历史 + history = history[-90:] + + with open(self.history_file, "w", encoding="utf-8") as f: + json.dump(history, f, ensure_ascii=False, indent=2) + print(f"✅ 历史快照已更新 ({today})") + + def get_stat_delta(self, stats: dict) -> dict: + """计算相对于上次记录的增长""" + history = self.load_history() + if len(history) < 2: + return {} + + # 获取上一次的快照(倒数第二个,因为当前可能已经存入倒数第一个) + # 或者如果还没存入,就是倒数第一个 + today = get_beijing_time().strftime("%Y-%m-%d") + prev = None + for item in reversed(history): + if item.get("date") != today: + prev = item + break + + if not prev: + return {} + + return { + "downloads": stats["total_downloads"] - prev.get("total_downloads", 0), + "views": stats["total_views"] - prev.get("total_views", 0), + "upvotes": stats["total_upvotes"] - prev.get("total_upvotes", 0), + "followers": stats.get("user", {}).get("followers", 0) + - prev.get("followers", 0), + "points": stats.get("user", {}).get("total_points", 0) + - prev.get("points", 0), + } + + def _resolve_post_type(self, post: dict) -> str: + """解析帖子类别""" + top_type = post.get("type") + function_data = post.get("data", {}) or {} + function_obj = function_data.get("function", {}) or {} + meta = function_obj.get("meta", {}) or {} + manifest = meta.get("manifest", {}) or {} + + # 类别识别优先级: + if top_type == "review": + return "review" + + post_type = "unknown" + if meta.get("type"): + post_type = meta.get("type") + elif function_obj.get("type"): + post_type = function_obj.get("type") + elif top_type: + post_type = top_type + elif not meta and not function_obj: + post_type = "post" + + # 统一和启发式识别逻辑 + if post_type == "unknown" and function_obj: + post_type = "action" + + if post_type == "action" or post_type == "unknown": + all_metadata = ( + post.get("title", "") + + json.dumps(meta, ensure_ascii=False) + + json.dumps(manifest, ensure_ascii=False) + ).lower() + + if "filter" in all_metadata: + post_type = "filter" + elif "pipe" in all_metadata: + post_type = "pipe" + elif "toolkit" in all_metadata: + post_type = "toolkit" + + return post_type def _parse_user_id_from_token(self, token: str) -> str: """从 JWT Token 中解析用户 ID""" @@ -84,6 +207,30 @@ class OpenWebUIStats: print(f"⚠️ 无法从 Token 解析用户 ID: {e}") return "" + def generate_mermaid_chart(self) -> str: + """生成 Mermaid 增长趋势图""" + history = self.load_history() + if len(history) < 3: # 数据太少不显示图表 + return "" + + # 只取最近 14 天的数据用于展示 + data = history[-14:] + dates = [item["date"][-5:] for item in data] # 只取 MM-DD + downloads = [str(item["total_downloads"]) for item in data] + + mm = [] + mm.append("### 📈 增长趋势 (14天)") + mm.append("") + mm.append("```mermaid") + mm.append("xychart-beta") + mm.append(f' title "Downloads Trend"') + mm.append(f" x-axis [{', '.join(f'\"{d}\"' for d in dates)}]") + mm.append(f' y-axis "Downloads"') + mm.append(f" line [{', '.join(downloads)}]") + mm.append("```") + mm.append("") + return "\n".join(mm) + def get_user_posts(self, sort: str = "new", page: int = 1) -> list: """ 获取用户发布的帖子列表 @@ -148,22 +295,26 @@ class OpenWebUIStats: } for post in posts: + post_type = self._resolve_post_type(post) + + function_data = post.get("data", {}) or {} + function_obj = function_data.get("function", {}) or {} + meta = function_obj.get("meta", {}) or {} + manifest = meta.get("manifest", {}) or {} + # 累计统计 - stats["total_downloads"] += post.get("downloads", 0) - stats["total_views"] += post.get("views", 0) + post_downloads = post.get("downloads", 0) + post_views = post.get("views", 0) + + stats["total_downloads"] += post_downloads stats["total_upvotes"] += post.get("upvotes", 0) stats["total_downvotes"] += post.get("downvotes", 0) stats["total_saves"] += post.get("saveCount", 0) stats["total_comments"] += post.get("commentCount", 0) - # 解析 data 字段 - 正确路径: data.function.meta - function_data = post.get("data", {}) - if function_data is None: - function_data = {} - function_data = function_data.get("function", {}) - meta = function_data.get("meta", {}) - manifest = meta.get("manifest", {}) - post_type = meta.get("type", function_data.get("type", "unknown")) + # 关键:总浏览量不包括不可以下载的类型 (如 post, review) + if post_type in self.DOWNLOADABLE_TYPES or post_downloads > 0: + stats["total_views"] += post_views if post_type not in stats["by_type"]: stats["by_type"][post_type] = 0 @@ -249,19 +400,24 @@ class OpenWebUIStats: stats: 统计数据 lang: 语言 ("zh" 中文, "en" 英文) """ + # 获取增量数据 + delta = self.get_stat_delta(stats) + # 中英文文本 texts = { "zh": { "title": "# 📊 OpenWebUI 社区统计报告", "updated": f"> 📅 更新时间: {get_beijing_time().strftime('%Y-%m-%d %H:%M')}", "overview_title": "## 📈 总览", - "overview_header": "| 指标 | 数值 |", + "overview_header": "| 指标 | 数值 | 增长 (24h) |", "posts": "📝 发布数量", "downloads": "⬇️ 总下载量", "views": "👁️ 总浏览量", "upvotes": "👍 总点赞数", "saves": "💾 总收藏数", "comments": "💬 总评论数", + "author_points": "⭐ 作者总积分", + "author_followers": "👥 粉丝数量", "type_title": "## 📂 按类型分类", "list_title": "## 📋 发布列表", "list_header": "| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |", @@ -270,13 +426,15 @@ class OpenWebUIStats: "title": "# 📊 OpenWebUI Community Stats Report", "updated": f"> 📅 Updated: {get_beijing_time().strftime('%Y-%m-%d %H:%M')}", "overview_title": "## 📈 Overview", - "overview_header": "| Metric | Value |", + "overview_header": "| Metric | Value | Growth (24h) |", "posts": "📝 Total Posts", "downloads": "⬇️ Total Downloads", "views": "👁️ Total Views", "upvotes": "👍 Total Upvotes", "saves": "💾 Total Saves", "comments": "💬 Total Comments", + "author_points": "⭐ Author Points", + "author_followers": "👥 Followers", "type_title": "## 📂 By Type", "list_title": "## 📋 Posts List", "list_header": "| Rank | Title | Type | Version | Downloads | Views | Upvotes | Saves | Updated |", @@ -291,17 +449,44 @@ class OpenWebUIStats: md.append(t["updated"]) md.append("") + # 插入趋势图 + chart = self.generate_mermaid_chart() + if chart: + md.append(chart) + md.append("") + # 总览 + def fmt_delta(key: str) -> str: + val = delta.get(key, 0) + if val > 0: + return f"**+{val}** 🚀" + return "-" + md.append(t["overview_title"]) md.append("") md.append(t["overview_header"]) - md.append("|------|------|") - md.append(f"| {t['posts']} | {stats['total_posts']} |") - md.append(f"| {t['downloads']} | {stats['total_downloads']} |") - md.append(f"| {t['views']} | {stats['total_views']} |") - md.append(f"| {t['upvotes']} | {stats['total_upvotes']} |") - md.append(f"| {t['saves']} | {stats['total_saves']} |") - md.append(f"| {t['comments']} | {stats['total_comments']} |") + md.append("|------|------|:---:|") + md.append(f"| {t['posts']} | {stats['total_posts']} | - |") + md.append( + f"| {t['downloads']} | {stats['total_downloads']} | {fmt_delta('downloads')} |" + ) + md.append(f"| {t['views']} | {stats['total_views']} | {fmt_delta('views')} |") + md.append( + f"| {t['upvotes']} | {stats['total_upvotes']} | {fmt_delta('upvotes')} |" + ) + md.append(f"| {t['saves']} | {stats['total_saves']} | - |") + md.append(f"| {t['comments']} | {stats['total_comments']} | - |") + + # 作者信息 + user = stats.get("user", {}) + if user: + md.append( + f"| {t['author_points']} | {user.get('total_points', 0)} | {fmt_delta('points')} |" + ) + md.append( + f"| {t['author_followers']} | {user.get('followers', 0)} | {fmt_delta('followers')} |" + ) + md.append("") # 按类型分类 @@ -581,6 +766,9 @@ def main(): # 生成统计 stats = stats_client.generate_stats(posts) + # 保存历史快照 + stats_client.save_history(stats) + # 打印到终端 stats_client.print_stats(stats)