Compare commits

..

11 Commits

Author SHA1 Message Date
fujie
500e090b11 fix: resolve TypeError and improve Pydantic compatibility in async-context-compression v1.2.2 2026-01-21 21:51:58 +08:00
github-actions[bot]
a75ee555fa chore: update community stats - followers increased (142 -> 143) 2026-01-21 13:22:53 +00:00
github-actions[bot]
6a8c2164cd chore: update community stats - followers increased (141 -> 142) 2026-01-21 12:15:46 +00:00
github-actions[bot]
7f7efa325a chore: update community stats - followers increased (140 -> 141) 2026-01-21 04:25:49 +00:00
github-actions[bot]
9ba6cb08fc chore: update community stats - followers increased (139 -> 140) 2026-01-20 20:27:29 +00:00
github-actions[bot]
1872271a2d chore: update community stats - new plugin added (16 -> 17), plugin version updated, points increased (134 -> 135) 2026-01-20 13:23:26 +00:00
fujie
813b50864a docs(folder-memory): add prerequisites section and enhance release workflow with README links
- Add 'Prerequisites' section to folder-memory README files clarifying that conversations must occur inside a folder
- Update docs/plugins/filters/folder-memory.md and folder-memory.zh.md with same prerequisites
- Enhance extract_plugin_versions.py to auto-generate GitHub README URLs in release notes
- Update plugin-development workflow to document README link requirements for publishing
2026-01-20 20:35:06 +08:00
github-actions[bot]
b18cefe320 chore: update community stats - followers increased (137 -> 139) 2026-01-20 12:15:40 +00:00
fujie
a54c359fcf docs(filters): remove language switchers and legacy references from folder-memory docs 2026-01-20 20:11:00 +08:00
fujie
8d83221a4a docs(filters): add author and project info to folder-memory READMEs and docs 2026-01-20 20:08:52 +08:00
fujie
1879000720 docs(filters): add 'What's New' section to folder-memory READMEs and docs
- Add prominent 'What's New' section to README.md, README_CN.md, and global docs.
- Ensure compliance with plugin development standards.
2026-01-20 20:07:46 +08:00
24 changed files with 296 additions and 176 deletions

View File

@@ -90,6 +90,9 @@ Reference: `.github/workflows/release.yml`
- Action: Automatically updates the plugin code and metadata on OpenWebUI.com using `scripts/publish_plugin.py`. - Action: Automatically updates the plugin code and metadata on OpenWebUI.com using `scripts/publish_plugin.py`.
- **Auto-Sync**: If a local plugin has no ID but matches an existing published plugin by **Title**, the script will automatically fetch the ID, update the local file, and proceed with the update. - **Auto-Sync**: If a local plugin has no ID but matches an existing published plugin by **Title**, the script will automatically fetch the ID, update the local file, and proceed with the update.
- Requirement: `OPENWEBUI_API_KEY` secret must be set. - Requirement: `OPENWEBUI_API_KEY` secret must be set.
- **README Link**: When announcing a release, always include the GitHub README URL for the plugin:
- Format: `https://github.com/Fu-Jie/awesome-openwebui/blob/main/plugins/{type}/{name}/README.md`
- Example: `https://github.com/Fu-Jie/awesome-openwebui/blob/main/plugins/filters/folder-memory/README.md`
### Pull Request Check ### Pull Request Check
- Workflow: `.github/workflows/plugin-version-check.yml` - Workflow: `.github/workflows/plugin-version-check.yml`

View File

@@ -10,28 +10,28 @@ A collection of enhancements, plugins, and prompts for [OpenWebUI](https://githu
<!-- STATS_START --> <!-- STATS_START -->
## 📊 Community Stats ## 📊 Community Stats
> 🕐 Auto-updated: 2026-01-20 19:10 > 🕐 Auto-updated: 2026-01-21 21:22
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions | | 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **137** | **134** | **25** | | [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **143** | **135** | **26** |
| 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves | | 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves |
|:---:|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|:---:|
| **16** | **1887** | **22101** | **120** | **147** | | **17** | **1974** | **22983** | **121** | **153** |
### 🔥 Top 6 Popular Plugins ### 🔥 Top 6 Popular Plugins
> 🕐 Auto-updated: 2026-01-20 19:10 > 🕐 Auto-updated: 2026-01-21 21:22
| Rank | Plugin | Version | Downloads | Views | Updated | | Rank | Plugin | Version | Downloads | Views | Updated |
|:---:|------|:---:|:---:|:---:|:---:| |:---:|------|:---:|:---:|:---:|:---:|
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 550 | 4939 | 2026-01-17 | | 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 562 | 5047 | 2026-01-17 |
| 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 282 | 2667 | 2026-01-18 | | 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 298 | 2777 | 2026-01-18 |
| 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 215 | 844 | 2026-01-07 | | 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 227 | 897 | 2026-01-07 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.1 | 189 | 2051 | 2026-01-20 | | 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.1 | 197 | 2137 | 2026-01-20 |
| 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 170 | 1457 | 2026-01-17 | | 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 179 | 1509 | 2026-01-17 |
| 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 144 | 2395 | 2026-01-17 | | 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 147 | 2434 | 2026-01-17 |
*See full stats in [Community Stats Report](./docs/community-stats.md)* *See full stats in [Community Stats Report](./docs/community-stats.md)*
<!-- STATS_END --> <!-- STATS_END -->

View File

@@ -7,28 +7,28 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
<!-- STATS_START --> <!-- STATS_START -->
## 📊 社区统计 ## 📊 社区统计
> 🕐 自动更新于 2026-01-20 19:10 > 🕐 自动更新于 2026-01-21 21:22
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 | | 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **137** | **134** | **25** | | [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **143** | **135** | **26** |
| 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 | | 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 |
|:---:|:---:|:---:|:---:|:---:| |:---:|:---:|:---:|:---:|:---:|
| **16** | **1887** | **22101** | **120** | **147** | | **17** | **1974** | **22983** | **121** | **153** |
### 🔥 热门插件 Top 6 ### 🔥 热门插件 Top 6
> 🕐 自动更新于 2026-01-20 19:10 > 🕐 自动更新于 2026-01-21 21:22
| 排名 | 插件 | 版本 | 下载 | 浏览 | 更新日期 | | 排名 | 插件 | 版本 | 下载 | 浏览 | 更新日期 |
|:---:|------|:---:|:---:|:---:|:---:| |:---:|------|:---:|:---:|:---:|:---:|
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 550 | 4939 | 2026-01-17 | | 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 562 | 5047 | 2026-01-17 |
| 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 282 | 2667 | 2026-01-18 | | 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 298 | 2777 | 2026-01-18 |
| 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 215 | 844 | 2026-01-07 | | 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 227 | 897 | 2026-01-07 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.1 | 189 | 2051 | 2026-01-20 | | 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.2.1 | 197 | 2137 | 2026-01-20 |
| 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 170 | 1457 | 2026-01-17 | | 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 179 | 1509 | 2026-01-17 |
| 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 144 | 2395 | 2026-01-17 | | 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 147 | 2434 | 2026-01-17 |
*完整统计请查看 [社区统计报告](./docs/community-stats.zh.md)* *完整统计请查看 [社区统计报告](./docs/community-stats.zh.md)*
<!-- STATS_END --> <!-- STATS_END -->

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "plugins", "label": "plugins",
"message": "16", "message": "17",
"color": "green" "color": "green"
} }

View File

@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "points", "label": "points",
"message": "134", "message": "135",
"color": "orange" "color": "orange"
} }

