Compare commits

...

26 Commits

Author SHA1 Message Date
fujie
3b11537b5e docs: sync markdown_normalizer 1.2.2 2026-01-17 18:53:05 +08:00
github-actions[bot]
e51d87ae80 chore: update community stats - plugin version updated 2026-01-17 09:07:56 +00:00
Jeff
f16e7c996c Merge pull request #32 from Fu-Jie/all-contributors/add-nahoj
docs: add nahoj as a contributor for ideas
2026-01-17 16:35:15 +08:00
allcontributors[bot]
55eb295c12 docs: update .all-contributorsrc [skip ci] 2026-01-17 08:32:48 +00:00
allcontributors[bot]
4767351c5e docs: update README.md [skip ci] 2026-01-17 08:32:47 +00:00
fujie
1d2502eb3f feat(markdown_normalizer): add details tag normalization and update documentation 2026-01-17 16:30:46 +08:00
fujie
94540cc131 feat(markdown_normalizer): add details tag normalization and update documentation 2026-01-17 16:30:14 +08:00
fujie
71bef146c8 docs: standardize plugin READMEs and documentation rules 2026-01-17 16:26:43 +08:00
github-actions[bot]
87e47fd4b2 chore: update community stats - followers increased (117 -> 118) 2026-01-17 04:15:52 +00:00
github-actions[bot]
2da600838c chore: update community stats - followers increased (116 -> 117) 2026-01-17 01:36:26 +00:00
github-actions[bot]
4ee34c1dc6 chore: update community stats - followers increased (114 -> 116) 2026-01-17 00:33:42 +00:00
github-actions[bot]
9a854c33d3 chore: update community stats - followers increased (113 -> 114) 2026-01-16 22:08:08 +00:00
github-actions[bot]
ae19653a8f chore: update community stats - points increased (107 -> 108) 2026-01-16 20:09:28 +00:00
github-actions[bot]
caf0acf2e1 chore: update community stats - followers increased (112 -> 113) 2026-01-16 18:12:25 +00:00
github-actions[bot]
b503ad6fd2 chore: update community stats - points increased (106 -> 107), followers increased (111 -> 112) 2026-01-16 16:10:41 +00:00
github-actions[bot]
357e869a15 chore: update community stats - followers increased (110 -> 111) 2026-01-16 12:14:19 +00:00
github-actions[bot]
3035c79d91 chore: update community stats - followers increased (108 -> 110) 2026-01-16 00:35:50 +00:00
github-actions[bot]
a5e5e178a0 chore: update community stats - followers increased (107 -> 108) 2026-01-15 16:14:45 +00:00
github-actions[bot]
d20081d3ed chore: update community stats - followers increased (106 -> 107) 2026-01-15 13:20:39 +00:00
github-actions[bot]
e2d94ba5b5 chore: update community stats - followers increased (105 -> 106) 2026-01-15 12:14:41 +00:00
github-actions[bot]
49a19242a4 chore: update community stats - followers increased (104 -> 105) 2026-01-15 09:11:33 +00:00
github-actions[bot]
c26d3b30e5 chore: update community stats - points increased (104 -> 106) 2026-01-14 20:08:17 +00:00
fujie
60e681042d chore: smart stats update - only commit on meaningful changes 2026-01-15 00:34:45 +08:00
Jeff
842d65b887 Update README to remove Gemini filters
Removed Gemini Manifold Companion and Gemini Multimodal Filter from the README.
2026-01-15 00:33:38 +08:00
Jeff
ff5cecca1c Update README to remove deprecated filters
Removed the Multi-Model Context Merger and Gemini Manifold entries from the README.
2026-01-15 00:32:38 +08:00
Jeff
b447143a50 Delete plugins/filters/multi_model_context_merger.py 2026-01-15 00:28:14 +08:00
44 changed files with 1064 additions and 1420 deletions

View File