View File

@@ -1,6 +1,6 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"label": "upvotes", "label": "upvotes",
"message": "120", "message": "121",
"color": "brightgreen" "color": "brightgreen"
} }

View File

@@ -1,12 +1,13 @@
{ {
"total_posts": 16, "total_posts": 17,
"total_downloads": 1887, "total_downloads": 1974,
"total_views": 22101, "total_views": 22983,
"total_upvotes": 120, "total_upvotes": 121,
"total_downvotes": 2, "total_downvotes": 2,
"total_saves": 147, "total_saves": 153,
"total_comments": 24, "total_comments": 24,
"by_type": { "by_type": {
"filter": 1,
"action": 14, "action": 14,
"unknown": 2 "unknown": 2
}, },
@@ -18,10 +19,10 @@
"version": "0.9.1", "version": "0.9.1",
"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": 550, "downloads": 562,
"views": 4939, "views": 5047,
"upvotes": 15, "upvotes": 15,
"saves": 30, "saves": 31,
"comments": 11, "comments": 11,
"created_at": "2025-12-30", "created_at": "2025-12-30",
"updated_at": "2026-01-17", "updated_at": "2026-01-17",
@@ -34,10 +35,10 @@
"version": "1.4.9", "version": "1.4.9",
"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": 282, "downloads": 298,
"views": 2667, "views": 2777,
"upvotes": 14, "upvotes": 14,
"saves": 21, "saves": 22,
"comments": 3, "comments": 3,
"created_at": "2025-12-28", "created_at": "2025-12-28",
"updated_at": "2026-01-18", "updated_at": "2026-01-18",
@@ -50,8 +51,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": 215, "downloads": 227,
"views": 844, "views": 897,
"upvotes": 4, "upvotes": 4,
"saves": 6, "saves": 6,
"comments": 0, "comments": 0,
@@ -66,10 +67,10 @@
"version": "1.2.1", "version": "1.2.1",
"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": 189, "downloads": 197,
"views": 2051, "views": 2137,
"upvotes": 9, "upvotes": 9,
"saves": 22, "saves": 23,
"comments": 0, "comments": 0,
"created_at": "2025-11-08", "created_at": "2025-11-08",
"updated_at": "2026-01-20", "updated_at": "2026-01-20",
@@ -82,10 +83,10 @@
"version": "0.4.3", "version": "0.4.3",
"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": 170, "downloads": 179,
"views": 1457, "views": 1509,
"upvotes": 8, "upvotes": 8,
"saves": 17, "saves": 18,
"comments": 0, "comments": 0,
"created_at": "2026-01-03", "created_at": "2026-01-03",
"updated_at": "2026-01-17", "updated_at": "2026-01-17",
@@ -98,8 +99,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": 144, "downloads": 147,
"views": 2395, "views": 2434,
"upvotes": 10, "upvotes": 10,
"saves": 12, "saves": 12,
"comments": 2, "comments": 2,
@@ -114,8 +115,8 @@
"version": "1.2.4", "version": "1.2.4",
"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.", "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": 96, "downloads": 100,
"views": 2234, "views": 2311,
"upvotes": 10, "upvotes": 10,
"saves": 17, "saves": 17,
"comments": 5, "comments": 5,
@@ -130,8 +131,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": 73, "downloads": 76,
"views": 707, "views": 740,
"upvotes": 4, "upvotes": 4,
"saves": 7, "saves": 7,
"comments": 0, "comments": 0,
@@ -146,8 +147,8 @@
"version": "0.4.3", "version": "0.4.3",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。", "description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 65, "downloads": 69,
"views": 1335, "views": 1392,
"upvotes": 11, "upvotes": 11,
"saves": 3, "saves": 3,
"comments": 1, "comments": 1,
@@ -162,8 +163,8 @@
"version": "1.4.9", "version": "1.4.9",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。", "description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 43, "downloads": 45,
"views": 704, "views": 718,
"upvotes": 6, "upvotes": 6,
"saves": 0, "saves": 0,
"comments": 0, "comments": 0,
@@ -178,8 +179,8 @@
"version": "0.9.1", "version": "0.9.1",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。", "description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
"downloads": 24, "downloads": 27,
"views": 407, "views": 417,
"upvotes": 3, "upvotes": 3,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -194,8 +195,8 @@
"version": "0.2.4", "version": "0.2.4",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。", "description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 16, "downloads": 19,
"views": 453, "views": 471,
"upvotes": 5, "upvotes": 5,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -211,7 +212,7 @@
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。", "description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
"downloads": 14, "downloads": 14,
"views": 377, "views": 401,
"upvotes": 5, "upvotes": 5,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -226,8 +227,8 @@
"version": "1.0.0", "version": "1.0.0",
"author": "Fu-Jie", "author": "Fu-Jie",
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。", "description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
"downloads": 6, "downloads": 8,
"views": 261, "views": 276,
"upvotes": 3, "upvotes": 3,
"saves": 1, "saves": 1,
"comments": 0, "comments": 0,
@@ -235,6 +236,22 @@
"updated_at": "2026-01-08", "updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/精读_99830b0f" "url": "https://openwebui.com/posts/精读_99830b0f"
}, },
{
"title": "📂 Folder Memory Auto-Evolving Project Context",
"slug": "folder_memory_auto_evolving_project_context_4a9875b2",
"type": "filter",
"version": "0.1.0",
"author": "Fu-Jie",
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
"downloads": 6,
"views": 162,
"upvotes": 1,
"saves": 2,
"comments": 0,
"created_at": "2026-01-20",
"updated_at": "2026-01-20",
"url": "https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2"
},
{ {
"title": "Review of Claude Haiku 4.5", "title": "Review of Claude Haiku 4.5",
"slug": "review_of_claude_haiku_45_41b0db39", "slug": "review_of_claude_haiku_45_41b0db39",
@@ -243,7 +260,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 62, "views": 71,
"upvotes": 1, "upvotes": 1,
"saves": 0, "saves": 0,
"comments": 0, "comments": 0,
@@ -259,7 +276,7 @@
"author": "", "author": "",
"description": "", "description": "",
"downloads": 0, "downloads": 0,
"views": 1208, "views": 1223,
"upvotes": 12, "upvotes": 12,
"saves": 8, "saves": 8,
"comments": 2, "comments": 2,
@@ -273,11 +290,11 @@
"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": 137, "followers": 143,
"following": 2, "following": 2,
"total_points": 134, "total_points": 135,
"post_points": 118, "post_points": 119,
"comment_points": 16, "comment_points": 16,
"contributions": 25 "contributions": 26
} }
} }