@@ -0,0 +1,30 @@
---
description: Standards for OpenWebUI Plugin Development, specifically README formatting.
globs: plugins/**
always_on: true
---
# Plugin Development Standards
## README Documentation
All plugins MUST follow the standard README template.
**Reference Template**: @docs/PLUGIN_README_TEMPLATE.md
### Language Requirements
- **English Version (`README.md`)**: The primary documentation source. Must follow the template strictly.
- **Chinese Version (`README_CN.md`)**: MUST be translated based on the English version (`README.md`) to ensure consistency in structure and content.
### Metadata Requirements
The metadata line must follow this format:
`**Author:** [Name](Link) | **Version:** [X.Y.Z] | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT`
### Structure Checklist
1. **Title & Description**
2. **Metadata Line** (Author, Version, Project, License)
3. **Preview** (Screenshots/GIFs)
4. **What's New** (Keep last 3 versions)
5. **Key Features**
6. **How to Use**
7. **Configuration (Valves)**
8. **Troubleshooting** (Must include link to GitHub Issues)

View File

@@ -36,6 +36,15 @@
"bug",
"ideas"
]
},
{
"login": "nahoj",
"name": "Johan Grande",
"avatar_url": "https://avatars.githubusercontent.com/u/469017?v=4",
"profile": "https://perso.crans.org/grande/",
"contributions": [
"ideas"
]
}
],
"contributorsPerLine": 7,

View File

@@ -1,5 +1,9 @@
# OpenWebUI 社区统计报告自动生成
# 只在统计数据变化时 commit避免频繁提交
# 智能检测:只在有意义的变更时才 commit
# - 新增插件 (total_posts)
# - 插件版本变更 (version)
# - 积分增加 (total_points)
# - 粉丝增加 (followers)
name: Community Stats
@@ -31,9 +35,23 @@ jobs:
- name: Install dependencies
run: |
pip install requests python-dotenv
- name: Capture existing stats (before update)
id: old_stats
run: |
if [ -f docs/community-stats.json ]; then
echo "total_posts=$(jq -r '.total_posts // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
echo "total_points=$(jq -r '.user.total_points // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
echo "followers=$(jq -r '.user.followers // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
# 提取所有插件的版本号,生成一个排序后的字符串用于比较
echo "versions=$(jq -r '[.posts[].version] | sort | join(",")' docs/community-stats.json)" >> $GITHUB_OUTPUT
else
echo "total_posts=0" >> $GITHUB_OUTPUT
echo "total_points=0" >> $GITHUB_OUTPUT
echo "followers=0" >> $GITHUB_OUTPUT
echo "versions=" >> $GITHUB_OUTPUT
fi
- name: Generate stats report
env:
OPENWEBUI_API_KEY: ${{ secrets.OPENWEBUI_API_KEY }}
@@ -41,10 +59,71 @@ jobs:
run: |
python scripts/openwebui_stats.py
- name: Capture new stats (after update)
id: new_stats
run: |
echo "total_posts=$(jq -r '.total_posts // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
echo "total_points=$(jq -r '.user.total_points // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
echo "followers=$(jq -r '.user.followers // 0' docs/community-stats.json)" >> $GITHUB_OUTPUT
echo "versions=$(jq -r '[.posts[].version] | sort | join(",")' docs/community-stats.json)" >> $GITHUB_OUTPUT
- name: Check for significant changes
id: check_changes
run: |
OLD_POSTS="${{ steps.old_stats.outputs.total_posts }}"
NEW_POSTS="${{ steps.new_stats.outputs.total_posts }}"
OLD_POINTS="${{ steps.old_stats.outputs.total_points }}"
NEW_POINTS="${{ steps.new_stats.outputs.total_points }}"
OLD_FOLLOWERS="${{ steps.old_stats.outputs.followers }}"
NEW_FOLLOWERS="${{ steps.new_stats.outputs.followers }}"
OLD_VERSIONS="${{ steps.old_stats.outputs.versions }}"
NEW_VERSIONS="${{ steps.new_stats.outputs.versions }}"
SHOULD_COMMIT="false"
CHANGE_REASON=""
# 检查新增插件
if [ "$NEW_POSTS" -gt "$OLD_POSTS" ]; then
SHOULD_COMMIT="true"
CHANGE_REASON="new plugin added ($OLD_POSTS -> $NEW_POSTS)"
echo "📦 New plugin detected: $OLD_POSTS -> $NEW_POSTS"
fi
# 检查版本变更
if [ "$OLD_VERSIONS" != "$NEW_VERSIONS" ]; then
SHOULD_COMMIT="true"
CHANGE_REASON="${CHANGE_REASON:+$CHANGE_REASON, }plugin version updated"
echo "🔄 Plugin version changed"
fi
# 检查积分增加
if [ "$NEW_POINTS" -gt "$OLD_POINTS" ]; then
SHOULD_COMMIT="true"
CHANGE_REASON="${CHANGE_REASON:+$CHANGE_REASON, }points increased ($OLD_POINTS -> $NEW_POINTS)"
echo "⭐ Points increased: $OLD_POINTS -> $NEW_POINTS"
fi
# 检查粉丝增加
if [ "$NEW_FOLLOWERS" -gt "$OLD_FOLLOWERS" ]; then
SHOULD_COMMIT="true"
CHANGE_REASON="${CHANGE_REASON:+$CHANGE_REASON, }followers increased ($OLD_FOLLOWERS -> $NEW_FOLLOWERS)"
echo "👥 Followers increased: $OLD_FOLLOWERS -> $NEW_FOLLOWERS"
fi
echo "should_commit=$SHOULD_COMMIT" >> $GITHUB_OUTPUT
echo "change_reason=$CHANGE_REASON" >> $GITHUB_OUTPUT
if [ "$SHOULD_COMMIT" = "false" ]; then
echo " No significant changes detected, skipping commit"
else
echo "✅ Significant changes detected: $CHANGE_REASON"
fi
- name: Commit and push changes
if: steps.check_changes.outputs.should_commit == 'true'
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add docs/community-stats.zh.md docs/community-stats.md docs/community-stats.json README.md README_CN.md
git diff --staged --quiet || git commit -m "chore: update community stats $(date +'%Y-%m-%d')"
git add docs/community-stats.zh.md docs/community-stats.md docs/community-stats.json docs/badges README.md README_CN.md
git diff --staged --quiet || git commit -m "chore: update community stats - ${{ steps.check_changes.outputs.change_reason }}"
git push

View File

@@ -1,6 +1,6 @@
# OpenWebUI Extras
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-)
[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
English | [中文](./README_CN.md)
@@ -10,28 +10,28 @@ A collection of enhancements, plugins, and prompts for [OpenWebUI](https://githu
<!-- STATS_START -->
## 📊 Community Stats
> 🕐 Auto-updated: 2026-01-15 00:11
> 🕐 Auto-updated: 2026-01-17 17:07
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
|:---:|:---:|:---:|:---:|
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **104** | **104** | **25** |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **118** | **108** | **25** |
| 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves |
|:---:|:---:|:---:|:---:|:---:|
| **16** | **1451** | **16966** | **91** | **108** |
| **16** | **1622** | **19716** | **94** | **123** |
### 🔥 Top 6 Popular Plugins
> 🕐 Auto-updated: 2026-01-15 00:11
> 🕐 Auto-updated: 2026-01-17 17:07
| Rank | Plugin | Version | Downloads | Views | Updated |
|:---:|------|:---:|:---:|:---:|:---:|
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 451 | 4028 | 2026-01-07 |
| 🥈 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 194 | 671 | 2026-01-07 |
| 🥉 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 185 | 1906 | 2026-01-11 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.1.3 | 156 | 1743 | 2026-01-11 |
| 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 122 | 1084 | 2026-01-07 |
| 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 116 | 2059 | 2026-01-07 |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 503 | 4601 | 2026-01-17 |
| 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 217 | 2232 | 2026-01-17 |
| 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 202 | 747 | 2026-01-07 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.1.3 | 171 | 1889 | 2026-01-17 |
| 5⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 131 | 2254 | 2026-01-17 |
| 6⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 130 | 1234 | 2026-01-17 |
*See full stats in [Community Stats Report](./docs/community-stats.md)*
<!-- STATS_END -->
@@ -53,14 +53,7 @@ Located in the `plugins/` directory, containing Python-based enhancements:
#### Filters
- **Async Context Compression** (`async-context-compression`): Optimizes token usage via context compression.
- **Context Enhancement** (`context_enhancement_filter`): Enhances chat context.
- **Gemini Manifold Companion** (`gemini_manifold_companion`): Companion filter for Gemini Manifold.
- **Gemini Multimodal Filter** (`web_gemini_multimodel_filter`): Provides multimodal capabilities (PDF, Office, Video) for any model via Gemini.
- **Markdown Normalizer** (`markdown_normalizer`): Fixes common Markdown formatting issues in LLM outputs.
- **Multi-Model Context Merger** (`multi_model_context_merger`): Automatically merges and injects context from multiple model responses.
#### Pipes
- **Gemini Manifold** (`gemini_mainfold`): Pipeline for Gemini model integration.
#### Pipelines
- **MoE Prompt Refiner** (`moe_prompt_refiner`): Refines prompts for Mixture of Experts (MoE) summary requests to generate high-quality comprehensive reports.
@@ -126,6 +119,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rbb-dev"><img src="https://avatars.githubusercontent.com/u/37469229?v=4?s=100" width="100px;" alt="rbb-dev"/><br /><sub><b>rbb-dev</b></sub></a><br /><a href="#ideas-rbb-dev" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/Fu-Jie/awesome-openwebui/commits?author=rbb-dev" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://trade.xyz/?ref=BZ1RJRXWO"><img src="https://avatars.githubusercontent.com/u/7317522?v=4?s=100" width="100px;" alt="Raxxoor"/><br /><sub><b>Raxxoor</b></sub></a><br /><a href="https://github.com/Fu-Jie/awesome-openwebui/issues?q=author%3Adhaern" title="Bug reports">🐛</a> <a href="#ideas-dhaern" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/i-iooi-i"><img src="https://avatars.githubusercontent.com/u/1827701?v=4?s=100" width="100px;" alt="ZOLO"/><br /><sub><b>ZOLO</b></sub></a><br /><a href="https://github.com/Fu-Jie/awesome-openwebui/issues?q=author%3Ai-iooi-i" title="Bug reports">🐛</a> <a href="#ideas-i-iooi-i" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://perso.crans.org/grande/"><img src="https://avatars.githubusercontent.com/u/469017?v=4?s=100" width="100px;" alt="Johan Grande"/><br /><sub><b>Johan Grande</b></sub></a><br /><a href="#ideas-nahoj" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr>
</tbody>
</table>

View File

@@ -7,28 +7,28 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
<!-- STATS_START -->
## 📊 社区统计
> 🕐 自动更新于 2026-01-15 00:11
> 🕐 自动更新于 2026-01-17 17:07
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
|:---:|:---:|:---:|:---:|
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **104** | **104** | **25** |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | **118** | **108** | **25** |
| 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 |
|:---:|:---:|:---:|:---:|:---:|
| **16** | **1451** | **16966** | **91** | **108** |
| **16** | **1622** | **19716** | **94** | **123** |
### 🔥 热门插件 Top 6
> 🕐 自动更新于 2026-01-15 00:11
> 🕐 自动更新于 2026-01-17 17:07
| 排名 | 插件 | 版本 | 下载 | 浏览 | 更新日期 |
|:---:|------|:---:|:---:|:---:|:---:|
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 451 | 4028 | 2026-01-07 |
| 🥈 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 194 | 671 | 2026-01-07 |
| 🥉 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 185 | 1906 | 2026-01-11 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.1.3 | 156 | 1743 | 2026-01-11 |
| 5⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 122 | 1084 | 2026-01-07 |
| 6⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 116 | 2059 | 2026-01-07 |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | 0.9.1 | 503 | 4601 | 2026-01-17 |
| 🥈 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | 1.4.9 | 217 | 2232 | 2026-01-17 |
| 🥉 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | 0.3.7 | 202 | 747 | 2026-01-07 |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | 1.1.3 | 171 | 1889 | 2026-01-17 |
| 5⃣ | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | 0.2.4 | 131 | 2254 | 2026-01-17 |
| 6⃣ | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | 0.4.3 | 130 | 1234 | 2026-01-17 |
*完整统计请查看 [社区统计报告](./docs/community-stats.zh.md)*
<!-- STATS_END -->

View File

@@ -0,0 +1,44 @@
<!--
NOTE: This template is for the English version (README.md).
The Chinese version (README_CN.md) MUST be translated based on this English version to ensure consistency in structure and content.
-->
# [Plugin Name] [Optional Emoji]
[Brief description of what the plugin does. Keep it concise and engaging.]
**Author:** [Fu-Jie](https://github.com/Fu-Jie) | **Version:** 1.0.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
## What's New
<!-- Keep the changelog for the last 3 versions here. Remove this section for the initial release. -->
### v1.0.0
- **Initial Release**: Released the first version of the plugin.
- **[Feature Name]**: [Brief description of the feature].
## Key Features 🔑
- **[Feature 1]**: [Description of feature 1].
- **[Feature 2]**: [Description of feature 2].
- **[Feature 3]**: [Description of feature 3].
## How to Use 🛠️
1. **Install**: Add the plugin to your OpenWebUI instance.
2. **Configure**: Adjust settings in the Valves menu (optional).
3. **[Action Step]**: Describe how to trigger or use the plugin.
4. **[Result Step]**: Describe the expected outcome.
## Configuration (Valves) ⚙️
| Valve | Default | Description |
|-------|---------|-------------|
| `VALVE_NAME` | `Default Value` | Description of what this setting does. |
| `ANOTHER_VALVE` | `True` | Another setting description. |
## Troubleshooting ❓
- **Plugin not working?**: Check if the filter/action is enabled in the model settings.
- **Debug Logs**: Enable `SHOW_DEBUG_LOG` in Valves and check the browser console (F12) for detailed logs.
- **Error Messages**: If you see an error, please copy the full error message and report it.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

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

View File

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

6
docs/badges/plugins.json Normal file
View File

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

6
docs/badges/points.json Normal file
View File

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

6
docs/badges/upvotes.json Normal file
View File

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

View File

@@ -1,14 +1,14 @@
{
"total_posts": 16,
"total_downloads": 1451,
"total_views": 16966,
"total_upvotes": 91,
"total_downloads": 1622,
"total_views": 19716,
"total_upvotes": 94,
"total_downvotes": 2,
"total_saves": 108,
"total_saves": 123,
"total_comments": 23,
"by_type": {
"unknown": 2,
"action": 14
"action": 14,
"unknown": 2
},
"posts": [
{
@@ -18,31 +18,15 @@
"version": "0.9.1",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 451,
"views": 4028,
"upvotes": 12,
"saves": 26,
"downloads": 503,
"views": 4601,
"upvotes": 13,
"saves": 28,
"comments": 11,
"created_at": "2025-12-30",
"updated_at": "2026-01-07",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a"
},
{
"title": "Export to Excel",
"slug": "export_mulit_table_to_excel_244b8f9d",
"type": "action",
"version": "0.3.7",
"author": "Fu-Jie",
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
"downloads": 194,
"views": 671,
"upvotes": 3,
"saves": 4,
"comments": 0,
"created_at": "2025-05-30",
"updated_at": "2026-01-07",
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
},
{
"title": "📊 Smart Infographic (AntV)",
"slug": "smart_infographic_ad6f0c7f",
@@ -50,15 +34,31 @@
"version": "1.4.9",
"author": "Fu-Jie",
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
"downloads": 185,
"views": 1906,
"upvotes": 9,
"saves": 13,
"downloads": 217,
"views": 2232,
"upvotes": 10,
"saves": 15,
"comments": 2,
"created_at": "2025-12-28",
"updated_at": "2026-01-11",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f"
},
{
"title": "Export to Excel",
"slug": "export_mulit_table_to_excel_244b8f9d",
"type": "action",
"version": "0.3.7",
"author": "Fu-Jie",
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
"downloads": 202,
"views": 747,
"upvotes": 3,
"saves": 5,
"comments": 0,
"created_at": "2025-05-30",
"updated_at": "2026-01-07",
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
},
{
"title": "Async Context Compression",
"slug": "async_context_compression_b1655bc8",
@@ -66,31 +66,15 @@
"version": "1.1.3",
"author": "Fu-Jie",
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
"downloads": 156,
"views": 1743,
"downloads": 171,
"views": 1889,
"upvotes": 7,
"saves": 15,
"saves": 18,
"comments": 0,
"created_at": "2025-11-08",
"updated_at": "2026-01-11",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
},
{
"title": "Export to Word (Enhanced)",
"slug": "export_to_word_enhanced_formatting_fca6a315",
"type": "action",
"version": "0.4.3",
"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": 122,
"views": 1084,
"upvotes": 6,
"saves": 11,
"comments": 0,
"created_at": "2026-01-03",
"updated_at": "2026-01-07",
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
},
{
"title": "Flash Card",
"slug": "flash_card_65a2ea8f",
@@ -98,30 +82,30 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
"downloads": 116,
"views": 2059,
"downloads": 131,
"views": 2254,
"upvotes": 8,
"saves": 10,
"comments": 2,
"created_at": "2025-12-30",
"updated_at": "2026-01-07",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/flash_card_65a2ea8f"
},
{
"title": "Deep Dive",
"slug": "deep_dive_c0b846e4",
"title": "Export to Word (Enhanced)",
"slug": "export_to_word_enhanced_formatting_fca6a315",
"type": "action",
"version": "1.0.0",
"version": "0.4.3",
"author": "Fu-Jie",
"description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.",
"downloads": 54,
"views": 523,
"upvotes": 3,
"saves": 4,
"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": 130,
"views": 1234,
"upvotes": 6,
"saves": 14,
"comments": 0,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
"created_at": "2026-01-03",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
},
{
"title": "导出为 Word (增强版)",
@@ -130,15 +114,47 @@
"version": "0.4.3",
"author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 49,
"views": 1155,
"downloads": 58,
"views": 1246,
"upvotes": 9,
"saves": 3,
"comments": 1,
"created_at": "2026-01-04",
"updated_at": "2026-01-07",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0"
},
{
"title": "Markdown Normalizer",
"slug": "markdown_normalizer_baaa8732",
"type": "action",
"version": "1.2.0",
"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": 57,
"views": 1681,
"upvotes": 8,
"saves": 14,
"comments": 5,
"created_at": "2026-01-12",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
},
{
"title": "Deep Dive",
"slug": "deep_dive_c0b846e4",
"type": "action",
"version": "1.0.0",
"author": "Fu-Jie",
"description": "A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.",
"downloads": 57,
"views": 597,
"upvotes": 3,
"saves": 5,
"comments": 0,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
},
{
"title": "📊 智能信息图 (AntV Infographic)",
"slug": "智能信息图_e04a48ff",
@@ -147,30 +163,14 @@
"author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 41,
"views": 603,
"views": 650,
"upvotes": 4,
"saves": 0,
"comments": 0,
"created_at": "2025-12-28",
"updated_at": "2026-01-11",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/智能信息图_e04a48ff"
},
{
"title": "Markdown Normalizer",
"slug": "markdown_normalizer_baaa8732",
"type": "action",
"version": "1.1.2",
"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": 30,
"views": 1095,
"upvotes": 7,
"saves": 11,
"comments": 5,
"created_at": "2026-01-12",
"updated_at": "2026-01-13",
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
},
{
"title": "思维导图",
"slug": "智能生成交互式思维导图帮助用户可视化知识_8d4b097b",
@@ -178,13 +178,13 @@
"version": "0.9.1",
"author": "Fu-Jie",
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
"downloads": 21,
"views": 369,
"downloads": 22,
"views": 389,
"upvotes": 2,
"saves": 1,
"comments": 0,
"created_at": "2025-12-31",
"updated_at": "2026-01-07",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b"
},
{
@@ -195,12 +195,12 @@
"author": "Fu-Jie",
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
"downloads": 14,
"views": 315,
"views": 337,
"upvotes": 4,
"saves": 1,
"comments": 0,
"created_at": "2025-11-08",
"updated_at": "2026-01-11",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/异步上下文压缩_5c0617cb"
},
{
@@ -210,13 +210,13 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 12,
"views": 405,
"downloads": 13,
"views": 423,
"upvotes": 4,
"saves": 1,
"comments": 0,
"created_at": "2025-12-30",
"updated_at": "2026-01-07",
"updated_at": "2026-01-17",
"url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3"
},
{
@@ -227,7 +227,7 @@
"author": "Fu-Jie",
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
"downloads": 6,
"views": 214,
"views": 254,
"upvotes": 2,
"saves": 1,
"comments": 0,
@@ -243,7 +243,7 @@
"author": "",
"description": "",
"downloads": 0,
"views": 5,
"views": 43,
"upvotes": 0,
"saves": 0,
"comments": 0,
@@ -259,7 +259,7 @@
"author": "",
"description": "",
"downloads": 0,
"views": 791,
"views": 1139,
"upvotes": 11,
"saves": 7,
"comments": 2,
@@ -273,11 +273,11 @@
"name": "Fu-Jie",
"profile_url": "https://openwebui.com/u/Fu-Jie",
"profile_image": "https://community.s3.openwebui.com/uploads/users/b15d1348-4347-42b4-b815-e053342d6cb0/profile_d9510745-4bd4-4f8f-a997-4a21847d9300.webp",
"followers": 104,
"followers": 118,
"following": 2,
"total_points": 104,
"post_points": 89,
"comment_points": 15,
"total_points": 108,
"post_points": 92,
"comment_points": 16,
"contributions": 25
}
}

View File

@@ -1,40 +1,40 @@
# 📊 OpenWebUI Community Stats Report
> 📅 Updated: 2026-01-15 00:11
> 📅 Updated: 2026-01-17 17:07
## 📈 Overview
| Metric | Value |
|------|------|
| 📝 Total Posts | 16 |
| ⬇️ Total Downloads | 1451 |
| 👁️ Total Views | 16966 |
| 👍 Total Upvotes | 91 |
| 💾 Total Saves | 108 |
| ⬇️ Total Downloads | 1622 |
| 👁️ Total Views | 19716 |
| 👍 Total Upvotes | 94 |
| 💾 Total Saves | 123 |
| 💬 Total Comments | 23 |
## 📂 By Type
- **unknown**: 2
- **action**: 14
- **unknown**: 2
## 📋 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.1 | 451 | 4028 | 12 | 26 | 2026-01-07 |
| 2 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 194 | 671 | 3 | 4 | 2026-01-07 |
| 3 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 185 | 1906 | 9 | 13 | 2026-01-11 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.1.3 | 156 | 1743 | 7 | 15 | 2026-01-11 |
| 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 122 | 1084 | 6 | 11 | 2026-01-07 |
| 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 116 | 2059 | 8 | 10 | 2026-01-07 |
| 7 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 54 | 523 | 3 | 4 | 2026-01-08 |
| 8 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 49 | 1155 | 9 | 3 | 2026-01-07 |
| 9 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 41 | 603 | 4 | 0 | 2026-01-11 |
| 10 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.1.2 | 30 | 1095 | 7 | 11 | 2026-01-13 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 21 | 369 | 2 | 1 | 2026-01-07 |
| 12 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.1.3 | 14 | 315 | 4 | 1 | 2026-01-11 |
| 13 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 12 | 405 | 4 | 1 | 2026-01-07 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 214 | 2 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 5 | 0 | 0 | 2026-01-14 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 791 | 11 | 7 | 2026-01-10 |
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 503 | 4601 | 13 | 28 | 2026-01-17 |
| 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 217 | 2232 | 10 | 15 | 2026-01-17 |
| 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 202 | 747 | 3 | 5 | 2026-01-07 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.1.3 | 171 | 1889 | 7 | 18 | 2026-01-17 |
| 5 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 131 | 2254 | 8 | 10 | 2026-01-17 |
| 6 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 130 | 1234 | 6 | 14 | 2026-01-17 |
| 7 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 58 | 1246 | 9 | 3 | 2026-01-17 |
| 8 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.0 | 57 | 1681 | 8 | 14 | 2026-01-17 |
| 9 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 57 | 597 | 3 | 5 | 2026-01-08 |
| 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 41 | 650 | 4 | 0 | 2026-01-17 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 22 | 389 | 2 | 1 | 2026-01-17 |
| 12 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.1.3 | 14 | 337 | 4 | 1 | 2026-01-17 |
| 13 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 13 | 423 | 4 | 1 | 2026-01-17 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 254 | 2 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 43 | 0 | 0 | 2026-01-14 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1139 | 11 | 7 | 2026-01-10 |

View File

@@ -1,40 +1,40 @@
# 📊 OpenWebUI 社区统计报告
> 📅 更新时间: 2026-01-15 00:11
> 📅 更新时间: 2026-01-17 17:07
## 📈 总览
| 指标 | 数值 |
|------|------|
| 📝 发布数量 | 16 |
| ⬇️ 总下载量 | 1451 |
| 👁️ 总浏览量 | 16966 |
| 👍 总点赞数 | 91 |
| 💾 总收藏数 | 108 |
| ⬇️ 总下载量 | 1622 |
| 👁️ 总浏览量 | 19716 |
| 👍 总点赞数 | 94 |
| 💾 总收藏数 | 123 |
| 💬 总评论数 | 23 |
## 📂 按类型分类
- **unknown**: 2
- **action**: 14
- **unknown**: 2
## 📋 发布列表
| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 451 | 4028 | 12 | 26 | 2026-01-07 |
| 2 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 194 | 671 | 3 | 4 | 2026-01-07 |
| 3 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 185 | 1906 | 9 | 13 | 2026-01-11 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.1.3 | 156 | 1743 | 7 | 15 | 2026-01-11 |
| 5 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 122 | 1084 | 6 | 11 | 2026-01-07 |
| 6 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 116 | 2059 | 8 | 10 | 2026-01-07 |
| 7 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 54 | 523 | 3 | 4 | 2026-01-08 |
| 8 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 49 | 1155 | 9 | 3 | 2026-01-07 |
| 9 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 41 | 603 | 4 | 0 | 2026-01-11 |
| 10 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.1.2 | 30 | 1095 | 7 | 11 | 2026-01-13 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 21 | 369 | 2 | 1 | 2026-01-07 |
| 12 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.1.3 | 14 | 315 | 4 | 1 | 2026-01-11 |
| 13 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 12 | 405 | 4 | 1 | 2026-01-07 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 214 | 2 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 5 | 0 | 0 | 2026-01-14 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 791 | 11 | 7 | 2026-01-10 |
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | 0.9.1 | 503 | 4601 | 13 | 28 | 2026-01-17 |
| 2 | [📊 Smart Infographic (AntV)](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | 1.4.9 | 217 | 2232 | 10 | 15 | 2026-01-17 |
| 3 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | 0.3.7 | 202 | 747 | 3 | 5 | 2026-01-07 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | action | 1.1.3 | 171 | 1889 | 7 | 18 | 2026-01-17 |
| 5 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | 0.2.4 | 131 | 2254 | 8 | 10 | 2026-01-17 |
| 6 | [Export to Word (Enhanced)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | 0.4.3 | 130 | 1234 | 6 | 14 | 2026-01-17 |
| 7 | [导出为 Word (增强版)](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | 0.4.3 | 58 | 1246 | 9 | 3 | 2026-01-17 |
| 8 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | action | 1.2.0 | 57 | 1681 | 8 | 14 | 2026-01-17 |
| 9 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | 1.0.0 | 57 | 597 | 3 | 5 | 2026-01-08 |
| 10 | [📊 智能信息图 (AntV Infographic)](https://openwebui.com/posts/智能信息图_e04a48ff) | action | 1.4.9 | 41 | 650 | 4 | 0 | 2026-01-17 |
| 11 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | 0.9.1 | 22 | 389 | 2 | 1 | 2026-01-17 |
| 12 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | 1.1.3 | 14 | 337 | 4 | 1 | 2026-01-17 |
| 13 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | 0.2.4 | 13 | 423 | 4 | 1 | 2026-01-17 |
| 14 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | 1.0.0 | 6 | 254 | 2 | 1 | 2026-01-08 |
| 15 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | unknown | | 0 | 43 | 0 | 0 | 2026-01-14 |
| 16 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | unknown | | 0 | 1139 | 11 | 7 | 2026-01-10 |

View File

@@ -1,45 +1,85 @@
# Markdown Normalizer Filter
A production-grade content normalizer filter for Open WebUI that fixes common Markdown formatting issues in LLM outputs. It ensures that code blocks, LaTeX formulas, Mermaid diagrams, and other Markdown elements are rendered correctly.
A content normalizer filter for Open WebUI that fixes common Markdown formatting issues in LLM outputs. It ensures that code blocks, LaTeX formulas, Mermaid diagrams, and other Markdown elements are rendered correctly.
## Features
* **Mermaid Syntax Fix**: Automatically fixes common Mermaid syntax errors, such as unquoted node labels (including multi-line labels and citations) and unclosed subgraphs, ensuring diagrams render correctly.
* **Frontend Console Debugging**: Supports printing structured debug logs directly to the browser console (F12) for easier troubleshooting.
* **Code Block Formatting**: Fixes broken code block prefixes, suffixes, and indentation.
* **LaTeX Normalization**: Standardizes LaTeX formula delimiters (`\[` -> `$$`, `\(` -> `$`).
* **Thought Tag Normalization**: Unifies thought tags (`<think>`, `<thinking>` -> `<thought>`).
* **Escape Character Fix**: Cleans up excessive escape characters (`\\n`, `\\t`).
* **List Formatting**: Ensures proper newlines in list items.
* **Heading Fix**: Adds missing spaces in headings (`#Heading` -> `# Heading`).
* **Table Fix**: Adds missing closing pipes in tables.
* **XML Cleanup**: Removes leftover XML artifacts.
* **Details Tag Normalization**: Ensures proper spacing for `<details>` tags (used for thought chains). Adds a blank line after `</details>` and ensures a newline after self-closing `<details />` tags to prevent rendering issues.
* **Emphasis Spacing Fix**: Fixes extra spaces inside emphasis markers (e.g., `** text **` -> `**text**`) which can cause rendering failures. Includes safeguards to protect math expressions (e.g., `2 * 3 * 4`) and list variables.
* **Mermaid Syntax Fix**: Automatically fixes common Mermaid syntax errors, such as unquoted node labels (including multi-line labels and citations) and unclosed subgraphs. **New in v1.1.2**: Comprehensive protection for edge labels (text on connecting lines) across all link types (solid, dotted, thick).
* **Frontend Console Debugging**: Supports printing structured debug logs directly to the browser console (F12) for easier troubleshooting.
* **Code Block Formatting**: Fixes broken code block prefixes, suffixes, and indentation.
* **LaTeX Normalization**: Standardizes LaTeX formula delimiters (`\[` -> `$$`, `\(` -> `$`).
* **Thought Tag Normalization**: Unifies thought tags (`<think>`, `<thinking>` -> `<thought>`).
* **Escape Character Fix**: Cleans up excessive escape characters (`\\n`, `\\t`).
* **List Formatting**: Ensures proper newlines in list items.
* **Heading Fix**: Adds missing spaces in headings (`#Heading` -> `# Heading`).
* **Table Fix**: Adds missing closing pipes in tables.
* **XML Cleanup**: Removes leftover XML artifacts.
## Usage
1. Install the plugin in Open WebUI.
2. Enable the filter globally or for specific models.
3. Configure the enabled fixes in the **Valves** settings.
4. (Optional) **Show Debug Log** is enabled by default in Valves. This prints structured logs to the browser console (F12).
1. Install the plugin in Open WebUI.
2. Enable the filter globally or for specific models.
3. Configure the enabled fixes in the **Valves** settings.
4. (Optional) **Show Debug Log** is enabled by default in Valves. This prints structured logs to the browser console (F12).
> [!WARNING]
> As this is an initial version, some "negative fixes" might occur (e.g., breaking valid Markdown). If you encounter issues, please check the console logs, copy the "Original" vs "Normalized" content, and submit an issue.
## Configuration (Valves)
* `priority`: Filter priority (default: 50).
* `enable_escape_fix`: Fix excessive escape characters.
* `enable_thought_tag_fix`: Normalize thought tags.
* `enable_code_block_fix`: Fix code block formatting.
* `enable_latex_fix`: Normalize LaTeX formulas.
* `enable_list_fix`: Fix list item newlines (Experimental).
* `enable_unclosed_block_fix`: Auto-close unclosed code blocks.
* `enable_fullwidth_symbol_fix`: Fix full-width symbols in code blocks.
* `enable_mermaid_fix`: Fix Mermaid syntax errors.
* `enable_heading_fix`: Fix missing space in headings.
* `enable_table_fix`: Fix missing closing pipe in tables.
* `enable_xml_tag_cleanup`: Cleanup leftover XML tags.
* `show_status`: Show status notification when fixes are applied.
* `show_debug_log`: Print debug logs to browser console.
* `priority`: Filter priority (default: 50).
* `enable_escape_fix`: Fix excessive escape characters.
* `enable_thought_tag_fix`: Normalize thought tags.
* `enable_details_tag_fix`: Normalize details tags (default: True).
* `enable_code_block_fix`: Fix code block formatting.
* `enable_latex_fix`: Normalize LaTeX formulas.
* `enable_list_fix`: Fix list item newlines (Experimental).
* `enable_unclosed_block_fix`: Auto-close unclosed code blocks.
* `enable_fullwidth_symbol_fix`: Fix full-width symbols in code blocks.
* `enable_mermaid_fix`: Fix Mermaid syntax errors.
* `enable_heading_fix`: Fix missing space in headings.
* `enable_table_fix`: Fix missing closing pipe in tables.
* `enable_xml_tag_cleanup`: Cleanup leftover XML tags.
* `enable_emphasis_spacing_fix`: Fix extra spaces in emphasis (default: True).
* `show_status`: Show status notification when fixes are applied.
* `show_debug_log`: Print debug logs to browser console.
## Troubleshooting ❓
* **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## Changelog
### v1.2.2
* **Version Bump**: Documentation and metadata updated for the latest release.
### v1.2.1
* **Emphasis Spacing Fix**: Added a new fix for extra spaces inside emphasis markers (e.g., `** text **` -> `**text**`).
* Uses a recursive approach to handle nested emphasis (e.g., `**bold _italic _**`).
* Includes safeguards to prevent modifying math expressions (e.g., `2 * 3 * 4`) or list variables.
* Controlled by the `enable_emphasis_spacing_fix` valve (default: True).
### v1.2.0
* **Details Tag Support**: Added normalization for `<details>` tags.
* Ensures a blank line is added after `</details>` closing tags to separate thought content from the main response.
* Ensures a newline is added after self-closing `<details ... />` tags to prevent them from interfering with subsequent Markdown headings (e.g., fixing `<details/>#Heading`).
* Includes safeguard to prevent modification of `<details>` tags inside code blocks.
### v1.1.2
* **Mermaid Edge Label Protection**: Implemented comprehensive protection for edge labels (text on connecting lines) to prevent them from being incorrectly modified. Now supports all Mermaid link types including solid (`--`), dotted (`-.`), and thick (`==`) lines with or without arrows.
* **Bug Fixes**: Fixed an issue where lines without arrows (e.g., `A -- text --- B`) were not correctly protected.
### v1.1.0
* **Mermaid Fix Refinement**: Improved regex to handle nested parentheses in node labels (e.g., `ID("Label (text)")`) and avoided matching connection labels.
* **HTML Safeguard Optimization**: Refined `_contains_html` to allow common tags like `<br/>`, `<b>`, `<i>`, etc., ensuring Mermaid diagrams with these tags are still normalized.
* **Full-width Symbol Cleanup**: Fixed duplicate keys and incorrect quote mapping in `FULLWIDTH_MAP`.
* **Bug Fixes**: Fixed missing `Dict` import in Python files.
## License

View File

@@ -1,45 +1,85 @@
# Markdown 格式化过滤器 (Markdown Normalizer)
这是一个用于 Open WebUI 的生产级内容格式化过滤器,旨在修复 LLM 输出中常见的 Markdown 格式问题。它能确保代码块、LaTeX 公式、Mermaid 图表和其他 Markdown 元素被正确渲染。
这是一个用于 Open WebUI 的内容格式化过滤器,旨在修复 LLM 输出中常见的 Markdown 格式问题。它能确保代码块、LaTeX 公式、Mermaid 图表和其他 Markdown 元素被正确渲染。
## 功能特性
* **Mermaid 语法修复**: 自动修复常见的 Mermaid 语法错误,如未加引号的节点标签(支持多行标签和引用标记)和未闭合的子图 (Subgraph),确保图表能正确渲染
* **前端控制台调试**: 支持将结构化的调试日志直接打印到浏览器控制台 (F12),方便排查问题
* **代码块格式化**: 修复破损的代码块前缀、后缀和缩进问题
* **LaTeX 规范化**: 标准化 LaTeX 公式定界符 (`\[` -> `$$`, `\(` -> `$`)
* **思维标签规范化**: 统一思维链标签 (`<think>`, `<thinking>` -> `<thought>`)
* **转义字符修复**: 清理过度的转义字符 (`\\n`, `\\t`)。
* **列表格式化**: 确保列表项有正确的换行
* **标题修复**: 修复标题中缺失的空格 (`#标题` -> `# 标题`)。
* **表格修复**: 修复表格中缺失的闭合管道符
* **XML 清理**: 移除残留的 XML 标签
* **Details 标签规范化**: 确保 `<details>` 标签(常用于思维链)有正确的间距。在 `</details>` 后添加空行,并在自闭合 `<details />` 标签后添加换行,防止渲染问题
* **强调空格修复**: 修复强调标记内部的多余空格(例如 `** 文本 **` -> `**文本**`),这会导致 Markdown 渲染失败。包含保护机制,防止误修改数学表达式(如 `2 * 3 * 4`)或列表变量
* **Mermaid 语法修复**: 自动修复常见的 Mermaid 语法错误,如未加引号的节点标签(支持多行标签和引用标记)和未闭合的子图 (Subgraph)。**v1.1.2 新增**: 全面保护各种类型的连线标签(实线、虚线、粗线),防止被误修改
* **前端控制台调试**: 支持将结构化的调试日志直接打印到浏览器控制台 (F12),方便排查问题
* **代码块格式化**: 修复破损的代码块前缀、后缀和缩进问题
* **LaTeX 规范化**: 标准化 LaTeX 公式定界符 (`\[` -> `$$`, `\(` -> `$`)。
* **思维标签规范化**: 统一思维链标签 (`<think>`, `<thinking>` -> `<thought>`)
* **转义字符修复**: 清理过度的转义字符 (`\\n`, `\\t`)。
* **表格式化**: 确保列表项有正确的换行
* **标题修复**: 修复标题中缺失的空格 (`#标题` -> `# 标题`)
* **表格修复**: 修复表格中缺失的闭合管道符。
* **XML 清理**: 移除残留的 XML 标签。
## 使用方法
1. 在 Open WebUI 中安装此插件。
2. 全局启用或为特定模型启用此过滤器。
3. **Valves** 设置中配置需要启用的修复项。
4. (可选) **显示调试日志 (Show Debug Log)** 在 Valves 中默认开启。这会将结构化的日志打印到浏览器控制台 (F12)。
1. 在 Open WebUI 中安装此插件。
2. 全局启用或为特定模型启用此过滤器。
3.**Valves** 设置中配置需要启用的修复项。
4. (可选) **显示调试日志 (Show Debug Log)** 在 Valves 中默认开启。这会将结构化的日志打印到浏览器控制台 (F12)。
> [!WARNING]
> 由于这是初版,可能会出现“负向修复”的情况(例如破坏了原本正确的格式)。如果您遇到问题,请务必查看控制台日志,复制“原始 (Original)”与“规范化 (Normalized)”的内容对比,并提交 Issue 反馈。
## 配置项 (Valves)
* `priority`: 过滤器优先级 (默认: 50)。
* `enable_escape_fix`: 修复过度的转义字符。
* `enable_thought_tag_fix`: 规范化思维标签。
* `enable_code_block_fix`: 修复代码块格式
* `enable_latex_fix`: 规范化 LaTeX 公式。
* `enable_list_fix`: 修复列表项换行 (实验性)
* `enable_unclosed_block_fix`: 自动闭合未闭合的代码块
* `enable_fullwidth_symbol_fix`: 修复代码块中的全角符号
* `enable_mermaid_fix`: 修复 Mermaid 语法错误
* `enable_heading_fix`: 修复标题中缺失的空格
* `enable_table_fix`: 修复表格中缺失的闭合管道符
* `enable_xml_tag_cleanup`: 清理残留的 XML 标签
* `show_status`: 应用修复时显示状态通知
* `show_debug_log`: 在浏览器控制台打印调试日志
* `priority`: 过滤器优先级 (默认: 50)。
* `enable_escape_fix`: 修复过度的转义字符。
* `enable_thought_tag_fix`: 规范化思维标签。
* `enable_details_tag_fix`: 规范化 Details 标签 (默认: True)
* `enable_code_block_fix`: 修复代码块格式。
* `enable_latex_fix`: 规范化 LaTeX 公式
* `enable_list_fix`: 修复列表项换行 (实验性)
* `enable_unclosed_block_fix`: 自动闭合未闭合的代码块
* `enable_fullwidth_symbol_fix`: 修复代码块中的全角符号
* `enable_mermaid_fix`: 修复 Mermaid 语法错误
* `enable_heading_fix`: 修复标题中缺失的空格
* `enable_table_fix`: 修复表格中缺失的闭合管道符
* `enable_xml_tag_cleanup`: 清理残留的 XML 标签
* `enable_emphasis_spacing_fix`: 修复强调语法中的多余空格 (默认: True)
* `show_status`: 应用修复时显示状态通知。
* `show_debug_log`: 在浏览器控制台打印调试日志。
## 故障排除 (Troubleshooting) ❓
* **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## 更新日志
### v1.2.2
* **版本更新**: 文档与元数据已同步到最新版本。
### v1.2.1
* **强调空格修复**: 新增了对强调标记内部多余空格的修复(例如 `** 文本 **` -> `**文本**`)。
* 采用递归方法处理嵌套强调(例如 `**加粗 _斜体 _**`)。
* 包含保护机制,防止误修改数学表达式(如 `2 * 3 * 4`)或列表变量。
* 通过 `enable_emphasis_spacing_fix` 开关控制(默认:开启)。
### v1.2.0
* **Details 标签支持**: 新增了对 `<details>` 标签的规范化支持。
* 确保在 `</details>` 闭合标签后添加空行,将思维内容与正文分隔开。
* 确保在自闭合 `<details ... />` 标签后添加换行,防止其干扰后续的 Markdown 标题(例如修复 `<details/>#标题`)。
* 包含保护机制,防止修改代码块内部的 `<details>` 标签。
### v1.1.2
* **Mermaid 连线标签保护**: 实现了全面的连线标签保护机制,防止连接线上的文字被误修改。现在支持所有 Mermaid 连线类型,包括实线 (`--`)、虚线 (`-.`) 和粗线 (`==`),无论是否带有箭头。
* **Bug 修复**: 修复了无箭头连线(如 `A -- text --- B`)未被正确保护的问题。
### v1.1.0
* **Mermaid 修复优化**: 改进了正则表达式以处理节点标签中的嵌套括号(如 `ID("标签 (文本)")`),并避免误匹配连接线上的文字。
* **HTML 保护机制优化**: 优化了 `_contains_html` 检测,允许 `<br/>`, `<b>`, `<i>` 等常见标签,确保包含这些标签的 Mermaid 图表能被正常规范化。
* **全角符号清理**: 修复了 `FULLWIDTH_MAP` 中的重复键名和错误的引号映射。
* **Bug 修复**: 修复了 Python 文件中缺失的 `Dict` 类型导入。
## 许可证

View File

@@ -124,10 +124,6 @@ Each plugin should include:
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## License
MIT License
---
> **Note**: For detailed information about each plugin type, see the respective README files in each plugin type directory.

View File

@@ -124,10 +124,6 @@ plugins/
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 许可证
MIT License
---
> **注意**:有关每种插件类型的详细信息,请参阅每个插件类型目录中的相应 README 文件。

View File

@@ -230,7 +230,3 @@ except Exception as e:
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## License
MIT License

View File

@@ -229,7 +229,3 @@ except Exception as e:
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 许可证
MIT License

View File

@@ -1,6 +1,6 @@
# 🌊 Deep Dive
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.0.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.0.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.
@@ -81,3 +81,10 @@ The plugin generates a structured thinking timeline:
- `deep_dive.py` - English version
- `deep_dive_cn.py` - Chinese version (精读)
## Troubleshooting ❓
- **Plugin not working?**: Check if the filter/action is enabled in the model settings.
- **Debug Logs**: Enable `SHOW_STATUS` in Valves to see progress updates.
- **Error Messages**: If you see an error, please copy the full error message and report it.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,6 +1,6 @@
# 📖 精读
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.0.0 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.0.0 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。
@@ -81,3 +81,10 @@
- `deep_dive.py` - 英文版 (Deep Dive)
- `deep_dive_cn.py` - 中文版 (精读)
## 故障排除 (Troubleshooting) ❓
- **插件不工作?**: 请检查是否在模型设置中启用了该过滤器/动作。
- **调试日志**: 在 Valves 中启用 `SHOW_STATUS` 以查看进度更新。
- **错误信息**: 如果看到错误,请复制完整的错误信息并报告。
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,6 +1,6 @@
# 📝 Export to Word (Enhanced)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.4.3 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.4.3 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
Export conversation to Word (.docx) with **syntax highlighting**, **native math equations**, **Mermaid diagrams**, **citations**, and **enhanced table formatting**.
@@ -86,3 +86,10 @@ Export conversation to Word (.docx) with **syntax highlighting**, **native math
- **Font & Style Configuration**: Customizable fonts and table colors.
- **Mermaid Enhancements**: Hybrid SVG+PNG rendering, background color config.
- **Performance**: Real-time progress updates for large exports.
## Troubleshooting ❓
- **Plugin not working?**: Check if the filter/action is enabled in the model settings.
- **Debug Logs**: Check the browser console (F12) for detailed logs if available.
- **Error Messages**: If you see an error, please copy the full error message and report it.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,6 +1,6 @@
# 📝 导出为 Word (增强版)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.4.3 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.4.3 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
将对话导出为 Word (.docx),支持**代码语法高亮**、**原生数学公式**、**Mermaid 图表**、**引用参考**和**增强表格格式**。
@@ -86,3 +86,10 @@
- **字体与样式配置**: 支持自定义中英文字体、代码字体以及表格颜色。
- **Mermaid 增强**: 混合 SVG+PNG 渲染,支持背景色配置。
- **性能优化**: 导出大型文档时提供实时进度反馈。
## 故障排除 (Troubleshooting) ❓
- **插件不工作?**: 请检查是否在模型设置中启用了该过滤器/动作。
- **调试日志**: 请查看浏览器控制台 (F12) 获取详细日志(如果可用)。
- **错误信息**: 如果看到错误,请复制完整的错误信息并报告。
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -2,9 +2,18 @@
Generate polished learning flashcards from any text—title, summary, key points, tags, and category—ready for review and sharing.
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.2.4 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
## Preview 📸
![Flash Card Example](flash_card.png)
## Highlights
## What's New
### v0.2.4
- **Clean Output**: Removed debug messages from output.
## Key Features 🔑
- **One-click generation**: Drop in text, get a structured card.
- **Concise extraction**: 35 key points and 24 tags automatically surfaced.
@@ -12,7 +21,14 @@ Generate polished learning flashcards from any text—title, summary, key points
- **Progressive merge**: Multiple runs append cards into the same HTML container; enable clearing to reset.
- **Status updates**: Live notifications for generating/done/error.
## Parameters
## How to Use 🛠️
1. **Install**: Add the plugin to your OpenWebUI instance.
2. **Configure**: Adjust settings in the Valves menu (optional).
3. **Trigger**: Send text to the chat.
4. **Result**: Watch status updates; the card HTML is embedded into the latest message.
## Configuration (Valves) ⚙️
| Param | Description | Default |
| ------------------- | ------------------------------------------------------------ | ------- |
@@ -23,34 +39,9 @@ Generate polished learning flashcards from any text—title, summary, key points
| CLEAR_PREVIOUS_HTML | Whether to clear previous card HTML (otherwise append/merge) | false |
| MESSAGE_COUNT | Use the latest N messages to build the card | 1 |
## How to Use
## Troubleshooting ❓
1. Install and enable “Flash Card”.
2. Send the text to the chat (multi-turn supported; governed by MESSAGE_COUNT).
3. Watch status updates; the card HTML is embedded into the latest message.
4. To regenerate from scratch, toggle CLEAR_PREVIOUS_HTML or resend text.
## Output Format
- JSON fields: `title`, `summary`, `key_points` (35), `tags` (24), `category`.
- UI: gradient-styled card with tags, key-point list; supports stacking multiple cards.
## Tips
- Very short text triggers a prompt to add more; consider summarizing first.
- Long text is accepted; for deep analysis, pre-condense with other tools before card creation.
## Author
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## License
MIT License
## Changelog
### v0.2.4
- Removed debug messages from output
- **Plugin not working?**: Check if the filter/action is enabled in the model settings.
- **Debug Logs**: Enable `SHOW_STATUS` in Valves to see progress updates.
- **Error Messages**: If you see an error, please copy the full error message and report it.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -2,9 +2,18 @@
快速将文本提炼为精美的学习记忆卡片,自动抽取标题、摘要、关键要点、标签和分类,适合复习与分享。
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.2.4 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
## 预览 📸
![闪记卡示例](flash_card_cn.png)
## 功能亮点
## 更新日志
### v0.2.4
- **输出优化**: 移除输出中的调试信息。
## 核心特性 🔑
- **一键生成**:输入任意文本,直接产出结构化卡片。
- **要点聚合**:自动提取 3-5 个记忆要点与 2-4 个标签。
@@ -12,7 +21,14 @@
- **渐进合并**:多次调用会将新卡片合并到同一 HTML 容器中;如需重置可启用清空选项。
- **状态提示**:实时推送“生成中/完成/错误”等状态与通知。
## 参数说明
## 使用方法 🛠️
1. **安装**: 在插件市场安装并启用“闪记卡”。
2. **配置**: 根据需要调整 Valves 设置(可选)。
3. **触发**: 将待整理的文本发送到聊天框。
4. **结果**: 等待状态提示,卡片将以 HTML 形式嵌入到最新消息中。
## 配置参数 (Valves) ⚙️
| 参数 | 说明 | 默认值 |
| ------------------- | ------------------------------------- | ------ |
@@ -23,34 +39,9 @@
| CLEAR_PREVIOUS_HTML | 是否清空旧的卡片 HTML否则合并追加 | false |
| MESSAGE_COUNT | 取最近 N 条消息生成卡片 | 1 |
## 使用步骤
## 故障排除 (Troubleshooting) ❓
1. 在插件市场安装并启用“闪记卡”
2. 将待整理的文本发送到聊天框(可多轮对话,受 MESSAGE_COUNT 控制)
3. 等待状态提示,卡片将以 HTML 形式嵌入到最新消息中
4. 若需重新生成,开启 CLEAR_PREVIOUS_HTML 或直接重发文本。
## 输出格式
- JSON 字段:`title``summary``key_points`3-5 条)、`tags`2-4 条)、`category`
- 前端呈现:单卡片带渐变主题、标签胶囊、要点列表,可连续追加多张卡片。
## 使用建议
- 文本过短会提醒补充,可先汇总再生成卡片。
- 长文本无需截断,直接生成;如需深度分析可先用其他工具精炼后再制作卡片。
## 作者
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 许可证
MIT License
## 更新日志
### v0.2.4
- 移除输出中的调试信息
- **插件不工作?**: 请检查是否在模型设置中启用了该过滤器/动作
- **调试日志**: 在 Valves 中启用 `SHOW_STATUS` 以查看进度更新
- **错误信息**: 如果看到错误,请复制完整的错误信息并报告
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,6 +1,6 @@
# 📊 Smart Infographic (AntV)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.4.9 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.4.9 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
@@ -56,6 +56,14 @@ You can adjust the following parameters in the plugin settings to optimize the g
| **Hierarchy** | `hierarchy-tree-tech-style-capsule-item`, `hierarchy-structure` | Org Charts, Structures |
| **Charts** | `chart-column-simple`, `chart-bar-plain-text`, `chart-line-plain-text`, `chart-wordcloud` | Trends, Distributions, Metrics |
## Troubleshooting ❓
- **Plugin not working?**: Check if the filter/action is enabled in the model settings.
- **Debug Logs**: Enable `SHOW_STATUS` in Valves to see progress updates.
- **Error Messages**: If you see an error, please copy the full error message and report it.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## 📝 Syntax Example (For Advanced Users)
You can also input this syntax directly for AI to render:

View File

@@ -1,6 +1,6 @@
# 📊 智能信息图 (AntV Infographic)
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.4.9 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.4.9 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
基于 AntV Infographic 引擎的 Open WebUI 插件,能够将长文本内容一键转换为专业、美观的信息图表。
@@ -56,6 +56,14 @@
| **层级与结构** | `hierarchy-tree-tech-style-capsule-item`, `hierarchy-structure` | 组织架构、层级关系 |
| **图表与数据** | `chart-column-simple`, `chart-bar-plain-text`, `chart-line-plain-text`, `chart-wordcloud` | 数据趋势、比例分布、数值对比 |
## 故障排除 (Troubleshooting) ❓
- **插件不工作?**: 请检查是否在模型设置中启用了该过滤器/动作。
- **调试日志**: 在 Valves 中启用 `SHOW_STATUS` 以查看进度更新。
- **错误信息**: 如果看到错误,请复制完整的错误信息并报告。
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## 📝 语法示例 (高级用户)
你也可以直接输入以下语法让 AI 渲染:

View File

@@ -1,65 +0,0 @@
# 📊 Smart Infographic (AntV)
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
## ✨ Key Features
- 🚀 **AI-Powered Transformation**: Automatically analyzes text logic, extracts key points, and generates structured charts.
- 🎨 **Professional Templates**: Includes various AntV official templates: Lists, Trees, Mindmaps, Comparison Tables, Flowcharts, and Statistical Charts.
- 🔍 **Auto-Icon Matching**: Built-in logic to search and match the most relevant Material Design Icons based on content.
- 📥 **Multi-Format Export**: Download your infographics as **SVG**, **PNG**, or a **Standalone HTML** file.
- 🌈 **Highly Customizable**: Supports Dark/Light modes, auto-adapts theme colors, with bold titles and refined card layouts.
- 📱 **Responsive Design**: Generated charts look great on both desktop and mobile devices.
## 🛠️ Supported Template Types
| Category | Template Name | Use Case |
| :--- | :--- | :--- |
| **Lists & Hierarchy** | `list-grid`, `tree-vertical`, `mindmap` | Features, Org Charts, Brainstorming |
| **Sequence & Relation** | `sequence-roadmap`, `relation-circle` | Roadmaps, Circular Flows, Steps |
| **Comparison & Analysis** | `compare-binary`, `compare-swot`, `quadrant-quarter` | Pros/Cons, SWOT, Quadrants |
| **Charts & Data** | `chart-bar`, `chart-line`, `chart-pie` | Trends, Distributions, Metrics |
## 🚀 How to Use
1. **Install**: Search for "Smart Infographic" in the Open WebUI Community and install.
2. **Trigger**: Enter your text in the chat, then click the **Action Button** (📊 icon) next to the input box.
3. **AI Processing**: The AI analyzes the text and generates the infographic syntax.
4. **Preview & Download**: Preview the result and use the download buttons below to save your infographic.
## ⚙️ Configuration (Valves)
You can adjust the following parameters in the plugin settings to optimize the generation:
| Parameter | Default | Description |
| :--- | :--- | :--- |
| **Show Status (SHOW_STATUS)** | `True` | Whether to show real-time AI analysis and generation status in the chat. |
| **Model ID (MODEL_ID)** | `Empty` | Specify the LLM model for text analysis. If empty, the current chat model is used. |
| **Min Text Length (MIN_TEXT_LENGTH)** | `100` | Minimum characters required to trigger analysis, preventing accidental triggers on short text. |
| **Clear Previous (CLEAR_PREVIOUS_HTML)** | `False` | Whether to clear previous charts. If `False`, new charts will be appended below. |
| **Message Count (MESSAGE_COUNT)** | `1` | Number of recent messages to use for analysis. Increase this for more context. |
## 📝 Syntax Example (For Advanced Users)
You can also input this syntax directly for AI to render:
```infographic
infographic list-grid
data
title 🚀 Plugin Benefits
desc Why use the Smart Infographic plugin
items
- label Fast Generation
desc Convert text to charts in seconds
- label Beautiful Design
desc Uses AntV professional design standards
```
## 👨‍💻 Author
**jeff**
- GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 📄 License
MIT License

View File

@@ -1,14 +1,10 @@
# Smart Mind Map - Mind Mapping Generation Plugin
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.9.1 | **License:** MIT
> **Important**: To ensure the maintainability and usability of all plugins, each plugin should be accompanied by clear and comprehensive documentation to ensure its functionality, configuration, and usage are well explained.
Smart Mind Map is a powerful OpenWebUI action plugin that intelligently analyzes long-form text content and automatically generates interactive mind maps, helping users structure and visualize knowledge.
---
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.9.1 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
## 🔥 What's New in v0.9.1
## What's New in v0.9.1
**New Feature: Image Output Mode**
@@ -18,362 +14,51 @@ Smart Mind Map is a powerful OpenWebUI action plugin that intelligently analyzes
- **Efficient Storage**: Image mode uploads SVG to `/api/v1/files`, avoiding huge base64 strings in chat history.
- **Smart Features**: Auto-responsive width and automatic theme detection (light/dark) for generated images.
| Feature | HTML Mode (Default) | Image Mode |
| :--- | :--- | :--- |
| **Output Format** | Interactive HTML Block | Static Markdown Image |
| **Interactivity** | Zoom, Pan, Expand/Collapse | None (Static Image) |
| **Chat History** | Contains HTML Code | Clean (Image URL only) |
| **Storage** | Browser Rendering | `/api/v1/files` Upload |
## Key Features 🔑
---
-**Intelligent Text Analysis**: Automatically identifies core themes, key concepts, and hierarchical structures.
-**Interactive Visualization**: Generates beautiful interactive mind maps based on Markmap.js.
-**High-Resolution PNG Export**: Export mind maps as high-quality PNG images (9x scale).
-**Complete Control Panel**: Zoom controls, expand level selection, and fullscreen mode.
-**Theme Switching**: Manual theme toggle button with automatic theme detection.
-**Image Output Mode**: Generate static SVG images embedded directly in Markdown for cleaner history.
## Core Features
## How to Use 🛠️
- **Intelligent Text Analysis**: Automatically identifies core themes, key concepts, and hierarchical structures
-**Interactive Visualization**: Generates beautiful interactive mind maps based on Markmap.js
-**High-Resolution PNG Export**: Export mind maps as high-quality PNG images (9x scale, ~1-2MB file size)
-**Complete Control Panel**: Zoom controls (+/-/reset), expand level selection (All/2/3 levels), and fullscreen mode
-**Theme Switching**: Manual theme toggle button (light/dark) with automatic theme detection
-**Dark Mode Support**: Full dark mode support with automatic detection and manual override
-**Multi-language Support**: Automatically adjusts output based on user language
-**Real-time Rendering**: Renders mind maps directly in the chat interface without navigation
-**Export Capabilities**: Supports PNG, SVG code, and Markdown source export
-**Customizable Configuration**: Configurable LLM model, minimum text length, and other parameters
-**Image Output Mode**: Generate static SVG images embedded directly in Markdown (**No HTML code output**, cleaner chat history)
1. **Install**: Upload the `smart_mind_map.py` file in OpenWebUI Admin Settings -> Plugins -> Actions.
2. **Configure**: Ensure you have an LLM model configured (e.g., `gemini-2.5-flash`).
3. **Trigger**: Enable the "Smart Mind Map" action in chat settings and send text (at least 100 characters).
4. **Result**: The mind map will be rendered directly in the chat interface.
---
## How It Works
1. **Text Extraction**: Extracts text content from user messages (automatically filters HTML code blocks)
2. **Intelligent Analysis**: Analyzes text structure using the configured LLM model
3. **Markdown Generation**: Converts analysis results to Markmap-compatible Markdown format
4. **Visual Rendering**: Renders the mind map using Markmap.js in an HTML template with optimized font hierarchy (H1: 22px bold, H2: 18px bold)
5. **Interactive Display**: Presents the mind map to users in an interactive format with complete control panel
6. **Theme Detection**: Automatically detects and applies the current OpenWebUI theme (light/dark mode)
7. **Export Options**: Provides PNG (high-resolution), SVG, and Markdown export functionality
---
## Installation and Configuration
### 1. Plugin Installation
1. Download the `smart_mind_map_cn.py` file to your local computer
2. In OpenWebUI Admin Settings, find the "Plugins" section
3. Select "Actions" type
4. Upload the downloaded file
5. Refresh the page, and the plugin will be available
### 2. Model Configuration
The plugin requires access to an LLM model for text analysis. Please ensure:
- Your OpenWebUI instance has at least one available LLM model configured
- Recommended to use fast, economical models (e.g., `gemini-2.5-flash`) for the best experience
- Configure the `LLM_MODEL_ID` parameter in the plugin settings
### 3. Plugin Activation
Select the "Smart Mind Map" action plugin in chat settings to enable it.
### 4. Theme Color Consistency (Optional)
To keep the mind map visually consistent with the OpenWebUI theme colors, enable same-origin access for artifacts in OpenWebUI:
- **Configuration Location**: In OpenWebUI User Settings: **Interface****Artifacts****iframe Sandbox Allow Same Origin**
- **Enable Option**: Check the "Allow same-origin access for artifacts" / "iframe sandbox allow-same-origin" option
- **Sandbox Attributes**: Ensure the iframe's sandbox attribute includes both `allow-same-origin` and `allow-scripts`
Once enabled, the mind map will automatically detect and apply the current OpenWebUI theme (light/dark) without any manual configuration.
---
## Configuration Parameters
You can adjust the following parameters in the plugin's settings (Valves):
## Configuration (Valves) ⚙️
| Parameter | Default | Description |
| :--- | :--- | :--- |
| `show_status` | `true` | Whether to display operation status updates in the chat interface (e.g., "Analyzing..."). |
| `LLM_MODEL_ID` | `gemini-2.5-flash` | LLM model ID for text analysis. Recommended to use fast and economical models. |
| `MIN_TEXT_LENGTH` | `100` | Minimum text length (in characters) required for mind map analysis. Text that's too short cannot generate valid mind maps. |
| `CLEAR_PREVIOUS_HTML` | `false` | Whether to clear previous plugin-generated HTML content when generating a new mind map. |
| `MESSAGE_COUNT` | `1` | Number of recent messages to use for mind map generation (1-5). |
| `OUTPUT_MODE` | `html` | Output mode: `html` for interactive HTML (default), or `image` to embed as static Markdown image. |
| `show_status` | `true` | Whether to display operation status updates. |
| `LLM_MODEL_ID` | `gemini-2.5-flash` | LLM model ID for text analysis. |
| `MIN_TEXT_LENGTH` | `100` | Minimum text length required for analysis. |
| `CLEAR_PREVIOUS_HTML` | `false` | Whether to clear previous plugin-generated HTML content. |
| `MESSAGE_COUNT` | `1` | Number of recent messages to use for generation (1-5). |
| `OUTPUT_MODE` | `html` | Output mode: `html` (interactive) or `image` (static). |
---
## Troubleshooting ❓
## Usage
### Basic Usage
1. Enable the "Smart Mind Map" action in chat settings
2. Input or paste long-form text content (at least 100 characters) in the conversation
3. After sending the message, the plugin will automatically analyze and generate a mind map
4. The mind map will be rendered directly in the chat interface
### Usage Example
**Input Text:**
```
Artificial Intelligence (AI) is a branch of computer science dedicated to creating systems capable of performing tasks that typically require human intelligence.
Main application areas include:
1. Machine Learning - Enables computers to learn from data
2. Natural Language Processing - Understanding and generating human language
3. Computer Vision - Recognizing and processing images
4. Robotics - Creating intelligent systems that can interact with the physical world
```
**Generated Result:**
The plugin will generate an interactive mind map centered on "Artificial Intelligence", including major application areas and their sub-concepts.
### Export Features
Generated mind maps support three export methods:
1. **Download PNG**: Click the "📥 Download PNG" button to export the mind map as a high-resolution PNG image (9x scale, ~1-2MB file size)
2. **Copy SVG Code**: Click the "Copy SVG Code" button to copy the mind map in SVG format to the clipboard
3. **Copy Markdown**: Click the "Copy Markdown" button to copy the raw Markdown format to the clipboard
### Control Panel
The interactive mind map includes a comprehensive control panel:
- **Zoom Controls**: `+` (zoom in), `-` (zoom out), `↻` (reset view)
- **Expand Level**: Switch between "All", "2 Levels", "3 Levels" to control node expansion depth
- **Fullscreen**: Enter fullscreen mode for better viewing experience
- **Theme Toggle**: Manually switch between light and dark themes
- **Plugin not working?**: Check if the action is enabled in the chat settings.
- **Text too short**: Ensure input text contains at least 100 characters.
- **Rendering failed**: Check browser console for errors related to Markmap.js or D3.js.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
---
## Technical Architecture
### Frontend Rendering
- **Markmap.js**: Open-source mind mapping rendering engine
- **D3.js**: Data visualization foundation library
- **Responsive Design**: Adapts to different screen sizes
- **Font Hierarchy**: Optimized typography with H1 (22px bold) and H2 (18px bold) for better readability
### PNG Export Technology
- **SVG to Canvas Conversion**: Converts mind map SVG to canvas for PNG export
- **ForeignObject Handling**: Properly processes HTML content within SVG elements
- **High Resolution**: 9x scale factor for print-quality output (~1-2MB file size)
- **Theme Preservation**: Maintains current theme (light/dark) in exported PNG
### Theme Detection Mechanism
Automatically detects and applies themes with a 4-level priority:
1. **Explicit Toggle**: User manually clicks theme toggle button (highest priority)
2. **Meta Tag**: Reads `<meta name="theme-color">` from parent document
3. **Class/Data-Theme**: Checks `class` or `data-theme` attributes on parent HTML/body
4. **System Preference**: Falls back to `prefers-color-scheme` media query
### Backend Processing
- **LLM Integration**: Calls configured models via `generate_chat_completion`
- **Text Preprocessing**: Automatically filters HTML code blocks, extracts plain text content
- **Format Conversion**: Converts LLM output to Markmap-compatible Markdown format
### Security Enhancements
- **XSS Protection**: Automatically escapes `</script>` tags to prevent script injection
- **Input Validation**: Checks text length to avoid invalid requests
- **Non-Bubbling Events**: Button clicks use `stopPropagation()` to prevent navigation interception
---
## Troubleshooting
### Issue: Plugin Won't Start
**Solution:**
- Check OpenWebUI logs for error messages
- Confirm the plugin is correctly uploaded and enabled
- Verify OpenWebUI version supports action plugins
### Issue: Text Content Too Short
**Symptom:** Prompt shows "Text content is too short for effective analysis"
**Solution:**
- Ensure input text contains at least 100 characters (default configuration)
- Lower the `MIN_TEXT_LENGTH` parameter value in plugin settings
- Provide more detailed, structured text content
### Issue: Mind Map Not Generated
**Solution:**
- Check if `LLM_MODEL_ID` is configured correctly
- Confirm the configured model is available in OpenWebUI
- Review backend logs for LLM call failures
- Verify user has sufficient permissions to access the configured model
### Issue: Mind Map Display Error
**Symptom:** Shows "⚠️ Mind map rendering failed"
**Solution:**
- Check browser console for error messages
- Confirm Markmap.js and D3.js libraries are loading correctly
- Verify generated Markdown format conforms to Markmap specifications
- Try refreshing the page to re-render
### Issue: PNG Export Not Working
**Symptom:** PNG download button doesn't work or produces blank/corrupted images
**Solution:**
- Ensure browser supports HTML5 Canvas API (all modern browsers do)
- Check browser console for errors related to `toDataURL()` or canvas rendering
- Verify the mind map is fully rendered before clicking export
- Try refreshing the page and re-generating the mind map
- Use Chrome or Firefox for best PNG export compatibility
### Issue: Theme Not Auto-Detected
**Symptom:** Mind map doesn't match OpenWebUI theme colors
**Solution:**
- Enable "iframe Sandbox Allow Same Origin" in OpenWebUI Settings → Interface → Artifacts
- Verify the iframe's sandbox attribute includes both `allow-same-origin` and `allow-scripts`
- Ensure parent document has `<meta name="theme-color">` tag or theme class/attribute
- Use the manual theme toggle button to override automatic detection
- Check browser console for cross-origin errors
### Issue: Export Function Not Working
**Solution:**
- Confirm browser supports Clipboard API
- Check if browser is blocking clipboard access permissions
- Use modern browsers (Chrome, Firefox, Edge, etc.)
---
- **Markmap.js**: Open-source mind mapping rendering engine.
- **PNG Export**: 9x scale factor for print-quality output (~1-2MB file size).
- **Theme Detection**: 4-level priority detection (Manual > Meta > Class > System).
- **Security**: XSS protection and input validation.
## Best Practices
1. **Text Preparation**
- Provide text content with clear structure and distinct hierarchies
- Use paragraphs, lists, and other formatting to help LLM understand text structure
- Avoid excessively lengthy or unstructured text
2. **Model Selection**
- For daily use, recommend fast models like `gemini-2.5-flash`
- For complex text analysis, use more powerful models (e.g., GPT-4)
- Balance speed and analysis quality based on needs
3. **Performance Optimization**
- Set `MIN_TEXT_LENGTH` appropriately to avoid processing text that's too short
- For particularly long texts, consider summarizing before generating mind maps
- Disable `show_status` in production environments to reduce interface updates
4. **Export Quality**
- **PNG Export**: Best for presentations, documents, and sharing (9x resolution suitable for printing)
- **SVG Export**: Best for further editing in vector graphics tools (infinite scalability)
- **Markdown Export**: Best for version control, collaboration, and regeneration
5. **Theme Consistency**
- Enable same-origin access for automatic theme detection
- Use manual theme toggle if automatic detection fails
- Export PNG after switching to desired theme for consistent visuals
---
## Requirements
This plugin uses only OpenWebUI's built-in dependencies. **No additional packages need to be installed.**
---
## Changelog
### v0.9.1
**New Feature: Image Output Mode**
- Added `OUTPUT_MODE` configuration parameter with two options:
- `html` (default): Interactive HTML mind map with full control panel
- `image`: Static SVG image embedded directly in Markdown (uploaded to `/api/v1/files`)
- Image mode features:
- Auto-responsive width (adapts to chat container)
- Automatic theme detection (light/dark)
- Persistent storage via Chat API (survives page refresh)
- Efficient file storage (no huge base64 strings in chat history)
**Improvements:**
- Implemented robust Chat API update mechanism with retry logic
- Fixed message persistence using both `messages[]` and `history.messages`
- Added Event API for immediate frontend updates
- Removed unnecessary `SVG_WIDTH` and `SVG_HEIGHT` parameters (now auto-calculated)
**Technical Details:**
- Image mode uses `__event_call__` to execute JavaScript in the browser
- SVG is rendered offline, converted to Blob, and uploaded to OpenWebUI Files API
- Updates chat message with `/api/v1/files/{id}/content` URL via OpenWebUI Backend-Controlled API flow
### v0.8.2
- Removed debug messages from output
### v0.8.0 (Previous Version)
**Major Features:**
- Added high-resolution PNG export (9x scale, ~1-2MB file size)
- Implemented complete control panel with zoom controls (+/-/reset)
- Added expand level selection (All/2/3 levels)
- Integrated fullscreen mode with auto-fit
- Added manual theme toggle button (light/dark)
- Implemented automatic theme detection with 4-level priority
**Improvements:**
- Optimized font hierarchy (H1: 22px bold, H2: 18px bold)
- Enhanced dark mode with full theme support
- Improved PNG export technology (SVG to Canvas with foreignObject handling)
- Added theme preservation in exported PNG images
- Enhanced security with non-bubbling button events
**Bug Fixes:**
- Fixed theme detection in cross-origin iframes
- Resolved PNG export issues with HTML content in SVG
- Improved compatibility with OpenWebUI theme system
### v0.7.2
- Optimized text extraction logic, automatically filters HTML code blocks
- Improved error handling and user feedback
- Enhanced export functionality compatibility
- Optimized UI styling and interactive experience
---
## License
This plugin is released under the MIT License.
## Contributing
Welcome to submit issue reports and improvement suggestions! Please visit the project repository: [awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
---
## Related Resources
- [Markmap Official Website](https://markmap.js.org/)
- [OpenWebUI Documentation](https://docs.openwebui.com/)
- [D3.js Official Website](https://d3js.org/)
1. **Text Preparation**: Provide text with clear structure and distinct hierarchies.
2. **Model Selection**: Use fast models like `gemini-2.5-flash` for daily use.
3. **Export Quality**: Use PNG for presentations and SVG for further editing.

View File

@@ -1,14 +1,10 @@
# 思维导图 - 思维导图生成插件
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.9.1 | **许可证:** MIT
> **重要提示**:为了确保所有插件的可维护性和易用性,每个插件都应附带清晰、完整的文档,以确保其功能、配置和使用方法得到充分说明。
思维导图是一个强大的 OpenWebUI 动作插件,能够智能分析长篇文本内容,自动生成交互式思维导图,帮助用户结构化和可视化知识。
---
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.9.1 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
## 🔥 v0.9.1 更新亮点
## v0.9.1 更新亮点
**新功能:图片输出模式**
@@ -18,362 +14,51 @@
- **高效存储**:图片模式将 SVG 上传至 `/api/v1/files`,避免聊天记录中出现超长 Base64 字符串。
- **智能特性**:生成的图片支持自动响应式宽度和自动主题检测(亮色/暗色)。
| 特性 | HTML 模式 (默认) | 图片模式 |
| :--- | :--- | :--- |
| **输出格式** | 交互式 HTML 代码块 | 静态 Markdown 图片 |
| **交互性** | 缩放、拖拽、展开/折叠 | 无 (静态图片) |
| **聊天记录** | 包含 HTML 代码 | 简洁 (仅图片链接) |
| **存储方式** | 浏览器实时渲染 | `/api/v1/files` 上传 |
## 核心特性 🔑
---
-**智能文本分析**:自动识别文本的核心主题、关键概念和层次结构。
-**交互式可视化**:基于 Markmap.js 生成美观的交互式思维导图。
-**高分辨率 PNG 导出**:导出高质量的 PNG 图片9 倍分辨率)。
-**完整控制面板**:缩放控制、展开层级选择、全屏模式。
-**主题切换**:手动主题切换按钮与自动主题检测。
-**图片输出模式**:生成静态 SVG 图片直接嵌入 Markdown聊天记录更简洁。
## 核心特性
## 使用方法 🛠️
-**智能文本分析**:自动识别文本的核心主题、关键概念和层次结构
-**交互式可视化**:基于 Markmap.js 生成美观的交互式思维导图
-**高分辨率 PNG 导出**:导出高质量的 PNG 图片9 倍分辨率,约 1-2MB 文件大小)
-**完整控制面板**:缩放控制(+/-/重置)、展开层级选择(全部/2级/3级、全屏模式
-**主题切换**:手动主题切换按钮(亮色/暗色)与自动主题检测
-**深色模式支持**:完整的深色模式支持,自动检测与手动覆盖
-**多语言支持**:根据用户语言自动调整输出
-**实时渲染**:在聊天界面中直接渲染思维导图,无需跳转
-**导出功能**:支持 PNG、SVG 代码和 Markdown 源码导出
-**自定义配置**:可配置 LLM 模型、最小文本长度等参数
-**图片输出模式**:生成静态 SVG 图片直接嵌入 Markdown**不输出 HTML 代码**,聊天记录更简洁)
1. **安装**: 在 OpenWebUI 管理员设置 -> 插件 -> 动作中上传 `smart_mind_map_cn.py`
2. **配置**: 确保配置了 LLM 模型(如 `gemini-2.5-flash`)。
3. **触发**: 在聊天设置中启用“思维导图”动作,并发送文本(至少 100 字符)。
4. **结果**: 思维导图将在聊天界面中直接渲染显示。
---
## 工作原理
1. **文本提取**:从用户消息中提取文本内容(自动过滤 HTML 代码块)
2. **智能分析**:使用配置的 LLM 模型分析文本结构
3. **Markdown 生成**:将分析结果转换为 Markmap 兼容的 Markdown 格式
4. **可视化渲染**:在 HTML 模板中使用 Markmap.js 渲染思维导图并优化字体层级H122px 粗体H218px 粗体)
5. **交互展示**:以可交互的形式展示给用户,并提供完整的控制面板
6. **主题检测**:自动检测并应用当前 OpenWebUI 的主题(亮色/暗色模式)
7. **导出选项**:提供 PNG高分辨率、SVG 和 Markdown 导出功能
---
## 安装与配置
### 1. 插件安装
1. 下载 `smart_mind_map_cn.py` 文件到本地
2. 在 OpenWebUI 管理员设置中找到"插件"Plugins部分
3. 选择"动作"Actions类型
4. 上传下载的文件
5. 刷新页面,插件即可使用
### 2. 模型配置
插件需要访问 LLM 模型来分析文本。请确保:
- 您的 OpenWebUI 实例中配置了至少一个可用的 LLM 模型
- 推荐使用快速、经济的模型(如 `gemini-2.5-flash`)来获得最佳体验
- 在插件设置中配置 `LLM_MODEL_ID` 参数
### 3. 插件启用
在聊天设置中选择"思维导图"动作插件即可启用。
### 4. 主题颜色风格一致性(可选)
为了使思维导图与 OpenWebUI 主题颜色风格保持一致,需要在 OpenWebUI 中启用 artifact 的同源访问:
- **配置位置**:在 OpenWebUI 用户设置中找到"界面"→"产物"部分Settings → Interface → Products/Artifacts
- **启用选项**:勾选 "iframe 沙盒允许同源访问"Allow same-origin access for artifacts / iframe sandbox allow-same-origin
- **沙箱属性**:确保 iframe 的 sandbox 属性包含 `allow-same-origin``allow-scripts`
启用后,思维导图会自动检测并应用 OpenWebUI 的当前主题(亮色/暗色),无需手动配置。
---
## 配置参数
您可以在插件的设置Valves中调整以下参数
## 配置参数 (Valves) ⚙️
| 参数 | 默认值 | 描述 |
| :--- | :--- | :--- |
| `show_status` | `true` | 是否在聊天界面显示操作状态更新(如"正在分析..."。 |
| `LLM_MODEL_ID` | `gemini-2.5-flash` | 用于文本分析的 LLM 模型 ID。推荐使用快速且经济的模型。 |
| `MIN_TEXT_LENGTH` | `100` | 进行思维导图分析所需的最小文本长度(字符数)。文本过短将无法生成有效的导图。 |
| `CLEAR_PREVIOUS_HTML` | `false` | 在生成新的思维导图时,是否清除之前由插件生成的 HTML 内容。 |
| `show_status` | `true` | 是否在聊天界面显示操作状态更新。 |
| `LLM_MODEL_ID` | `gemini-2.5-flash` | 用于文本分析的 LLM 模型 ID。 |
| `MIN_TEXT_LENGTH` | `100` | 进行思维导图分析所需的最小文本长度。 |
| `CLEAR_PREVIOUS_HTML` | `false` | 在生成新的思维导图时,是否清除之前的 HTML 内容。 |
| `MESSAGE_COUNT` | `1` | 用于生成思维导图的最近消息数量1-5。 |
| `OUTPUT_MODE` | `html` | 输出模式:`html`交互式 HTML默认`image` 为嵌入静态 Markdown 图片。 |
| `OUTPUT_MODE` | `html` | 输出模式:`html`交互式)或 `image`(静态图片。 |
---
## 故障排除 (Troubleshooting) ❓
## 使用方法
### 基本使用
1. 在聊天设置中启用"思维导图"动作
2. 在对话中输入或粘贴长篇文本内容(至少 100 字符)
3. 发送消息后,插件会自动分析并生成思维导图
4. 思维导图将在聊天界面中直接渲染显示
### 使用示例
**输入文本:**
```
人工智能AI是计算机科学的一个分支致力于创建能够执行通常需要人类智能的任务的系统。
主要应用领域包括:
1. 机器学习 - 使计算机能够从数据中学习
2. 自然语言处理 - 理解和生成人类语言
3. 计算机视觉 - 识别和处理图像
4. 机器人技术 - 创建能够与物理世界交互的智能系统
```
**生成结果:**
插件会生成一个以"人工智能"为中心主题的交互式思维导图,包含主要应用领域及其子概念。
### 导出功能
生成的思维导图支持三种导出方式:
1. **下载 PNG**:点击“📥 下载 PNG”按钮可将思维导图导出为高分辨率 PNG 图片9 倍分辨率,约 1-2MB 文件大小)
2. **复制 SVG 代码**:点击“复制 SVG 代码”按钮,可将思维导图的 SVG 格式复制到剪贴板
3. **复制 Markdown**:点击“复制 Markdown”按钮可将原始 Markdown 格式复制到剪贴板
### 控制面板
交互式思维导图包含完整的控制面板:
- **缩放控制**`+`(放大)、`-`(缩小)、`↻`(重置视图)
- **展开层级**在“全部”、“2 级”、“3 级”之间切换,控制节点展开深度
- **全屏模式**:进入全屏模式,获得更好的查看体验
- **主题切换**:手动在亮色和暗色主题之间切换
- **插件无法启动**:检查 OpenWebUI 日志,确认插件已正确上传并启用。
- **文本内容过短**:确保输入的文本至少包含 100 个字符。
- **渲染失败**:检查浏览器控制台,确认 Markmap.js 和 D3.js 库是否正确加载。
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
---
## 技术架构
### 前端渲染
- **Markmap.js**:开源的思维导图渲染引擎
- **D3.js**:数据可视化基础库
- **响应式设计**:适配不同屏幕尺寸
- **字体层级**优化的字体排版H122px 粗体)和 H218px 粗体),提供更好的可读性
### PNG 导出技术
- **SVG 转 Canvas**:将思维导图 SVG 转换为 Canvas 以导出 PNG
- **ForeignObject 处理**:正确处理 SVG 元素中的 HTML 内容
- **高分辨率**9 倍缩放因子,输出打印级质量(约 1-2MB 文件大小)
- **主题保持**:在导出的 PNG 中保持当前主题(亮色/暗色)
### 主题检测机制
自动检测并应用主题,具有 4 级优先级:
1. **显式切换**:用户手动点击主题切换按钮(最高优先级)
2. **Meta 标签**:从父文档读取 `<meta name="theme-color">`
3. **Class/Data-Theme**:检查父文档 HTML/body 的 `class``data-theme` 属性
4. **系统偏好**:回退到 `prefers-color-scheme` 媒体查询
### 后端处理
- **LLM 集成**:通过 `generate_chat_completion` 调用配置的模型
- **文本预处理**:自动过滤 HTML 代码块,提取纯文本内容
- **格式转换**:将 LLM 输出转换为 Markmap 兼容的 Markdown 格式
### 安全性增强
- **XSS 防护**:自动转义 `</script>` 标签,防止脚本注入
- **输入验证**:检查文本长度,避免无效请求
- **非冒泡事件**:按钮点击使用 `stopPropagation()` 防止导航拦截
---
## 故障排除
### 问题:插件无法启动
**解决方案:**
- 检查 OpenWebUI 日志,查看是否有错误信息
- 确认插件已正确上传并启用
- 验证 OpenWebUI 版本是否支持动作插件
### 问题:文本内容过短
**现象:** 提示"文本内容过短,无法进行有效分析"
**解决方案:**
- 确保输入的文本至少包含 100 个字符(默认配置)
- 可以在插件设置中降低 `MIN_TEXT_LENGTH` 参数值
- 提供更详细、结构化的文本内容
### 问题:思维导图未生成
**解决方案:**
- 检查 `LLM_MODEL_ID` 是否配置正确
- 确认配置的模型在 OpenWebUI 中可用
- 查看后端日志,检查是否有 LLM 调用失败的错误
- 验证用户是否有足够的权限访问配置的模型
### 问题:思维导图显示错误
**现象:** 显示"⚠️ 思维导图渲染失败"
**解决方案:**
- 检查浏览器控制台的错误信息
- 确认 Markmap.js 和 D3.js 库是否正确加载
- 验证生成的 Markdown 格式是否符合 Markmap 规范
- 尝试刷新页面重新渲染
### 问题PNG 导出不工作
**现象:**PNG 下载按钮不工作或生成空白/损坏的图片
**解决方案:**
- 确保浏览器支持 HTML5 Canvas API所有现代浏览器都支持
- 检查浏览器控制台是否有与 `toDataURL()` 或 Canvas 渲染相关的错误
- 确保思维导图在点击导出前已完全渲染
- 尝试刷新页面并重新生成思维导图
- 使用 Chrome 或 Firefox获得最佳 PNG 导出兼容性
### 问题:主题未自动检测
**现象:**思维导图不匹配 OpenWebUI 主题颜色
**解决方案:**
- 在 OpenWebUI 设置 → 界面 → 产物中启用“iframe 沙盒允许同源访问”
- 验证 iframe 的 sandbox 属性包含 `allow-same-origin``allow-scripts`
- 确保父文档有 `<meta name="theme-color">` 标签或主题 class/属性
- 使用手动主题切换按钮覆盖自动检测
- 检查浏览器控制台是否有跨域错误
### 问题:导出功能不工作
**解决方案:**
- 确认浏览器支持剪贴板 API
- 检查浏览器是否阻止了剪贴板访问权限
- 使用现代浏览器Chrome、Firefox、Edge 等)
---
- **Markmap.js**:开源的思维导图渲染引擎。
- **PNG 导出技术**9 倍缩放因子,输出打印级质量。
- **主题检测机制**4 级优先级检测(手动 > Meta > Class > 系统)。
- **安全性增强**XSS 防护与输入验证。
## 最佳实践
1. **文本准备**
- 提供结构清晰、层次分明的文本内容
- 使用段落、列表等格式帮助 LLM 理解文本结构
- 避免过于冗长或无结构的文本
2. **模型选择**
- 对于日常使用,推荐 `gemini-2.5-flash` 等快速模型
- 对于复杂文本分析,可以使用更强大的模型(如 GPT-4
- 根据需求平衡速度和分析质量
3. **性能优化**
- 合理设置 `MIN_TEXT_LENGTH`,避免处理过短的文本
- 对于特别长的文本,考虑先进行摘要再生成思维导图
- 在生产环境中关闭 `show_status` 以减少界面更新
4. **导出质量**
- **PNG 导出**最适合演示、文档和分享9 倍分辨率适合打印)
- **SVG 导出**:最适合在矢量图形工具中进一步编辑(无限缩放)
- **Markdown 导出**:最适合版本控制、协作和重新生成
5. **主题一致性**
- 启用同源访问以实现自动主题检测
- 如果自动检测失败,使用手动主题切换
- 在切换到所需主题后导出 PNG以保持视觉一致性
---
## 依赖要求
本插件仅使用 OpenWebUI 的内置依赖,**无需安装额外的软件包。**
---
## 更新日志
### v0.9.1
**新功能:图片输出模式**
- 新增 `OUTPUT_MODE` 配置参数,支持两种模式:
- `html`(默认):交互式 HTML 思维导图,带完整控制面板
- `image`:静态 SVG 图片直接嵌入 Markdown上传至 `/api/v1/files`
- 图片模式特性:
- 自动响应式宽度(适应聊天容器)
- 自动主题检测(亮色/暗色)
- 通过 Chat API 持久化存储(刷新页面后保留)
- 高效文件存储(聊天记录中无超长 Base64 字符串)
**改进项:**
- 实现健壮的 Chat API 更新机制,带重试逻辑
- 修复消息持久化,同时更新 `messages[]``history.messages`
- 添加 Event API 实现即时前端更新
- 移除不必要的 `SVG_WIDTH``SVG_HEIGHT` 参数(现已自动计算)
**技术细节:**
- 图片模式使用 `__event_call__` 在浏览器中执行 JavaScript
- SVG 离屏渲染,转换为 Blob并上传至 OpenWebUI Files API
- 通过 OpenWebUI Backend-Controlled API 流程更新聊天消息为 `/api/v1/files/{id}/content` URL
### v0.8.2
- 移除输出中的调试信息
### v0.8.0 (Previous Version)
**主要功能:**
- 添加高分辨率 PNG 导出9 倍分辨率,约 1-2MB 文件大小)
- 实现完整的控制面板,包含缩放控制(+/-/重置)
- 添加展开层级选择(全部/2级/3级
- 集成全屏模式,自动适应
- 添加手动主题切换按钮(亮色/暗色)
- 实现 4 级优先级的自动主题检测
**改进项:**
- 优化字体层级H122px 粗体H218px 粗体)
- 增强深色模式,完整的主题支持
- 改进 PNG 导出技术SVG 转 Canvas处理 foreignObject
- 在导出的 PNG 图片中保持主题
- 增强安全性,按钮事件使用非冒泡机制
**Bug 修复:**
- 修复跨域 iframe 中的主题检测问题
- 解决 SVG 中 HTML 内容的 PNG 导出问题
- 改进与 OpenWebUI 主题系统的兼容性
### v0.7.2
- 优化文本提取逻辑,自动过滤 HTML 代码块
- 改进错误处理和用户反馈
- 增强导出功能的兼容性
- 优化 UI 样式和交互体验
---
## 许可证
本插件采用 MIT 许可证发布。
## 贡献
欢迎提交问题报告和改进建议!请访问项目仓库:[awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
---
## 相关资源
- [Markmap 官方网站](https://markmap.js.org/)
- [OpenWebUI 文档](https://docs.openwebui.com/)
- [D3.js 官方网站](https://d3js.org/)
1. **文本准备**:提供结构清晰、层次分明的文本内容。
2. **模型选择**:日常使用推荐 `gemini-2.5-flash` 等快速模型。
3. **导出质量**PNG 适合演示分享SVG 适合进一步矢量编辑。

View File

@@ -48,7 +48,3 @@ When adding a new filter, please follow these steps:
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## License
MIT License

View File

@@ -70,7 +70,3 @@
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 许可证
MIT License

View File

@@ -1,6 +1,6 @@
# Async Context Compression Filter
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.1.3 | **License:** MIT
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 1.1.3 | **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.
@@ -69,9 +69,6 @@ It is recommended to keep this filter early in the chain so it runs before filte
---
## Troubleshooting
- **Database table not created**: Ensure Open WebUI is configured with a database and check Open WebUI logs for errors.
- **Summary not generated**: Confirm `compression_threshold_tokens` was hit and `summary_model` is compatible. Review logs for details.
- **Initial system prompt is lost**: Keep `keep_first` greater than 0 to protect the initial message.
- **Compression effect is weak**: Raise `compression_threshold_tokens` or lower `keep_first` / `keep_last` to allow more aggressive compression.
- **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,6 +1,6 @@
# 异步上下文压缩过滤器
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.1.3 | **许可证:** MIT
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.1.3 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
> **重要提示**:为了确保所有过滤器的可维护性和易用性,每个过滤器都应附带清晰、完整的文档,以确保其功能、配置和使用方法得到充分说明。
@@ -112,9 +112,6 @@
---
## 故障排除
- **数据库表未创建**:确保 Open WebUI 已配置数据库,并查看日志获取错误信息。
- **摘要未生成**:检查是否达到 `compression_threshold_tokens`,确认 `summary_model` 可用,并查看日志。
- **初始系统提示丢失**:将 `keep_first` 设置为大于 0。
- **压缩效果不明显**:提高 `compression_threshold_tokens`,或降低 `keep_first` / `keep_last` 以增强压缩力度。
- **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)

View File

@@ -1,61 +1,84 @@
# Markdown Normalizer Filter
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui)
**Version:** 1.1.2
**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
A content normalizer filter for Open WebUI that fixes common Markdown formatting issues in LLM outputs. It ensures that code blocks, LaTeX formulas, Mermaid diagrams, and other Markdown elements are rendered correctly.
## Features
* **Mermaid Syntax Fix**: Automatically fixes common Mermaid syntax errors, such as unquoted node labels (including multi-line labels and citations) and unclosed subgraphs. **New in v1.1.2**: Comprehensive protection for edge labels (text on connecting lines) across all link types (solid, dotted, thick).
* **Frontend Console Debugging**: Supports printing structured debug logs directly to the browser console (F12) for easier troubleshooting.
* **Code Block Formatting**: Fixes broken code block prefixes, suffixes, and indentation.
* **LaTeX Normalization**: Standardizes LaTeX formula delimiters (`\[` -> `$$`, `\(` -> `$`).
* **Thought Tag Normalization**: Unifies thought tags (`<think>`, `<thinking>` -> `<thought>`).
* **Escape Character Fix**: Cleans up excessive escape characters (`\\n`, `\\t`).
* **List Formatting**: Ensures proper newlines in list items.
* **Heading Fix**: Adds missing spaces in headings (`#Heading` -> `# Heading`).
* **Table Fix**: Adds missing closing pipes in tables.
* **XML Cleanup**: Removes leftover XML artifacts.
* **Details Tag Normalization**: Ensures proper spacing for `<details>` tags (used for thought chains). Adds a blank line after `</details>` and ensures a newline after self-closing `<details />` tags to prevent rendering issues.
* **Emphasis Spacing Fix**: Fixes extra spaces inside emphasis markers (e.g., `** text **` -> `**text**`) which can cause rendering failures. Includes safeguards to protect math expressions (e.g., `2 * 3 * 4`) and list variables.
* **Mermaid Syntax Fix**: Automatically fixes common Mermaid syntax errors, such as unquoted node labels (including multi-line labels and citations) and unclosed subgraphs. **New in v1.1.2**: Comprehensive protection for edge labels (text on connecting lines) across all link types (solid, dotted, thick).
* **Frontend Console Debugging**: Supports printing structured debug logs directly to the browser console (F12) for easier troubleshooting.
* **Code Block Formatting**: Fixes broken code block prefixes, suffixes, and indentation.
* **LaTeX Normalization**: Standardizes LaTeX formula delimiters (`\[` -> `$$`, `\(` -> `$`).
* **Thought Tag Normalization**: Unifies thought tags (`<think>`, `<thinking>` -> `<thought>`).
* **Escape Character Fix**: Cleans up excessive escape characters (`\\n`, `\\t`).
* **List Formatting**: Ensures proper newlines in list items.
* **Heading Fix**: Adds missing spaces in headings (`#Heading` -> `# Heading`).
* **Table Fix**: Adds missing closing pipes in tables.
* **XML Cleanup**: Removes leftover XML artifacts.
## Usage
1. Install the plugin in Open WebUI.
2. Enable the filter globally or for specific models.
3. Configure the enabled fixes in the **Valves** settings.
4. (Optional) **Show Debug Log** is enabled by default in Valves. This prints structured logs to the browser console (F12).
1. Install the plugin in Open WebUI.
2. Enable the filter globally or for specific models.
3. Configure the enabled fixes in the **Valves** settings.
4. (Optional) **Show Debug Log** is enabled by default in Valves. This prints structured logs to the browser console (F12).
> [!WARNING]
> As this is an initial version, some "negative fixes" might occur (e.g., breaking valid Markdown). If you encounter issues, please check the console logs, copy the "Original" vs "Normalized" content, and submit an issue.
## Configuration (Valves)
* `priority`: Filter priority (default: 50).
* `enable_escape_fix`: Fix excessive escape characters.
* `enable_thought_tag_fix`: Normalize thought tags.
* `enable_code_block_fix`: Fix code block formatting.
* `enable_latex_fix`: Normalize LaTeX formulas.
* `enable_list_fix`: Fix list item newlines (Experimental).
* `enable_unclosed_block_fix`: Auto-close unclosed code blocks.
* `enable_fullwidth_symbol_fix`: Fix full-width symbols in code blocks.
* `enable_mermaid_fix`: Fix Mermaid syntax errors.
* `enable_heading_fix`: Fix missing space in headings.
* `enable_table_fix`: Fix missing closing pipe in tables.
* `enable_xml_tag_cleanup`: Cleanup leftover XML tags.
* `show_status`: Show status notification when fixes are applied.
* `show_debug_log`: Print debug logs to browser console.
* `priority`: Filter priority (default: 50).
* `enable_escape_fix`: Fix excessive escape characters.
* `enable_thought_tag_fix`: Normalize thought tags.
* `enable_details_tag_fix`: Normalize details tags (default: True).
* `enable_code_block_fix`: Fix code block formatting.
* `enable_latex_fix`: Normalize LaTeX formulas.
* `enable_list_fix`: Fix list item newlines (Experimental).
* `enable_unclosed_block_fix`: Auto-close unclosed code blocks.
* `enable_fullwidth_symbol_fix`: Fix full-width symbols in code blocks.
* `enable_mermaid_fix`: Fix Mermaid syntax errors.
* `enable_heading_fix`: Fix missing space in headings.
* `enable_table_fix`: Fix missing closing pipe in tables.
* `enable_xml_tag_cleanup`: Cleanup leftover XML tags.
* `enable_emphasis_spacing_fix`: Fix extra spaces in emphasis (default: True).
* `show_status`: Show status notification when fixes are applied.
* `show_debug_log`: Print debug logs to browser console.
## Troubleshooting ❓
* **Submit an Issue**: If you encounter any problems, please submit an issue on GitHub: [Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## Changelog
### v1.2.2
* **Version Bump**: Documentation and metadata updated for the latest release.
### v1.2.1
* **Emphasis Spacing Fix**: Added a new fix for extra spaces inside emphasis markers (e.g., `** text **` -> `**text**`).
* Uses a recursive approach to handle nested emphasis (e.g., `**bold _italic _**`).
* Includes safeguards to prevent modifying math expressions (e.g., `2 * 3 * 4`) or list variables.
* Controlled by the `enable_emphasis_spacing_fix` valve (default: True).
### v1.2.0
* **Details Tag Support**: Added normalization for `<details>` tags.
* Ensures a blank line is added after `</details>` closing tags to separate thought content from the main response.
* Ensures a newline is added after self-closing `<details ... />` tags to prevent them from interfering with subsequent Markdown headings (e.g., fixing `<details/>#Heading`).
* Includes safeguard to prevent modification of `<details>` tags inside code blocks.
### v1.1.2
* **Mermaid Edge Label Protection**: Implemented comprehensive protection for edge labels (text on connecting lines) to prevent them from being incorrectly modified. Now supports all Mermaid link types including solid (`--`), dotted (`-.`), and thick (`==`) lines with or without arrows.
* **Bug Fixes**: Fixed an issue where lines without arrows (e.g., `A -- text --- B`) were not correctly protected.
* **Mermaid Edge Label Protection**: Implemented comprehensive protection for edge labels (text on connecting lines) to prevent them from being incorrectly modified. Now supports all Mermaid link types including solid (`--`), dotted (`-.`), and thick (`==`) lines with or without arrows.
* **Bug Fixes**: Fixed an issue where lines without arrows (e.g., `A -- text --- B`) were not correctly protected.
### v1.1.0
* **Mermaid Fix Refinement**: Improved regex to handle nested parentheses in node labels (e.g., `ID("Label (text)")`) and avoided matching connection labels.
* **HTML Safeguard Optimization**: Refined `_contains_html` to allow common tags like `<br/>`, `<b>`, `<i>`, etc., ensuring Mermaid diagrams with these tags are still normalized.
* **Full-width Symbol Cleanup**: Fixed duplicate keys and incorrect quote mapping in `FULLWIDTH_MAP`.
* **Bug Fixes**: Fixed missing `Dict` import in Python files.
## License
MIT
* **Mermaid Fix Refinement**: Improved regex to handle nested parentheses in node labels (e.g., `ID("Label (text)")`) and avoided matching connection labels.
* **HTML Safeguard Optimization**: Refined `_contains_html` to allow common tags like `<br/>`, `<b>`, `<i>`, etc., ensuring Mermaid diagrams with these tags are still normalized.
* **Full-width Symbol Cleanup**: Fixed duplicate keys and incorrect quote mapping in `FULLWIDTH_MAP`.
* **Bug Fixes**: Fixed missing `Dict` import in Python files.

View File

@@ -1,61 +1,84 @@
# Markdown 格式化过滤器 (Markdown Normalizer)
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui)
**版本:** 1.1.2
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 1.2.2 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
这是一个用于 Open WebUI 的内容格式化过滤器,旨在修复 LLM 输出中常见的 Markdown 格式问题。它能确保代码块、LaTeX 公式、Mermaid 图表和其他 Markdown 元素被正确渲染。
## 功能特性
* **Mermaid 语法修复**: 自动修复常见的 Mermaid 语法错误,如未加引号的节点标签(支持多行标签和引用标记)和未闭合的子图 (Subgraph)。**v1.1.2 新增**: 全面保护各种类型的连线标签(实线、虚线、粗线),防止被误修改
* **前端控制台调试**: 支持将结构化的调试日志直接打印到浏览器控制台 (F12),方便排查问题
* **代码块格式化**: 修复破损的代码块前缀、后缀和缩进问题
* **LaTeX 规范化**: 标准化 LaTeX 公式定界符 (`\[` -> `$$`, `\(` -> `$`)
* **思维标签规范化**: 统一思维链标签 (`<think>`, `<thinking>` -> `<thought>`)
* **转义字符修复**: 清理过度的转义字符 (`\\n`, `\\t`)。
* **列表格式化**: 确保列表项有正确的换行
* **标题修复**: 修复标题中缺失的空格 (`#标题` -> `# 标题`)。
* **表格修复**: 修复表格中缺失的闭合管道符
* **XML 清理**: 移除残留的 XML 标签
* **Details 标签规范化**: 确保 `<details>` 标签(常用于思维链)有正确的间距。在 `</details>` 后添加空行,并在自闭合 `<details />` 标签后添加换行,防止渲染问题
* **强调空格修复**: 修复强调标记内部的多余空格(例如 `** 文本 **` -> `**文本**`),这会导致 Markdown 渲染失败。包含保护机制,防止误修改数学表达式(如 `2 * 3 * 4`)或列表变量
* **Mermaid 语法修复**: 自动修复常见的 Mermaid 语法错误,如未加引号的节点标签(支持多行标签和引用标记)和未闭合的子图 (Subgraph)。**v1.1.2 新增**: 全面保护各种类型的连线标签(实线、虚线、粗线),防止被误修改
* **前端控制台调试**: 支持将结构化的调试日志直接打印到浏览器控制台 (F12),方便排查问题
* **代码块格式化**: 修复破损的代码块前缀、后缀和缩进问题
* **LaTeX 规范化**: 标准化 LaTeX 公式定界符 (`\[` -> `$$`, `\(` -> `$`)。
* **思维标签规范化**: 统一思维链标签 (`<think>`, `<thinking>` -> `<thought>`)
* **转义字符修复**: 清理过度的转义字符 (`\\n`, `\\t`)。
* **表格式化**: 确保列表项有正确的换行
* **标题修复**: 修复标题中缺失的空格 (`#标题` -> `# 标题`)
* **表格修复**: 修复表格中缺失的闭合管道符。
* **XML 清理**: 移除残留的 XML 标签。
## 使用方法
1. 在 Open WebUI 中安装此插件。
2. 全局启用或为特定模型启用此过滤器。
3. **Valves** 设置中配置需要启用的修复项。
4. (可选) **显示调试日志 (Show Debug Log)** 在 Valves 中默认开启。这会将结构化的日志打印到浏览器控制台 (F12)。
1. 在 Open WebUI 中安装此插件。
2. 全局启用或为特定模型启用此过滤器。
3.**Valves** 设置中配置需要启用的修复项。
4. (可选) **显示调试日志 (Show Debug Log)** 在 Valves 中默认开启。这会将结构化的日志打印到浏览器控制台 (F12)。
> [!WARNING]
> 由于这是初版,可能会出现“负向修复”的情况(例如破坏了原本正确的格式)。如果您遇到问题,请务必查看控制台日志,复制“原始 (Original)”与“规范化 (Normalized)”的内容对比,并提交 Issue 反馈。
## 配置项 (Valves)
* `priority`: 过滤器优先级 (默认: 50)。
* `enable_escape_fix`: 修复过度的转义字符。
* `enable_thought_tag_fix`: 规范化思维标签。
* `enable_code_block_fix`: 修复代码块格式
* `enable_latex_fix`: 规范化 LaTeX 公式。
* `enable_list_fix`: 修复列表项换行 (实验性)
* `enable_unclosed_block_fix`: 自动闭合未闭合的代码块
* `enable_fullwidth_symbol_fix`: 修复代码块中的全角符号
* `enable_mermaid_fix`: 修复 Mermaid 语法错误
* `enable_heading_fix`: 修复标题中缺失的空格
* `enable_table_fix`: 修复表格中缺失的闭合管道符
* `enable_xml_tag_cleanup`: 清理残留的 XML 标签
* `show_status`: 应用修复时显示状态通知
* `show_debug_log`: 在浏览器控制台打印调试日志
* `priority`: 过滤器优先级 (默认: 50)。
* `enable_escape_fix`: 修复过度的转义字符。
* `enable_thought_tag_fix`: 规范化思维标签。
* `enable_details_tag_fix`: 规范化 Details 标签 (默认: True)
* `enable_code_block_fix`: 修复代码块格式。
* `enable_latex_fix`: 规范化 LaTeX 公式
* `enable_list_fix`: 修复列表项换行 (实验性)
* `enable_unclosed_block_fix`: 自动闭合未闭合的代码块
* `enable_fullwidth_symbol_fix`: 修复代码块中的全角符号
* `enable_mermaid_fix`: 修复 Mermaid 语法错误
* `enable_heading_fix`: 修复标题中缺失的空格
* `enable_table_fix`: 修复表格中缺失的闭合管道符
* `enable_xml_tag_cleanup`: 清理残留的 XML 标签
* `enable_emphasis_spacing_fix`: 修复强调语法中的多余空格 (默认: True)
* `show_status`: 应用修复时显示状态通知。
* `show_debug_log`: 在浏览器控制台打印调试日志。
## 故障排除 (Troubleshooting) ❓
* **提交 Issue**: 如果遇到任何问题,请在 GitHub 上提交 Issue[Awesome OpenWebUI Issues](https://github.com/Fu-Jie/awesome-openwebui/issues)
## 更新日志
### v1.2.2
* **版本更新**: 文档与元数据已同步到最新版本。
### v1.2.1
* **强调空格修复**: 新增了对强调标记内部多余空格的修复(例如 `** 文本 **` -> `**文本**`)。
* 采用递归方法处理嵌套强调(例如 `**加粗 _斜体 _**`)。
* 包含保护机制,防止误修改数学表达式(如 `2 * 3 * 4`)或列表变量。
* 通过 `enable_emphasis_spacing_fix` 开关控制(默认:开启)。
### v1.2.0
* **Details 标签支持**: 新增了对 `<details>` 标签的规范化支持。
* 确保在 `</details>` 闭合标签后添加空行,将思维内容与正文分隔开。
* 确保在自闭合 `<details ... />` 标签后添加换行,防止其干扰后续的 Markdown 标题(例如修复 `<details/>#标题`)。
* 包含保护机制,防止修改代码块内部的 `<details>` 标签。
### v1.1.2
* **Mermaid 连线标签保护**: 实现了全面的连线标签保护机制,防止连接线上的文字被误修改。现在支持所有 Mermaid 连线类型,包括实线 (`--`)、虚线 (`-.`) 和粗线 (`==`),无论是否带有箭头。
* **Bug 修复**: 修复了无箭头连线(如 `A -- text --- B`)未被正确保护的问题
* **Mermaid 连线标签保护**: 实现了全面的连线标签保护机制,防止连接线上的文字被误修改。现在支持所有 Mermaid 连线类型,包括实线 (`--`)、虚线 (`-.`) 和粗线 (`==`),无论是否带有箭头
* **Bug 修复**: 修复了无箭头连线(如 `A -- text --- B`)未被正确保护的问题。
### v1.1.0
* **Mermaid 修复优化**: 改进了正则表达式以处理节点标签中的嵌套括号(如 `ID("标签 (文本)")`),并避免误匹配连接线上的文字。
* **HTML 保护机制优化**: 优化了 `_contains_html` 检测,允许 `<br/>`, `<b>`, `<i>` 等常见标签,确保包含这些标签的 Mermaid 图表能被正常规范化。
* **全角符号清理**: 修复了 `FULLWIDTH_MAP` 中的重复键名和错误的引号映射。
* **Bug 修复**: 修复了 Python 文件中缺失的 `Dict` 类型导入。
## 许可证
MIT
* **Mermaid 修复优化**: 改进了正则表达式以处理节点标签中的嵌套括号(如 `ID("标签 (文本)")`),并避免误匹配连接线上的文字。
* **HTML 保护机制优化**: 优化了 `_contains_html` 检测,允许 `<br/>`, `<b>`, `<i>` 等常见标签,确保包含这些标签的 Mermaid 图表能被正常规范化。
* **全角符号清理**: 修复了 `FULLWIDTH_MAP` 中的重复键名和错误的引号映射。
* **Bug 修复**: 修复了 Python 文件中缺失的 `Dict` 类型导入。

View File

@@ -3,7 +3,7 @@ title: Markdown Normalizer
author: Fu-Jie
author_url: https://github.com/Fu-Jie/awesome-openwebui
funding_url: https://github.com/open-webui
version: 1.1.2
version: 1.2.2
openwebui_id: baaa8732-9348-40b7-8359-7e009660e23c
description: A content normalizer filter that fixes common Markdown formatting issues in LLM outputs, such as broken code blocks, LaTeX formulas, and list formatting.
"""
@@ -29,6 +29,7 @@ class NormalizerConfig:
False # Apply escape fix inside code blocks (default: False for safety)
)
enable_thought_tag_fix: bool = True # Normalize thought tags
enable_details_tag_fix: bool = True # Normalize <details> tags (like thought tags)
enable_code_block_fix: bool = True # Fix code block formatting
enable_latex_fix: bool = True # Fix LaTeX formula formatting
enable_list_fix: bool = (
@@ -42,6 +43,7 @@ class NormalizerConfig:
)
enable_table_fix: bool = True # Fix missing closing pipe in tables
enable_xml_tag_cleanup: bool = True # Cleanup leftover XML tags
enable_emphasis_spacing_fix: bool = True # Fix spaces inside **emphasis**
# Custom cleaner functions (for advanced extension)
custom_cleaners: List[Callable[[str], str]] = field(default_factory=list)
@@ -52,8 +54,8 @@ class ContentNormalizer:
# --- 1. Pre-compiled Regex Patterns (Performance Optimization) ---
_PATTERNS = {
# Code block prefix: if ``` is not at start of line or file
"code_block_prefix": re.compile(r"(?<!^)(?<!\n)(```)", re.MULTILINE),
# Code block prefix: if ``` is not at start of line (ignoring whitespace)
"code_block_prefix": re.compile(r"(\S[ \t]*)(```)"),
# Code block suffix: ```lang followed by non-whitespace (no newline)
"code_block_suffix": re.compile(r"(```[\w\+\-\.]*)[ \t]+([^\n\r])"),
# Code block indent: whitespace at start of line + ```
@@ -63,6 +65,12 @@ class ContentNormalizer:
r"</(thought|think|thinking)>[ \t]*\n*", re.IGNORECASE
),
"thought_start": re.compile(r"<(thought|think|thinking)>", re.IGNORECASE),
# Details tag: </details> followed by optional whitespace/newlines
"details_end": re.compile(r"</details>[ \t]*\n*", re.IGNORECASE),
# Self-closing details tag: <details ... /> followed by optional whitespace (but NOT already having newline)
"details_self_closing": re.compile(
r"(<details[^>]*/\s*>)(?!\n)", re.IGNORECASE
),
# LaTeX block: \[ ... \]
"latex_bracket_block": re.compile(r"\\\[(.+?)\\\]", re.DOTALL),
# LaTeX inline: \( ... \)
@@ -101,6 +109,13 @@ class ContentNormalizer:
"heading_space": re.compile(r"^(#+)([^ \n#])", re.MULTILINE),
# Table: | col1 | col2 -> | col1 | col2 |
"table_pipe": re.compile(r"^(\|.*[^|\n])$", re.MULTILINE),
# Emphasis spacing: ** text ** -> **text**
# Matches emphasis blocks within a single line. We use a recursive approach
# in _fix_emphasis_spacing to handle nesting and spaces correctly.
# NOTE: We use [^\n] instead of . to prevent cross-line matching.
"emphasis_spacing": re.compile(
r"(?<!\*|_)(\*{1,3}|_)(?P<inner>[^\n]*?)(\1)(?!\*|_)"
),
}
def __init__(self, config: Optional[NormalizerConfig] = None):
@@ -130,7 +145,14 @@ class ContentNormalizer:
if content != original:
self.applied_fixes.append("Normalize Thought Tags")
# 3. Code block formatting fix
# 3. Details tag normalization (must be before heading fix)
if self.config.enable_details_tag_fix:
original = content
content = self._fix_details_tags(content)
if content != original:
self.applied_fixes.append("Normalize Details Tags")
# 4. Code block formatting fix
if self.config.enable_code_block_fix:
original = content
content = self._fix_code_blocks(content)
@@ -193,6 +215,13 @@ class ContentNormalizer:
if content != original:
self.applied_fixes.append("Cleanup XML Tags")
# 12. Emphasis spacing fix
if self.config.enable_emphasis_spacing_fix:
original = content
content = self._fix_emphasis_spacing(content)
if content != original:
self.applied_fixes.append("Fix Emphasis Spacing")
# 9. Custom cleaners
for cleaner in self.config.custom_cleaners:
original = content
@@ -249,10 +278,26 @@ class ContentNormalizer:
# 2. Standardize end tag and ensure newlines: </think> -> </thought>\n\n
return self._PATTERNS["thought_end"].sub("</thought>\n\n", content)
def _fix_details_tags(self, content: str) -> str:
"""Normalize <details> tags: ensure proper spacing after closing tags
Handles two cases:
1. </details> followed by content -> ensure double newline
2. <details .../> (self-closing) followed by content -> ensure newline
Note: Only applies outside of code blocks to avoid breaking code examples.
"""
parts = content.split("```")
for i in range(0, len(parts), 2): # Even indices are markdown text
# 1. Ensure double newline after </details>
parts[i] = self._PATTERNS["details_end"].sub("</details>\n\n", parts[i])
# 2. Ensure newline after self-closing <details ... />
parts[i] = self._PATTERNS["details_self_closing"].sub(r"\1\n", parts[i])
return "```".join(parts)
def _fix_code_blocks(self, content: str) -> str:
"""Fix code block formatting (prefixes, suffixes, indentation)"""
# Remove indentation before code blocks
content = self._PATTERNS["code_block_indent"].sub(r"\1", content)
# Ensure newline before ```
content = self._PATTERNS["code_block_prefix"].sub(r"\n\1", content)
# Ensure newline after ```lang
@@ -411,6 +456,47 @@ class ContentNormalizer:
"""Remove leftover XML tags"""
return self._PATTERNS["xml_artifacts"].sub("", content)
def _fix_emphasis_spacing(self, content: str) -> str:
"""Fix spaces inside **emphasis** or _emphasis_
Example: ** text ** -> **text**, **text ** -> **text**, ** text** -> **text**
"""
def replacer(match):
symbol = match.group(1)
inner = match.group("inner")
# Recursive step: Fix emphasis spacing INSIDE the current block first
# This ensures that ** _ italic _ ** becomes ** _italic_ ** before we strip outer spaces.
inner = self._PATTERNS["emphasis_spacing"].sub(replacer, inner)
# If no leading/trailing whitespace, nothing to fix at this level
stripped_inner = inner.strip()
if stripped_inner == inner:
return f"{symbol}{inner}{symbol}"
# Safeguard: If inner content is just whitespace, don't touch it
if not stripped_inner:
return match.group(0)
# Safeguard: If it looks like a math expression or list of variables (e.g. " * 3 * " or " _ b _ ")
# If the symbol is surrounded by spaces in the original text, it's likely an operator.
if inner.startswith(" ") and inner.endswith(" "):
# If it's single '*' or '_', and both sides have spaces, it's almost certainly an operator.
if symbol in ["*", "_"]:
return match.group(0)
return f"{symbol}{stripped_inner}{symbol}"
parts = content.split("```")
for i in range(0, len(parts), 2): # Even indices are markdown text
# We use a while loop to handle overlapping or multiple occurrences at the top level
while True:
new_part = self._PATTERNS["emphasis_spacing"].sub(replacer, parts[i])
if new_part == parts[i]:
break
parts[i] = new_part
return "```".join(parts)
class Filter:
class Valves(BaseModel):
@@ -428,6 +514,10 @@ class Filter:
enable_thought_tag_fix: bool = Field(
default=True, description="Normalize </thought> tags"
)
enable_details_tag_fix: bool = Field(
default=True,
description="Normalize <details> tags (add blank line after </details> and handle self-closing tags)",
)
enable_code_block_fix: bool = Field(
default=True,
description="Fix code block formatting (indentation, newlines)",
@@ -458,6 +548,10 @@ class Filter:
enable_xml_tag_cleanup: bool = Field(
default=True, description="Cleanup leftover XML tags"
)
enable_emphasis_spacing_fix: bool = Field(
default=True,
description="Fix spaces inside **emphasis** (e.g. ** text ** -> **text**)",
)
show_status: bool = Field(
default=True, description="Show status notification when fixes are applied"
)
@@ -591,6 +685,7 @@ class Filter:
enable_escape_fix=self.valves.enable_escape_fix,
enable_escape_fix_in_code_blocks=self.valves.enable_escape_fix_in_code_blocks,
enable_thought_tag_fix=self.valves.enable_thought_tag_fix,
enable_details_tag_fix=self.valves.enable_details_tag_fix,
enable_code_block_fix=self.valves.enable_code_block_fix,
enable_latex_fix=self.valves.enable_latex_fix,
enable_list_fix=self.valves.enable_list_fix,
@@ -600,6 +695,7 @@ class Filter:
enable_heading_fix=self.valves.enable_heading_fix,
enable_table_fix=self.valves.enable_table_fix,
enable_xml_tag_cleanup=self.valves.enable_xml_tag_cleanup,
enable_emphasis_spacing_fix=self.valves.enable_emphasis_spacing_fix,
)
normalizer = ContentNormalizer(config)