View File

@@ -1,20 +1,21 @@
# 📊 OpenWebUI Community Stats Report # 📊 OpenWebUI Community Stats Report
> 📅 Updated: 2026-01-20 19:10 > 📅 Updated: 2026-01-21 21:22
## 📈 Overview ## 📈 Overview
| Metric | Value | | Metric | Value |
|------|------| |------|------|
| 📝 Total Posts | 16 | | 📝 Total Posts | 17 |
| ⬇️ Total Downloads | 1887 | | ⬇️ Total Downloads | 1974 |
| 👁️ Total Views | 22101 | | 👁️ Total Views | 22983 |
| 👍 Total Upvotes | 120 | | 👍 Total Upvotes | 121 |
| 💾 Total Saves | 147 | | 💾 Total Saves | 153 |
| 💬 Total Comments | 24 | | 💬 Total Comments | 24 |
## 📂 By Type ## 📂 By Type
- **filter**: 1
- **action**: 14 - **action**: 14
- **unknown**: 2 - **unknown**: 2
@@ -22,19 +23,20 @@
| Rank | Title | Type | Version | Downloads | Views | Upvotes | Saves | Updated | | 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.1 | 550 | 4939 | 15 | 30 | 2026-01-17 | | 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 562 | 5047 | 15 | 31 | 2026-01-17 |
| 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 282 | 2667 | 14 | 21 | 2026-01-18 | | 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 298 | 2777 | 14 | 22 | 2026-01-18 |
| 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 215 | 844 | 4 | 6 | 2026-01-07 | | 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 227 | 897 | 4 | 6 | 2026-01-07 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.1 | 189 | 2051 | 9 | 22 | 2026-01-20 | | 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.1 | 197 | 2137 | 9 | 23 | 2026-01-20 |
| 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 170 | 1457 | 8 | 17 | 2026-01-17 | | 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 179 | 1509 | 8 | 18 | 2026-01-17 |
| 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 144 | 2395 | 10 | 12 | 2026-01-17 | | 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 147 | 2434 | 10 | 12 | 2026-01-17 |
| 7 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 96 | 2234 | 10 | 17 | 2026-01-19 | | 7 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 100 | 2311 | 10 | 17 | 2026-01-19 |
| 8 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 73 | 707 | 4 | 7 | 2026-01-08 | | 8 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 76 | 740 | 4 | 7 | 2026-01-08 |
| 9 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 65 | 1335 | 11 | 3 | 2026-01-17 | | 9 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 69 | 1392 | 11 | 3 | 2026-01-17 |
| 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 43 | 704 | 6 | 0 | 2026-01-17 | | 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 45 | 718 | 6 | 0 | 2026-01-17 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 24 | 407 | 3 | 1 | 2026-01-17 | | 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 27 | 417 | 3 | 1 | 2026-01-17 |
| 12 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 16 | 453 | 5 | 1 | 2026-01-17 | | 12 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 19 | 471 | 5 | 1 | 2026-01-17 |
| 13 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.1 | 14 | 377 | 5 | 1 | 2026-01-20 | | 13 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.1 | 14 | 401 | 5 | 1 | 2026-01-20 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 261 | 3 | 1 | 2026-01-08 | | 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 8 | 276 | 3 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 62 | 1 | 0 | 2026-01-14 | | 15 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | 0.1.0 | 6 | 162 | 1 | 2 | 2026-01-20 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1208 | 12 | 8 | 2026-01-10 | | 16 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 71 | 1 | 0 | 2026-01-14 |
| 17 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1223 | 12 | 8 | 2026-01-10 |

View File

@@ -1,20 +1,21 @@
# 📊 OpenWebUI 社区统计报告 # 📊 OpenWebUI 社区统计报告
> 📅 更新时间: 2026-01-20 19:10 > 📅 更新时间: 2026-01-21 21:22
## 📈 总览 ## 📈 总览
| 指标 | 数值 | | 指标 | 数值 |
|------|------| |------|------|
| 📝 发布数量 | 16 | | 📝 发布数量 | 17 |
| ⬇️ 总下载量 | 1887 | | ⬇️ 总下载量 | 1974 |
| 👁️ 总浏览量 | 22101 | | 👁️ 总浏览量 | 22983 |
| 👍 总点赞数 | 120 | | 👍 总点赞数 | 121 |
| 💾 总收藏数 | 147 | | 💾 总收藏数 | 153 |
| 💬 总评论数 | 24 | | 💬 总评论数 | 24 |
## 📂 按类型分类 ## 📂 按类型分类
- **filter**: 1
- **action**: 14 - **action**: 14
- **unknown**: 2 - **unknown**: 2
@@ -22,19 +23,20 @@
| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 | | 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:| |:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 550 | 4939 | 15 | 30 | 2026-01-17 | | 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 562 | 5047 | 15 | 31 | 2026-01-17 |
| 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 282 | 2667 | 14 | 21 | 2026-01-18 | | 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 298 | 2777 | 14 | 22 | 2026-01-18 |
| 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 215 | 844 | 4 | 6 | 2026-01-07 | | 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 227 | 897 | 4 | 6 | 2026-01-07 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.1 | 189 | 2051 | 9 | 22 | 2026-01-20 | | 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.2.1 | 197 | 2137 | 9 | 23 | 2026-01-20 |
| 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 170 | 1457 | 8 | 17 | 2026-01-17 | | 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 179 | 1509 | 8 | 18 | 2026-01-17 |
| 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 144 | 2395 | 10 | 12 | 2026-01-17 | | 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 147 | 2434 | 10 | 12 | 2026-01-17 |
| 7 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 96 | 2234 | 10 | 17 | 2026-01-19 | | 7 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.4 | 100 | 2311 | 10 | 17 | 2026-01-19 |
| 8 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 73 | 707 | 4 | 7 | 2026-01-08 | | 8 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 76 | 740 | 4 | 7 | 2026-01-08 |
| 9 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 65 | 1335 | 11 | 3 | 2026-01-17 | | 9 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 69 | 1392 | 11 | 3 | 2026-01-17 |
| 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 43 | 704 | 6 | 0 | 2026-01-17 | | 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 45 | 718 | 6 | 0 | 2026-01-17 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 24 | 407 | 3 | 1 | 2026-01-17 | | 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 27 | 417 | 3 | 1 | 2026-01-17 |
| 12 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 16 | 453 | 5 | 1 | 2026-01-17 | | 12 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 19 | 471 | 5 | 1 | 2026-01-17 |
| 13 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.1 | 14 | 377 | 5 | 1 | 2026-01-20 | | 13 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.2.1 | 14 | 401 | 5 | 1 | 2026-01-20 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 261 | 3 | 1 | 2026-01-08 | | 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 8 | 276 | 3 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 62 | 1 | 0 | 2026-01-14 | | 15 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | 0.1.0 | 6 | 162 | 1 | 2 | 2026-01-20 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1208 | 12 | 8 | 2026-01-10 | | 16 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 71 | 1 | 0 | 2026-01-14 |
| 17 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1223 | 12 | 8 | 2026-01-10 |