View File

@@ -3,7 +3,7 @@ title: Markdown 格式修复器 (Markdown Normalizer)
author: Fu-Jie
author_url: https://github.com/Fu-Jie/awesome-openwebui
funding_url: https://github.com/open-webui
version: 1.1.2
version: 1.2.2
description: 内容规范化过滤器,修复 LLM 输出中常见的 Markdown 格式问题如损坏的代码块、LaTeX 公式、Mermaid 图表和列表格式。
"""
@@ -25,6 +25,7 @@ class NormalizerConfig:
enable_escape_fix: bool = True # 修复过度的转义字符
enable_thought_tag_fix: bool = True # 规范化思维链标签
enable_details_tag_fix: bool = True # 规范化 <details> 标签(类似思维链标签)
enable_code_block_fix: bool = True # 修复代码块格式
enable_latex_fix: bool = True # 修复 LaTeX 公式格式
enable_list_fix: bool = False # 修复列表项换行 (默认关闭,因为可能过于激进)
@@ -34,6 +35,7 @@ class NormalizerConfig:
enable_heading_fix: bool = True # 修复标题中缺失的空格 (#Header -> # Header)
enable_table_fix: bool = True # 修复表格中缺失的闭合管道符
enable_xml_tag_cleanup: bool = True # 清理残留的 XML 标签
enable_emphasis_spacing_fix: bool = True # 修复 **强调内容** 中的多余空格
# 自定义清理函数 (用于高级扩展)
custom_cleaners: List[Callable[[str], str]] = field(default_factory=list)
@@ -44,8 +46,8 @@ class ContentNormalizer:
# --- 1. Pre-compiled Regex Patterns (Performance Optimization) ---
_PATTERNS = {
# Code block prefix: if ``` is not at start of line or file
"code_block_prefix": re.compile(r"(?<!^)(?<!\n)(```)", re.MULTILINE),
# Code block prefix: if ``` is not at start of line (ignoring whitespace)
"code_block_prefix": re.compile(r"(\S[ \t]*)(```)"),
# Code block suffix: ```lang followed by non-whitespace (no newline)
"code_block_suffix": re.compile(r"(```[\w\+\-\.]*)[ \t]+([^\n\r])"),
# Code block indent: whitespace at start of line + ```
@@ -55,6 +57,12 @@ class ContentNormalizer:
r"</(thought|think|thinking)>[ \t]*\n*", re.IGNORECASE
),
"thought_start": re.compile(r"<(thought|think|thinking)>", re.IGNORECASE),
# Details tag: </details> followed by optional whitespace/newlines
"details_end": re.compile(r"</details>[ \t]*\n*", re.IGNORECASE),
# Self-closing details tag: <details ... /> followed by optional whitespace (but NOT already having newline)
"details_self_closing": re.compile(
r"(<details[^>]*/\s*>)(?!\n)", re.IGNORECASE
),
# LaTeX block: \[ ... \]
"latex_bracket_block": re.compile(r"\\\[(.+?)\\\]", re.DOTALL),
# LaTeX inline: \( ... \)
@@ -93,6 +101,13 @@ class ContentNormalizer:
"heading_space": re.compile(r"^(#+)([^ \n#])", re.MULTILINE),
# Table: | col1 | col2 -> | col1 | col2 |
"table_pipe": re.compile(r"^(\|.*[^|\n])$", re.MULTILINE),
# Emphasis spacing: ** text ** -> **text**
# Matches emphasis blocks within a single line. We use a recursive approach
# in _fix_emphasis_spacing to handle nesting and spaces correctly.
# NOTE: We use [^\n] instead of . to prevent cross-line matching.
"emphasis_spacing": re.compile(
r"(?<!\*|_)(\*{1,3}|_)(?P<inner>[^\n]*?)(\1)(?!\*|_)"
),
}
def __init__(self, config: Optional[NormalizerConfig] = None):
@@ -122,7 +137,14 @@ class ContentNormalizer:
if content != original:
self.applied_fixes.append("Normalize Thought Tags")
# 3. Code block formatting fix
# 3. Details tag normalization (must be before heading fix)
if self.config.enable_details_tag_fix:
original = content
content = self._fix_details_tags(content)
if content != original:
self.applied_fixes.append("Normalize Details Tags")
# 4. Code block formatting fix
if self.config.enable_code_block_fix:
original = content
content = self._fix_code_blocks(content)
@@ -185,6 +207,13 @@ class ContentNormalizer:
if content != original:
self.applied_fixes.append("Cleanup XML Tags")
# 12. Emphasis spacing fix
if self.config.enable_emphasis_spacing_fix:
original = content
content = self._fix_emphasis_spacing(content)
if content != original:
self.applied_fixes.append("Fix Emphasis Spacing")
# 9. Custom cleaners
for cleaner in self.config.custom_cleaners:
original = content
@@ -223,10 +252,26 @@ class ContentNormalizer:
# 2. Standardize end tag and ensure newlines: </think> -> </thought>\n\n
return self._PATTERNS["thought_end"].sub("</thought>\n\n", content)
def _fix_details_tags(self, content: str) -> str:
"""规范化 <details> 标签:确保闭合标签后的正确间距
处理两种情况:
1. </details> 后跟内容 -> 确保有双换行
2. <details .../> (自闭合) 后跟内容 -> 确保有换行
注意:仅在代码块外部应用,以避免破坏代码示例。
"""
parts = content.split("```")
for i in range(0, len(parts), 2): # 偶数索引是 Markdown 文本
# 1. 确保 </details> 后有双换行
parts[i] = self._PATTERNS["details_end"].sub("</details>\n\n", parts[i])
# 2. 确保自闭合 <details ... /> 后有换行
parts[i] = self._PATTERNS["details_self_closing"].sub(r"\1\n", parts[i])
return "```".join(parts)
def _fix_code_blocks(self, content: str) -> str:
"""Fix code block formatting (prefixes, suffixes, indentation)"""
# Remove indentation before code blocks
content = self._PATTERNS["code_block_indent"].sub(r"\1", content)
# Ensure newline before ```
content = self._PATTERNS["code_block_prefix"].sub(r"\n\1", content)
# Ensure newline after ```lang
@@ -390,6 +435,47 @@ class ContentNormalizer:
"""Remove leftover XML tags"""
return self._PATTERNS["xml_artifacts"].sub("", content)
def _fix_emphasis_spacing(self, content: str) -> str:
"""Fix spaces inside **emphasis** or _emphasis_
Example: ** text ** -> **text**, **text ** -> **text**, ** text** -> **text**
"""
def replacer(match):
symbol = match.group(1)
inner = match.group("inner")
# Recursive step: Fix emphasis spacing INSIDE the current block first
# This ensures that ** _ italic _ ** becomes ** _italic_ ** before we strip outer spaces.
inner = self._PATTERNS["emphasis_spacing"].sub(replacer, inner)
# If no leading/trailing whitespace, nothing to fix at this level
stripped_inner = inner.strip()
if stripped_inner == inner:
return f"{symbol}{inner}{symbol}"
# Safeguard: If inner content is just whitespace, don't touch it
if not stripped_inner:
return match.group(0)
# Safeguard: If it looks like a math expression or list of variables (e.g. " * 3 * " or " _ b _ ")
# If the symbol is surrounded by spaces in the original text, it's likely an operator.
if inner.startswith(" ") and inner.endswith(" "):
# If it's single '*' or '_', and both sides have spaces, it's almost certainly an operator.
if symbol in ["*", "_"]:
return match.group(0)
return f"{symbol}{stripped_inner}{symbol}"
parts = content.split("```")
for i in range(0, len(parts), 2): # Even indices are markdown text
# We use a while loop to handle overlapping or multiple occurrences at the top level
while True:
new_part = self._PATTERNS["emphasis_spacing"].sub(replacer, parts[i])
if new_part == parts[i]:
break
parts[i] = new_part
return "```".join(parts)
class Filter:
class Valves(BaseModel):
@@ -403,6 +489,10 @@ class Filter:
enable_thought_tag_fix: bool = Field(
default=True, description="规范化思维链标签 (<think> -> <thought>)"
)
enable_details_tag_fix: bool = Field(
default=True,
description="规范化 <details> 标签 (在 </details> 后添加空行,处理自闭合标签)",
)
enable_code_block_fix: bool = Field(
default=True,
description="修复代码块格式 (缩进、换行)",
@@ -433,6 +523,10 @@ class Filter:
enable_xml_tag_cleanup: bool = Field(
default=True, description="清理残留的 XML 标签"
)
enable_emphasis_spacing_fix: bool = Field(
default=True,
description="修复强调语法中的多余空格 (例如 ** 文本 ** -> **文本**)",
)
show_status: bool = Field(default=True, description="应用修复时显示状态通知")
show_debug_log: bool = Field(
default=True, description="在浏览器控制台打印调试日志 (F12)"
@@ -494,6 +588,7 @@ class Filter:
fix_map = {
"Fix Escape Chars": "转义字符",
"Normalize Thought Tags": "思维标签",
"Normalize Details Tags": "Details标签",
"Fix Code Blocks": "代码块",
"Normalize LaTeX": "LaTeX公式",
"Fix List Format": "列表格式",
@@ -503,6 +598,7 @@ class Filter:
"Fix Headings": "标题格式",
"Fix Tables": "表格格式",
"Cleanup XML Tags": "XML清理",
"Fix Emphasis Spacing": "强调空格",
"Custom Cleaner": "自定义清理",
}
translated_fixes = [fix_map.get(fix, fix) for fix in applied_fixes]
@@ -579,6 +675,7 @@ class Filter:
config = NormalizerConfig(
enable_escape_fix=self.valves.enable_escape_fix,
enable_thought_tag_fix=self.valves.enable_thought_tag_fix,
enable_details_tag_fix=self.valves.enable_details_tag_fix,
enable_code_block_fix=self.valves.enable_code_block_fix,
enable_latex_fix=self.valves.enable_latex_fix,
enable_list_fix=self.valves.enable_list_fix,
@@ -588,6 +685,7 @@ class Filter:
enable_heading_fix=self.valves.enable_heading_fix,
enable_table_fix=self.valves.enable_table_fix,
enable_xml_tag_cleanup=self.valves.enable_xml_tag_cleanup,
enable_emphasis_spacing_fix=self.valves.enable_emphasis_spacing_fix,
)
normalizer = ContentNormalizer(config)

View File

@@ -14,6 +14,7 @@ class TestMarkdownNormalizer(unittest.TestCase):
self.config = NormalizerConfig(
enable_escape_fix=True,
enable_thought_tag_fix=True,
enable_details_tag_fix=True,
enable_code_block_fix=True,
enable_latex_fix=True,
enable_list_fix=True,
@@ -21,6 +22,7 @@ class TestMarkdownNormalizer(unittest.TestCase):
enable_fullwidth_symbol_fix=True,
enable_mermaid_fix=True,
enable_xml_tag_cleanup=True,
enable_heading_fix=True,
)
self.normalizer = ContentNormalizer(self.config)
@@ -42,6 +44,32 @@ class TestMarkdownNormalizer(unittest.TestCase):
self.normalizer.normalize(input_text_deepseek), expected_deepseek
)
def test_details_tag_fix(self):
# Case 1: </details> followed by content without blank line
input_text = (
"<details><summary>Thought</summary>\n> Thinking\n</details>Next paragraph"
)
expected = "<details><summary>Thought</summary>\n> Thinking\n</details>\n\nNext paragraph"
self.assertEqual(self.normalizer.normalize(input_text), expected)
# Case 2: Self-closing <details /> followed by heading
input_text_self_closing = '<details id="__DETAIL_0__"/>#Heading'
result = self.normalizer.normalize(input_text_self_closing)
self.assertIn("# Heading", result) # Heading should be fixed
self.assertIn(
'<details id="__DETAIL_0__"/>\n', result
) # Should have newline after
# Case 3: </details> already has proper spacing (should not add extra)
input_already_good = "</details>\n\nNext"
self.assertEqual(
self.normalizer.normalize(input_already_good), input_already_good
)
# Case 4: Details tag inside code block (should NOT be modified)
input_code_block = "```html\n<details>\n</details>\n```"
self.assertEqual(self.normalizer.normalize(input_code_block), input_code_block)
def test_code_block_fix(self):
# Case 1: Indentation
self.assertEqual(self.normalizer._fix_code_blocks(" ```python"), "```python")

View File

@@ -0,0 +1,37 @@
from markdown_normalizer import ContentNormalizer, NormalizerConfig
def test_side_effects():
normalizer = ContentNormalizer(NormalizerConfig(enable_details_tag_fix=True))
# Scenario 1: HTML code block
code_block = """```html
<details>
<summary>Click</summary>
Content
</details>
```"""
# Scenario 2: Python string
python_code = """```python
html = "</details>"
print(html)
```"""
print("--- Scenario 1: HTML Code Block ---")
res1 = normalizer.normalize(code_block)
print(repr(res1))
if "</details>\n\n" in res1 and "```" in res1:
print("WARNING: Modified inside HTML code block")
print("\n--- Scenario 2: Python String ---")
res2 = normalizer.normalize(python_code)
print(repr(res2))
if 'html = "</details>\n\n"' in res2:
print("CRITICAL: Broke Python string literal")
else:
print("OK")
if __name__ == "__main__":
test_side_effects()

View File

@@ -1,221 +0,0 @@
"""
title: Multi-Model Context Merger
author: Fu-Jie
author_url: https://github.com/Fu-Jie/awesome-openwebui
funding_url: https://github.com/Fu-Jie/awesome-openwebui
version: 0.1.0
description: Automatically merges context from multiple model responses in the previous turn.
"""
import asyncio
from typing import List, Optional, Dict
from pydantic import BaseModel, Field
from fastapi import Request
from open_webui.models.chats import Chats
class Filter:
class Valves(BaseModel):
# 注入的系统消息的前缀
CONTEXT_PREFIX: str = Field(
default="下面是多个匿名AI模型给出的回答使用<response>标签包裹:\n\n",
description="Prefix for the injected system message containing the raw merged context.",
)
def __init__(self):
self.valves = self.Valves()
self.toggle = True
self.type = "filter"
self.name = "合并回答"
self.description = "在用户提问时,自动注入之前多个模型回答的上下文。"
async def inlet(
self,
body: Dict,
__user__: Dict,
__metadata__: Dict,
__request__: Request,
__event_emitter__,
):
"""
此方法是过滤器的入口点。它会检查上一回合是否为多模型响应,
如果是,则将这些响应直接格式化,并将格式化后的上下文作为系统消息注入到当前请求中。
"""
print(f"*********** Filter '{self.name}' triggered ***********")
chat_id = __metadata__.get("chat_id")
if not chat_id:
print(
f"DEBUG: Filter '{self.name}' skipped: chat_id not found in metadata."
)
return body
print(f"DEBUG: Chat ID found: {chat_id}")
# 1. 从数据库获取完整的聊天历史
try:
chat = await asyncio.to_thread(Chats.get_chat_by_id, chat_id)
if (
not chat
or not hasattr(chat, "chat")
or not chat.chat.get("history")
or not chat.chat.get("history").get("messages")
):
print(
f"DEBUG: Filter '{self.name}' skipped: Chat history not found or empty for chat_id: {chat_id}"
)
return body
messages_map = chat.chat["history"]["messages"]
print(
f"DEBUG: Successfully loaded {len(messages_map)} messages from history."
)
# Count the number of user messages in the history
user_message_count = sum(
1 for msg in messages_map.values() if msg.get("role") == "user"
)
# If there are less than 2 user messages, there's no previous turn to merge.
if user_message_count < 2:
print(
f"DEBUG: Filter '{self.name}' skipped: Not enough user messages in history to have a previous turn (found {user_message_count}, required >= 2)."
)
return body
except Exception as e:
print(
f"ERROR: Filter '{self.name}' failed to get chat history from DB: {e}"
)
return body
# This filter rebuilds the entire chat history to consolidate all multi-response turns.
# 1. Get all messages from history and sort by timestamp
all_messages = list(messages_map.values())
all_messages.sort(key=lambda x: x.get("timestamp", 0))
# 2. Pre-group all assistant messages by their parentId for efficient lookup
assistant_groups = {}
for msg in all_messages:
if msg.get("role") == "assistant":
parent_id = msg.get("parentId")
if parent_id:
if parent_id not in assistant_groups:
assistant_groups[parent_id] = []
assistant_groups[parent_id].append(msg)
final_messages = []
processed_parent_ids = set()
# 3. Iterate through the sorted historical messages to build the final, clean list
for msg in all_messages:
msg_id = msg.get("id")
role = msg.get("role")
parent_id = msg.get("parentId")
if role == "user":
# Add user messages directly
final_messages.append(msg)
elif role == "assistant":
# If this assistant's parent group has already been processed, skip it
if parent_id in processed_parent_ids:
continue
# Process the group of siblings for this parent_id
if parent_id in assistant_groups:
siblings = assistant_groups[parent_id]
# Only perform a merge if there are multiple siblings
if len(siblings) > 1:
print(
f"DEBUG: Found a group of {len(siblings)} siblings for parent_id {parent_id}. Merging..."
)
# --- MERGE LOGIC ---
merged_content = None
merged_message_id = None
# Sort siblings by timestamp before processing
siblings.sort(key=lambda s: s.get("timestamp", 0))
merged_message_timestamp = siblings[0].get("timestamp", 0)
# Case A: Check for system pre-merged content (merged.status: true and content not empty)
merged_content_msg = next(
(
s
for s in siblings
if s.get("merged", {}).get("status")
and s.get("merged", {}).get("content")
),
None,
)
if merged_content_msg:
merged_content = merged_content_msg["merged"]["content"]
merged_message_id = merged_content_msg["id"]
merged_message_timestamp = merged_content_msg.get(
"timestamp", merged_message_timestamp
)
print(
f"DEBUG: Using pre-merged content from message ID: {merged_message_id}"
)
else:
# Case B: Manually merge content
combined_content = []
first_sibling_id = None
counter = 0
for s in siblings:
if not first_sibling_id:
first_sibling_id = s["id"]
content = s.get("content", "")
if (
content
and content
!= "The requested model is not supported."
):
response_id = chr(ord("a") + counter)
combined_content.append(
f'<response id="{response_id}">\n{content}\n</response>'
)
counter += 1
if combined_content:
merged_content = "\n\n".join(combined_content)
merged_message_id = first_sibling_id or parent_id
if merged_content:
merged_message = {
"id": merged_message_id,
"parentId": parent_id,
"role": "assistant",
"content": f"{self.valves.CONTEXT_PREFIX}{merged_content}",
"timestamp": merged_message_timestamp,
}
final_messages.append(merged_message)
else:
# If there's only one sibling, add it directly
final_messages.append(siblings[0])
# Mark this group as processed
processed_parent_ids.add(parent_id)
# 4. The new user message from the current request is not in the historical messages_map,
# so we need to append it to our newly constructed message list.
if body.get("messages"):
new_user_message_from_body = body["messages"][-1]
# Ensure we don't add a historical message that might be in the body for context
if new_user_message_from_body.get("id") not in messages_map:
final_messages.append(new_user_message_from_body)
# 5. Replace the original message list with the new, cleaned-up list
body["messages"] = final_messages
print(
f"DEBUG: Rebuilt message history with {len(final_messages)} messages, consolidating all multi-response turns."
)
print(f"*********** Filter '{self.name}' finished successfully ***********")
return body

View File

@@ -63,7 +63,3 @@ When adding a new pipe plugin, please follow these steps:
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## License
MIT License

View File

@@ -63,7 +63,3 @@
Fu-Jie
GitHub: [Fu-Jie/awesome-openwebui](https://github.com/Fu-Jie/awesome-openwebui)
## 许可证
MIT License