View File

@@ -1,7 +1,7 @@
# Async Context Compression # Async Context Compression
<span class="category-badge filter">Filter</span> <span class="category-badge filter">Filter</span>
<span class="version-badge">v1.2.1</span> <span class="version-badge">v1.2.2</span>
Reduces token consumption in long conversations through intelligent summarization while maintaining conversational coherence. Reduces token consumption in long conversations through intelligent summarization while maintaining conversational coherence.

View File

@@ -1,7 +1,7 @@
# Async Context Compression异步上下文压缩 # Async Context Compression异步上下文压缩
<span class="category-badge filter">Filter</span> <span class="category-badge filter">Filter</span>
<span class="version-badge">v1.2.1</span> <span class="version-badge">v1.2.2</span>
通过智能摘要减少长对话的 token 消耗,同时保持对话连贯。 通过智能摘要减少长对话的 token 消耗,同时保持对话连贯。

View File

@@ -1,5 +1,16 @@
# Folder Memory # Folder Memory
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.1.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
---
### 📌 What's new in 0.1.0
- **Initial Release**: Automated "Project Rules" management for OpenWebUI folders.
- **Folder-Level Persistence**: Automatically updates folder system prompts with extracted rules.
- **Optimized Performance**: Runs asynchronously and supports `PRIORITY` configuration for seamless integration with other filters.
---
**Folder Memory** is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt. **Folder Memory** is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt.
This ensures that all future conversations within that folder share the same evolved context and rules, without manual updates. This ensures that all future conversations within that folder share the same evolved context and rules, without manual updates.
@@ -11,6 +22,10 @@ This ensures that all future conversations within that folder share the same evo
- **Async Processing**: Runs in the background without blocking the user's chat experience. - **Async Processing**: Runs in the background without blocking the user's chat experience.
- **ORM Integration**: Directly updates folder data using OpenWebUI's internal models for reliability. - **ORM Integration**: Directly updates folder data using OpenWebUI's internal models for reliability.
## Prerequisites
- **Conversations must occur inside a folder.** This plugin only triggers when a chat belongs to a folder (i.e., you need to create a folder in OpenWebUI and start a conversation within it).
## Installation ## Installation
1. Copy `folder_memory.py` to your OpenWebUI `plugins/filters/` directory (or upload via Admin UI). 1. Copy `folder_memory.py` to your OpenWebUI `plugins/filters/` directory (or upload via Admin UI).

View File

@@ -1,5 +1,16 @@
# 文件夹记忆 (Folder Memory) # 文件夹记忆 (Folder Memory)
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.1.0 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
---
### 📌 0.1.0 版本特性
- **首个版本发布**:专注于自动化的“项目规则”管理。
- **文件夹级持久化**:自动将提取的规则回写到文件夹系统提示词中。
- **性能优化**:采用异步处理机制,并支持 `PRIORITY` 配置,确保与其他过滤器(如上下文压缩)完美协作。
---
**文件夹记忆 (Folder Memory)** 是一个 OpenWebUI 的智能上下文过滤器插件。它能自动从文件夹内的对话中提取一致性的“项目规则”,并将其回写到文件夹的系统提示词中。 **文件夹记忆 (Folder Memory)** 是一个 OpenWebUI 的智能上下文过滤器插件。它能自动从文件夹内的对话中提取一致性的“项目规则”,并将其回写到文件夹的系统提示词中。
这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。 这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。
@@ -11,6 +22,10 @@
- **异步处理**:在后台运行,不阻塞用户的聊天体验。 - **异步处理**:在后台运行,不阻塞用户的聊天体验。
- **ORM 集成**:直接使用 OpenWebUI 的内部模型更新文件夹数据,确保可靠性。 - **ORM 集成**:直接使用 OpenWebUI 的内部模型更新文件夹数据,确保可靠性。
## 前置条件
- **对话必须在文件夹内进行。** 此插件仅在聊天属于某个文件夹时触发(即您需要先在 OpenWebUI 中创建一个文件夹,并在其内部开始对话)。
## 安装指南 ## 安装指南
1.`folder_memory.py` (或中文版 `folder_memory_cn.py`) 复制到 OpenWebUI 的 `plugins/filters/` 目录(或通过管理员 UI 上传)。 1.`folder_memory.py` (或中文版 `folder_memory_cn.py`) 复制到 OpenWebUI 的 `plugins/filters/` 目录(或通过管理员 UI 上传)。

View File

@@ -22,7 +22,7 @@ Filters act as middleware in the message pipeline:
Reduces token consumption in long conversations through intelligent summarization while maintaining coherence. Reduces token consumption in long conversations through intelligent summarization while maintaining coherence.
**Version:** 1.2.1 **Version:** 1.2.2
[:octicons-arrow-right-24: Documentation](async-context-compression.md) [:octicons-arrow-right-24: Documentation](async-context-compression.md)

View File

@@ -22,7 +22,7 @@ Filter 充当消息管线中的中间件:
通过智能总结减少长对话的 token 消耗,同时保持连贯性。 通过智能总结减少长对话的 token 消耗,同时保持连贯性。
**版本:** 1.2.1 **版本:** 1.2.2
[:octicons-arrow-right-24: 查看文档](async-context-compression.md) [:octicons-arrow-right-24: 查看文档](async-context-compression.md)

View File

@@ -1,9 +1,13 @@
# Async Context Compression Filter # Async Context Compression Filter
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.2.1 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT **Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.2.2 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
This filter reduces token consumption in long conversations through intelligent summarization and message compression while keeping conversations coherent. This filter reduces token consumption in long conversations through intelligent summarization and message compression while keeping conversations coherent.
## What's new in 1.2.2
- **Critical Fix**: Resolved `TypeError: 'str' object is not callable` caused by variable name conflict in logging function.
- **Compatibility**: Enhanced `params` handling to support Pydantic objects, improving compatibility with different OpenWebUI versions.
## What's new in 1.2.1 ## What's new in 1.2.1
- **Smart Configuration**: Automatically detects base model settings for custom models and adds `summary_model_max_context` for independent summary limits. - **Smart Configuration**: Automatically detects base model settings for custom models and adds `summary_model_max_context` for independent summary limits.

View File

@@ -1,11 +1,15 @@
# 异步上下文压缩过滤器 # 异步上下文压缩过滤器
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.2.1 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT **作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.2.2 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
> **重要提示**:为了确保所有过滤器的可维护性和易用性,每个过滤器都应附带清晰、完整的文档,以确保其功能、配置和使用方法得到充分说明。 > **重要提示**:为了确保所有过滤器的可维护性和易用性,每个过滤器都应附带清晰、完整的文档,以确保其功能、配置和使用方法得到充分说明。
本过滤器通过智能摘要和消息压缩技术,在保持对话连贯性的同时,显著降低长对话的 Token 消耗。 本过滤器通过智能摘要和消息压缩技术,在保持对话连贯性的同时,显著降低长对话的 Token 消耗。
## 1.2.2 版本更新
- **严重错误修复**: 解决了因日志函数变量名冲突导致的 `TypeError: 'str' object is not callable` 错误。
- **兼容性增强**: 改进了 `params` 处理逻辑以支持 Pydantic 对象,提高了对不同 OpenWebUI 版本的兼容性。
## 1.2.1 版本更新 ## 1.2.1 版本更新
- **智能配置增强**: 自动检测自定义模型的基础模型配置,并新增 `summary_model_max_context` 参数以独立控制摘要模型的上下文限制。 - **智能配置增强**: 自动检测自定义模型的基础模型配置,并新增 `summary_model_max_context` 参数以独立控制摘要模型的上下文限制。

View File

@@ -5,7 +5,7 @@ author: Fu-Jie
author_url: https://github.com/Fu-Jie/awesome-openwebui author_url: https://github.com/Fu-Jie/awesome-openwebui
funding_url: https://github.com/open-webui funding_url: https://github.com/open-webui
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.
version: 1.2.1 version: 1.2.2
openwebui_id: b1655bc8-6de9-4cad-8cb5-a6f7829a02ce openwebui_id: b1655bc8-6de9-4cad-8cb5-a6f7829a02ce
license: MIT license: MIT
@@ -839,7 +839,7 @@ class Filter:
except Exception as e: except Exception as e:
logger.error(f"Error emitting debug log: {e}") logger.error(f"Error emitting debug log: {e}")
async def _log(self, message: str, type: str = "info", event_call=None): async def _log(self, message: str, log_type: str = "info", event_call=None):
"""Unified logging to both backend (print) and frontend (console.log)""" """Unified logging to both backend (print) and frontend (console.log)"""
# Backend logging # Backend logging
if self.valves.debug_mode: if self.valves.debug_mode:
@@ -849,11 +849,11 @@ class Filter:
if self.valves.show_debug_log and event_call: if self.valves.show_debug_log and event_call:
try: try:
css = "color: #3b82f6;" # Blue default css = "color: #3b82f6;" # Blue default
if type == "error": if log_type == "error":
css = "color: #ef4444; font-weight: bold;" # Red css = "color: #ef4444; font-weight: bold;" # Red
elif type == "warning": elif log_type == "warning":
css = "color: #f59e0b;" # Orange css = "color: #f59e0b;" # Orange
elif type == "success": elif log_type == "success":
css = "color: #10b981; font-weight: bold;" # Green css = "color: #10b981; font-weight: bold;" # Green
# Clean message for frontend: remove separators and extra newlines # Clean message for frontend: remove separators and extra newlines
@@ -999,6 +999,7 @@ class Filter:
# 2. For base models: check messages for role='system' # 2. For base models: check messages for role='system'
system_prompt_content = None system_prompt_content = None
# Try to get from DB (custom model)
# Try to get from DB (custom model) # Try to get from DB (custom model)
try: try:
model_id = body.get("model") model_id = body.get("model")
@@ -1026,12 +1027,17 @@ class Filter:
# Handle case where params is a JSON string # Handle case where params is a JSON string
if isinstance(params, str): if isinstance(params, str):
params = json.loads(params) params = json.loads(params)
# Convert Pydantic model to dict if needed
elif hasattr(params, "model_dump"):
params = params.model_dump()
elif hasattr(params, "dict"):
params = params.dict()
# Handle dict or Pydantic object # Now params should be a dict
if isinstance(params, dict): if isinstance(params, dict):
system_prompt_content = params.get("system") system_prompt_content = params.get("system")
else: else:
# Assume Pydantic model or object # Fallback: try getattr
system_prompt_content = getattr(params, "system", None) system_prompt_content = getattr(params, "system", None)
if system_prompt_content: if system_prompt_content:
@@ -1050,7 +1056,7 @@ class Filter:
if self.valves.show_debug_log and __event_call__: if self.valves.show_debug_log and __event_call__:
await self._log( await self._log(
f"[Inlet] ❌ Failed to parse model params: {e}", f"[Inlet] ❌ Failed to parse model params: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1071,7 +1077,7 @@ class Filter:
if self.valves.show_debug_log and __event_call__: if self.valves.show_debug_log and __event_call__:
await self._log( await self._log(
f"[Inlet] ❌ Error fetching system prompt from DB: {e}", f"[Inlet] ❌ Error fetching system prompt from DB: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
if self.valves.debug_mode: if self.valves.debug_mode:
@@ -1125,7 +1131,7 @@ class Filter:
if not chat_id: if not chat_id:
await self._log( await self._log(
"[Inlet] ❌ Missing chat_id in metadata, skipping compression", "[Inlet] ❌ Missing chat_id in metadata, skipping compression",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
return body return body
@@ -1154,7 +1160,7 @@ class Filter:
else: else:
await self._log( await self._log(
f"[Inlet] ⚠️ Invalid Model Configs (Raw: '{raw_config}'): No valid configs parsed. Expected format: 'model_id:threshold:max_context'", f"[Inlet] ⚠️ Invalid Model Configs (Raw: '{raw_config}'): No valid configs parsed. Expected format: 'model_id:threshold:max_context'",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
else: else:
@@ -1258,7 +1264,7 @@ class Filter:
if total_tokens > max_context_tokens: if total_tokens > max_context_tokens:
await self._log( await self._log(
f"[Inlet] ⚠️ Candidate prompt ({total_tokens} Tokens) exceeds limit ({max_context_tokens}). Reducing history...", f"[Inlet] ⚠️ Candidate prompt ({total_tokens} Tokens) exceeds limit ({max_context_tokens}). Reducing history...",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1395,7 +1401,7 @@ class Filter:
await self._log( await self._log(
f"[Inlet] Applied summary: {system_info} + Head({len(head_messages)} msg, {head_tokens}t) + Summary({summary_tokens}t) + Tail({len(tail_messages)} msg, {tail_tokens}t) = Total({total_section_tokens}t)", f"[Inlet] Applied summary: {system_info} + Head({len(head_messages)} msg, {head_tokens}t) + Summary({summary_tokens}t) + Tail({len(tail_messages)} msg, {tail_tokens}t) = Total({total_section_tokens}t)",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1455,7 +1461,7 @@ class Filter:
if total_tokens > max_context_tokens: if total_tokens > max_context_tokens:
await self._log( await self._log(
f"[Inlet] ⚠️ Original messages ({total_tokens} Tokens) exceed limit ({max_context_tokens}). Reducing history...", f"[Inlet] ⚠️ Original messages ({total_tokens} Tokens) exceed limit ({max_context_tokens}). Reducing history...",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1523,7 +1529,7 @@ class Filter:
if not chat_id: if not chat_id:
await self._log( await self._log(
"[Outlet] ❌ Missing chat_id in metadata, skipping compression", "[Outlet] ❌ Missing chat_id in metadata, skipping compression",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
return body return body
@@ -1625,7 +1631,7 @@ class Filter:
if current_tokens >= compression_threshold_tokens: if current_tokens >= compression_threshold_tokens:
await self._log( await self._log(
f"[🔍 Background Calculation] ⚡ Compression threshold triggered (Token: {current_tokens} >= {compression_threshold_tokens})", f"[🔍 Background Calculation] ⚡ Compression threshold triggered (Token: {current_tokens} >= {compression_threshold_tokens})",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1648,7 +1654,7 @@ class Filter:
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[🔍 Background Calculation] ❌ Error: {str(e)}", f"[🔍 Background Calculation] ❌ Error: {str(e)}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1687,7 +1693,7 @@ class Filter:
target_compressed_count = max(0, len(messages) - self.valves.keep_last) target_compressed_count = max(0, len(messages) - self.valves.keep_last)
await self._log( await self._log(
f"[🤖 Async Summary Task] ⚠️ target_compressed_count is None, estimating: {target_compressed_count}", f"[🤖 Async Summary Task] ⚠️ target_compressed_count is None, estimating: {target_compressed_count}",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1734,7 +1740,7 @@ class Filter:
if not summary_model_id: if not summary_model_id:
await self._log( await self._log(
"[🤖 Async Summary Task] ⚠️ Summary model does not exist, skipping compression", "[🤖 Async Summary Task] ⚠️ Summary model does not exist, skipping compression",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return return
@@ -1765,7 +1771,7 @@ class Filter:
excess_tokens = estimated_input_tokens - max_context_tokens excess_tokens = estimated_input_tokens - max_context_tokens
await self._log( await self._log(
f"[🤖 Async Summary Task] ⚠️ Middle messages ({middle_tokens} Tokens) + Buffer exceed summary model limit ({max_context_tokens}), need to remove approx {excess_tokens} Tokens", f"[🤖 Async Summary Task] ⚠️ Middle messages ({middle_tokens} Tokens) + Buffer exceed summary model limit ({max_context_tokens}), need to remove approx {excess_tokens} Tokens",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1822,7 +1828,7 @@ class Filter:
if not new_summary: if not new_summary:
await self._log( await self._log(
"[🤖 Async Summary Task] ⚠️ Summary generation returned empty result, skipping save", "[🤖 Async Summary Task] ⚠️ Summary generation returned empty result, skipping save",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return return
@@ -1851,7 +1857,7 @@ class Filter:
await self._log( await self._log(
f"[🤖 Async Summary Task] ✅ Complete! New summary length: {len(new_summary)} characters", f"[🤖 Async Summary Task] ✅ Complete! New summary length: {len(new_summary)} characters",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
await self._log( await self._log(
@@ -1957,14 +1963,14 @@ class Filter:
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[Status] Error calculating tokens: {e}", f"[Status] Error calculating tokens: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[🤖 Async Summary Task] ❌ Error: {str(e)}", f"[🤖 Async Summary Task] ❌ Error: {str(e)}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -2066,7 +2072,7 @@ Based on the content above, generate the summary:
if not model: if not model:
await self._log( await self._log(
"[🤖 LLM Call] ⚠️ Summary model does not exist, skipping summary generation", "[🤖 LLM Call] ⚠️ Summary model does not exist, skipping summary generation",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return "" return ""
@@ -2133,7 +2139,7 @@ Based on the content above, generate the summary:
await self._log( await self._log(
f"[🤖 LLM Call] ✅ Successfully received summary", f"[🤖 LLM Call] ✅ Successfully received summary",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -2154,7 +2160,7 @@ Based on the content above, generate the summary:
await self._log( await self._log(
f"[🤖 LLM Call] ❌ {error_message}", f"[🤖 LLM Call] ❌ {error_message}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )

View File

@@ -5,7 +5,7 @@ author: Fu-Jie
author_url: https://github.com/Fu-Jie/awesome-openwebui author_url: https://github.com/Fu-Jie/awesome-openwebui
funding_url: https://github.com/open-webui funding_url: https://github.com/open-webui
description: 通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。 description: 通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。
version: 1.2.1 version: 1.2.2
openwebui_id: 5c0617cb-a9e4-4bd6-a440-d276534ebd18 openwebui_id: 5c0617cb-a9e4-4bd6-a440-d276534ebd18
license: MIT license: MIT
@@ -787,7 +787,7 @@ class Filter:
except Exception as e: except Exception as e:
print(f"Error emitting debug log: {e}") print(f"Error emitting debug log: {e}")
async def _log(self, message: str, type: str = "info", event_call=None): async def _log(self, message: str, log_type: str = "info", event_call=None):
"""统一日志输出到后端 (print) 和前端 (console.log)""" """统一日志输出到后端 (print) 和前端 (console.log)"""
# 后端日志 # 后端日志
if self.valves.debug_mode: if self.valves.debug_mode:
@@ -797,11 +797,11 @@ class Filter:
if self.valves.show_debug_log and event_call: if self.valves.show_debug_log and event_call:
try: try:
css = "color: #3b82f6;" # 默认蓝色 css = "color: #3b82f6;" # 默认蓝色
if type == "error": if log_type == "error":
css = "color: #ef4444; font-weight: bold;" # 红色 css = "color: #ef4444; font-weight: bold;" # 红色
elif type == "warning": elif log_type == "warning":
css = "color: #f59e0b;" # 橙色 css = "color: #f59e0b;" # 橙色
elif type == "success": elif log_type == "success":
css = "color: #10b981; font-weight: bold;" # 绿色 css = "color: #10b981; font-weight: bold;" # 绿色
# 清理前端消息:移除分隔符和多余换行 # 清理前端消息:移除分隔符和多余换行
@@ -948,12 +948,17 @@ class Filter:
# 处理 params 是 JSON 字符串的情况 # 处理 params 是 JSON 字符串的情况
if isinstance(params, str): if isinstance(params, str):
params = json.loads(params) params = json.loads(params)
# 转换 Pydantic 模型为字典
elif hasattr(params, "model_dump"):
params = params.model_dump()
elif hasattr(params, "dict"):
params = params.dict()
# 处理字典或 Pydantic 对象 # 处理字典
if isinstance(params, dict): if isinstance(params, dict):
system_prompt_content = params.get("system") system_prompt_content = params.get("system")
else: else:
# 假设是 Pydantic 模型或对象 # 回退:尝试 getattr
system_prompt_content = getattr(params, "system", None) system_prompt_content = getattr(params, "system", None)
if system_prompt_content: if system_prompt_content:
@@ -972,7 +977,7 @@ class Filter:
if self.valves.show_debug_log and __event_call__: if self.valves.show_debug_log and __event_call__:
await self._log( await self._log(
f"[Inlet] ❌ 解析模型参数失败: {e}", f"[Inlet] ❌ 解析模型参数失败: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -986,7 +991,7 @@ class Filter:
if self.valves.show_debug_log and __event_call__: if self.valves.show_debug_log and __event_call__:
await self._log( await self._log(
f"[Inlet] ❌ 数据库中未找到模型", f"[Inlet] ❌ 数据库中未找到模型",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -994,7 +999,7 @@ class Filter:
if self.valves.show_debug_log and __event_call__: if self.valves.show_debug_log and __event_call__:
await self._log( await self._log(
f"[Inlet] ❌ 从数据库获取系统提示词错误: {e}", f"[Inlet] ❌ 从数据库获取系统提示词错误: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
if self.valves.debug_mode: if self.valves.debug_mode:
@@ -1048,7 +1053,7 @@ class Filter:
if not chat_id: if not chat_id:
await self._log( await self._log(
"[Inlet] ❌ metadata 中缺少 chat_id跳过压缩", "[Inlet] ❌ metadata 中缺少 chat_id跳过压缩",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
return body return body
@@ -1154,7 +1159,7 @@ class Filter:
if total_tokens > max_context_tokens: if total_tokens > max_context_tokens:
await self._log( await self._log(
f"[Inlet] ⚠️ 候选提示词 ({total_tokens} Tokens) 超过上限 ({max_context_tokens})。正在缩减历史记录...", f"[Inlet] ⚠️ 候选提示词 ({total_tokens} Tokens) 超过上限 ({max_context_tokens})。正在缩减历史记录...",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1290,7 +1295,7 @@ class Filter:
await self._log( await self._log(
f"[Inlet] 应用摘要: {system_info} + Head({len(head_messages)} 条, {head_tokens}t) + Summary({summary_tokens}t) + Tail({len(tail_messages)} 条, {tail_tokens}t) = Total({total_section_tokens}t)", f"[Inlet] 应用摘要: {system_info} + Head({len(head_messages)} 条, {head_tokens}t) + Summary({summary_tokens}t) + Tail({len(tail_messages)} 条, {tail_tokens}t) = Total({total_section_tokens}t)",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1350,7 +1355,7 @@ class Filter:
if total_tokens > max_context_tokens: if total_tokens > max_context_tokens:
await self._log( await self._log(
f"[Inlet] ⚠️ 原始消息 ({total_tokens} Tokens) 超过上限 ({max_context_tokens})。正在缩减历史记录...", f"[Inlet] ⚠️ 原始消息 ({total_tokens} Tokens) 超过上限 ({max_context_tokens})。正在缩减历史记录...",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1420,7 +1425,7 @@ class Filter:
if not chat_id: if not chat_id:
await self._log( await self._log(
"[Outlet] ❌ metadata 中缺少 chat_id跳过压缩", "[Outlet] ❌ metadata 中缺少 chat_id跳过压缩",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
return body return body
@@ -1486,7 +1491,7 @@ class Filter:
if current_tokens >= compression_threshold_tokens: if current_tokens >= compression_threshold_tokens:
await self._log( await self._log(
f"[🔍 后台计算] ⚡ 触发压缩阈值 (Token: {current_tokens} >= {compression_threshold_tokens})", f"[🔍 后台计算] ⚡ 触发压缩阈值 (Token: {current_tokens} >= {compression_threshold_tokens})",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1509,7 +1514,7 @@ class Filter:
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[🔍 后台计算] ❌ 错误: {str(e)}", f"[🔍 后台计算] ❌ 错误: {str(e)}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1546,7 +1551,7 @@ class Filter:
target_compressed_count = max(0, len(messages) - self.valves.keep_last) target_compressed_count = max(0, len(messages) - self.valves.keep_last)
await self._log( await self._log(
f"[🤖 异步摘要任务] ⚠️ target_compressed_count 为 None进行估算: {target_compressed_count}", f"[🤖 异步摘要任务] ⚠️ target_compressed_count 为 None进行估算: {target_compressed_count}",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1593,7 +1598,7 @@ class Filter:
if not summary_model_id: if not summary_model_id:
await self._log( await self._log(
"[🤖 异步摘要任务] ⚠️ 摘要模型不存在,跳过压缩", "[🤖 异步摘要任务] ⚠️ 摘要模型不存在,跳过压缩",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return return
@@ -1624,7 +1629,7 @@ class Filter:
excess_tokens = estimated_input_tokens - max_context_tokens excess_tokens = estimated_input_tokens - max_context_tokens
await self._log( await self._log(
f"[🤖 异步摘要任务] ⚠️ 中间消息 ({middle_tokens} Tokens) + 缓冲超过摘要模型上限 ({max_context_tokens}),需要移除约 {excess_tokens} Token", f"[🤖 异步摘要任务] ⚠️ 中间消息 ({middle_tokens} Tokens) + 缓冲超过摘要模型上限 ({max_context_tokens}),需要移除约 {excess_tokens} Token",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1681,7 +1686,7 @@ class Filter:
if not new_summary: if not new_summary:
await self._log( await self._log(
"[🤖 异步摘要任务] ⚠️ 摘要生成返回空结果,跳过保存", "[🤖 异步摘要任务] ⚠️ 摘要生成返回空结果,跳过保存",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return return
@@ -1710,7 +1715,7 @@ class Filter:
await self._log( await self._log(
f"[🤖 异步摘要任务] ✅ 完成!新摘要长度: {len(new_summary)} 字符", f"[🤖 异步摘要任务] ✅ 完成!新摘要长度: {len(new_summary)} 字符",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
await self._log( await self._log(
@@ -1821,14 +1826,14 @@ class Filter:
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[Status] 计算 Token 错误: {e}", f"[Status] 计算 Token 错误: {e}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
except Exception as e: except Exception as e:
await self._log( await self._log(
f"[🤖 异步摘要任务] ❌ 错误: {str(e)}", f"[🤖 异步摘要任务] ❌ 错误: {str(e)}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -1928,7 +1933,7 @@ class Filter:
if not model: if not model:
await self._log( await self._log(
"[🤖 LLM 调用] ⚠️ 摘要模型不存在,跳过摘要生成", "[🤖 LLM 调用] ⚠️ 摘要模型不存在,跳过摘要生成",
type="warning", log_type="warning",
event_call=__event_call__, event_call=__event_call__,
) )
return "" return ""
@@ -1995,7 +2000,7 @@ class Filter:
await self._log( await self._log(
f"[🤖 LLM 调用] ✅ 成功接收摘要", f"[🤖 LLM 调用] ✅ 成功接收摘要",
type="success", log_type="success",
event_call=__event_call__, event_call=__event_call__,
) )
@@ -2016,7 +2021,7 @@ class Filter:
await self._log( await self._log(
f"[🤖 LLM 调用] ❌ {error_message}", f"[🤖 LLM 调用] ❌ {error_message}",
type="error", log_type="error",
event_call=__event_call__, event_call=__event_call__,
) )

View File

@@ -1,10 +1,17 @@
# Folder Memory # Folder Memory
English | [中文](./README_CN.md) **Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.1.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
**Folder Memory** (formerly Folder Rule Collector) is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt. ---
This ensures that all future conversations within that folder share the same evolved context and rules, without manual updates. ### 📌 What's new in 0.1.0
- **Initial Release**: Automated "Project Rules" management for OpenWebUI folders.
- **Folder-Level Persistence**: Automatically updates folder system prompts with extracted rules.
- **Optimized Performance**: Runs asynchronously and supports `PRIORITY` configuration for seamless integration with other filters.
---
**Folder Memory** is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt.
## ✨ Features ## ✨ Features
@@ -13,6 +20,10 @@ This ensures that all future conversations within that folder share the same evo
- **Async Processing**: Runs in the background without blocking the user's chat experience. - **Async Processing**: Runs in the background without blocking the user's chat experience.
- **ORM Integration**: Directly updates folder data using OpenWebUI's internal models for reliability. - **ORM Integration**: Directly updates folder data using OpenWebUI's internal models for reliability.
## ⚠️ Prerequisites
- **Conversations must occur inside a folder.** This plugin only triggers when a chat belongs to a folder (i.e., you need to create a folder in OpenWebUI and start a conversation within it).
## 📦 Installation ## 📦 Installation
1. Copy `folder_memory.py` to your OpenWebUI `plugins/filters/` directory (or upload via Admin UI). 1. Copy `folder_memory.py` to your OpenWebUI `plugins/filters/` directory (or upload via Admin UI).

View File

@@ -1,8 +1,17 @@
# 文件夹记忆 (Folder Memory) # 文件夹记忆 (Folder Memory)
[English](./README.md) | 中文 **作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.1.0 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
**文件夹记忆 (Folder Memory)** (原名 Folder Rule Collector) 是一个 OpenWebUI 的智能上下文过滤器插件。它能自动从文件夹内的对话中提取一致性的“项目规则”,并将其回写到文件夹的系统提示词中。 ---
### 📌 0.1.0 版本特性
- **首个版本发布**:专注于自动化的“项目规则”管理。
- **文件夹级持久化**:自动将提取的规则回写到文件夹系统提示词中。
- **性能优化**:采用异步处理机制,并支持 `PRIORITY` 配置,确保与其他过滤器(如上下文压缩)完美协作。
---
**文件夹记忆 (Folder Memory)** 是一个 OpenWebUI 的智能上下文过滤器插件。它能自动从文件夹内的对话中提取一致性的“项目规则”,并将其回写到文件夹的系统提示词中。
这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。 这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。
@@ -13,6 +22,10 @@
- **异步处理**:在后台运行,不阻塞用户的聊天体验。 - **异步处理**:在后台运行,不阻塞用户的聊天体验。
- **ORM 集成**:直接使用 OpenWebUI 的内部模型更新文件夹数据,确保可靠性。 - **ORM 集成**:直接使用 OpenWebUI 的内部模型更新文件夹数据,确保可靠性。
## ⚠️ 前置条件
- **对话必须在文件夹内进行。** 此插件仅在聊天属于某个文件夹时触发(即您需要先在 OpenWebUI 中创建一个文件夹,并在其内部开始对话)。
## 📦 安装指南 ## 📦 安装指南
1.`folder_memory.py` (或中文版 `folder_memory_cn.py`) 复制到 OpenWebUI 的 `plugins/filters/` 目录(或通过管理员 UI 上传)。 1.`folder_memory.py` (或中文版 `folder_memory_cn.py`) 复制到 OpenWebUI 的 `plugins/filters/` 目录(或通过管理员 UI 上传)。

View File

@@ -217,6 +217,23 @@ def format_markdown_table(plugins: list[dict]) -> str:
return "\n".join(lines) return "\n".join(lines)
def _get_readme_url(file_path: str) -> str:
"""
Generate GitHub README URL from plugin file path.
从插件文件路径生成 GitHub README 链接。
"""
if not file_path:
return ""
# Extract plugin directory (e.g., plugins/filters/folder-memory/folder_memory.py -> plugins/filters/folder-memory)
from pathlib import Path
plugin_dir = Path(file_path).parent
# Convert to GitHub URL
return (
f"https://github.com/Fu-Jie/awesome-openwebui/blob/main/{plugin_dir}/README.md"
)
def format_release_notes( def format_release_notes(
comparison: dict[str, list], ignore_removed: bool = False comparison: dict[str, list], ignore_removed: bool = False
) -> str: ) -> str:
@@ -229,9 +246,12 @@ def format_release_notes(
if comparison["added"]: if comparison["added"]:
lines.append("### 新增插件 / New Plugins") lines.append("### 新增插件 / New Plugins")
for plugin in comparison["added"]: for plugin in comparison["added"]:
readme_url = _get_readme_url(plugin.get("file_path", ""))
lines.append(f"- **{plugin['title']}** v{plugin['version']}") lines.append(f"- **{plugin['title']}** v{plugin['version']}")
if plugin.get("description"): if plugin.get("description"):
lines.append(f" - {plugin['description']}") lines.append(f" - {plugin['description']}")
if readme_url:
lines.append(f" - 📖 [README / 文档]({readme_url})")
lines.append("") lines.append("")
if comparison["updated"]: if comparison["updated"]:
@@ -258,7 +278,10 @@ def format_release_notes(
) )
prev_ver = prev_manifest.get("version") or prev.get("version") prev_ver = prev_manifest.get("version") or prev.get("version")
readme_url = _get_readme_url(curr.get("file_path", ""))
lines.append(f"- **{curr_title}**: v{prev_ver} → v{curr_ver}") lines.append(f"- **{curr_title}**: v{prev_ver} → v{curr_ver}")
if readme_url:
lines.append(f" - 📖 [README / 文档]({readme_url})")
lines.append("") lines.append("")
if comparison["removed"] and not ignore_removed: if comparison["removed"] and not ignore_removed: