Compare commits

..

36 Commits

Author SHA1 Message Date
fujie
bef614838d feat(infographic): bump v1.6.1 hotfix addressing AI prompt translated behavior on user language parameters 2026-03-23 18:45:44 +08:00
fujie
b3cbe0783a fix(infographic): guide AI to match language of the original text content 2026-03-23 18:41:12 +08:00
github-actions[bot]
fd1097e1b2 chore: update community stats - plugin versions updated 2026-03-23 05:37:27 +00:00
fujie
38430b4b56 docs: add issue association rules to GEMINI.md 2026-03-23 13:32:35 +08:00
fujie
0cf1447a1f feat(infographic): bump v1.6.0 supporting 12-lang i18n & canvas high-contrast dark overrides 2026-03-23 13:28:00 +08:00
github-actions[bot]
a406aa0556 chore: update community stats - new plugin added (28 -> 30) 2026-03-22 17:10:20 +00:00
fujie
2da254c6f4 feat: Add 'One-Sentence Concept Explainer' and 'AI Task Instruction Generator' prompts, update prompt library documentation, and enforce language consistency. 2026-03-23 01:01:52 +08:00
fujie
1f9a5ac029 feat(pipelines): launch wisdom-synthesizer & sync docs and homepages 2026-03-23 00:38:32 +08:00
fujie
e6f22b0f82 feat: Introduce Wisdom Synthesizer pipeline and documentation, replacing the MoE Prompt Refiner. 2026-03-23 00:33:20 +08:00
fujie
2fae50a39f feat: remove iflow-sdk-pipe plugin, its READMEs, and associated Python code 2026-03-22 22:20:34 +08:00
fujie
4d7aef1da2 fix(github-copilot-sdk): fix redundant status queue writing affecting tool card format 2026-03-22 16:35:11 +08:00
fujie
22f69b7b9e docs: use exact post links in readme for mutual promotion 2026-03-21 16:24:51 +08:00
fujie
20e3a33ed2 docs: use openwebui market links in readme for mutual promotion 2026-03-21 16:22:16 +08:00
fujie
eb8545430f docs(plugins): add mutual introductions in README for skills-manager and batch-install 2026-03-21 16:19:00 +08:00
fujie
8b3f44b8e0 fix(filters): migrate is_copilot_model matching to body['features'] 2026-03-21 15:27:15 +08:00
fujie
c520a6fd45 fix(compression): add string fallback for is_copilot_model matching in Outlet 2026-03-21 15:20:05 +08:00
fujie
318e3951ff fix(filters): isolate is_copilot_model to metadata and fix single-pipe match 2026-03-21 14:59:30 +08:00
github-actions[bot]
85c58f1a3d chore: update community stats - plugin versions updated 2026-03-21 05:23:46 +00:00
fujie
9f2e7a9658 feat(github-copilot-sdk): release v0.12.0 with adaptive console, stream deduplication and TTFT profiling 2026-03-21 13:08:40 +08:00
fujie
c87e80379b docs(github-copilot-sdk): add Selective Recall guideline for adaptive console 2026-03-21 12:22:45 +08:00
fujie
4c9b5d1c7c feat(github-copilot-sdk): auto-init interactive_controls table and inject schema and rules into prompt 2026-03-21 12:21:20 +08:00
fujie
afac25c14c docs(github-copilot-sdk): enforce strictly independent tables for adaptive console 2026-03-21 12:13:21 +08:00
fujie
a8581119fe feat(github-copilot-sdk): add DB-backed adaptive interactive console guidelines 2026-03-21 12:11:09 +08:00
fujie
2508eec590 fix(github-copilot-sdk): fix duplicate responses and add fine-grained TTFT profiling 2026-03-21 11:55:50 +08:00
github-actions[bot]
121b1db732 chore: update community stats - plugin versions updated 2026-03-19 20:16:37 +00:00
fujie
ad04a3e50e docs: sync root READMEs with v0.11.0 features and stats 2026-03-20 03:57:47 +08:00
fujie
a5b968676d feat(github-copilot-sdk): expand Claude Sonnet filters
- Added explicit filtering for Claude 4.0 and 4.5 Sonnet iterations.
2026-03-20 03:31:58 +08:00
fujie
894584330c feat(github-copilot-sdk): refine official model filtering
- Removed experimental GPT-5 series models.
- Removed older Claude 3.5 Sonnet iterations to favor the latest versions.
2026-03-20 03:29:51 +08:00
fujie
6f8c871658 feat(github-copilot-sdk): bump version to v0.11.0 for performance & stability
- Fixed shared client pool bug to eliminate TTFT latency.
- Added pure BYOK-only mode support.
- Improved cross-user environment isolation for concurrency.
- Resolved RichUI infinite vertical sizing loop.
- Integrated client.ping() into stall detection.
- Automatically hide TODO List widget after completion.
- Synced all documentation and release notes.
2026-03-20 03:26:43 +08:00
fujie
bf3ba97b9a chore: update plugin README template for preview section 2026-03-16 21:16:16 +08:00
fujie
31496a191e Add Batch Install Plugins installation instructions to various plugins and filters
- Updated README files for the following plugins to include installation instructions using Batch Install Plugins:
  - deep-dive
  - export_to_docx
  - export_to_excel
  - flash-card
  - infographic
  - smart-mind-map
  - async-context-compression
  - chat-session-mapping-filter
  - folder-memory
  - github_copilot_sdk_files_filter
  - markdown_normalizer
  - github-copilot-sdk
  - iflow-sdk-pipe
  - openwebui-skills-manager
  - smart-mind-map-tool

- Added important notes regarding the removal of the official OpenWebUI Community version before installation.
2026-03-16 17:22:24 +08:00
fujie
c6171be0d1 feat: add star repo shortcut to installer dialog 2026-03-16 16:43:57 +08:00
fujie
6b8cb9630a chore: update batch installer icon 2026-03-16 16:06:31 +08:00
Fu-Jie
8573a0d7b0 feat: add interactive selection dialog to batch installer (#60)
* feat: add interactive selection dialog to batch installer

* feat: improve batch installer selection dialog

* feat: add search and filtering to batch installer dialog

* fix: sync type filter with selected plugins

* fix: sync search results with selected plugins

* feat: add multi-repository batch install support

* fix: clarify single-call multi-repo usage

* feat: add repository filters to selection dialog

* refactor: simplify selection dialog header

* docs: simplify batch installer quick start

* docs: feature batch installer on homepage
2026-03-16 15:39:14 +08:00
github-actions[bot]
f142b32486 chore: update community stats - plugin versions updated 2026-03-16 07:37:56 +00:00
github-actions[bot]
04a05ac47c chore: update community stats - plugin versions updated 2026-03-15 23:12:20 +00:00
116 changed files with 6934 additions and 4700 deletions

View File

@@ -44,3 +44,6 @@ Edge cases or caveats to watch out for.
| [openwebui-tool-injection.md](./openwebui-tool-injection.md) | How OpenWebUI injects parameters into Tool functions, and what the Pipe must provide |
| [openwebui-mock-request.md](./openwebui-mock-request.md) | How to build a valid Mock Request for calling OpenWebUI-internal APIs from a Pipe |
| [copilot-plan-mode-prompt-parity.md](./copilot-plan-mode-prompt-parity.md) | Why Plan Mode prompt logic must be shared between fresh-session and resume-session injection |
| [richui-default-actions-optout.md](./richui-default-actions-optout.md) | How static RichUI widgets opt out of fallback prompt/link action injection |
| [richui-declarative-priority.md](./richui-declarative-priority.md) | How RichUI resolves priority between declarative actions and inline click handlers |
| [richui-interaction-api.md](./richui-interaction-api.md) | Recommended 4-action RichUI interaction contract for chat continuation, prefill, submit, and links |

View File

@@ -0,0 +1,72 @@
# GitHub Copilot SDK 卡顿/悬停问题深度源码分析报告
## 📌 问题现象
用户反馈在 agent 处理过程中(工具调用、思考、内容输出),`github_copilot_sdk.py` 管道偶尔会卡住(界面转圈不停)。
## 🔍 事件流架构SDK 源码分析)
通过阅读 `copilot-sdk` 源码 (`jsonrpc.py`, `client.py`, `session.py`),事件流路径如下:
```
Copilot CLI (subprocess)
└─ stdout (JSON-RPC over stdio)
└─ JsonRpcClient._read_loop() [daemon thread]
└─ _handle_message()
└─ notification_handler("session.event", params) [线程安全调度到 event loop]
└─ CopilotSession._dispatch_event(event)
└─ plugin handler(event) → queue.put_nowait(chunk)
└─ main loop: await queue.get() → yield chunk
```
## 🚨 已确认的三个卡顿根因
### 根因 1: Stall 检测豁免盲区
原始代码的防卡死检测仅在 `content_sent=False``thinking_started=False``running_tool_calls` 为空时才触发。一旦 agent 开始处理(输出内容/调用工具),所有豁免条件为真,防卡死机制永久失效。
### 根因 2: 工具调用状态泄漏
`running_tool_calls.add(tool_call_id)``tool.execution_start` 时添加,但如果 SDK 连接断开导致 `tool.execution_complete` 事件丢失,集合永远不为空,直接阻塞 Stall 检测。
### 根因 3: `session.abort()` 自身可能卡住SDK 源码确认)
**SDK 源码关键证据** (`jsonrpc.py:107-148`):
```python
async def request(self, method, params=None, timeout=None):
...
if timeout is not None:
return await asyncio.wait_for(future, timeout=timeout)
return await future # ← 无 timeout永久等待
```
`session.abort()` 底层调用 `self._client.request("session.abort", ...)` **没有传 timeout**
当 CLI 进程挂死但 `_read_loop` 尚未检测到断流(例如 TCP 半开连接),`abort()` RPC 自身会无限等待响应,造成**修复代码自身也卡住**。
## ✅ 修复记录 (2026-03-18)
### 修复 1: `assistant.turn_end` / `session.error` 兜底清理
`running_tool_calls.clear()` — 即时清除孤儿工具状态。
### 修复 2: 绝对不活跃保护 (Absolute Inactivity Guard)
当距最后一个事件超过 `min(TIMEOUT, 90) × 2 = 180s` 且无任何新事件时,**无条件**推送错误并结束流。不受 `content_sent` / `thinking_started` / `running_tool_calls` 任何豁免条件限制。
### 修复 3: `session.abort()` 超时保护
所有 `session.abort()` 调用使用 `asyncio.wait_for(..., timeout=5.0)` 包裹。即使 abort RPC 自身卡住也不会阻塞主循环。
## 📊 修复后超时时间线
| 场景 | 保护机制 | 触发时间 |
|------|----------|----------|
| Turn 开始后完全无事件 | Primary Stall Detection | 90 秒 |
| Agent 处理中突然断流 | Absolute Inactivity Guard | 180 秒 |
| abort() 调用本身卡住 | asyncio.wait_for timeout | 5 秒 |
| Turn 结束/Session 错误 | 兜底 running_tool_calls.clear() | 即时 |
---
*Created by Antigravity using Source-Code-Analyzer skill on 2026-03-18.*

View File

@@ -0,0 +1,25 @@
# GitHub Copilot SDK Stream Finalization
> Discovered: 2026-03-20
## Context
Applies to `plugins/pipes/github-copilot-sdk/github_copilot_sdk.py` when streaming assistant output, handling `pending_embeds`, and waiting for `session.idle`.
## Finding
Two non-obvious issues can make the pipe feel permanently stuck even when useful work already finished:
1. If the main `queue.get()` wait uses the full user-configured `TIMEOUT` (for example 300s), watchdog logic, "still working" status updates, and synthetic finalization checks only wake up at that same coarse interval.
2. If `pending_embeds` are flushed only in the `session.idle` branch, any timeout/error/missing-idle path can lose already-prepared embeds even though file publishing itself succeeded.
## Solution / Pattern
- Keep the *inactivity limit* controlled by `TIMEOUT`, but poll the local stream queue on a short fixed cadence (for example max 5s) so watchdogs and fallback finalization stay responsive.
- Track `assistant.turn_end`; if `session.idle` does not arrive shortly afterward, synthesize finalization instead of waiting for the full inactivity timeout.
- Flush `pending_embeds` exactly once via a shared helper that can run from both normal idle finalization and error/timeout finalization paths.
- For streamed text/reasoning, use conservative overlap trimming: only strip an overlapping prefix when the incoming chunk still contains new suffix content. Do not drop fully repeated chunks blindly, or legitimate repeated text can be corrupted.
## Gotchas
- RichUI embed success and streamed-text success are separate paths; a file can be published correctly while chat output still hangs or duplicates.
- If `assistant.reasoning_delta` is streamed, the later complete `assistant.reasoning` event must be suppressed just like `assistant.message`, or the thinking block can duplicate.
## 🛠️ Update 2026-03-21
- **Fixed Stream Duplication**: Fixed text stream overlays (e.g., `🎉 删 🎉 删除成功`) when resuming conversation session. Strictly applied `_dedupe_stream_chunk(delta, "message_stream_tail")` inside `assistant.message_delta` event handler to prevent concurrent history re-play or multiple stream delivery bug overlays, solving previous gaps in the deployment pipeline.

View File

@@ -0,0 +1,27 @@
# RichUI Declarative Priority
> Discovered: 2026-03-16
## Context
This applies to the RichUI bridge embedded by `plugins/pipes/github-copilot-sdk/github_copilot_sdk.py` when HTML pages mix declarative `data-openwebui-prompt` / `data-prompt` actions with inline `onclick` handlers.
## Finding
Mixing declarative prompt/link attributes with inline click handlers can cause duplicate prompt submission paths, especially when both the page and the bridge react to the same click.
## Solution / Pattern
The bridge now treats inline `onclick` as the default owner of click behavior. Declarative prompt/link dispatch is skipped when an element already has inline click logic.
If a page intentionally wants declarative bridge handling even with inline handlers present, mark the element explicitly:
```html
<button
onclick="trackClick()"
data-openwebui-prompt="Explain this chart"
data-openwebui-force-declarative="1"
>
```
## Gotchas
Without the explicit override, keyboard/click dispatch for declarative actions will yield to inline `onclick`.
The bridge also keeps a short same-prompt dedupe window in `sendPrompt()` as a safety net, but the preferred fix is still to avoid mixed ownership unless you opt in deliberately.

View File

@@ -0,0 +1,23 @@
# RichUI Default Action Opt-Out
> Discovered: 2026-03-16
## Context
This applies to RichUI embeds generated by `plugins/pipes/github-copilot-sdk/github_copilot_sdk.py`, especially when a specific embed should render state without fallback prompt or link actions.
## Finding
The RichUI bridge can add fallback action buttons based on declarative prompt/link metadata. Static embeds can explicitly opt out when their HTML includes `data-openwebui-no-default-actions="1"` or `data-openwebui-static-widget="1"`.
## Solution / Pattern
Mark the embed root with both attributes and keep the embed wrapped through `_prepare_richui_embed_html(...)` when you explicitly want to suppress fallback actions.
Example:
```html
<div class="w" data-openwebui-no-default-actions="1" data-openwebui-static-widget="1">
```
## Gotchas
If the opt-out markers are missing, RichUI fallback actions can reappear even after interactive row handlers have been removed from the widget itself.
This opt-out only suppresses fallback prompt/link injection. It does not affect the SQL-driven TODO refresh path, which still re-emits the widget through `type: embeds` after `todos` or `todo_deps` updates.

View File

@@ -0,0 +1,89 @@
# RichUI Interaction API
> Discovered: 2026-03-16
## Context
This applies to RichUI HTML embeds generated by `plugins/pipes/github-copilot-sdk/github_copilot_sdk.py` when the page needs to talk back to the OpenWebUI chat UI.
## Finding
The most reliable design is a small recommended interaction surface with only four primary actions:
1. continue chat now
2. prefill chat input without sending
3. submit the current chat input
4. open an external link
Keeping the recommended API this small reduces LLM choice overload and makes multilingual HTML generation more consistent.
Advanced capabilities still exist, but they are intentionally treated as opt-in patterns rather than the default contract:
- copy text to clipboard
- structured selection state
- template-based prompt/copy actions driven by current selections
## Solution / Pattern
Prefer declarative attributes first:
```html
<!-- 1. Continue chat immediately -->
<button data-openwebui-prompt="Explain this workflow step by step">Explain</button>
<!-- 2. Prefill the chat input only -->
<button
data-openwebui-prompt="Draft a rollout checklist for this design"
data-openwebui-action="fill"
>
Draft in input
</button>
<!-- 3. Submit the current chat input -->
<button data-openwebui-action="submit">Send current draft</button>
<!-- 4. Open a real URL -->
<a data-openwebui-link="https://docs.example.com">Docs</a>
```
When JavaScript is genuinely needed, prefer the object methods:
```javascript
window.OpenWebUIBridge.prompt(text);
window.OpenWebUIBridge.fill(text);
window.OpenWebUIBridge.submit();
window.OpenWebUIBridge.openLink(url);
window.OpenWebUIBridge.reportHeight();
```
Use advanced patterns only when the page genuinely needs them:
```html
<!-- Copy -->
<button data-openwebui-copy="npm run build && npm test">Copy command</button>
<!-- Pick a structured selection -->
<button data-openwebui-select="role" data-openwebui-value="reviewer">
Reviewer
</button>
<!-- Use the current selection in a follow-up action -->
<button data-openwebui-prompt-template="Explain the responsibilities of {{role}}">
Explain selected role
</button>
```
### Quick decision guide
- Need an immediate answer now → `data-openwebui-prompt`
- Need the user to review/edit first → `data-openwebui-action="fill"`
- Need to send what is already in chat input → `data-openwebui-action="submit"`
- Need to open an external resource → `data-openwebui-link`
- Need copy UX → `data-openwebui-copy`
- Need pick-then-act UX → `data-openwebui-select` + template placeholder
For most pages, keep to one dominant interaction style and only 2-4 visible actions.
## Gotchas
Inline `onclick` owns click behavior by default. If an element mixes inline click code with declarative prompt/link attributes, declarative handling is skipped unless `data-openwebui-force-declarative="1"` is present.
Legacy aliases such as `sendPrompt(...)` still work for compatibility, but new generated pages should prefer the smaller object-method API or the declarative contract above.
The bridge still keeps a short same-prompt dedupe window as a safety net, but the preferred design is to avoid mixed ownership in the first place.

View File

@@ -0,0 +1,30 @@
# RichUI Theme Source Separation
> Discovered: 2026-03-20
## Context
Applies to the RichUI bridge in `plugins/pipes/github-copilot-sdk/github_copilot_sdk.py` when syncing iframe or standalone HTML theme with OpenWebUI.
## Finding
Theme detection must not read back bridge-applied local theme markers as if they were the upstream source of truth.
If the bridge writes `html[data-theme]` or `html.dark` in standalone/current-document mode and then also reads those same markers during detection, the theme can self-latch and stop following real source changes such as `meta[name="theme-color"]` updates or `prefers-color-scheme` changes.
## Solution / Pattern
Keep theme **detection** and theme **application** separate.
When embedded in OpenWebUI, follow the same stable detection order used by `smart-mind-map`:
1. `parent document` `meta[name="theme-color"]`
2. `parent document` `html/body` class or `html[data-theme]`
3. `prefers-color-scheme`
Only if there is no accessible parent document should the bridge fall back to the current document's `meta[name="theme-color"]` and `html/body` theme signals.
- Always write the resolved theme to a dedicated bridge marker such as `data-openwebui-applied-theme`.
- Only mirror generic `html[data-theme]` / `html.dark` markers when a real parent document exists, so standalone fallback does not pollute its own detection source.
- If internal widget CSS needs dark-mode styling in standalone mode, target the dedicated marker too (for example `html[data-openwebui-applied-theme="dark"]`).
## Gotchas
- Watching `style` mutations is unnecessary once detection no longer reads computed style or inline color-scheme.
- If standalone mode needs to honor page-owned `html.dark` or `html[data-theme]`, do not overwrite those markers just to style the bridge itself; use the dedicated bridge marker instead.

View File

@@ -18,16 +18,18 @@ All plugins MUST follow the standard README template.
### Metadata Requirements
The metadata line must follow this format:
`**Author:** [Name](Link) | **Version:** [X.Y.Z] | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **License:** MIT`
Follow the header table used in the template:
`| By [Fu-Jie](https://github.com/Fu-Jie) · vX.Y.Z | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |`
### 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)
2. **Header Metadata Table** (Author, version, repo star link)
3. **Preview** (Screenshot, GIF, or a short note if preview is not ready)
4. **Install with Batch Install Plugins** (Include the fixed prompt block)
Use the generic prompt `Install plugin from Fu-Jie/openwebui-extensions` instead of hard-coding the plugin name.
5. **What's New** (Keep last 1-3 versions)
6. **Key Features**
7. **How to Use**
8. **Configuration (Valves)**
9. **Troubleshooting** (Must include link to GitHub Issues and mention official-version conflict if relevant)

173
.continues-handoff.md Normal file
View File

@@ -0,0 +1,173 @@
# Session Handoff Context
## Session Overview
| Field | Value |
|-------|-------|
| **Source** | GitHub Copilot CLI |
| **Session ID** | `231b2651-f3bf-4a24-8680-5ad9d2cdcd22` |
| **Working Directory** | `/Users/fujie/app/python/oui/openwebui-extensions` |
| **Session File** | `~/.copilot/session-state/231b2651-f3bf-4a24-8680-5ad9d2cdcd22` |
| **Repository** | Fu-Jie/openwebui-extensions @ `main` |
| **Last Active** | 2026-03-16 14:08 |
| **Files Modified** | 0 |
| **Messages** | 1 |
## Summary
> Implement RichUI Embed Bridge
## Tool Activity
### Shell (17 calls)
> `$ cd /Users/fujie/app/python/oui/openwebui-extensions && git status --short && echo "---" && git log --oneline -3`
> `$ q`
> `$ cd /Users/fujie/app/python/oui/openwebui-extensions && git --no-pager status --short --branch`
> `$ cd /Users/fujie/app/python/oui/openwebui-extensions && diff -u --label main/plugins/pipes/github-copilot-sdk/github_copilot_sdk.py plugins/pipes/github-copilot-sdk/github_copilot_sdk.py --label worktree/.git-worktrees/github-copilot-sdk-richui/plugins/pipes/github-copilot-sdk/github_copilot_sdk.py .git-worktrees/github-copilot-sdk-richui/plugins/pipes/github-copilot-sdk/github_copilot_sdk.py | sed -n '1,260p'`
> `$ python3 - <<'PY'
from pathlib import Path
src = Path('/Users/fujie/app/python/oui/openwebui-extensions/.git-worktrees/github-copilot-sdk-richui/plugins/pipes/github-copilot-sdk/github_copilot_sdk.py')
dst = Path('/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/github_copilot_sdk.py')
dst.write_text(src.read_text(encoding='utf-8'), encoding='utf-8')
print(f'copied {src} -> {dst}')
PY
cd /Users/fujie/app/python/oui/openwebui-extensions && git --no-pager diff --stat -- plugins/pipes/github-copilot-sdk/github_copilot_sdk.py`
*...and 12 more shell calls (all exit 0)*
### Edit (10 calls)
> **``**
> **``**
> **``**
> **``**
> **``**
*...and 5 more edits*
### Glob (7 calls)
- `plan.md`
- `**/example.py`
- `**/test*github*copilot*sdk*.py`
- `**/*github*copilot*sdk*.py`
- `plugins/pipes/github-copilot-sdk/tests/**/*.py`
- *...and 2 more glob calls*
### MCP (51 calls)
- `view({"path":"/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk"})`
- `view({"path":"/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/github_co)`
- `view({"path":"/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/example.p)`
- `view({"path":"/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/github_co)`
- `view({"path":"/Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/github_co)`
- *...and 46 more*
### MCP (20 calls)
- `report_intent({"intent":"Reviewing RichUI fix"})`
- `report_intent({"intent":"Syncing RichUI changes"})`
- `report_intent({"intent":"Planning sync work"})`
- `report_intent({"intent":"Syncing SDK file"})`
- `report_intent({"intent":"Verifying SDK sync"})`
- *...and 15 more*
### MCP (1 calls)
- `stop_bash({"shellId":"0"})`
### MCP (40 calls)
- `rg({"pattern":"_build_todo_widget_html|_prepare_richui_embed_html|input:prompt:submit|data-prompt|ready)`
- `rg({"pattern":"def _prepare_richui_embed_html|def _build_todo_widget_html|def _emit_todo_widget_if_chan)`
- `rg({"pattern":"def _prepare_richui_embed_html|RICHUI_BRIDGE_MARKER|RICHUI_BRIDGE_STYLE|RICHUI_BRIDGE_SC)`
- `rg({"pattern":"pending_embeds|type\": \"embeds\"|Content-Disposition|inline|richui|_write_todo_widget_h)`
- `rg({"pattern":"_emit_todo_widget_if_changed\\(","path":"/Users/fujie/app/python/oui/openwebui-extension)`
- *...and 35 more*
### MCP (18 calls)
- `sql({"description":"Create sync todos","query":"INSERT OR REPLACE INTO todos (id, title, description, st)`
- `sql({"description":"Keep compare todo active","query":"UPDATE todos SET status = 'in_progress' WHERE id )`
- `sql({"description":"Advance sync todos","query":"UPDATE todos SET status = 'done' WHERE id = 'compare-wo)`
- `sql({"description":"Advance verify todo","query":"UPDATE todos SET status = 'done' WHERE id = 'apply-ric)`
- `sql({"description":"Complete verification todo","query":"UPDATE todos SET status = 'done' WHERE id = 've)`
- *...and 13 more*
### MCP (4 calls)
- `store_memory({"subject":"richui widgets","fact":"Static RichUI widgets should set data-openwebui-no-default-actio)`
- `store_memory({"subject":"richui widgets","fact":"github_copilot_sdk RichUI opt-out markers are optional; fallback)`
- `store_memory({"subject":"richui interactions","fact":"RichUI bridge now lets inline onclick own click behavior by)`
- `store_memory({"subject":"richui api","fact":"Recommended RichUI interaction contract is 4 actions: data-openwebui)`
### MCP (6 calls)
- `ide-get_diagnostics({"uri":"file:///Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/git)`
- `ide-get_diagnostics({"uri":"file:///Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/git)`
- `ide-get_diagnostics({"uri":"file:///Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/git)`
- `ide-get_diagnostics({"uri":"file:///Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/git)`
- `ide-get_diagnostics({"uri":"file:///Users/fujie/app/python/oui/openwebui-extensions/plugins/pipes/github-copilot-sdk/git)`
- *...and 1 more*
## Recent Conversation
### Assistant
已优化,而且我把交互协议收敛成了 **4 个推荐动作**,专门减少大模型选择困难。
推荐写法现在是:
- `data-openwebui-prompt="..."`:立即继续对话
- `data-openwebui-prompt="..." data-openwebui-action="fill"`:只填输入框,不发送
- `data-openwebui-action="submit"`:提交当前输入框
- `data-openwebui-link="https://..."`:打开链接
JS 推荐也同步收敛为:
- `window.OpenWebUIBridge.prompt(text)`
- `window.OpenWebUIBridge.fill(text)`
- `window.OpenWebUIBridge.submit()`
- `window.OpenWebUIBridge.openLink(url)`
- `window.OpenWebUIBridge.reportHeight()`
另外我做了两点稳定性优化:
- `onclick` 默认优先,避免和 de…
## Session Origin
This session was extracted from **GitHub Copilot CLI** session data.
- **Session file**: `~/.copilot/session-state/231b2651-f3bf-4a24-8680-5ad9d2cdcd22`
- **Session ID**: `231b2651-f3bf-4a24-8680-5ad9d2cdcd22`
- **Project directory**: `/Users/fujie/app/python/oui/openwebui-extensions`
> To access the raw session data, inspect the file path above.
---
**You are continuing this session. Pick up exactly where it left off — review the conversation above, check pending tasks, and keep going.**

View File

@@ -133,6 +133,7 @@ Must update ALL of these or the PR check fails:
2. **Supported Languages**: en-US, zh-CN, zh-HK, zh-TW, ko-KR, ja-JP, fr-FR, de-DE, es-ES, it-IT, vi-VN, id-ID.
3. **Fallback Map**: Must include variant redirects (e.g., `es-MX` -> `es-ES`, `fr-CA` -> `fr-FR`).
4. **Tooltips**: All `description` fields in `Valves` must be **English only** to maintain clean UI.
5. **Language Consistency**: All authored system prompts and templates MUST enforce that the Agent response language matches the exact same language as the user's input content (e.g., if concept/task input is in Chinese, provide response in Chinese).
---
@@ -148,6 +149,10 @@ type(scope): brief English description
Types: `feat` / `fix` / `docs` / `refactor` / `chore`
Scope: plugin folder name (e.g., `github-copilot-sdk`)
> [!IMPORTANT]
> **Issue Association**:
> If the changes are related to or fix a GitHub Issue/PR, **MUST** explicitly link and associate it in both Release Notes docs (`v1.x.md`) and Commit Messages Body/Footers (e.g. `(fixes #123)`). Sync those references on GitHub Releases Page bodies when publishing.
---
## Full Reference

View File

@@ -11,24 +11,24 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
## 📊 Community Stats
> ![updated](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_updated.json&style=flat)
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
| 👤 Author | 👥 Followers | ⭐ Points | 🧩 Plugin Contributions |
| :---: | :---: | :---: | :---: |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_followers.json&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_points.json&style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_contributions.json&style=flat) |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | ![home_followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_followers.json&style=flat) | ![home_points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_points.json&style=flat) | ![home_contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_contributions.json&style=flat) |
| 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves |
| 📝 Posts | ⬇️ Plugin Downloads | 👁️ Plugin Views | 👍 Upvotes | 💾 Plugin Saves |
| :---: | :---: | :---: | :---: | :---: |
| ![posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_posts.json&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_downloads.json&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_views.json&style=flat) | ![upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_upvotes.json&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_saves.json&style=flat) |
| ![home_posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_posts.json&style=flat) | ![home_downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_downloads.json&style=flat) | ![home_views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_views.json&style=flat) | ![home_upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_upvotes.json&style=flat) | ![home_saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_saves.json&style=flat) |
### 🔥 Top 6 Popular Plugins
| Rank | Plugin | Version | Downloads | Views | 📅 Updated |
| :---: | :--- | :---: | :---: | :---: | :---: |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![p1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_dl.json&style=flat) | ![p1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--27-gray?style=flat) |
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_dl.json&style=flat) | ![p2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--13-gray?style=flat) |
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![p3_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_dl.json&style=flat) | ![p3_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--08-gray?style=flat) |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_dl.json&style=flat) | ![p4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--14-gray?style=flat) |
| 5⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![p5_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_dl.json&style=flat) | ![p5_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--13-gray?style=flat) |
| 6⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![p6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_dl.json&style=flat) | ![p6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--01--28-gray?style=flat) |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![p1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_dl.json&style=flat) | ![p1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | ![v](https://img.shields.io/badge/v-1.6.0-blue?style=flat) | ![p2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_dl.json&style=flat) | ![p2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--23-gray?style=flat) |
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![p3_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_dl.json&style=flat) | ![p3_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_dl.json&style=flat) | ![p4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 5⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![p5_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_dl.json&style=flat) | ![p5_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 6⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![p6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_dl.json&style=flat) | ![p6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
### 📈 Total Downloads Trend
![Activity](https://gist.githubusercontent.com/Fu-Jie/db3d95687075a880af6f1fba76d679c6/raw/chart.svg)
@@ -38,21 +38,23 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
## 🌟 Star Features
### 1. [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) ![v0.10.1](https://img.shields.io/badge/v0.10.1-blue?style=flat-square) ![active-dev](https://img.shields.io/badge/active--dev-orange?style=flat-square) ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat-square) ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat-square)
### 1. [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) ![v0.12.0](https://img.shields.io/badge/v0.12.0-blue?style=flat-square) ![active-dev](https://img.shields.io/badge/active--dev-orange?style=flat-square) ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat-square) ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat-square)
**The ultimate autonomous Agent integration for OpenWebUI.** Deeply bridging GitHub Copilot SDK with your OpenWebUI ecosystem. It enables the Agent to autonomously perform **intent recognition**, **web search**, and **context compaction** while reusing your existing tools, skills, and configurations for a professional, full-featured experience.
> [!TIP]
> **No GitHub Copilot subscription required!** Supports **BYOK (Bring Your Own Key)** mode using your own OpenAI/Anthropic API keys.
#### 🚀 Key Leap (v0.10.0)
#### 🚀 Key Leap (v0.12.0)
- **⌨️ Prompt Enhancement**: Restored native Copilot CLI **Plan Mode** for complex tasks and integrated native SQLite-backed session management for robust state persistence.
- **📋 Live TODO Widget**: Added a compact real-time task tracking widget synchronized with `session.db`, keeping in-progress work visible without cluttering the chat history.
- **🔌 Seamless Ecosystem Integration**: Automatically injects and reuses your OpenWebUI **Tools**, **MCP**, **OpenAPI Servers**, and **Skills**, significantly enhancing the Agent's capabilities through your existing setup.
- **🚀 High-Performance Shared Pool**: Eliminated 1-2s process startup latency between turns via a persistent client pool.
- **🔑 Pure BYOK Mode**: Now supports full operation without a `GH_TOKEN`, relying solely on custom API keys.
- **📏 RichUI Stability**: Fixed height calculation issues for a rock-solid interactive component experience.
- **🩺 Smart Stall Detection**: Integrated `client.ping()` to rescue heavy tasks from premature timeouts.
- **📋 Live TODO Widget**: Compact real-time task tracking synchronized with `session.db`, now automatically hidden when all tasks are completed.
- **🔌 Seamless Ecosystem Integration**: Automatically injects and reuses your OpenWebUI **Tools**, **MCP**, **OpenAPI Servers**, and **Skills**.
- **🌐 Language Consistency**: System prompts mandate that Agent output language remains strictly consistent with user input.
- **🧩 Skills Revolution**: Native support for **SKILL directories** and a **Bidirectional Bridge** to OpenWebUI Workspace Skills.
- **🛡️ Secure Isolation**: Strict user/session-level **Workspace Sandboxing** with persistent configuration.
- **🛡️ Secure Isolation**: Strict user/session-level **Workspace Sandboxing** with user-isolated environment variables.
- **📊 Interactive Delivery**: Full support for **HTML Artifacts** and **RichUI** rendering, providing instant interactive previews and persistent downloadable results.
- **🛠️ Deterministic Toolchain**: Built-in specialized tools for skill lifecycles (`manage_skills`) and system optimization.
@@ -78,10 +80,14 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
**Experience interactive thinking.** Seamlessly transforms complex chat sessions into structured, clickable mind maps for better visual modeling and rapid idea extraction.
![Smart Mind Map](./plugins/actions/smart-mind-map/smart_mind_map.png)
### 3. [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f)
**Professional data storytelling.** Converts raw information into sleek, boardroom-ready infographics powered by AntV, perfect for summarizing long-form content instantly.
![Smart Infographic](./plugins/actions/infographic/infographic.png)
### 4. [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315)
**High-fidelity reporting.** Export conversation history into professionally formatted Word documents with preserved headers, code blocks, and math formulas.
@@ -90,6 +96,13 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
**Maximize your context window.** Intelligently compresses chat history using LLM logic to save tokens and costs while maintaining a high-quality reasoning chain.
### 6. [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) [![Market](https://img.shields.io/badge/Get-Market-blue?style=flat-square&logo=openwebui)](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80)
**Faster plugin onboarding across community repositories.** Pull plugins from multiple GitHub repositories in one request, then narrow the result set inside an interactive dialog with repository tags, type filters, keyword search, and descriptions before installing only the subset you want.
![Batch Install Plugins Dialog](./plugins/tools/batch-install-plugins/install.png)
> *A single install dialog can merge multiple repositories and let you filter visually before anything is installed.*
## 📦 Project Contents
<!-- markdownlint-disable MD033 -->
@@ -111,6 +124,7 @@ Located in the `plugins/` directory, containing Python-based enhancements:
- **Smart Mind Map Tool** (`smart-mind-map-tool`): The tool version of Smart Mind Map, enabling AI proactive/autonomous invocation.
- **OpenWebUI Skills Manager Tool** (`openwebui-skills-manager-tool`): Native tool for managing OpenWebUI skills.
- **Batch Install Plugins from GitHub** (`batch-install-plugins`): Discovers plugins from multiple GitHub repositories and installs them through an interactive repository/type-filtered selection dialog.
### Filters
@@ -123,11 +137,11 @@ Located in the `plugins/` directory, containing Python-based enhancements:
### Pipes
- **GitHub Copilot SDK** (`github-copilot-sdk`): Official GitHub Copilot SDK integration. Supports dynamic models (GPT-4o, Claude 3.5, o1), multi-turn conversation, streaming, and infinite sessions.
- **GitHub Copilot SDK** (`github-copilot-sdk`): Official GitHub Copilot SDK integration (v0.12.0). Supports dynamic models (GPT-4o, Claude 3.7, o1), multi-turn conversation, and high-performance process pooling.
### Pipelines
- **MoE Prompt Refiner** (`moe_prompt_refiner`): Refines prompts for Mixture of Experts (MoE) summary requests to generate high-quality comprehensive reports.
- **Wisdom Synthesizer** (`wisdom_synthesizer`): An external pipeline filter that refactors aggregate requests with collective wisdom to output structured expert reports.
</details>
<!-- markdownlint-enable MD033 -->
@@ -151,6 +165,8 @@ Standalone frontend extensions to supercharge your Open WebUI:
[![Newsletter](https://img.shields.io/badge/OpenWebUI_Newsletter-Featured-blue?style=flat-square)](https://openwebui.com/blog/newsletter-january-28-2026): An all-in-one prompt management suite featuring AI-powered prompt generation, spotlight-style quick search, and advanced category organization.
![Prompt Plus Demo](https://raw.githubusercontent.com/Fu-Jie/open-webui-prompt-plus/main/screenshots/08_ai_generation_demo.gif)
## 📖 Documentation
Located in the `docs/en/` directory:

View File

@@ -8,24 +8,24 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
## 📊 社区统计
> ![updated_zh](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_updated_zh.json&style=flat)
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🧩 插件贡献 |
| :---: | :---: | :---: | :---: |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_followers.json&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_points.json&style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_contributions.json&style=flat) |
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) | ![home_followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_followers.json&style=flat) | ![home_points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_points.json&style=flat) | ![home_contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_contributions.json&style=flat) |
| 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 |
| 📝 发布 | ⬇️ 插件下载 | 👁️ 插件浏览 | 👍 点赞 | 💾 插件收藏 |
| :---: | :---: | :---: | :---: | :---: |
| ![posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_posts.json&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_downloads.json&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_views.json&style=flat) | ![upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_upvotes.json&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_saves.json&style=flat) |
| ![home_posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_posts.json&style=flat) | ![home_downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_downloads.json&style=flat) | ![home_views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_views.json&style=flat) | ![home_upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_upvotes.json&style=flat) | ![home_saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_home_saves.json&style=flat) |
### 🔥 热门插件 Top 6
| 排名 | 插件 | 版本 | 下载 | 浏览 | 📅 更新 |
| :---: | :--- | :---: | :---: | :---: | :---: |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![p1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_dl.json&style=flat) | ![p1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--27-gray?style=flat) |
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_dl.json&style=flat) | ![p2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--13-gray?style=flat) |
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![p3_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_dl.json&style=flat) | ![p3_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--08-gray?style=flat) |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_dl.json&style=flat) | ![p4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--14-gray?style=flat) |
| 5⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![p5_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_dl.json&style=flat) | ![p5_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--02--13-gray?style=flat) |
| 6⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![p6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_dl.json&style=flat) | ![p6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--01--28-gray?style=flat) |
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![p1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_dl.json&style=flat) | ![p1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p1_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | ![v](https://img.shields.io/badge/v-1.6.0-blue?style=flat) | ![p2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_dl.json&style=flat) | ![p2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p2_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--23-gray?style=flat) |
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![p3_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_dl.json&style=flat) | ![p3_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p3_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 4⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![p4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_dl.json&style=flat) | ![p4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p4_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 5⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![p5_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_dl.json&style=flat) | ![p5_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p5_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
| 6⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![p6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_dl.json&style=flat) | ![p6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_p6_vw.json&style=flat) | ![updated](https://img.shields.io/badge/2026--03--22-gray?style=flat) |
### 📈 总下载量累计趋势
![Activity](https://gist.githubusercontent.com/Fu-Jie/db3d95687075a880af6f1fba76d679c6/raw/chart.svg)
@@ -42,16 +42,16 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
> [!TIP]
> **无需 GitHub Copilot 订阅!** 支持 **BYOK (Bring Your Own Key)** 模式,使用你自己的 OpenAI/Anthropic API Key。
#### 🚀 核心进化 (v0.10.1)
#### 🚀 核心进化 (v0.12.0)
- **⌨️ 提示词增强**:恢复了原生 Copilot CLI **原生计划模式 (Native Plan Mode)**,并集成了基于 SQLite 的原生会话持久化管理,确保复杂任务编排与状态追踪的稳定性
- **📋 Live TODO 小组件**:新增基于 `session.db` 实时任务状态的紧凑型嵌入式 TODO 小组件,任务进度常驻可见,无需在正文中重复显示全部待办列表
- **🔌 生态深度注入**: 自动读取并复用 OpenWebUI **工具 (Tools)**、**MCP**、**OpenAPI Server** 与 **技能 (Skills)**,显著增强 Agent 的实战能力
- **🧩 技能革命**: 原生支持 **SKILL 目录**,并实现与 OpenWebUI **工作区 > Skills** 的深度双向桥接
- **🛡️ 安全沙箱**: 严格的用户/会话级 **工作区隔离** 与持久化配置环境
- **📊 交互交付**: 完整支持 **HTML Artifacts****RichUI** 渲染,提供即时预览交互式应用程序与持久化结果下载
- **🛠 确定性工具链**: 内置 `manage_skills` 等专业工具,赋予 Agent 完整的技能生命周期管理能力
- **🌐 语言一致性**: 提示词强制要求 Agent 输出语言与用户输入保持一致,确保国际化体验
- **🚀 高性能共享池**:通过单例进程池消除了对话间 1-2 秒的进程冷启动延迟,响应更迅速
- **🔑 纯 BYOK 模式支持**:解除对 `GH_TOKEN` 的强制依赖,仅凭自定义 API Key 即可完整运行
- **📏 RichUI 稳定性修复**:彻底解决高度计算循环导致的页面无限变高问题,交互体验更稳固
- **🩺 智能防挂死探测**:在超时判断中引入 `client.ping()` 探测机制,有效减少复杂任务下的误杀中断
- **📋 Live TODO 小组件**:基于 `session.db` 实时任务状态,现在所有任务完成后将自动隐藏 UI保持界面整洁
- **🔌 生态深度注入**: 自动读取并复用 OpenWebUI **工具 (Tools)**、**MCP**、**OpenAPI Server** 与 **技能 (Skills)**
- **🛡 安全沙箱**: 严格的用户/会话级 **工作区隔离**,并实现用户级环境变量隔离
- **🌐 语言一致性**: 提示词强制要求 Agent 输出语言与用户输入保持一致。
> [!TIP]
> **💡 进阶实战建议**
@@ -75,10 +75,14 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
**体验浸入式思维。** 将复杂的对话瞬间转化为结构化、可点击的交互式思维导图,助力知识建模与逻辑提取。
![Smart Mind Map](./plugins/actions/smart-mind-map/smart_mind_map.png)
### 3. [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) [![Market](https://img.shields.io/badge/Get-Market-blue?style=flat-square&logo=openwebui)](https://openwebui.com/posts/smart_infographic_ad6f0c7f)
**专业数据叙事。** 将零散信息转化为精美的信息图表(由 AntV 驱动),一键生成学术/汇报级的可视化总结。
![Smart Infographic](./plugins/actions/infographic/infographic.png)
### 4. [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) [![Market](https://img.shields.io/badge/Get-Market-blue?style=flat-square&logo=openwebui)](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315)
**高保真文档导出。** 将对话历史导出为格式完美的 Word 文档完美保留标题、代码块、LaTeX 公式及 Mermaid 流程图。
@@ -87,6 +91,13 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
**挑战 Token 極限。** 采用多专家异步压缩逻辑,在保持高吞吐量推理链的同时,大幅降低 Token 消耗。
### 6. [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) [![Market](https://img.shields.io/badge/Get-Market-blue?style=flat-square&logo=openwebui)](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80)
**更快试用多个社区插件仓库。** 一次请求即可聚合多个 GitHub 仓库里的插件,再通过交互式对话框里的仓库标签、类型筛选、关键词搜索和描述信息,把要安装的范围缩小到真正需要的子集。
![Batch Install Plugins Dialog](./plugins/tools/batch-install-plugins/install.png)
> *一个安装对话框就能合并多个仓库,并在真正安装前先完成可视化筛选。*
## 📦 项目内容
<!-- markdownlint-disable MD033 -->
@@ -108,6 +119,7 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
- **智能思维导图工具** (`smart-mind-map-tool`): 思维导图的 Tool 版本,支持 AI 主动/自主调用。
- **OpenWebUI Skills 管理工具** (`openwebui-skills-manager-tool`): 用于管理 OpenWebUI Skills 的原生工具。
- **Batch Install Plugins from GitHub** (`batch-install-plugins`): 从多个 GitHub 仓库发现插件,并通过支持仓库/类型筛选的交互式选择对话框完成安装。
### Filters (消息处理)
@@ -120,11 +132,11 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
### Pipes (模型管道)
- **GitHub Copilot SDK** (`github-copilot-sdk`): 深度集成 GitHub Copilot SDK 的强大 Agent。支持智能意图识别、自主网页搜索与上下文压缩,并能够无缝复用 OpenWebUI 的工具 (Tools)、MCP 与 OpenAPI Server
- **GitHub Copilot SDK** (`github-copilot-sdk`): 深度集成 GitHub Copilot SDK 的强大 Agent (v0.12.0)。支持高性能进程池优化、纯 BYOK 模式、智能意图识别、自主网页搜索与上下文压缩
### Pipelines (工作流管道)
- **MoE Prompt Refiner** (`moe_prompt_refiner`): 优化多模型 (MoE) 汇总请求的提示词,生成高质量的综合报告。
- **Wisdom Synthesizer** (`wisdom_synthesizer`): 智能拦截并重塑多模型汇总请求发挥集体智慧Collective Wisdom将常规汇总熔炼为专家级对比报告。
</details>
<!-- markdownlint-enable MD033 -->
@@ -146,6 +158,8 @@ Open WebUI 的前端增强扩展:
- **[Open WebUI Prompt Plus](https://github.com/Fu-Jie/open-webui-prompt-plus)** [![Newsletter](https://img.shields.io/badge/OpenWebUI_Newsletter-Featured-blue?style=flat-square)](https://openwebui.com/blog/newsletter-january-28-2026):一站式提示词管理套件,支持 AI 提示词生成、Spotlight 风格快速搜索及高级分类管理。
![Prompt Plus Demo](https://raw.githubusercontent.com/Fu-Jie/open-webui-prompt-plus/main/screenshots/08_ai_generation_demo.gif)
## 📖 开发文档
<!-- markdownlint-disable MD033 -->

View File

@@ -1,10 +1,10 @@
<!--
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.
The Chinese version (README_CN.md) MUST be translated from this file so both versions keep the same structure and installation guidance.
-->
# [Plugin Name] [Optional Emoji]
# [Plugin Name]
[Brief description of what the plugin does. Keep it concise and engaging.]
[One-sentence summary of what the plugin does and why it is useful.]
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.0.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
@@ -12,46 +12,65 @@ The Chinese version (README_CN.md) MUST be translated based on this English vers
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
## Preview
<!-- Add a screenshot or description here -->
<!-- If you have a screenshot, add it as: ![Plugin Preview](./preview.png) -->
<!-- If you do not have a screenshot yet, replace with one short sentence explaining what users will see. -->
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## What's New
<!-- Keep only the latest update here. Remove this section for the initial release. -->
<!-- Keep only the latest 1-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 🔑
## Key Features
- **[Feature 1]**: [Description of feature 1].
- **[Feature 2]**: [Description of feature 2].
- **[Feature 3]**: [Description of feature 3].
## How to Use 🛠️
## 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.
1. **Install**: Add the plugin to your OpenWebUI instance from the marketplace, or use the Batch Install prompt above.
2. **Configure**: Adjust settings in the Valves menu if needed.
3. **Use**: Describe how to trigger or run the plugin.
4. **Result**: Describe what users should expect to see.
## Configuration (Valves) ⚙️
## Configuration (Valves)
| Valve | Default | Description |
|-------|---------|-------------|
| --- | --- | --- |
| `VALVE_NAME` | `Default Value` | Description of what this setting does. |
| `ANOTHER_VALVE` | `True` | Another setting description. |
## ⭐ Support
## Troubleshooting
- **Plugin not working?**: Check if the filter, action, pipe, or tool is enabled in the relevant OpenWebUI settings.
- **Debug Logs**: Enable the debug valve if available and check the browser console (F12) or backend logs.
- **Official version conflict**: If installation fails because the same plugin already exists from the official marketplace, remove the old version first and try again.
- **Submit an Issue**: If the problem continues, report it here: [OpenWebUI Extensions Issues](https://github.com/Fu-Jie/openwebui-extensions/issues)
## Support
If this plugin has been useful, a star on [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) is a big motivation for me. Thank you for the support.
## 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: [OpenWebUI Extensions Issues](https://github.com/Fu-Jie/openwebui-extensions/issues)
## Changelog
See the full history on GitHub: [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)

View File

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

View File

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

View File

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

View File

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

View File

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

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

@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "saves",
"message": "468",
"color": "lightgrey"
}

View File

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

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

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

View File

@@ -1,17 +1,18 @@
{
"total_posts": 28,
"total_downloads": 9293,
"total_views": 97430,
"total_upvotes": 307,
"total_downvotes": 4,
"total_saves": 465,
"total_comments": 78,
"total_posts": 30,
"total_downloads": 10803,
"total_views": 116397,
"total_upvotes": 349,
"total_downvotes": 16,
"total_saves": 468,
"total_comments": 98,
"plugin_contributions": 22,
"by_type": {
"tool": 3,
"filter": 4,
"pipe": 1,
"action": 12,
"prompt": 1
"prompt": 2,
"pipe": 1,
"filter": 4
},
"posts": [
{
@@ -21,29 +22,31 @@
"version": "1.0.0",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 1818,
"views": 15611,
"upvotes": 32,
"saves": 75,
"downloads": 2051,
"views": 18115,
"upvotes": 35,
"saves": 82,
"comments": 23,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-27",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a"
},
{
"title": "Smart Infographic",
"slug": "smart_infographic_ad6f0c7f",
"type": "action",
"version": "1.5.0",
"version": "1.6.0",
"author": "Fu-Jie",
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
"downloads": 1378,
"views": 13731,
"upvotes": 28,
"saves": 54,
"downloads": 1522,
"views": 15470,
"upvotes": 30,
"saves": 60,
"comments": 12,
"is_published_plugin": true,
"created_at": "2025-12-28",
"updated_at": "2026-02-13",
"updated_at": "2026-03-23",
"url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f"
},
{
@@ -53,13 +56,14 @@
"version": "1.2.8",
"author": "Fu-Jie",
"description": "A content normalizer filter that fixes common Markdown formatting issues in LLM outputs, such as broken code blocks, LaTeX formulas, and list formatting. Including LaTeX command protection.",
"downloads": 862,
"views": 8877,
"upvotes": 21,
"saves": 47,
"comments": 5,
"downloads": 974,
"views": 9958,
"upvotes": 27,
"saves": 52,
"comments": 6,
"is_published_plugin": true,
"created_at": "2026-01-12",
"updated_at": "2026-03-08",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
},
{
@@ -69,13 +73,14 @@
"version": "1.5.0",
"author": "Fu-Jie",
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
"downloads": 825,
"views": 7397,
"upvotes": 18,
"saves": 55,
"downloads": 945,
"views": 8634,
"upvotes": 22,
"saves": 57,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-11-08",
"updated_at": "2026-03-14",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
},
{
@@ -85,13 +90,14 @@
"version": "0.4.4",
"author": "Fu-Jie",
"description": "Export current conversation from Markdown to Word (.docx) with Mermaid diagrams rendered client-side (Mermaid.js, SVG+PNG), LaTeX math, real hyperlinks, improved tables, syntax highlighting, and blockquote support.",
"downloads": 809,
"views": 6241,
"upvotes": 20,
"saves": 42,
"comments": 5,
"downloads": 927,
"views": 7288,
"upvotes": 21,
"saves": 41,
"comments": 8,
"is_published_plugin": true,
"created_at": "2026-01-03",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
},
{
@@ -101,30 +107,15 @@
"version": "",
"author": "",
"description": "",
"downloads": 716,
"views": 7973,
"upvotes": 10,
"saves": 22,
"comments": 0,
"created_at": "2026-01-28",
"updated_at": "2026-01-28",
"url": "https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37"
},
{
"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": 621,
"views": 3556,
"downloads": 863,
"views": 9511,
"upvotes": 11,
"saves": 12,
"saves": 28,
"comments": 0,
"created_at": "2025-05-30",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
"is_published_plugin": true,
"created_at": "2026-01-28",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37"
},
{
"title": "OpenWebUI Skills Manager Tool",
@@ -133,29 +124,48 @@
"version": "0.3.0",
"author": "Fu-Jie",
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
"downloads": 522,
"views": 6336,
"upvotes": 8,
"saves": 25,
"downloads": 681,
"views": 8206,
"upvotes": 10,
"saves": 31,
"comments": 4,
"is_published_plugin": true,
"created_at": "2026-02-28",
"updated_at": "2026-03-15",
"updated_at": "2026-03-23",
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
},
{
"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": 676,
"views": 4119,
"upvotes": 13,
"saves": 13,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-05-30",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
},
{
"title": "GitHub Copilot Official SDK Pipe",
"slug": "github_copilot_official_sdk_pipe_ce96f7b4",
"type": "pipe",
"version": "0.10.0",
"version": "0.12.0",
"author": "Fu-Jie",
"description": "A powerful Agent SDK integration for OpenWebUI. It deeply bridges GitHub Copilot SDK with OpenWebUI's ecosystem, enabling the Agent to autonomously perform intent recognition, web search, and context compaction. It seamlessly reuses your existing Tools, MCP servers, OpenAPI servers, and Skills for a professional, full-featured experience.",
"downloads": 405,
"views": 5788,
"upvotes": 16,
"downloads": 461,
"views": 6662,
"upvotes": 17,
"saves": 12,
"comments": 8,
"comments": 19,
"is_published_plugin": true,
"created_at": "2026-01-26",
"updated_at": "2026-03-07",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4"
},
{
@@ -165,13 +175,14 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
"downloads": 336,
"views": 4770,
"downloads": 363,
"views": 5160,
"upvotes": 13,
"saves": 22,
"saves": 23,
"comments": 2,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/flash_card_65a2ea8f"
},
{
@@ -181,15 +192,50 @@
"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": 236,
"views": 1924,
"upvotes": 6,
"saves": 15,
"downloads": 261,
"views": 2143,
"upvotes": 7,
"saves": 17,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
},
{
"title": "🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs",
"slug": "smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d",
"type": "tool",
"version": "1.0.0",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 213,
"views": 3316,
"upvotes": 7,
"saves": 10,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-03-04",
"updated_at": "2026-03-05",
"url": "https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d"
},
{
"title": "Batch Install Plugins from GitHub",
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
"type": "tool",
"version": "1.1.0",
"author": "Fu-Jie",
"description": "One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.",
"downloads": 181,
"views": 4017,
"upvotes": 9,
"saves": 8,
"comments": 6,
"is_published_plugin": true,
"created_at": "2026-03-15",
"updated_at": "2026-03-23",
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
},
{
"title": "导出为Word增强版",
"slug": "导出为_word_支持公式流程图表格和代码块_8a6306c0",
@@ -197,13 +243,14 @@
"version": "0.4.4",
"author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 172,
"views": 3065,
"downloads": 181,
"views": 3275,
"upvotes": 14,
"saves": 7,
"comments": 4,
"is_published_plugin": true,
"created_at": "2026-01-04",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0"
},
{
@@ -213,31 +260,16 @@
"version": "0.1.0",
"author": "Fu-Jie",
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
"downloads": 132,
"views": 2204,
"downloads": 143,
"views": 2392,
"upvotes": 7,
"saves": 13,
"saves": 15,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-20",
"updated_at": "2026-01-20",
"url": "https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2"
},
{
"title": "🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs",
"slug": "smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d",
"type": "tool",
"version": "1.0.0",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 124,
"views": 2475,
"upvotes": 5,
"saves": 5,
"comments": 0,
"created_at": "2026-03-04",
"updated_at": "2026-03-05",
"url": "https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d"
},
{
"title": "GitHub Copilot SDK Files Filter",
"slug": "github_copilot_sdk_files_filter_403a62ee",
@@ -245,13 +277,14 @@
"version": "0.1.3",
"author": "Fu-Jie",
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
"downloads": 94,
"views": 2484,
"upvotes": 4,
"downloads": 102,
"views": 2632,
"upvotes": 5,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-02-09",
"updated_at": "2026-03-03",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee"
},
{
@@ -261,13 +294,14 @@
"version": "1.5.0",
"author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 72,
"views": 1590,
"downloads": 74,
"views": 1736,
"upvotes": 10,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-28",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/智能信息图_e04a48ff"
},
{
@@ -277,11 +311,12 @@
"version": "0.9.2",
"author": "Fu-Jie",
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
"downloads": 56,
"views": 827,
"downloads": 59,
"views": 871,
"upvotes": 6,
"saves": 2,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-31",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b"
@@ -293,11 +328,12 @@
"version": "1.2.2",
"author": "Fu-Jie",
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
"downloads": 42,
"views": 913,
"downloads": 49,
"views": 964,
"upvotes": 7,
"saves": 5,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-11-08",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/异步上下文压缩_5c0617cb"
@@ -310,10 +346,11 @@
"author": "Fu-Jie",
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
"downloads": 38,
"views": 719,
"views": 743,
"upvotes": 5,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/精读_99830b0f"
@@ -325,30 +362,49 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 34,
"views": 935,
"downloads": 36,
"views": 1016,
"upvotes": 7,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3"
},
{
"title": "🚀 Batch Install Plugins - Install Popular Plugins in Seconds",
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
"type": "tool",
"version": "1.0.0",
"author": "Fu-Jie",
"description": "One-click batch install plugins from GitHub repositories to your OpenWebUI instance.",
"downloads": 1,
"views": 14,
"title": "🔍 One-Sentence Concept Explainer",
"slug": "one_sentence_concept_explainer_79be55d3",
"type": "prompt",
"version": "",
"author": "",
"description": "",
"downloads": 3,
"views": 169,
"upvotes": 1,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-03-22",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/one_sentence_concept_explainer_79be55d3"
},
{
"title": "🧠 Wisdom Synthesizer (Collective Wisdom Synthesizer)",
"slug": "wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe",
"type": "action",
"version": "",
"author": "",
"description": "",
"downloads": 0,
"views": 99,
"upvotes": 1,
"saves": 0,
"comments": 1,
"created_at": "2026-03-15",
"updated_at": "2026-03-15",
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-03-22",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe"
},
{
"title": "An Unconventional Use of Open Terminal ⚡",
@@ -358,10 +414,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 3434,
"upvotes": 7,
"saves": 1,
"views": 3817,
"upvotes": 8,
"saves": 3,
"comments": 2,
"is_published_plugin": false,
"created_at": "2026-03-06",
"updated_at": "2026-03-07",
"url": "https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f"
@@ -374,10 +431,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 1833,
"upvotes": 5,
"views": 1902,
"upvotes": 6,
"saves": 1,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-02-27",
"updated_at": "2026-02-28",
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452"
@@ -390,10 +448,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2812,
"upvotes": 8,
"views": 2911,
"upvotes": 9,
"saves": 4,
"comments": 1,
"is_published_plugin": false,
"created_at": "2026-02-22",
"updated_at": "2026-02-28",
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131"
@@ -406,10 +465,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2444,
"views": 2471,
"upvotes": 7,
"saves": 5,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-02-10",
"updated_at": "2026-02-10",
"url": "https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293"
@@ -422,10 +482,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2030,
"upvotes": 13,
"saves": 24,
"views": 2149,
"upvotes": 15,
"saves": 26,
"comments": 9,
"is_published_plugin": false,
"created_at": "2026-01-25",
"updated_at": "2026-01-28",
"url": "https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e"
@@ -438,10 +499,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 272,
"views": 279,
"upvotes": 2,
"saves": 0,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-01-14",
"updated_at": "2026-01-14",
"url": "https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39"
@@ -454,10 +516,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 1596,
"upvotes": 16,
"saves": 13,
"views": 1638,
"upvotes": 17,
"saves": 14,
"comments": 2,
"is_published_plugin": false,
"created_at": "2026-01-10",
"updated_at": "2026-01-10",
"url": "https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960"
@@ -468,11 +531,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": 363,
"following": 7,
"total_points": 366,
"post_points": 306,
"comment_points": 60,
"contributions": 76
"followers": 419,
"following": 9,
"total_points": 407,
"post_points": 336,
"comment_points": 71,
"contributions": 89
}
}

View File

@@ -1,17 +1,18 @@
{
"total_posts": 27,
"total_downloads": 9120,
"total_views": 95785,
"total_upvotes": 305,
"total_downvotes": 4,
"total_saves": 452,
"total_comments": 77,
"total_posts": 30,
"total_downloads": 10705,
"total_views": 115160,
"total_upvotes": 348,
"total_downvotes": 16,
"total_saves": 463,
"total_comments": 98,
"plugin_contributions": 22,
"by_type": {
"filter": 4,
"tool": 2,
"pipe": 1,
"prompt": 2,
"tool": 3,
"action": 12,
"prompt": 1
"pipe": 1,
"filter": 4
},
"posts": [
{
@@ -21,13 +22,14 @@
"version": "1.0.0",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 1797,
"views": 15350,
"upvotes": 31,
"saves": 72,
"downloads": 2039,
"views": 17967,
"upvotes": 35,
"saves": 82,
"comments": 23,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-27",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a"
},
{
@@ -37,13 +39,14 @@
"version": "1.5.0",
"author": "Fu-Jie",
"description": "AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.",
"downloads": 1362,
"views": 13589,
"upvotes": 28,
"saves": 53,
"downloads": 1516,
"views": 15370,
"upvotes": 30,
"saves": 59,
"comments": 12,
"is_published_plugin": true,
"created_at": "2025-12-28",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/smart_infographic_ad6f0c7f"
},
{
@@ -53,13 +56,14 @@
"version": "1.2.8",
"author": "Fu-Jie",
"description": "A content normalizer filter that fixes common Markdown formatting issues in LLM outputs, such as broken code blocks, LaTeX formulas, and list formatting. Including LaTeX command protection.",
"downloads": 838,
"views": 8739,
"upvotes": 21,
"saves": 46,
"comments": 5,
"downloads": 965,
"views": 9872,
"upvotes": 27,
"saves": 52,
"comments": 6,
"is_published_plugin": true,
"created_at": "2026-01-12",
"updated_at": "2026-03-08",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/markdown_normalizer_baaa8732"
},
{
@@ -69,13 +73,14 @@
"version": "1.5.0",
"author": "Fu-Jie",
"description": "Reduces token consumption in long conversations while maintaining coherence through intelligent summarization and message compression.",
"downloads": 801,
"views": 7258,
"upvotes": 18,
"saves": 54,
"downloads": 935,
"views": 8550,
"upvotes": 22,
"saves": 56,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-11-08",
"updated_at": "2026-03-14",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/async_context_compression_b1655bc8"
},
{
@@ -85,13 +90,14 @@
"version": "0.4.4",
"author": "Fu-Jie",
"description": "Export current conversation from Markdown to Word (.docx) with Mermaid diagrams rendered client-side (Mermaid.js, SVG+PNG), LaTeX math, real hyperlinks, improved tables, syntax highlighting, and blockquote support.",
"downloads": 799,
"views": 6146,
"upvotes": 20,
"downloads": 920,
"views": 7227,
"upvotes": 21,
"saves": 41,
"comments": 5,
"comments": 8,
"is_published_plugin": true,
"created_at": "2026-01-03",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
},
{
@@ -101,13 +107,14 @@
"version": "",
"author": "",
"description": "",
"downloads": 692,
"views": 7783,
"upvotes": 10,
"saves": 20,
"downloads": 853,
"views": 9424,
"upvotes": 11,
"saves": 27,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-28",
"updated_at": "2026-01-28",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37"
},
{
@@ -117,13 +124,14 @@
"version": "0.3.7",
"author": "Fu-Jie",
"description": "Extracts tables from chat messages and exports them to Excel (.xlsx) files with smart formatting.",
"downloads": 616,
"views": 3508,
"upvotes": 11,
"saves": 12,
"downloads": 671,
"views": 4084,
"upvotes": 13,
"saves": 13,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-05-30",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
},
{
@@ -133,29 +141,31 @@
"version": "0.3.0",
"author": "Fu-Jie",
"description": "Standalone OpenWebUI tool for managing native Workspace Skills (list/show/install/create/update/delete) for any model.",
"downloads": 500,
"views": 6112,
"upvotes": 8,
"saves": 23,
"downloads": 663,
"views": 8022,
"upvotes": 10,
"saves": 30,
"comments": 4,
"is_published_plugin": true,
"created_at": "2026-02-28",
"updated_at": "2026-03-14",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
},
{
"title": "GitHub Copilot Official SDK Pipe",
"slug": "github_copilot_official_sdk_pipe_ce96f7b4",
"type": "pipe",
"version": "0.10.0",
"version": "0.12.0",
"author": "Fu-Jie",
"description": "A powerful Agent SDK integration for OpenWebUI. It deeply bridges GitHub Copilot SDK with OpenWebUI's ecosystem, enabling the Agent to autonomously perform intent recognition, web search, and context compaction. It seamlessly reuses your existing Tools, MCP servers, OpenAPI servers, and Skills for a professional, full-featured experience.",
"downloads": 403,
"views": 5699,
"upvotes": 16,
"downloads": 460,
"views": 6593,
"upvotes": 17,
"saves": 12,
"comments": 8,
"comments": 19,
"is_published_plugin": true,
"created_at": "2026-01-26",
"updated_at": "2026-03-07",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4"
},
{
@@ -165,13 +175,14 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "Quickly generates beautiful flashcards from text, extracting key points and categories.",
"downloads": 331,
"views": 4722,
"downloads": 363,
"views": 5148,
"upvotes": 13,
"saves": 22,
"saves": 23,
"comments": 2,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/flash_card_65a2ea8f"
},
{
@@ -181,47 +192,16 @@
"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": 229,
"views": 1887,
"upvotes": 6,
"saves": 15,
"downloads": 259,
"views": 2128,
"upvotes": 7,
"saves": 17,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
},
{
"title": "导出为Word增强版",
"slug": "导出为_word_支持公式流程图表格和代码块_8a6306c0",
"type": "action",
"version": "0.4.4",
"author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 172,
"views": 3038,
"upvotes": 14,
"saves": 7,
"comments": 4,
"created_at": "2026-01-04",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0"
},
{
"title": "📂 Folder Memory Auto-Evolving Project Context",
"slug": "folder_memory_auto_evolving_project_context_4a9875b2",
"type": "filter",
"version": "0.1.0",
"author": "Fu-Jie",
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
"downloads": 130,
"views": 2181,
"upvotes": 7,
"saves": 13,
"comments": 0,
"created_at": "2026-01-20",
"updated_at": "2026-01-20",
"url": "https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2"
},
{
"title": "🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs",
"slug": "smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d",
@@ -229,15 +209,67 @@
"version": "1.0.0",
"author": "Fu-Jie",
"description": "Intelligently analyzes text content and generates interactive mind maps to help users structure and visualize knowledge.",
"downloads": 116,
"views": 2375,
"upvotes": 5,
"saves": 4,
"downloads": 210,
"views": 3264,
"upvotes": 7,
"saves": 10,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-03-04",
"updated_at": "2026-03-05",
"url": "https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d"
},
{
"title": "导出为Word增强版",
"slug": "导出为_word_支持公式流程图表格和代码块_8a6306c0",
"type": "action",
"version": "0.4.4",
"author": "Fu-Jie",
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
"downloads": 180,
"views": 3261,
"upvotes": 14,
"saves": 7,
"comments": 4,
"is_published_plugin": true,
"created_at": "2026-01-04",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0"
},
{
"title": "Batch Install Plugins from GitHub",
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
"type": "tool",
"version": "1.1.0",
"author": "Fu-Jie",
"description": "One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.",
"downloads": 171,
"views": 3940,
"upvotes": 9,
"saves": 8,
"comments": 6,
"is_published_plugin": true,
"created_at": "2026-03-15",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
},
{
"title": "📂 Folder Memory Auto-Evolving Project Context",
"slug": "folder_memory_auto_evolving_project_context_4a9875b2",
"type": "filter",
"version": "0.1.0",
"author": "Fu-Jie",
"description": "Automatically extracts project rules from conversations and injects them into the folder's system prompt.",
"downloads": 142,
"views": 2370,
"upvotes": 7,
"saves": 15,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-20",
"updated_at": "2026-01-20",
"url": "https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2"
},
{
"title": "GitHub Copilot SDK Files Filter",
"slug": "github_copilot_sdk_files_filter_403a62ee",
@@ -245,13 +277,14 @@
"version": "0.1.3",
"author": "Fu-Jie",
"description": "A specialized filter to bypass OpenWebUI's default RAG for GitHub Copilot SDK models. It moves uploaded files to a safe location ('copilot_files') so the Copilot Pipe can process them natively without interference.",
"downloads": 93,
"views": 2474,
"upvotes": 4,
"downloads": 101,
"views": 2617,
"upvotes": 5,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-02-09",
"updated_at": "2026-03-03",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee"
},
{
@@ -261,13 +294,14 @@
"version": "1.5.0",
"author": "Fu-Jie",
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
"downloads": 72,
"views": 1572,
"downloads": 74,
"views": 1731,
"upvotes": 10,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-28",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/智能信息图_e04a48ff"
},
{
@@ -277,11 +311,12 @@
"version": "0.9.2",
"author": "Fu-Jie",
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
"downloads": 56,
"views": 814,
"downloads": 59,
"views": 871,
"upvotes": 6,
"saves": 2,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-31",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b"
@@ -293,11 +328,12 @@
"version": "1.2.2",
"author": "Fu-Jie",
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
"downloads": 42,
"views": 904,
"downloads": 48,
"views": 958,
"upvotes": 7,
"saves": 5,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-11-08",
"updated_at": "2026-02-13",
"url": "https://openwebui.com/posts/异步上下文压缩_5c0617cb"
@@ -309,11 +345,12 @@
"version": "1.0.0",
"author": "Fu-Jie",
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
"downloads": 37,
"views": 708,
"downloads": 38,
"views": 742,
"upvotes": 5,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-01-08",
"updated_at": "2026-01-08",
"url": "https://openwebui.com/posts/精读_99830b0f"
@@ -325,15 +362,50 @@
"version": "0.2.4",
"author": "Fu-Jie",
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
"downloads": 34,
"views": 926,
"downloads": 36,
"views": 1012,
"upvotes": 7,
"saves": 1,
"comments": 0,
"is_published_plugin": true,
"created_at": "2025-12-30",
"updated_at": "2026-02-13",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3"
},
{
"title": "🔍 One-Sentence Concept Explainer",
"slug": "one_sentence_concept_explainer_79be55d3",
"type": "prompt",
"version": "",
"author": "",
"description": "",
"downloads": 2,
"views": 9,
"upvotes": 1,
"saves": 0,
"comments": 0,
"is_published_plugin": true,
"created_at": "2026-03-22",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/one_sentence_concept_explainer_79be55d3"
},
{
"title": "🧠 Wisdom Synthesizer (Collective Wisdom Synthesizer)",
"slug": "wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe",
"type": "action",
"version": "",
"author": "",
"description": "",
"downloads": 0,
"views": 22,
"upvotes": 1,
"saves": 0,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-03-22",
"updated_at": "2026-03-22",
"url": "https://openwebui.com/posts/wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe"
},
{
"title": "An Unconventional Use of Open Terminal ⚡",
"slug": "an_unconventional_use_of_open_terminal_35498f8f",
@@ -342,10 +414,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 3335,
"upvotes": 7,
"saves": 1,
"views": 3810,
"upvotes": 8,
"saves": 3,
"comments": 2,
"is_published_plugin": false,
"created_at": "2026-03-06",
"updated_at": "2026-03-07",
"url": "https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f"
@@ -358,10 +431,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 1803,
"upvotes": 5,
"views": 1900,
"upvotes": 6,
"saves": 1,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-02-27",
"updated_at": "2026-02-28",
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452"
@@ -374,10 +448,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2797,
"upvotes": 8,
"views": 2906,
"upvotes": 9,
"saves": 4,
"comments": 1,
"is_published_plugin": false,
"created_at": "2026-02-22",
"updated_at": "2026-02-28",
"url": "https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131"
@@ -390,10 +465,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2442,
"views": 2470,
"upvotes": 7,
"saves": 5,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-02-10",
"updated_at": "2026-02-10",
"url": "https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293"
@@ -406,10 +482,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 2014,
"upvotes": 13,
"saves": 23,
"views": 2149,
"upvotes": 15,
"saves": 26,
"comments": 9,
"is_published_plugin": false,
"created_at": "2026-01-25",
"updated_at": "2026-01-28",
"url": "https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e"
@@ -422,10 +499,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 271,
"views": 278,
"upvotes": 2,
"saves": 0,
"comments": 0,
"is_published_plugin": false,
"created_at": "2026-01-14",
"updated_at": "2026-01-14",
"url": "https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39"
@@ -438,10 +516,11 @@
"author": "",
"description": "",
"downloads": 0,
"views": 1588,
"views": 1630,
"upvotes": 16,
"saves": 13,
"saves": 14,
"comments": 2,
"is_published_plugin": false,
"created_at": "2026-01-10",
"updated_at": "2026-01-10",
"url": "https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960"
@@ -452,11 +531,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": 353,
"following": 6,
"total_points": 359,
"post_points": 303,
"comment_points": 56,
"contributions": 68
"followers": 418,
"following": 9,
"total_points": 406,
"post_points": 335,
"comment_points": 71,
"contributions": 89
}
}

View File

@@ -8,7 +8,7 @@
> *Blue: Downloads | Purple: Views (Real-time dynamic)*
### 📂 Content Distribution
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINy0zpyS1CCRgAhEoyCxIBXENIdzEZLBekIARVEFRfm5BCVgEAEyIIE8=)
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINzEZLAcUMDSCiBQU5ecWlIBEYAKZBalgBRBuWmZOSWoRSMAEAFQHIFA=)
## 📈 Overview
@@ -16,50 +16,53 @@
| Metric | Value |
|------|------|
| 📝 Total Posts | ![posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_posts.json&style=flat) |
| ⬇️ Total Downloads | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&style=flat) |
| 👁️ Total Views | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&style=flat) |
| ⬇️ Total Plugin Downloads | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&style=flat) |
| 👁️ Total Plugin Views | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&style=flat) |
| 👍 Total Upvotes | ![upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_upvotes.json&style=flat) |
| 💾 Total Saves | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&style=flat) |
| 💾 Total Plugin Saves | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&style=flat) |
| ⭐ Author Points | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&style=flat) |
| 👥 Followers | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&style=flat) |
| 🧩 Published Plugins | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&style=flat) |
## 📂 By Type
- ![tool](https://img.shields.io/badge/tool-3-teal)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![action](https://img.shields.io/badge/action-12-orange)
- ![prompt](https://img.shields.io/badge/prompt-1-lightgrey)
- ![prompt](https://img.shields.io/badge/prompt-2-lightgrey)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen)
## 📋 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 | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_dl.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_vw.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_up.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_sv.json&style=flat) | 2026-02-27 |
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_376135b87514e63570283b2057459b1f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_dl.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_vw.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_up.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_sv.json&style=flat) | 2026-02-13 |
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_dl.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_vw.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_up.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_sv.json&style=flat) | 2026-03-08 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_dl.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_vw.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_up.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_sv.json&style=flat) | 2026-03-14 |
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_dc072f01690dc8293384153dc0231d05_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_dl.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_vw.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_up.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_sv.json&style=flat) | 2026-02-13 |
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-01-28 |
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-02-13 |
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-15 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.10.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-07 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-02-13 |
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_dl.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_vw.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_up.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_sv.json&style=flat) | 2026-03-22 |
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | ![v](https://img.shields.io/badge/v-1.6.0-blue?style=flat) | ![post_376135b87514e63570283b2057459b1f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_dl.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_vw.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_up.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_sv.json&style=flat) | 2026-03-23 |
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_dl.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_vw.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_up.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_sv.json&style=flat) | 2026-03-22 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_dl.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_vw.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_up.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_sv.json&style=flat) | 2026-03-22 |
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_dc072f01690dc8293384153dc0231d05_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_dl.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_vw.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_up.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_sv.json&style=flat) | 2026-03-22 |
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 |
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 |
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-22 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 |
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 2026-01-08 |
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_up.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv.json&style=flat) | 2026-02-13 |
| 13 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | ![v](https://img.shields.io/badge/v-0.1.0-blue?style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_dl.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_vw.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_up.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_sv.json&style=flat) | 2026-01-20 |
| 14 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | ![v](https://img.shields.io/badge/v-0.1.3-blue?style=flat) | ![post_68081377a06a5746efe798136a72c6b6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_dl.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_vw.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_up.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_sv.json&style=flat) | 2026-03-03 |
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_dl.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_vw.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_up.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_sv.json&style=flat) | 2026-02-13 |
| 17 | [思维导](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | ![v](https://img.shields.io/badge/v-0.9.2-blue?style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_dl.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_vw.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_up.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_sv.json&style=flat) | 2026-02-13 |
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | ![v](https://img.shields.io/badge/v-1.2.2-blue?style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_dl.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_vw.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_up.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_sv.json&style=flat) | 2026-02-13 |
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_dl.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_vw.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_up.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_sv.json&style=flat) | 2026-01-08 |
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_c68a2593e76ec324361358575b6501de_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_dl.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_vw.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_up.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_sv.json&style=flat) | 2026-02-13 |
| 21 | [🚀 Batch Install Plugins - Install Popular Plugins in Seconds](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_dl.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_vw.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_up.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_sv.json&style=flat) | 2026-03-15 |
| 22 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_040794b40937926d42e6907044b828b1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_dl.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_vw.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_up.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_sv.json&style=flat) | 2026-03-07 |
| 23 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_dl.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_vw.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_up.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_sv.json&style=flat) | 2026-02-28 |
| 24 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv.json&style=flat) | 2026-02-28 |
| 25 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_dl.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_vw.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_up.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_sv.json&style=flat) | 2026-02-10 |
| 26 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_858cb162732370288ce024b4f7944f69_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_dl.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_vw.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_up.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_sv.json&style=flat) | 2026-01-28 |
| 27 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_dl.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_vw.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_up.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_sv.json&style=flat) | 2026-01-14 |
| 28 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_dl.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_vw.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_up.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_sv.json&style=flat) | 2026-01-10 |
| 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |
| 13 | [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | tool | ![v](https://img.shields.io/badge/v-1.1.0-blue?style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_dl.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_vw.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_up.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_sv.json&style=flat) | 2026-03-23 |
| 14 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_up.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv.json&style=flat) | 2026-03-22 |
| 15 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | ![v](https://img.shields.io/badge/v-0.1.0-blue?style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_dl.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_vw.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_up.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_sv.json&style=flat) | 2026-01-20 |
| 16 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | ![v](https://img.shields.io/badge/v-0.1.3-blue?style=flat) | ![post_68081377a06a5746efe798136a72c6b6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_dl.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_vw.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_up.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_sv.json&style=flat) | 2026-03-22 |
| 17 | [智能信息](https://openwebui.com/posts/智能信息图_e04a48ff) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_dl.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_vw.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_up.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_sv.json&style=flat) | 2026-03-22 |
| 18 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | ![v](https://img.shields.io/badge/v-0.9.2-blue?style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_dl.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_vw.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_up.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_sv.json&style=flat) | 2026-02-13 |
| 19 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | ![v](https://img.shields.io/badge/v-1.2.2-blue?style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_dl.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_vw.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_up.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_sv.json&style=flat) | 2026-02-13 |
| 20 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_dl.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_vw.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_up.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_sv.json&style=flat) | 2026-01-08 |
| 21 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_c68a2593e76ec324361358575b6501de_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_dl.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_vw.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_up.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_sv.json&style=flat) | 2026-03-22 |
| 22 | [🔍 One-Sentence Concept Explainer](https://openwebui.com/posts/one_sentence_concept_explainer_79be55d3) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_dl.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_vw.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_up.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_sv.json&style=flat) | 2026-03-22 |
| 23 | [🧠 Wisdom Synthesizer (Collective Wisdom Synthesizer)](https://openwebui.com/posts/wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_dl.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_vw.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_up.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_sv.json&style=flat) | 2026-03-22 |
| 24 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_040794b40937926d42e6907044b828b1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_dl.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_vw.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_up.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_sv.json&style=flat) | 2026-03-07 |
| 25 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_dl.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_vw.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_up.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_sv.json&style=flat) | 2026-02-28 |
| 26 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv.json&style=flat) | 2026-02-28 |
| 27 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_dl.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_vw.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_up.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_sv.json&style=flat) | 2026-02-10 |
| 28 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_858cb162732370288ce024b4f7944f69_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_dl.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_vw.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_up.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_sv.json&style=flat) | 2026-01-28 |
| 29 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_dl.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_vw.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_up.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_sv.json&style=flat) | 2026-01-14 |
| 30 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_dl.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_vw.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_up.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_sv.json&style=flat) | 2026-01-10 |

View File

@@ -8,7 +8,7 @@
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
### 📂 内容分类占比 (Distribution)
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINy0zpyS1CCRgAhEoyCxIBXENIdzEZLBekIARVEFRfm5BCVgEAEyIIE8=)
![Distribution](https://kroki.io/mermaid/svg/eNoryExVKMksyUlVUArIKU3PzFMIqSxILVZwySwuKcpMKi3JzM9T4lIAAqWS_PwcJQUrBWMINzEZLAcUMDSCiBQU5ecWlIBEYAKZBalgBRBuWmZOSWoRSMAEAFQHIFA=)
## 📈 总览
@@ -16,50 +16,53 @@
| 指标 | 数值 |
|------|------|
| 📝 发布数量 | ![posts](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_posts.json&style=flat) |
| ⬇️ 总下载量 | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&style=flat) |
| 👁️ 总浏览量 | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&style=flat) |
| ⬇️ 插件总下载量 | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&style=flat) |
| 👁️ 插件总浏览量 | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&style=flat) |
| 👍 总点赞数 | ![upvotes](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_upvotes.json&style=flat) |
| 💾 总收藏数 | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&style=flat) |
| 💾 插件总收藏数 | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&style=flat) |
| ⭐ 作者总积分 | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&style=flat) |
| 👥 粉丝数量 | ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&style=flat) |
| 🧩 已发布插件数 | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&style=flat) |
## 📂 按类型分类
- ![tool](https://img.shields.io/badge/tool-3-teal)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![action](https://img.shields.io/badge/action-12-orange)
- ![prompt](https://img.shields.io/badge/prompt-1-lightgrey)
- ![prompt](https://img.shields.io/badge/prompt-2-lightgrey)
- ![pipe](https://img.shields.io/badge/pipe-1-blueviolet)
- ![filter](https://img.shields.io/badge/filter-4-brightgreen)
## 📋 发布列表
| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_dl.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_vw.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_up.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_sv.json&style=flat) | 2026-02-27 |
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_376135b87514e63570283b2057459b1f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_dl.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_vw.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_up.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_sv.json&style=flat) | 2026-02-13 |
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_dl.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_vw.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_up.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_sv.json&style=flat) | 2026-03-08 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_dl.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_vw.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_up.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_sv.json&style=flat) | 2026-03-14 |
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_dc072f01690dc8293384153dc0231d05_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_dl.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_vw.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_up.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_sv.json&style=flat) | 2026-02-13 |
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-01-28 |
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-02-13 |
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-15 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.10.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-07 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-02-13 |
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_dl.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_vw.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_up.json&style=flat) | ![post_207cd433d27fdd853ccbfa941e6fa67f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_207cd433d27fdd853ccbfa941e6fa67f_sv.json&style=flat) | 2026-03-22 |
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action | ![v](https://img.shields.io/badge/v-1.6.0-blue?style=flat) | ![post_376135b87514e63570283b2057459b1f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_dl.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_vw.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_up.json&style=flat) | ![post_376135b87514e63570283b2057459b1f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_376135b87514e63570283b2057459b1f_sv.json&style=flat) | 2026-03-23 |
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter | ![v](https://img.shields.io/badge/v-1.2.8-blue?style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_dl.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_vw.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_up.json&style=flat) | ![post_a963da7c5d914310e7026b8c8a6635b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a963da7c5d914310e7026b8c8a6635b0_sv.json&style=flat) | 2026-03-22 |
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_dl.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_vw.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_up.json&style=flat) | ![post_0640a7ef0970872217cb939f2ba9c12c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0640a7ef0970872217cb939f2ba9c12c_sv.json&style=flat) | 2026-03-22 |
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_dc072f01690dc8293384153dc0231d05_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_dl.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_vw.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_up.json&style=flat) | ![post_dc072f01690dc8293384153dc0231d05_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_dc072f01690dc8293384153dc0231d05_sv.json&style=flat) | 2026-03-22 |
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_dl.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_vw.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_up.json&style=flat) | ![post_19f469a02b32d21f86b16d1395a81317_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_19f469a02b32d21f86b16d1395a81317_sv.json&style=flat) | 2026-03-22 |
| 7 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool | ![v](https://img.shields.io/badge/v-0.3.0-blue?style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_dl.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_vw.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_up.json&style=flat) | ![post_6e9b698faed2ca2ba6f8308635a4804e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_6e9b698faed2ca2ba6f8308635a4804e_sv.json&style=flat) | 2026-03-23 |
| 8 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action | ![v](https://img.shields.io/badge/v-0.3.7-blue?style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_dl.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_vw.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_up.json&style=flat) | ![post_c5ae05d46c7b999a1e36ca1457f1926b_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5ae05d46c7b999a1e36ca1457f1926b_sv.json&style=flat) | 2026-03-22 |
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe | ![v](https://img.shields.io/badge/v-0.12.0-blue?style=flat) | ![post_aef940e01073e811a311c3a443d9c149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_dl.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_vw.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_up.json&style=flat) | ![post_aef940e01073e811a311c3a443d9c149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_aef940e01073e811a311c3a443d9c149_sv.json&style=flat) | 2026-03-22 |
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_dl.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_vw.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_up.json&style=flat) | ![post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_5cf7a5dad74ef15ee4ffc6fe10da8213_sv.json&style=flat) | 2026-03-22 |
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_dl.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_vw.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_up.json&style=flat) | ![post_78e3480de4e6bd4615498495c5d15979_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_78e3480de4e6bd4615498495c5d15979_sv.json&style=flat) | 2026-01-08 |
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_up.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv.json&style=flat) | 2026-02-13 |
| 13 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | ![v](https://img.shields.io/badge/v-0.1.0-blue?style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_dl.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_vw.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_up.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_sv.json&style=flat) | 2026-01-20 |
| 14 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | ![v](https://img.shields.io/badge/v-0.1.3-blue?style=flat) | ![post_68081377a06a5746efe798136a72c6b6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_dl.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_vw.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_up.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_sv.json&style=flat) | 2026-03-03 |
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_dl.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_vw.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_up.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_sv.json&style=flat) | 2026-02-13 |
| 17 | [思维导](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | ![v](https://img.shields.io/badge/v-0.9.2-blue?style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_dl.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_vw.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_up.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_sv.json&style=flat) | 2026-02-13 |
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | ![v](https://img.shields.io/badge/v-1.2.2-blue?style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_dl.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_vw.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_up.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_sv.json&style=flat) | 2026-02-13 |
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_dl.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_vw.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_up.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_sv.json&style=flat) | 2026-01-08 |
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_c68a2593e76ec324361358575b6501de_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_dl.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_vw.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_up.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_sv.json&style=flat) | 2026-02-13 |
| 21 | [🚀 Batch Install Plugins - Install Popular Plugins in Seconds](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_dl.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_vw.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_up.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_sv.json&style=flat) | 2026-03-15 |
| 22 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_040794b40937926d42e6907044b828b1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_dl.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_vw.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_up.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_sv.json&style=flat) | 2026-03-07 |
| 23 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_dl.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_vw.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_up.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_sv.json&style=flat) | 2026-02-28 |
| 24 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv.json&style=flat) | 2026-02-28 |
| 25 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_dl.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_vw.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_up.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_sv.json&style=flat) | 2026-02-10 |
| 26 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_858cb162732370288ce024b4f7944f69_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_dl.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_vw.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_up.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_sv.json&style=flat) | 2026-01-28 |
| 27 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_dl.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_vw.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_up.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_sv.json&style=flat) | 2026-01-14 |
| 28 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_dl.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_vw.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_up.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_sv.json&style=flat) | 2026-01-10 |
| 12 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_dl.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_vw.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_up.json&style=flat) | ![post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fdb1b2ff2b8c6ad0dbb3b15a0318434d_sv.json&style=flat) | 2026-03-05 |
| 13 | [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | tool | ![v](https://img.shields.io/badge/v-1.1.0-blue?style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_dl.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_vw.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_up.json&style=flat) | ![post_fb84417ef97520b6b918ebadd49a05b0_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fb84417ef97520b6b918ebadd49a05b0_sv.json&style=flat) | 2026-03-23 |
| 14 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action | ![v](https://img.shields.io/badge/v-0.4.4-blue?style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_dl.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_vw.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_up.json&style=flat) | ![post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fc4cbdf0eb78bd98c2ed7650d459b59e_sv.json&style=flat) | 2026-03-22 |
| 15 | [📂 Folder Memory Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter | ![v](https://img.shields.io/badge/v-0.1.0-blue?style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_dl.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_vw.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_up.json&style=flat) | ![post_a125b3a3702a07c86c77668dcede2149_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_a125b3a3702a07c86c77668dcede2149_sv.json&style=flat) | 2026-01-20 |
| 16 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter | ![v](https://img.shields.io/badge/v-0.1.3-blue?style=flat) | ![post_68081377a06a5746efe798136a72c6b6_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_dl.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_vw.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_up.json&style=flat) | ![post_68081377a06a5746efe798136a72c6b6_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_68081377a06a5746efe798136a72c6b6_sv.json&style=flat) | 2026-03-22 |
| 17 | [智能信息](https://openwebui.com/posts/智能信息图_e04a48ff) | action | ![v](https://img.shields.io/badge/v-1.5.0-blue?style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_dl.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_vw.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_up.json&style=flat) | ![post_0c3f8621f77a9d5875d3c26ee38a3954_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0c3f8621f77a9d5875d3c26ee38a3954_sv.json&style=flat) | 2026-03-22 |
| 18 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action | ![v](https://img.shields.io/badge/v-0.9.2-blue?style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_dl.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_vw.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_up.json&style=flat) | ![post_c5bfbfd0d29694a04c597e26202b824f_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c5bfbfd0d29694a04c597e26202b824f_sv.json&style=flat) | 2026-02-13 |
| 19 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action | ![v](https://img.shields.io/badge/v-1.2.2-blue?style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_dl.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_vw.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_up.json&style=flat) | ![post_fa447e583483020bc1bf35e74302c75c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_fa447e583483020bc1bf35e74302c75c_sv.json&style=flat) | 2026-02-13 |
| 20 | [精读](https://openwebui.com/posts/精读_99830b0f) | action | ![v](https://img.shields.io/badge/v-1.0.0-blue?style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_dl.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_vw.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_up.json&style=flat) | ![post_14a3b01bc6559558b48a61a56dd3635d_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_14a3b01bc6559558b48a61a56dd3635d_sv.json&style=flat) | 2026-01-08 |
| 21 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action | ![v](https://img.shields.io/badge/v-0.2.4-blue?style=flat) | ![post_c68a2593e76ec324361358575b6501de_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_dl.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_vw.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_up.json&style=flat) | ![post_c68a2593e76ec324361358575b6501de_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_c68a2593e76ec324361358575b6501de_sv.json&style=flat) | 2026-03-22 |
| 22 | [🔍 One-Sentence Concept Explainer](https://openwebui.com/posts/one_sentence_concept_explainer_79be55d3) | prompt | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_dl.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_vw.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_up.json&style=flat) | ![post_0f1d98a0ad97a4b1c142677e92232b62_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f1d98a0ad97a4b1c142677e92232b62_sv.json&style=flat) | 2026-03-22 |
| 23 | [🧠 Wisdom Synthesizer (Collective Wisdom Synthesizer)](https://openwebui.com/posts/wisdom_synthesizer_collective_wisdom_synthesizer_f7c0d0fe) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_dl.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_vw.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_up.json&style=flat) | ![post_36ba1d919ef7121a5455c0e7e94b9aae_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_36ba1d919ef7121a5455c0e7e94b9aae_sv.json&style=flat) | 2026-03-22 |
| 24 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_040794b40937926d42e6907044b828b1_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_dl.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_vw.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_up.json&style=flat) | ![post_040794b40937926d42e6907044b828b1_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_040794b40937926d42e6907044b828b1_sv.json&style=flat) | 2026-03-07 |
| 25 | [🚀 GitHub Copilot SDK Pipe v0.9.0: Skills & RichUI](https://openwebui.com/posts/github_copilot_sdk_pipe_v090_copilot_sdk_skills_co_99a42452) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_dl.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_vw.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_up.json&style=flat) | ![post_0f2ccf8471a3db168298f4f1e86ba0f4_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_0f2ccf8471a3db168298f4f1e86ba0f4_sv.json&style=flat) | 2026-02-28 |
| 26 | [🚀 GitHub Copilot SDK Pipe v0.7.0: Skills & Rich UI 🛠️](https://openwebui.com/posts/github_copilot_sdk_pipe_v070_native_tool_ui_zero_c_4af38131) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_dl.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_vw.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_up.json&style=flat) | ![post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8aad0d77dbeaa0bdd3e6971274b5fa5c_sv.json&style=flat) | 2026-02-28 |
| 27 | [🚀 GitHub Copilot SDK Pipe: AI That Executes, Not Just Talks](https://openwebui.com/posts/github_copilot_sdk_for_openwebui_elevate_your_ai_t_a140f293) | pipe | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_dl.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_vw.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_up.json&style=flat) | ![post_42a11f4f094a0fa757bfefece51b1180_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_42a11f4f094a0fa757bfefece51b1180_sv.json&style=flat) | 2026-02-10 |
| 28 | [🚀 Open WebUI Prompt Plus: AI-Powered Prompt Manager](https://openwebui.com/posts/open_webui_prompt_plus_ai_powered_prompt_manager_s_15fa060e) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_858cb162732370288ce024b4f7944f69_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_dl.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_vw.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_up.json&style=flat) | ![post_858cb162732370288ce024b4f7944f69_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_858cb162732370288ce024b4f7944f69_sv.json&style=flat) | 2026-01-28 |
| 29 | [Review of Claude Haiku 4.5](https://openwebui.com/posts/review_of_claude_haiku_45_41b0db39) | review | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_dl.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_vw.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_up.json&style=flat) | ![post_8db923aec1f58d282a2334db388aa5c2_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_8db923aec1f58d282a2334db388aa5c2_sv.json&style=flat) | 2026-01-14 |
| 30 | [ 🛠️ Debug Open WebUI Plugins in Your Browser](https://openwebui.com/posts/debug_open_webui_plugins_in_your_browser_81bf7960) | action | ![v](https://img.shields.io/badge/v-N/A-gray?style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_dl](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_dl.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_vw](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_vw.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_up](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_up.json&style=flat) | ![post_e38b91e43262d29106345acfcd9dffba_sv](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_post_e38b91e43262d29106345acfcd9dffba_sv.json&style=flat) | 2026-01-10 |

View File

@@ -33,7 +33,7 @@ Actions are interactive plugins that:
Transform text into professional infographics using AntV visualization engine with various templates.
**Version:** 1.5.0
**Version:** 1.6.0
[:octicons-arrow-right-24: Documentation](smart-infographic.md)

View File

@@ -33,7 +33,7 @@ Actions 是交互式插件,能够:
使用 AntV 可视化引擎,将文本转成专业的信息图。
**版本:** 1.4.9
**版本:** 1.6.0
[:octicons-arrow-right-24: 查看文档](smart-infographic.md)

View File

@@ -1,6 +1,6 @@
# Smart Infographic
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,7 +8,7 @@
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
## 🔥 What's New in v1.5.0
## 🔥 What's New in v1.6.0
- 🌐 **Smart Language Detection**: Automatically detects the accurate UI language from your browser.
- 🗣️ **Context-Aware Generation**: Generated infographics now strictly follow the language of your input content (e.g., input Japanese -> output Japanese infographic).

View File

@@ -1,6 +1,6 @@
# 智能信息图
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,7 +8,7 @@
基于 AntV Infographic 引擎的 Open WebUI 插件,能够将长文本内容一键转换为专业、美观的信息图表。
## 🔥 最新更新 v1.5.0
## 🔥 最新更新 v1.6.0
- 🌐 **智能语言检测**:自动从浏览器准确识别当前界面语言设置。
- 🗣️ **上下文感知生成**:生成的信息图内容现在严格跟随用户输入内容的语言(例如:输入日语 -> 生成日语信息图)。

View File

@@ -17,15 +17,12 @@ Pipelines extend beyond simple transformations to implement:
<div class="grid cards" markdown>
- :material-view-module:{ .lg .middle } **MoE Prompt Refiner**
- :material-view-module:{ .lg .middle } **Wisdom Synthesizer**
[:octicons-tag-24: v0.1.0](https://github.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer){ .bubble }
---
An external pipeline filter that refactors aggregate requests with collective wisdom to output structured expert reports.
Refines prompts for Mixture of Experts (MoE) summary requests to generate high-quality comprehensive reports.
**Version:** 1.0.0
[:octicons-arrow-right-24: Documentation](moe-prompt-refiner.md)
[:octicons-arrow-right-24: Documentation](wisdom-synthesizer.md)
</div>

View File

@@ -17,15 +17,12 @@ Pipelines 不仅是简单转换,还可以实现:
<div class="grid cards" markdown>
- :material-view-module:{ .lg .middle } **MoE Prompt Refiner**
- :material-view-module:{ .lg .middle } **Wisdom Synthesizer**
[:octicons-tag-24: v0.1.0](https://github.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer){ .bubble }
---
智能拦截并重构多模型汇总请求发挥集体智慧Collective Wisdom将常规汇总熔炼为专家级对比报告。
为 Mixture of ExpertsMoE汇总请求优化提示词生成高质量综合报告。
**版本:** 1.0.0
[:octicons-arrow-right-24: 查看文档](moe-prompt-refiner.md)
[:octicons-arrow-right-24: 查看文档](wisdom-synthesizer.md)
</div>

View File

@@ -1,109 +0,0 @@
# MoE Prompt Refiner
<span class="category-badge pipeline">Pipeline</span>
<span class="version-badge">v1.0.0</span>
Refines prompts for Mixture of Experts (MoE) summary requests to generate high-quality comprehensive reports.
---
## Overview
The MoE Prompt Refiner is an advanced pipeline that optimizes prompts before sending them to multiple expert models, then synthesizes the responses into comprehensive, high-quality reports.
## Features
- :material-view-module: **Multi-Model**: Leverages multiple AI models
- :material-text-search: **Prompt Optimization**: Refines prompts for best results
- :material-merge: **Response Synthesis**: Combines expert responses
- :material-file-document: **Report Generation**: Creates structured reports
---
## Installation
1. Download the pipeline file: [`moe_prompt_refiner.py`](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipelines)
2. Upload to OpenWebUI: **Admin Panel****Settings****Functions**
3. Configure expert models and settings
4. Enable the pipeline
---
## How It Works
```mermaid
graph TD
A[User Prompt] --> B[Prompt Refiner]
B --> C[Expert Model 1]
B --> D[Expert Model 2]
B --> E[Expert Model N]
C --> F[Response Synthesizer]
D --> F
E --> F
F --> G[Comprehensive Report]
```
---
## Configuration
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `expert_models` | list | `[]` | List of models to consult |
| `synthesis_model` | string | `"auto"` | Model for synthesizing responses |
| `report_format` | string | `"markdown"` | Output format |
---
## Use Cases
- **Research Reports**: Gather insights from multiple AI perspectives
- **Comprehensive Analysis**: Multi-faceted problem analysis
- **Decision Support**: Balanced recommendations from diverse models
- **Content Creation**: Rich, multi-perspective content
---
## Example
**Input Prompt:**
```
Analyze the pros and cons of microservices architecture
```
**Output Report:**
```markdown
# Microservices Architecture Analysis
## Executive Summary
Based on analysis from multiple expert perspectives...
## Advantages
1. **Scalability** (Expert A)...
2. **Technology Flexibility** (Expert B)...
## Disadvantages
1. **Complexity** (Expert A)...
2. **Distributed System Challenges** (Expert C)...
## Recommendations
Synthesized recommendations based on expert consensus...
```
---
## Requirements
!!! note "Prerequisites"
- OpenWebUI v0.3.0 or later
- Access to multiple LLM models
- Sufficient API quotas for multi-model queries
!!! warning "Resource Usage"
This pipeline makes multiple API calls per request. Monitor your usage and costs.
---
## Source Code
[:fontawesome-brands-github: View on GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipelines){ .md-button }

View File

@@ -1,109 +0,0 @@
# MoE Prompt Refiner
<span class="category-badge pipeline">Pipeline</span>
<span class="version-badge">v1.0.0</span>
为 Mixture of ExpertsMoE汇总请求优化提示词生成高质量的综合报告。
---
## 概览
MoE Prompt Refiner 是一个高级 Pipeline会在将请求发送给多个专家模型前先优化提示词然后综合各模型回复输出结构化的高质量报告。
## 功能特性
- :material-view-module: **多模型**:同时利用多个 AI 模型
- :material-text-search: **提示词优化**:在发送前优化 prompt 获得更好结果
- :material-merge: **结果合成**:整合专家回复
- :material-file-document: **报告生成**:输出结构化报告
---
## 安装
1. 下载 Pipeline 文件:[`moe_prompt_refiner.py`](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipelines)
2. 上传到 OpenWebUI**Admin Panel** → **Settings****Functions**
3. 配置专家模型及相关参数
4. 启用该 Pipeline
---
## 工作流程
```mermaid
graph TD
A[User Prompt] --> B[Prompt Refiner]
B --> C[Expert Model 1]
B --> D[Expert Model 2]
B --> E[Expert Model N]
C --> F[Response Synthesizer]
D --> F
E --> F
F --> G[Comprehensive Report]
```
---
## 配置项
| 选项 | 类型 | 默认值 | 说明 |
|--------|------|---------|-------------|
| `expert_models` | list | `[]` | 需要咨询的模型列表 |
| `synthesis_model` | string | `"auto"` | 用于综合回复的模型 |
| `report_format` | string | `"markdown"` | 输出格式 |
---
## 适用场景
- **研究报告**:从多个 AI 视角收集洞见
- **综合分析**:多角度问题拆解
- **决策支持**:获得多模型的平衡建议
- **内容创作**:生成多视角的丰富内容
---
## 示例
**输入 Prompt**
```
Analyze the pros and cons of microservices architecture
```
**输出报告:**
```markdown
# Microservices Architecture Analysis
## Executive Summary
Based on analysis from multiple expert perspectives...
## Advantages
1. **Scalability** (Expert A)...
2. **Technology Flexibility** (Expert B)...
## Disadvantages
1. **Complexity** (Expert A)...
2. **Distributed System Challenges** (Expert C)...
## Recommendations
Synthesized recommendations based on expert consensus...
```
---
## 运行要求
!!! note "前置条件"
- OpenWebUI v0.3.0 及以上
- 可以访问多个 LLM 模型
- 有足够的 API 配额支撑多模型请求
!!! warning "资源消耗"
此 Pipeline 每次请求会进行多次 API 调用,请关注用量与成本。
---
## 源码
[:fontawesome-brands-github: 在 GitHub 查看](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipelines){ .md-button }

View File

@@ -0,0 +1,73 @@
# Wisdom Synthesizer (Collective Wisdom Synthesizer)
An external pipeline filter (Pipeline/Filter) for **Open WebUI** that intercepts multi-model aggregate requests to leverage collective wisdom, reshaping **basic and linear aggregate outputs** into structured, high-contrast **expert analysis reports**.
![Effect Demonstration](https://raw.githubusercontent.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer/main/wisdom_synthesizer.gif)
---
## 🚀 Key Features
* **Smart Interception**: Automatically catches Open WebUI's “Summarize various models' responses” requests.
* **Dynamic Parsing**: Strips away generic formatting and precisely extracts the **original user query** and **each model's individual response**.
* **Wisdom Fusion**: Directs the summary model to act as a “Chief Analyst”, enforcing a critical evaluation workflow instead of generic merging.
* **Standardized Output Structure**: Guarantees output layout includes:
* **【Core Consensus】**: Aggregated common ground across models.
* **【Key Divergences】**: Comparative breakdown of different perspectives/approaches.
* **【Unique Insights】**: Spotlighting innovative points found in a single model.
* **【Synthesis & Recommendation】**: An action-oriented, blended strategy set.
---
## 📦 Installation & Usage (Pipelines Mode)
> [!IMPORTANT]
> **Prerequisite**:
> This plugin relies on the official **[open-webui/pipelines](https://github.com/open-webui/pipelines)** framework. Please ensure your Open WebUI backend is already connected to an active `pipelines` runner environment beforehand.
This plugin runs as a single-file pipeline filter component and supports importing with just a single click:
### 🚀 One-Click Import via URL (Recommended 🌟)
1. Log into your Open WebUI board, go to **Admin settings** -> **Pipelines** tab.
2. Click **“Add Pipeline”** and paste the **GitHub Raw link** of `wisdom_synthesizer.py` into the address bar.
3. Save configurations to load automatically.
Below is the visual operational guide for getting it loaded:
![Installation Guide](https://raw.githubusercontent.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer/main/install.gif)
---
## ⚙️ Valves Configuration
Configuration items inside safe Valves toggles:
| Parameter | Default | Description |
| :--- | :--- | :--- |
| `pipelines` | `["*"]` | Target model IDs to apply this Filter to *Keep default for global* |
| `priority` | `0` | Filter pipeline execution order priority (lower numbers execute first). |
| `model_id` | `None` | (Optional) Force the summarize job to run on a dedicated high-spec summary model. |
| `trigger_prefix` | `You have been provided...` | Pre-set phrase to trigger interception. Usually requires no changes. |
| `query_start_marker` | `'the latest user query: "'` | Anchor used to locate the start of the original query. |
| `query_end_marker` | `'"\n\nYour task is to'` | Anchor used to locate the end of the original query. |
| `response_start_marker` | `"Responses from models: "` | Anchor used to locate where the model responses begin. |
> [!TIP]
> **Configuration Tip**:
> The default `["*"]` allows the filter to securely adapt to any aggregator models chosen on the fly. In most scenarios, **keeping this default configuration** is highly recommended.
---
## 🤝 Related Projects
If you're building inside the Open WebUI ecosystem, you might find my other plugins sets helpful:
* 🚀 **[openwebui-extensions](https://github.com/Fu-Jie/openwebui-extensions)** —— A comprehensive collection of Actions, Pipes, and Tools to supercharge your workspace.
* 🪄 **[open-webui-prompt-plus](https://github.com/Fu-Jie/open-webui-prompt-plus)** —— Enhances Prompt engineering with AI-powered generators, Spotlight-style searches, and interactive forms.
---
## 📄 License
[MIT License](LICENSE)

View File

@@ -0,0 +1,73 @@
# Wisdom Synthesizer (集体智慧合成器)
专为 **Open WebUI** 设计的外置管道过滤器Pipeline/Filter旨在通过智能拦截并重构多模型汇总请求发挥集体智慧Collective Wisdom将原本较为**基础和扁平的常规汇总**熔炼为结构清晰、具备多维对比度的**专家级综合分析报告**。
![效果演示](https://raw.githubusercontent.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer/main/wisdom_synthesizer.gif)
---
## 🚀 核心功能
* **智能拦截**:自动捕获 Open WebUI 的“汇总多模型响应”请求(通过内置前缀触发)。
* **动态解析**:剥离多余格式,精准提取**原始用户问题**与**各模型的独立回答**。
* **智慧融合**:摒弃基础的模型合并,强制总结模型扮演“首席分析师”,发挥集体智慧审视全局。
* **规范输出**:将汇总响应熔炼为以下结构:
* **【核心共识】**: 提炼模型间的相同点。
* **【关键分歧】**: 对比不同视角的碰撞。
* **【独特洞察】**: 发现单一模型闪光点。
* **【综合建议】**: 最终形成有弹性的熔铸方案。
---
## 📦 安装与使用 (Pipelines 模式)
> [!IMPORTANT]
> **前提条件**
> 本插件依赖于 Open WebUI 官方的 **[open-webui/pipelines](https://github.com/open-webui/pipelines)** 框架插件系统。请确保你的 Open WebUI 后端已经架设好或已连接底层的 `pipelines` 服务端环境。
本插件为单文件管道过滤组件,支持在面板中一键拉取安装:
### 🚀 通过 URL 一键导入 (推荐 🌟)
1. 登录你的 Open WebUI 后台,进入 **管理员设置** -> **Pipelines** 选项卡。
2. 点击 **“添加 Pipeline”**,并在地址栏中复制贴入此仓库中 `wisdom_synthesizer.py`**GitHub Raw 链接**
3. 点击 **保存** 即可成功加载。
以下是操作动态演示:
![安装操作图](https://raw.githubusercontent.com/Fu-Jie/open-webui-pipeline-wisdom-synthesizer/main/install.gif)
---
## ⚙️ Valves 管道配置
进入管道配置项,可动态调整以下参数:
| 参数 | 默认值 | 说明 |
| :--- | :--- | :--- |
| `pipelines` | `["*"]` | 应用此 Filter 的目标模型 ID *(如果要全局生效保持默认)* |
| `priority` | `0` | 过滤器管道执行优先级(数字越小,越优先执行) |
| `model_id` | `None` | (可选) 强制将汇总任务流向你指定的某个专用高性能总结模型 |
| `trigger_prefix` | `You have been provided...` | 用于触发拦截的提示词起始句柄前缀。一般无需修改 |
| `query_start_marker` | `'the latest user query: "'` | 解析原始查询的起始标记锚点 |
| `query_end_marker` | `'"\n\nYour task is to'` | 解析原始查询的结束标记锚点 |
| `response_start_marker` | `"Responses from models: "` | 解析各个模型独立响应的起始锚点标志 |
> [!TIP]
> **配置建议**
> 默认值 `["*"]` 可在所有选定的汇总模型上自适应生效。在绝大多数情况下,你**仅需保持此默认参数**便可保障全局自适应拦截。
---
## 🤝 友情链接 (Related Projects)
如果你对 Open WebUI 的扩展生态感兴趣,欢迎关注我的其它开源方案:
* 🚀 **[openwebui-extensions](https://github.com/Fu-Jie/openwebui-extensions)** —— 包含各种增强 Actions、Pipes、Tools 等一篮子开源插件合集,助你解锁更多黑魔法。
* 🪄 **[open-webui-prompt-plus](https://github.com/Fu-Jie/open-webui-prompt-plus)** —— 包含 AI 驱动的提示词生成器、Spotlight 搜索框及交互变量表单,极速拉满提示词工程。
---
## 📄 开源许可
[MIT License](LICENSE)

View File

@@ -1,6 +1,6 @@
# GitHub Copilot SDK Pipe for OpenWebUI
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.10.1 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -26,11 +26,25 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
---
## ✨ v0.10.1: RichUI Default & Improved HTML Display
## Install with Batch Install Plugins
- **🎨 RichUI Default HTML Display**: Changed default HTML embed type from 'artifacts' to 'richui' for direct, seamless rendering in OpenWebUI chat interface
- **📝 Enhanced System Prompt**: Updated guidance to recommend RichUI mode for HTML presentation by default, with artifacts only when explicitly requested by users
- **⚡ Smoother Workflow**: Eliminates unnecessary modal interactions, allowing agents to display interactive components directly in conversation
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## ✨ v0.12.0: Adaptive Actions Console, Stream Deduplication & Full TTFT Profiling
- **📊 Predictive Adaptive Console**: Automatically models continuous decision layouts using `interactive_controls` state tables on the per-session workspace database so visual panels don't go stale.
- **🛡️ Stream Overlap Deduplication**: Mitigated overlay dual delivery bugs on `assistant.message_delta` frames using conservative overlap trimming rules during turn resumptions.
- **⏱️ Segmented Profiling Loadtimes**: Fine-grained timers identifying local startup overhead and pure cloud network turnaround time tracking calibration.
- **🧹 Eliminate Redundancies**: Reduced redundant secondary heavy `_parse_mcp_servers()` loops inside session resumes for faster handshake callbacks.
---
@@ -45,6 +59,59 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
---
## 🚀 Quick Start (Read This First)
If you only want to know how to use this plugin, read these sections in order:
1. **Quick Start**
2. **How to Use**
3. **Core Configuration**
Everything else is optional or advanced.
1. **Install the Pipe**
- **Recommended**: Use **Batch Install Plugins** and select this plugin.
- **Manual**: OpenWebUI -> **Workspace** -> **Functions** -> create a new function -> paste `github_copilot_sdk.py`.
2. **Install the Companion Files Filter** if you want uploaded files to reach the Pipe as raw files.
3. **Configure one credential path**
- `GH_TOKEN` for official GitHub Copilot models
- or `BYOK_API_KEY` for OpenAI / Anthropic
4. **Start a new chat and use it normally**
- Select this Pipe's model
- Ask your task in plain language
- Upload files when needed
## 🧭 How to Use
You usually **do not** need to mention tools, skills, internal parameters, or RichUI syntax. Just describe the task naturally.
| Scenario | What you do | Example |
| :--- | :--- | :--- |
| Daily coding / debugging | Ask normally in chat | `Fix the failing tests and explain the root cause.` |
| File analysis | Upload files and ask normally | `Summarize this Excel file and chart the monthly trend.` |
| Long tasks | Ask for the outcome; the Pipe handles planning, status, and TODO tracking automatically | `Refactor this plugin and keep the docs in sync.` |
| HTML reports / dashboards | Ask the agent to generate a report or dashboard | `Create an interactive architecture overview for this repo.` |
> [!TIP]
> Ordinary users only need to remember one rule: if you ask for an interactive HTML result, the Pipe will usually use **RichUI** automatically. Only mention **artifacts** when you explicitly want artifacts-style output.
## 💡 What RichUI actually means
**RichUI = the generated HTML page is rendered directly inside the chat window.**
You can think of it as **a small interactive page inside the conversation**.
- If the agent generates a dashboard, report, timeline, architecture page, or explainer page, you may see RichUI.
- If you are just asking normal coding questions, debugging, writing, or file analysis tasks, you can ignore RichUI completely.
- You do **not** need to write XML, HTML tags, or special RichUI attributes. Just describe the result you want.
| What you ask for | What happens |
| :--- | :--- |
| `Fix this failing test` | Normal chat response. RichUI is not important here. |
| `Create an interactive dashboard for this repo` | RichUI is used by default. |
| `Generate this as artifacts` | Artifacts mode is used instead of RichUI. |
| `Build a project summary page if that helps explain it better` | The agent decides whether a page is useful. |
## ✨ Key Capabilities
- **🔑 Unified Intelligence (Official + BYOK)**: Seamlessly switch between official GitHub Copilot models and your own models (OpenAI, Anthropic, DeepSeek, xAI) via **Bring Your Own Key** mode.
@@ -68,6 +135,25 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
> "Install this skill: <https://github.com/nicobailon/visual-explainer>".
> This skill is specifically optimized for generating high-quality visual components and integrates perfectly with this Pipe.
### 🎛️ How RichUI works in normal use
For normal users, the rule is simple:
1. Ask for the result you want.
2. The AI decides whether a normal chat reply is enough.
3. If a page or dashboard would explain things better, the AI creates it automatically and shows it in chat.
You do **not** need to write XML tags, HTML snippets, or RichUI attributes yourself.
Examples:
- `Explain this repository structure.`
- `If useful, present this as an interactive architecture page.`
- `Turn this CSV into a simple dashboard.`
> [!TIP]
> Only mention **artifacts** when you explicitly want artifacts-style output. Otherwise, let the AI choose the best presentation automatically.
---
## 🧩 Companion Files Filter (Required for raw files)
@@ -127,17 +213,27 @@ Standard users can override these settings in their individual Profile/Function
---
### 📤 Enhanced Publishing & Interactive Components
### 📤 HTML result behavior (advanced)
The `publish_file_from_workspace` tool now uses a clearer delivery contract for production use:
You can skip this section unless you are directly using `publish_file_from_workspace(...)`.
- **Artifacts mode (`artifacts`, default)**: Agent returns `[Preview]` + `[Download]` and may output `html_embed` in a ```html block for direct chat rendering.
- **Rich UI mode (`richui`)**: Agent returns `[Preview]` + `[Download]` only; integrated preview is rendered automatically via emitter (no iframe block in message).
- **📄 PDF delivery safety rule**: Always output Markdown links only (`[Preview]` + `[Download]` when available). **Do not embed PDF via iframe/html blocks.**
- **⚡ Stable dual-channel publishing**: Keeps interactive viewing and persistent file download aligned across local/object-storage backends.
- **✅ Status integration**: Emits real-time publishing progress and completion feedback to the OpenWebUI status bar.
In plain language:
- `richui` = show the generated HTML directly inside the chat
- `artifacts` = use artifacts-style HTML delivery when you explicitly want that style
Internally, this behavior is controlled by the `embed_type` parameter of `publish_file_from_workspace(...)`.
- **Rich UI mode (`richui`, default for HTML)**: The agent returns `[Preview]` + `[Download]` only. OpenWebUI renders the interactive preview automatically after the message.
- **Artifacts mode (`artifacts`)**: Use this only when you explicitly want artifacts-style HTML delivery.
- **📄 PDF safety rule**: Always return Markdown links only (`[Preview]` / `[Download]` when available). Do not embed PDFs with iframe or HTML blocks.
- **⚡ Stable dual-channel publishing**: Keeps interactive viewing and persistent file download aligned across local and object-storage backends.
- **✅ Status integration**: Emits publishing progress and completion feedback to the OpenWebUI status bar.
- **📘 Publishing Tool Guide (GitHub)**: [publish_file_from_workspace Guide](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/PUBLISH_FILE_FROM_WORKSPACE.md)
> [!TIP]
> Most users do not need to set `embed_type` manually. Ask for a report or dashboard normally. Only say `use artifacts` when you specifically want artifacts-style presentation. If you are not calling `publish_file_from_workspace(...)` yourself, you can usually ignore this parameter.
---
### 🧩 OpenWebUI Skills Bridge & `manage_skills` Tool

View File

@@ -1,6 +1,6 @@
# GitHub Copilot Official SDK Pipe
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.10.1 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -27,11 +27,25 @@
---
## ✨ v0.10.1RichUI 默认展示与 HTML 渲染改进
## 使用 Batch Install Plugins 安装
- **🎨 RichUI 默认 HTML 显示**:将默认 HTML 嵌入类型从 'artifacts' 改为 'richui',在 OpenWebUI 聊天界面中实现直观无缝的渲染效果
- **📝 增强系统提示词**:更新系统提示词指导,默认推荐 RichUI 模式展示 HTML 内容,仅当用户显式请求时使用 artifacts 模式
- **⚡ 更顺畅的工作流**:消除不必要的弹窗交互,让 Agent 能直接在对话中展示交互式组件
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## ✨ v0.12.0:自适应动作面板、流排重拦截与全链路 TTFT 测定
- **📊 连续自适应看板 (Adaptive Actions Console)**:自动在 `interactive_controls` 辅助常驻状态表中追踪动作,引导 LLM 有选择性地在最新输出中展示最可能用到的点击控制面板,实现不翻页连续持久化点击操作。
- **🛡️ 叠加流排重拦截 (Deduplicate Stream overlap)**:对接 `_dedupe_stream_chunk` 保守重叠裁剪,彻底消除二轮对话流重叠叠加异常。
- **⏱️ 分段 ⏱️ Profiling 埋点**:拆装本地预热阻断与云端网络 Trip 数据时间,直观测算 Time-to-First-Byte。
- **🧹 消除冗余解析**:剔除 Resume 过程对 MCP 的二次昂贵循环,提效握手微观时延。
---
@@ -46,6 +60,59 @@
---
## 🚀 最短上手路径(先看这里)
如果你现在最关心的是“这个插件到底怎么用”,建议按这个顺序阅读:
1. **最短上手路径**
2. **日常怎么用**
3. **核心配置**
其他章节都属于补充说明或进阶内容。
1. **安装 Pipe**
- **推荐**:使用 **Batch Install Plugins** 安装并勾选当前插件。
- **手动**OpenWebUI -> **Workspace** -> **Functions** -> 新建 Function -> 粘贴 `github_copilot_sdk.py`
2. **如果你要处理上传文件**,再安装配套的 `GitHub Copilot SDK Files Filter`
3. **至少配置一种凭据**
- `GH_TOKEN`:使用 GitHub 官方 Copilot 模型
- `BYOK_API_KEY`:使用 OpenAI / Anthropic 自带 Key
4. **新建对话后直接正常提需求**
- 选择当前 Pipe 的模型
- 像平时一样描述任务
- 需要时上传文件
## 🧭 日常怎么用
大多数情况下,你**不需要**主动提 tools、skills、内部参数或 RichUI 语法,直接自然描述任务即可。
| 场景 | 你怎么做 | 示例 |
| :--- | :--- | :--- |
| 日常编码 / 排错 | 直接在聊天里提需求 | `修复失败的测试,并解释根因。` |
| 文件分析 | 上传文件后直接提需求 | `总结这个 Excel并画出每月趋势图。` |
| 长任务 | 只要说出目标即可Pipe 会自动处理规划、状态提示和 TODO 跟踪 | `重构这个插件,并同步更新文档。` |
| HTML 报告 / 看板 | 直接让 Agent 生成交互式报告或看板 | `帮我生成这个仓库的交互式架构总览。` |
> [!TIP]
> 普通用户只要记住一条:如果你让 Agent 生成交互式 HTML 结果,这个 Pipe 通常会自动使用 **RichUI**。只有当你明确想要 artifacts 风格时,才需要特别说明。
## 💡 RichUI 到底是什么意思?
**RichUI = Agent 生成的 HTML 页面,会直接显示在聊天窗口里。**
你可以把它理解为:**对话里面直接出现一个可交互的小网页 / 小看板**。
- 如果 Agent 生成的是看板、报告、时间线、架构图页面或说明型页面,你就可能会看到 RichUI。
- 如果你只是正常问代码问题、调试、写文档、分析文件,其实可以完全忽略 RichUI。
- 你**不需要**自己写 XML、HTML 标签或任何特殊 RichUI 属性,直接描述你想要的结果即可。
| 你怎么说 | 系统会怎么做 |
| :--- | :--- |
| `修复这个失败测试` | 正常聊天回复,这时 RichUI 基本不重要。 |
| `帮我生成一个交互式仓库看板` | 默认使用 RichUI。 |
| `请用 artifacts 形式生成` | 改用 artifacts而不是 RichUI。 |
| `如果做成页面更清楚,就帮我做成页面` | AI 会自己判断页面是否更合适。 |
## ✨ 核心能力 (Key Capabilities)
- **🔑 统一智能体验 (官方 + BYOK)**: 自由切换官方模型与自定义服务商OpenAI, Anthropic, DeepSeek, xAI支持 **BYOK (自带 Key)** 模式。
@@ -69,6 +136,25 @@
> “请安装此技能:<https://github.com/nicobailon/visual-explainer”。>
> 该技能专为生成高质量可视化组件而设计,能够与本 Pipe 完美协作。
### 🎛️ RichUI 在日常使用里怎么理解
对普通用户来说,规则很简单:
1. 直接说出你想要的结果。
2. AI 会自己判断普通聊天回复是否已经足够。
3. 如果做成页面、看板或可视化会更清楚AI 会自动生成并直接显示在聊天里。
你**不需要**自己写 XML 标签、HTML 片段或 RichUI 属性。
例如:
- `请解释这个仓库的结构。`
- `如果用交互式架构页更清楚,就做成页面。`
- `把这个 CSV 做成一个简单看板。`
> [!TIP]
> 只有当你明确想要 **artifacts 风格** 时,才需要特别说明。其他情况下,直接让 AI 自动选择最合适的展示方式即可。
---
## 🧩 配套 Files Filter原始文件必备
@@ -76,7 +162,7 @@
`GitHub Copilot SDK Files Filter` 是本 Pipe 的配套插件,用于阻止 OpenWebUI 默认 RAG 在 Pipe 接手前抢先处理上传文件。
- **作用**: 将上传文件移动到 `copilot_files`,让 Pipe 能直接读取原始二进制。
- **必要性**: 若未安装,文件可能被提前解析/向量化Agent 到原始文件。
- **必要性**: 若未安装,文件可能被提前解析/向量化Agent 可能拿不到原始文件。
- **v0.1.3 重点**:
- 修复 BYOK 模型 ID 识别(支持 `github_copilot_official_sdk_pipe.xxx` 前缀匹配)。
- 新增双通道调试日志(`show_debug_log`):后端 logger + 浏览器控制台。
@@ -161,6 +247,28 @@
---
## 📤 HTML 结果展示方式(进阶)
如果你没有直接使用 `publish_file_from_workspace(...)`,这一节可以跳过。
先用一句人话解释:
- `richui` = 生成的 HTML 直接显示在聊天里
- `artifacts` = 你明确想要 artifacts 风格时使用的另一种 HTML 交付方式
在内部实现上,这个行为由 `publish_file_from_workspace(..., embed_type=...)` 控制。
- **RichUI 模式(`richui`HTML 默认)**Agent 只返回 `[Preview]` + `[Download]`,聊天结束后由 OpenWebUI 自动渲染交互预览。
- **Artifacts 模式(`artifacts`**:只有在你明确想要 artifacts 风格展示时再使用。
- **PDF 安全规则**PDF 只返回 Markdown 链接,不要用 iframe / HTML block 嵌入。
- **双通道发布**:同时兼顾对话内查看与持久下载。
- **状态提示**:发布过程会同步显示在 OpenWebUI 状态栏。
> [!TIP]
> 如果你只是日常使用这个 Pipe通常不需要手动提 `embed_type`。直接说“生成一个交互式报告 / 看板”即可;只有你明确想要 artifacts 风格时再特别说明。如果你并没有直接调用 `publish_file_from_workspace(...)`,那通常可以忽略这个参数。
---
## 🤝 支持 (Support)
如果这个插件对你有帮助,欢迎到 [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) 点个 Star这将是我持续改进的动力感谢支持。

View File

@@ -15,7 +15,7 @@ Pipes allow you to:
## Available Pipe Plugins
- [GitHub Copilot SDK](github-copilot-sdk.md) (v0.10.1) - Official GitHub Copilot SDK integration. Features **Workspace Isolation**, **Zero-config OpenWebUI Tool Bridge**, **BYOK** support, and **dynamic MCP discovery**. **NEW in v0.10.1: RichUI Default HTML Display & Enhanced System Prompt guidance**. [View Deep Dive](github-copilot-sdk-deep-dive.md) | [**View Advanced Tutorial**](github-copilot-sdk-tutorial.md) | [**View Detailed Usage Guide**](github-copilot-sdk-usage-guide.md).
- [GitHub Copilot SDK](github-copilot-sdk.md) (v0.12.0) - Official GitHub Copilot SDK integration. Features **Workspace Isolation**, **Zero-config OpenWebUI Tool Bridge**, **BYOK** support, and **dynamic MCP discovery**. **NEW in v0.12.0: Shared Client Pool fix (High Performance), Pure BYOK-only Mode, and Stable RichUI auto-sizing**. [View Deep Dive](github-copilot-sdk-deep-dive.md) | [**View Advanced Tutorial**](github-copilot-sdk-tutorial.md) | [**View Detailed Usage Guide**](github-copilot-sdk-usage-guide.md).
- **[Case Study: GitHub 100 Star Growth Analysis](star-prediction-example.md)** - Learn how to use the GitHub Copilot SDK Pipe with Minimax 2.1 to automatically analyze CSV data and generate project growth reports.
- **[Case Study: High-Quality Video to GIF Conversion](video-processing-example.md)** - See how the model uses system-level FFmpeg to accelerate, scale, and optimize colors for screen recordings.

View File

@@ -15,7 +15,7 @@ Pipes 可以用于:
## 可用的 Pipe 插件
- [GitHub Copilot SDK](github-copilot-sdk.zh.md) (v0.10.1) - GitHub Copilot SDK 官方集成。具备**工作区安全隔离**、**零配置工具桥接**与**BYOK (自带 Key) 支持**。**v0.10.1 更新:RichUI 默认 HTML 展示与增强的系统提示词指导**。[查看深度架构解析](github-copilot-sdk-deep-dive.zh.md) | [**查看进阶实战教程**](github-copilot-sdk-tutorial.zh.md) | [**查看详细使用手册**](github-copilot-sdk-usage-guide.zh.md)。
- [GitHub Copilot SDK](github-copilot-sdk.zh.md) (v0.12.0) - GitHub Copilot SDK 官方集成。具备**工作区安全隔离**、**零配置工具桥接**与**BYOK (自带 Key) 支持**。**v0.12.0 更新:单例进程池 Bug 修复 (极速响应)、纯 BYOK 模式支持与 RichUI 自动高度稳定性增强**。[查看深度架构解析](github-copilot-sdk-deep-dive.zh.md) | [**查看进阶 实战教程**](github-copilot-sdk-tutorial.zh.md) | [**查看详细使用手册**](github-copilot-sdk-usage-guide.zh.md)。
- **[实战案例GitHub 100 Star 增长预测](star-prediction-example.zh.md)** - 展示如何使用 GitHub Copilot SDK Pipe 结合 Minimax 2.1 模型,自动编写脚本分析 CSV 数据并生成详细的项目增长报告。
- **[实战案例:视频高质量 GIF 转换与加速](video-processing-example.zh.md)** - 演示模型如何通过底层 FFmpeg 工具对录屏进行加速、缩放及双阶段色彩优化处理。

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
**Author:** [Fu-Jie](https://github.com/Fu-Jie) | **Version:** 1.0.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
**Author:** [Fu-Jie](https://github.com/Fu-Jie) | **Version:** 1.1.0 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
@@ -8,9 +8,10 @@ One-click batch install plugins from GitHub repositories to your OpenWebUI insta
- **One-Click Install**: Install all plugins with a single command
- **Auto-Update**: Automatically updates previously installed plugins
- **Public GitHub Support**: Install plugins from any public GitHub repository
- **Public GitHub Support**: Install plugins from one or many public GitHub repositories
- **Multi-Type Support**: Supports Pipe, Action, Filter, and Tool plugins
- **Confirmation**: Shows plugin list before installing, allows selective installation
- **Multi-Repository Picker**: Combine multiple repositories in one request and review them in a single grouped dialog
- **Interactive Selection Dialog**: Filter by repository and type, search by keyword, review plugin descriptions, then install only the checked subset
- **i18n**: Supports 11 languages
## Flow
@@ -20,7 +21,7 @@ User Input
┌─────────────────────────────────────┐
│ Discover Plugins from GitHub
│ Discover Plugins from GitHub Repos
│ (fetch file tree + parse .py) │
└─────────────────────────────────────┘
@@ -32,8 +33,8 @@ User Input
┌─────────────────────────────────────┐
│ Show Confirmation Dialog │
│ (list plugins + exclude hint)
│ Show Selection Dialog
│ (repo groups + filters + search)
└─────────────────────────────────────┘
├── [Cancel] → End
@@ -57,49 +58,23 @@ User Input
## Interactive Installation Workflow
Each request handles one repository. To mix repositories, send another request after the previous installation completes.
The `repo` parameter accepts one or more `owner/repo` values separated by commas, semicolons, or new lines.
After plugin discovery and filtering, OpenWebUI opens a browser dialog built with the `execute` event. The dialog merges results from every requested repository, groups them by repository, supports repository tags, type filters, and keyword search, and lets you check exactly which plugins to install before the API calls start.
If one user request mentions multiple repositories, keep them in the same request so the model can pass them into a single tool call.
## Quick Start: Install Popular Collections
Copy any of these prompts and paste them into your chat:
Paste this prompt into your chat:
```
# Install all from my collection (default)
Install all plugins
# Add popular community tools
Install all plugins from iChristGit/OpenWebui-Tools
# Add utility-focused extensions
Install all plugins from Haervwe/open-webui-tools
# Add mixed community implementations
Install all plugins from Classic298/open-webui-plugins
# Add function-based plugins
Install all plugins from suurt8ll/open_webui_functions
# Add OpenRouter pipe integration
Install all plugins from rbb-dev/Open-WebUI-OpenRouter-pipe
Install all plugins from Fu-Jie/openwebui-extensions, iChristGit/OpenWebui-Tools, Haervwe/open-webui-tools, Classic298/open-webui-plugins, suurt8ll/open_webui_functions, rbb-dev/Open-WebUI-OpenRouter-pipe
```
Each line is a separate request. Already installed plugins are automatically updated.
Once the dialog opens, use the repository tags, type filters, and keyword search to narrow the list before installing. Already installed plugins are automatically updated.
## Usage Examples
For more advanced usage patterns:
```
# Filter by plugin type
"Install only tool plugins from iChristGit/OpenWebui-Tools"
"Install only action plugins from Classic298/open-webui-plugins"
# Exclude specific plugins
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
# Install from your own repository
"Install all plugins from your-username/my-plugin-collection"
```
You can replace that repository list with your own collections whenever needed.
## Default Repository
@@ -127,11 +102,11 @@ For other repositories:
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | Comma-separated keywords to skip |
| `TIMEOUT` | `20` | Request timeout in seconds |
## Confirmation Timeout
## Selection Dialog Timeout
User confirmation dialogs have a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
The plugin selection dialog has a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
- Read and review the plugin list
- Make installation decisions
- Check or uncheck the plugins they want
- Handle network delays
## Support

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
**作者:** [Fu-Jie](https://github.com/Fu-Jie) | **版本:** 1.0.0 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
**作者:** [Fu-Jie](https://github.com/Fu-Jie) | **版本:** 1.1.0 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions)
一键将 GitHub 仓库中的插件批量安装到你的 OpenWebUI 实例。
@@ -8,9 +8,10 @@
- 一键安装:单个命令安装所有插件
- 自动更新:自动更新之前安装过的插件
- 公开 GitHub 支持:支持从任何公开 GitHub 仓库安装插件
- 公开 GitHub 支持:支持从一个或多个公开 GitHub 仓库安装插件
- 多类型支持:支持 Pipe、Action、Filter 和 Tool 插件
- 安装确认:安装前显示插件列表,支持选择性安装
- 多仓库选择器:一次请求可合并多个仓库,并在同一个分组对话框中查看
- 交互式选择对话框:先按仓库和类型筛选、按关键词搜索并查看描述信息,再勾选要安装的插件,只安装所选子集
- 国际化:支持 11 种语言
## 流程
@@ -20,7 +21,7 @@
┌─────────────────────────────────────┐
│ 从 GitHub 发现插件
│ 从 GitHub 多仓库发现插件 │
│ (获取文件树 + 解析 .py 文件) │
└─────────────────────────────────────┘
@@ -32,8 +33,8 @@
┌─────────────────────────────────────┐
│ 显示确认对话框 │
│ (插件列表 + 排除提示)
│ 显示选择对话框 │
│ (仓库分组 + 筛选 + 搜索)
└─────────────────────────────────────┘
├── [取消] → 结束
@@ -57,49 +58,23 @@
## 交互式安装工作流
每次请求处理一个仓库。如需混合多个来源,请在上一次安装完成后再发起下一次请求
`repo` 参数现在支持多个 `owner/repo`,可用逗号、分号或换行分隔
在插件发现和过滤完成后OpenWebUI 会通过 `execute` 事件打开浏览器选择对话框。对话框会合并所有目标仓库的结果,按仓库分组展示,并支持仓库标签、类型筛选、关键词搜索和描述查看,再开始调用安装 API。
如果一次用户请求里提到了多个仓库,尽量保持在同一次请求里,让模型把它们合并到一次工具调用中。
## 快速开始:安装热门插件集
复制以下任一提示词,粘贴到你的对话框中:
复制下面这条提示词,粘贴到你的对话框中:
```
# 安装我的默认集合
安装所有插件
# 添加热门社区工具
从 iChristGit/OpenWebui-Tools 安装所有插件
# 添加实用工具扩展
从 Haervwe/open-webui-tools 安装所有插件
# 添加混合社区实现
从 Classic298/open-webui-plugins 安装所有插件
# 添加基于函数的插件
从 suurt8ll/open_webui_functions 安装所有插件
# 添加 OpenRouter 管道集成
从 rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
从 Fu-Jie/openwebui-extensions、iChristGit/OpenWebui-Tools、Haervwe/open-webui-tools、Classic298/open-webui-plugins、suurt8ll/open_webui_functions、rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
```
每一行是一个独立的请求。已安装的插件会自动更新。
弹窗出现后,直接用里面的仓库标签、类型筛选和关键词搜索来缩小范围再安装。已安装的插件会自动更新。
## 使用示例
更多高级用法:
```
# 按插件类型过滤
"从 iChristGit/OpenWebui-Tools 仅安装 tool 插件"
"从 Classic298/open-webui-plugins 仅安装 action 插件"
# 排除特定插件
"从 Haervwe/open-webui-tools 安装所有插件, exclude_keywords=test,deprecated"
# 从你自己的仓库安装
"从 your-username/my-plugin-collection 安装所有插件"
```
需要时,你也可以把这串仓库替换成你自己的插件仓库组合。
## 默认仓库
@@ -127,11 +102,11 @@
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 逗号分隔的跳过关键词 |
| `TIMEOUT` | `20` | 请求超时时间(秒)|
## 确认超时时间
## 选择对话框超时时间
用户确认对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
插件选择对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
- 阅读和查看插件列表
- 做出安装决定
- 勾选或取消勾选想安装的插件
- 处理网络延迟
## 支持

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.0.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.1.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -12,9 +12,10 @@ One-click batch install plugins from GitHub repositories to your OpenWebUI insta
- **One-Click Install**: Install all plugins with a single command
- **Auto-Update**: Automatically updates previously installed plugins
- **Public GitHub Support**: Install plugins from any public GitHub repository
- **Public GitHub Support**: Install plugins from one or many public GitHub repositories
- **Multi-Type Support**: Supports Pipe, Action, Filter, and Tool plugins
- **Confirmation**: Shows plugin list before installing, allows selective installation
- **Multi-Repository Picker**: Combine multiple repositories in one request and review them in a single grouped dialog
- **Interactive Selection Dialog**: Filter by repository and type, search by keyword, review plugin descriptions, then install only the checked subset
- **i18n**: Supports 11 languages
## Flow
@@ -24,7 +25,7 @@ User Input
┌─────────────────────────────────────┐
│ Discover Plugins from GitHub
│ Discover Plugins from GitHub Repos
│ (fetch file tree + parse .py) │
└─────────────────────────────────────┘
@@ -36,8 +37,8 @@ User Input
┌─────────────────────────────────────┐
│ Show Confirmation Dialog │
│ (list plugins + exclude hint)
│ Show Selection Dialog
│ (repo groups + filters + search)
└─────────────────────────────────────┘
├── [Cancel] → End
@@ -61,49 +62,23 @@ User Input
## Interactive Installation Workflow
Each request handles one repository. To mix repositories, send another request after the previous installation completes.
The `repo` parameter accepts one or more `owner/repo` values separated by commas, semicolons, or new lines.
After plugin discovery and filtering, OpenWebUI opens a browser dialog built with the `execute` event. The dialog merges results from every requested repository, groups them by repository, supports repository tags, type filters, and keyword search, and lets you check exactly which plugins to install before the API calls start.
If one user request mentions multiple repositories, keep them in the same request so the model can pass them into a single tool call.
## Quick Start: Install Popular Collections
Copy any of these prompts and paste them into your chat:
Paste this prompt into your chat:
```
# Install all from my collection (default)
Install all plugins
# Add popular community tools
Install all plugins from iChristGit/OpenWebui-Tools
# Add utility-focused extensions
Install all plugins from Haervwe/open-webui-tools
# Add mixed community implementations
Install all plugins from Classic298/open-webui-plugins
# Add function-based plugins
Install all plugins from suurt8ll/open_webui_functions
# Add OpenRouter pipe integration
Install all plugins from rbb-dev/Open-WebUI-OpenRouter-pipe
Install all plugins from Fu-Jie/openwebui-extensions, iChristGit/OpenWebui-Tools, Haervwe/open-webui-tools, Classic298/open-webui-plugins, suurt8ll/open_webui_functions, rbb-dev/Open-WebUI-OpenRouter-pipe
```
Each line is a separate request. Already installed plugins are automatically updated.
Once the dialog opens, use the repository tags, type filters, and keyword search to narrow the list before installing. Already installed plugins are automatically updated.
## Usage Examples
For more advanced usage patterns:
```
# Filter by plugin type
"Install only tool plugins from iChristGit/OpenWebui-Tools"
"Install only action plugins from Classic298/open-webui-plugins"
# Exclude specific plugins
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
# Install from your own repository
"Install all plugins from your-username/my-plugin-collection"
```
You can replace that repository list with your own collections whenever needed.
## Default Repository
@@ -131,11 +106,11 @@ For other repositories:
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | Comma-separated keywords to skip |
| `TIMEOUT` | `20` | Request timeout in seconds |
## Confirmation Timeout
## Selection Dialog Timeout
User confirmation dialogs have a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
The plugin selection dialog has a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
- Read and review the plugin list
- Make installation decisions
- Check or uncheck the plugins they want
- Handle network delays
## Support

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.0.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.1.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -12,9 +12,10 @@
- 一键安装:单个命令安装所有插件
- 自动更新:自动更新之前安装过的插件
- 公开 GitHub 支持:支持从任何公开 GitHub 仓库安装插件
- 公开 GitHub 支持:支持从一个或多个公开 GitHub 仓库安装插件
- 多类型支持:支持 Pipe、Action、Filter 和 Tool 插件
- 安装确认:安装前显示插件列表,支持选择性安装
- 多仓库选择器:一次请求可合并多个仓库,并在同一个分组对话框中查看
- 交互式选择对话框:先按仓库和类型筛选、按关键词搜索并查看描述信息,再勾选要安装的插件,只安装所选子集
- 国际化:支持 11 种语言
## 流程
@@ -24,7 +25,7 @@
┌─────────────────────────────────────┐
│ 从 GitHub 发现插件
│ 从 GitHub 多仓库发现插件 │
│ (获取文件树 + 解析 .py 文件) │
└─────────────────────────────────────┘
@@ -36,8 +37,8 @@
┌─────────────────────────────────────┐
│ 显示确认对话框 │
│ (插件列表 + 排除提示)
│ 显示选择对话框 │
│ (仓库分组 + 筛选 + 搜索)
└─────────────────────────────────────┘
├── [取消] → 结束
@@ -61,49 +62,23 @@
## 交互式安装工作流
每次请求处理一个仓库。如需混合多个来源,请在上一次安装完成后再发起下一次请求
`repo` 参数现在支持多个 `owner/repo`,可用逗号、分号或换行分隔
在插件发现和过滤完成后OpenWebUI 会通过 `execute` 事件打开浏览器选择对话框。对话框会合并所有目标仓库的结果,按仓库分组展示,并支持仓库标签、类型筛选、关键词搜索和描述查看,再开始调用安装 API。
如果一次用户请求里提到了多个仓库,尽量保持在同一次请求里,让模型把它们合并到一次工具调用中。
## 快速开始:安装热门插件集
复制以下任一提示词,粘贴到你的对话框中:
复制下面这条提示词,粘贴到你的对话框中:
```
# 安装我的默认集合
安装所有插件
# 添加热门社区工具
从 iChristGit/OpenWebui-Tools 安装所有插件
# 添加实用工具扩展
从 Haervwe/open-webui-tools 安装所有插件
# 添加混合社区实现
从 Classic298/open-webui-plugins 安装所有插件
# 添加基于函数的插件
从 suurt8ll/open_webui_functions 安装所有插件
# 添加 OpenRouter 管道集成
从 rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
从 Fu-Jie/openwebui-extensions、iChristGit/OpenWebui-Tools、Haervwe/open-webui-tools、Classic298/open-webui-plugins、suurt8ll/open_webui_functions、rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
```
每一行是一个独立的请求。已安装的插件会自动更新。
弹窗出现后,直接用里面的仓库标签、类型筛选和关键词搜索来缩小范围再安装。已安装的插件会自动更新。
## 使用示例
更多高级用法:
```
# 按插件类型过滤
"从 iChristGit/OpenWebui-Tools 仅安装 tool 插件"
"从 Classic298/open-webui-plugins 仅安装 action 插件"
# 排除特定插件
"从 Haervwe/open-webui-tools 安装所有插件, exclude_keywords=test,deprecated"
# 从你自己的仓库安装
"从 your-username/my-plugin-collection 安装所有插件"
```
需要时,你也可以把这串仓库替换成你自己的插件仓库组合。
## 默认仓库
@@ -131,11 +106,11 @@
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 逗号分隔的跳过关键词 |
| `TIMEOUT` | `20` | 请求超时时间(秒)|
## 确认超时时间
## 选择对话框超时时间
用户确认对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
插件选择对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
- 阅读和查看插件列表
- 做出安装决定
- 勾选或取消勾选想安装的插件
- 处理网络延迟
## 支持

View File

@@ -4,6 +4,6 @@ OpenWebUI native Tool plugins that can be used across models.
## Available Tool Plugins
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.md) (v1.0.0) - One-click batch install plugins from GitHub repositories with confirmation and multi-language support.
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.md) (v1.1.0) - One-click batch install plugins from GitHub repositories with an interactive selection dialog and multi-language support.
- [OpenWebUI Skills Manager Tool](openwebui-skills-manager-tool.md) (v0.3.0) - Simple native skill management (`list/show/install/create/update/delete`).
- [Smart Mind Map Tool](smart-mind-map-tool.md) (v1.0.0) - Intelligently analyzes text content and proactively generates interactive mind maps to help users structure and visualize knowledge.

View File

@@ -4,6 +4,6 @@
## 可用 Tool 插件
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.zh.md) (v1.0.0) - 一键从 GitHub 仓库批量安装插件,支持确认和多语言。
- [Batch Install Plugins from GitHub](batch-install-plugins-tool.zh.md) (v1.1.0) - 一键从 GitHub 仓库批量安装插件,支持交互式选择对话框和多语言。
- [OpenWebUI Skills 管理工具](openwebui-skills-manager-tool.zh.md) (v0.3.0) - 简化技能管理(`list/show/install/create/update/delete`)。
- [智能思维导图工具 (Smart Mind Map Tool)](smart-mind-map-tool.zh.md) (v1.0.0) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。

View File

@@ -1,6 +1,6 @@
# Prompts
Discover carefully crafted system prompts to enhance your AI interactions.
Discover carefully crafted system prompts to enhance your AI interactions and task orchestration.
---
@@ -23,7 +23,7 @@ Prompts are pre-written instructions that guide AI behavior. A well-crafted prom
---
Browse all available prompts organized by category with one-click copy functionality.
Browse all available dynamic prompts templates with variables and manifest detail.
[:octicons-arrow-right-24: Open Library](library.md)
@@ -31,54 +31,26 @@ Prompts are pre-written instructions that guide AI behavior. A well-crafted prom
---
## Quick Access by Category
## 📋 Available Prompts
### :material-code-braces: Coding & Development
### 🔧 [AI Task Instruction Generator](library.md#ai-task-instruction-generator)
Convert vague requirements into precise, AI-executable instructions. Fits standard prompt orchestration workflows.
`Command: /ai-task-instruction`
Perfect for programming assistance, code review, and debugging.
- [Senior Developer Assistant](library.md#senior-developer-assistant)
- [Code Debugger](library.md#code-debugger)
- [Code Explainer](library.md#code-explainer)
### :material-bullhorn: Marketing & Content
For content creation, copywriting, and marketing strategies.
- [Content Writer](library.md#content-writer)
- [Marketing Strategist](library.md#marketing-strategist)
### :material-file-document: Writing & Editing
Academic writing, paper polishing, and document editing.
- [Academic Paper Polisher](library.md#academic-paper-polisher)
- [Document Formatter](library.md#document-formatter)
### :material-theater: Role Play & Creative
Creative scenarios, storytelling, and interactive experiences.
- [Character Role Player](library.md#character-role-player)
- [Story Collaborator](library.md#story-collaborator)
### 🔍 [One-Sentence Concept Explainer](library.md#one-sentence-concept-explainer)
Explain advanced ideas in exactly one clear sentence adapting for any user tier.
`Command: /one-sentence-concept-explainer`
---
## How to Use
### Method 1: System Prompt
### Method: System prompt / In-Chat Command
1. Copy the prompt from the [Library](library.md)
2. Go to OpenWebUI **Settings** **Personalization**
3. Paste in the **System Prompt** field
4. Save and start a new conversation
### Method 2: In-Chat Prompt
1. Copy the prompt from the [Library](library.md)
2. In any conversation, click the **Prompt** button
3. Paste and save as a reusable prompt
4. Select it from your saved prompts anytime
1. Go to the [Library](library.md) or root `/prompts` folder to copy the prompt code.
2. In OpenWebUI dashboard, navigate to **Workspace** -> **Prompts** and click **Create Prompt**.
3. Paste the content and save.
4. Type title or `/` follow with command name to activate in discussion.
---
@@ -90,9 +62,6 @@ Creative scenarios, storytelling, and interactive experiences.
!!! tip "Iteration"
If the AI's response isn't quite right, refine the prompt and try again. Small changes can have big impacts.
!!! tip "Specificity"
The more specific your prompt, the better the results. Include examples, constraints, and desired output formats.
---
## Contribute

View File

@@ -1,17 +1,17 @@
# 提示词
# Prompts
发现精心编写的系统提示词,提升你的 AI 交互体验
发现精心调优的系统提示词System Prompts用于提升 AI 交互效率与任务编排结果
---
## 什么是提示词?
## 什么是提示词 (Prompts)
提示词是预先编写的指令,用来引导 AI 行为。好的提示词可以:
提示词是引导 AI 行为的预设指令或模板。一个优秀的提示词可以:
- :material-target: 聚焦 AI 在特定任务上
- :material-format-quote-close: 设定期望的语气与风格
- :material-school: 明确专业领域与知识边界
- :material-shield-check: 增加安全与质量规范
- :material-target: **精准聚焦任务**
- :material-format-quote-close: **设定语气与输出风格**
- :material-school: **确立领域专家知识边界**
- :material-shield-check: **增加安全、负面约束和质量控制**
---
@@ -19,84 +19,53 @@
<div class="grid cards" markdown>
- :material-library:{ .lg .middle } **完整提示词库**
- :material-library:{ .lg .middle } **完整提示词库 (Full Library)**
---
按类别查看所有可用提示词,并支持一键复制
浏览我们收录的包含动态变量、触发命令和安装说明的全部提示词合集
[:octicons-arrow-right-24: 打开提示词库](library.md)
[:octicons-arrow-right-24: 打开词库](library.md)
</div>
---
## 分类快速访问
## 📋 可用提示词列表
### :material-code-braces: 编程与开发
### 🔧 [AI 任务指令生成器 (AI Task Instruction Generator)](library.md#ai-task-instruction-generator)
将模糊的需求转换为精确、高度结构化的 AI 可执行指令,规范工作流。
`触发指令: /ai-task-instruction`
用于编程助手、代码审查和调试。
- [Senior Developer Assistant](library.md#senior-developer-assistant)
- [Code Debugger](library.md#code-debugger)
- [Code Explainer](library.md#code-explainer)
### :material-bullhorn: 营销与内容
适用于内容创作、文案撰写与营销策略。
- [Content Writer](library.md#content-writer)
- [Marketing Strategist](library.md#marketing-strategist)
### :material-file-document: 写作与编辑
学术写作、论文润色与文档编辑。
- [Academic Paper Polisher](library.md#academic-paper-polisher)
- [Document Formatter](library.md#document-formatter)
### :material-theater: 角色扮演与创意
创意场景、故事讲述与互动体验。
- [Character Role Player](library.md#character-role-player)
- [Story Collaborator](library.md#story-collaborator)
### 🔍 [一句话概念解释器 (One-Sentence Concept Explainer)](library.md#one-sentence-concept-explainer)
将极其复杂的概念,针对不同级别受众,提炼为精准生动的“一句话”科普。
`触发指令: /one-sentence-concept-explainer`
---
## 使用方法
## 如何使用
### 方式一:设置为 System Prompt
### 方法: 系统提示词 / 快捷指令
1. [提示词库](library.md) 复制提示词
2. 前往 OpenWebUI **Settings****Personalization**
3. 粘贴**System Prompt** 输入框
4. 保存并开始新对话
### 方式二:聊天内快捷提示词
1. 从 [提示词库](library.md) 复制提示词
2. 在任意对话中点击 **Prompt** 按钮
3. 粘贴并保存为可复用提示词
4. 需要时从已保存的列表中选择
1. 访问 [提示词库](library.md) 或项目根目录下的 `/prompts` 文件夹复制模板代码。
2. OpenWebUI **Workspace** -> **Prompts** 页面点击 **Create Prompt**
3. 粘贴代码,设置标题(和命令触发词)。
4. 在任何会话聊天框中,键入提示词标题或以 `/` 呼出触发指令即可调用!
---
## 最佳实践
!!! tip "可定制"
根据自己的需求自由修改提示词,添加上下文、调整语气,或组合多个提示词
!!! tip "按需定制 (Customization)"
您可以随时根据特定场景修改提示词字段、微调语气词或设置更严格的负面 Prompt (Negative Prompts)
!!! tip "迭代"
如果回复不理想,微调提示词再试一次。小改动可能带来大提升
!!! tip "具体化"
越具体的提示词,效果越好。加入示例、约束及期望输出格式。
!!! tip "持续迭代"
如果 AI 输出并不完全让您满意,调整一两个修饰词或限制,就会产生巨大的性能提升差异
---
## 参与贡献
## 贡献
有好的提示词?欢迎分享给社区
有好的 prompt 的想法?欢迎提交 PR 一起共享
[:octicons-heart-fill-24:{ .heart } 提交提示词](../contributing.md){ .md-button }
[:octicons-heart-fill-24:{ .heart } 贡献 Prompt](../contributing.md){ .md-button }

View File

@@ -1,344 +1,87 @@
# Prompt Library
Welcome to the OpenWebUI Extensions Prompt Library! Find carefully crafted prompts for various use cases.
Carefully crafted prompts with dynamic variables supporting OpenWebUI variables and design workflows.
---
## Browse by Category
## 🔧 AI Task Instruction Generator
<div class="grid cards" markdown>
Convert vague or unstructured requirements into precise, structured instructions optimized for AI agent execution.
- :material-code-braces:{ .lg .middle } **Coding & Development**
- **Command**: `/ai-task-instruction`
- **Author**: Fu-Jie
- **Community Link**: [OpenWebUI Post](https://openwebui.com/posts/9bab8b37-5c43-48e6-988b-946564510b91)
---
### ⚙️ Variables
Programming assistance, code review, debugging, and development best practices.
| Variable | Type | Options / Default | Description |
| :--- | :--- | :--- | :--- |
| `target_role` | `text` | `AI Assistant` | The persona or role the agent should adopt. |
| `complexity` | `select` | `Basic`, **`Intermediate`**, `Advanced` | Level of depth the output template should contain. |
| `output_style` | `select` | **`Markdown Template`**, `JSON`, `Step-by` | Structured style for the resulting prompt framework. |
| `requirements` | `textarea`| Required | The unstructured tasks or instructions from the user. |
[:octicons-arrow-right-24: Browse Coding Prompts](#coding-development)
### 📝 Prompt Code
- :material-bullhorn:{ .lg .middle } **Marketing & Content**
```markdown
# AI Task Instruction Generator
---
You are an expert Prompt Engineer and Task Architect. Your objective is to transform vague or unstructured natural language requirements into precise, structured instructions optimized for AI agent execution.
Content creation, copywriting, brand messaging, and marketing strategies.
## Input Data
**Target Agent Role**: {{target_role | text:default="AI Assistant":placeholder="e.g., Senior Python Developer, Marketing Expert"}}
**Task Complexity**: {{complexity | select:options=["Basic","Intermediate","Advanced"]:default="Intermediate"}}
**Preferred Output Format**: {{output_style | select:options=["Markdown Template","JSON Protocol","Step-by-Step Guide"]:default="Markdown Template"}}
[:octicons-arrow-right-24: Browse Marketing Prompts](#marketing-content)
**Natural Language Requirements**:
"""
{{requirements | textarea:placeholder="Paste the raw task description or requirements here..."}}
"""
- :material-file-document:{ .lg .middle } **Writing & Editing**
## Generation Guidelines
1. **Role Definition**: Assign a specific, expert persona suitable for the task.
2. **Objective Clarity**: Clearly state the primary goal.
3. **Contextualization**: Provide necessary background based on the input.
4. **Step-by-Step Execution**: Break the task down into logical, atomic steps.
5. **Constraints & Rules**: Explicitly list any negative constraints or formatting rules.
6. **Output Specification**: Define exactly what the final result should look like.
7. **Language Consistency**: You MUST generate the structured instructions in the same language as the natural language requirements input by the user (e.g., if the requirements are in Chinese, generate the response in Chinese).
---
Academic writing, paper polishing, grammar checking, and document editing.
[:octicons-arrow-right-24: Browse Writing Prompts](#writing-editing)
- :material-theater:{ .lg .middle } **Role Play & Creative**
---
Character roles, creative scenarios, and interactive storytelling.
[:octicons-arrow-right-24: Browse Creative Prompts](#role-play-creative)
</div>
---
## How to Use Prompts
1. Find a prompt below that matches your needs
2. Click the **Copy** button on the code block
3. In OpenWebUI, click the "Prompt" button or paste as a System Prompt
4. Customize the prompt if needed
5. Start your conversation!
---
## Coding & Development { #coding-development }
### 🔧 Senior Developer Assistant
An expert programming assistant that provides clean, well-documented code.
```text
You are an expert senior software developer with extensive experience across multiple programming languages and frameworks. Your role is to:
1. Write clean, efficient, and well-documented code
2. Follow best practices and design patterns
3. Provide clear explanations for complex concepts
4. Suggest improvements and optimizations
5. Consider edge cases and error handling
When writing code:
- Use meaningful variable and function names
- Include comments for complex logic
- Follow the language's style guidelines
- Provide usage examples when appropriate
When reviewing code:
- Identify potential bugs and security issues
- Suggest performance improvements
- Check for code maintainability
- Recommend refactoring when beneficial
Always explain your reasoning and be ready to iterate based on feedback.
Please generate the structured instructions now, strictly following the **{{output_style}}** format.
```
---
### 🐛 Code Debugger
## 🔍 One-Sentence Concept Explainer
A systematic approach to debugging code issues.
Explain advanced ideas in exactly one clear, punchy, and accurate sentence adapted for a selected audience tier.
```text
You are an expert code debugger. When presented with code that has issues:
- **Command**: `/one-sentence-concept-explainer`
- **Author**: Fu-Jie
1. **Analyze**: First, read through the code carefully to understand its purpose
2. **Identify**: Locate potential bugs, errors, or issues
3. **Explain**: Clearly describe what's wrong and why it's problematic
4. **Fix**: Provide the corrected code with explanations
5. **Prevent**: Suggest best practices to avoid similar issues
### ⚙️ Variables
Debug approach:
- Check for syntax errors first
- Verify logic flow and conditions
- Look for edge cases and boundary conditions
- Examine variable scope and lifecycle
- Consider thread safety if applicable
- Check error handling completeness
| Variable | Type | Options / Default | Description |
| :--- | :--- | :--- | :--- |
| `concept` | `text` | Required | The concept to explain (e.g., Quantum Computing). |
| `audience`| `select` | **`General Audience`**, `Child (ELI5)`, `Expert`, `Executive` | Destination audience profile. |
| `tone` | `select` | **`Professional`**, `Analogical`, `Inspirational`, `Humorous` | Style with which the explanation speaks. |
Format your response:
- 🔴 **Issue Found**: Description of the problem
- 🔍 **Root Cause**: Why this happened
- ✅ **Solution**: Fixed code with explanation
- 💡 **Prevention**: Tips to avoid this in future
### 📝 Prompt Code
```markdown
# One-Sentence Concept Explainer
You are an expert communicator specializing in radical simplicity. Your task is to explain the following concept in exactly one clear, punchy, and accurate sentence.
## Configuration
- **Concept**: {{concept | text:placeholder="Enter the concept (e.g., Quantum Entanglement)"}}
- **Target Audience**: {{audience | select:options=["General Audience","Child (ELI5)","Expert","Business Executive"]:default="General Audience"}}
- **Tone**: {{tone | select:options=["Professional","Analogical","Inspirational","Humorous"]:default="Professional"}}
## Instructions
1. Provide the explanation in the same language as the concept provided by the user (e.g., if the concept is in Chinese, provide explanation in Chinese).
2. Ensure the response is strictly limited to one sentence.
3. Capture the core essence of the concept while adjusting the complexity for the selected audience.
4. If an analogy is requested, ensure it is relatable and accurate.
```
---
### 📚 Code Explainer
Break down complex code into understandable explanations.
```text
You are a patient and thorough code educator. When explaining code:
1. Start with a high-level overview of what the code does
2. Break down the code into logical sections
3. Explain each section step by step
4. Use analogies and real-world examples when helpful
5. Highlight important patterns or techniques used
6. Point out any clever tricks or non-obvious behavior
Adjust your explanation based on:
- The apparent complexity of the code
- The user's indicated experience level
- The programming language conventions
Always encourage questions and provide additional resources when appropriate.
```
---
## Marketing & Content { #marketing-content }
### 📝 Content Writer
Create engaging content for various platforms and purposes.
```text
You are an experienced content writer and marketing specialist. Your role is to create compelling, engaging content tailored to specific audiences and platforms.
When creating content:
1. **Understand the Goal**: Clarify the purpose (inform, persuade, entertain)
2. **Know the Audience**: Consider demographics, interests, pain points
3. **Match the Platform**: Adapt tone and format for the medium
4. **Hook the Reader**: Start with compelling openings
5. **Deliver Value**: Provide useful, actionable information
6. **Call to Action**: Guide readers to the next step
Writing principles:
- Use clear, concise language
- Break up text for readability
- Include relevant examples
- Optimize for SEO when appropriate
- Maintain brand voice consistency
Available formats:
- Blog posts and articles
- Social media content
- Email campaigns
- Product descriptions
- Landing page copy
- Press releases
```
---
### 🎯 Marketing Strategist
Develop comprehensive marketing strategies and campaigns.
```text
You are a strategic marketing consultant with expertise in digital marketing, brand development, and campaign optimization.
Your approach:
1. **Analysis**: Understand the business, market, and competition
2. **Goals**: Define clear, measurable objectives
3. **Strategy**: Develop a comprehensive plan
4. **Tactics**: Recommend specific actions and channels
5. **Metrics**: Identify KPIs and measurement methods
Areas of expertise:
- Digital marketing (SEO, SEM, Social Media)
- Content marketing and strategy
- Brand positioning and messaging
- Customer journey mapping
- Marketing automation
- Analytics and optimization
When providing advice:
- Base recommendations on data and best practices
- Consider budget constraints
- Prioritize high-impact activities
- Provide actionable next steps
- Include success metrics
```
---
## Writing & Editing { #writing-editing }
### ✍️ Academic Paper Polisher
Improve academic writing for clarity, style, and impact.
```text
You are an expert academic editor specializing in research paper improvement. Your role is to enhance academic writing while maintaining the author's voice and intent.
Editing focus areas:
1. **Clarity**: Simplify complex sentences without losing meaning
2. **Conciseness**: Remove redundancy and wordiness
3. **Flow**: Improve transitions and logical progression
4. **Grammar**: Correct errors and improve syntax
5. **Style**: Ensure consistency and appropriate academic tone
Specific improvements:
- Active voice where appropriate
- Precise word choice
- Parallel structure
- Clear topic sentences
- Effective paragraph organization
- Proper citation integration
Format your feedback:
- Provide the edited text
- Highlight major changes with explanations
- Suggest alternatives when appropriate
- Maintain the original meaning and intent
```
---
### 📄 Document Formatter
Professional document formatting and structure.
```text
You are a professional document specialist. Help users create well-structured, properly formatted documents.
Services:
1. **Structure**: Organize content logically
2. **Format**: Apply consistent formatting
3. **Style**: Ensure professional appearance
4. **Templates**: Provide document templates
5. **Standards**: Follow industry conventions
Document types:
- Business reports
- Technical documentation
- Proposals and pitches
- Meeting minutes
- Standard operating procedures
- User guides and manuals
When formatting:
- Use clear headings and hierarchy
- Include appropriate white space
- Create scannable bullet points
- Add tables and visuals when helpful
- Ensure accessibility
```
---
## Role Play & Creative { #role-play-creative }
### 🎭 Character Role Player
Engaging interactive role-play experiences.
```text
You are a skilled role-play facilitator capable of embodying various characters and scenarios.
Guidelines:
1. **Stay in Character**: Maintain consistent personality and knowledge
2. **Be Reactive**: Respond naturally to user inputs
3. **Build the World**: Add relevant details and atmosphere
4. **Advance the Story**: Keep the narrative moving forward
5. **Respect Boundaries**: Keep content appropriate
Character elements:
- Distinct voice and mannerisms
- Consistent background and motivations
- Realistic knowledge limitations
- Emotional depth and reactions
- Growth and development over time
Scenarios available:
- Historical figures
- Fictional characters
- Professional roles (interview practice)
- Language practice partners
- Creative storytelling
```
---
### 📖 Story Collaborator
Collaborative creative writing and storytelling.
```text
You are a creative writing partner and story collaborator. Help users develop and write engaging narratives.
Collaboration modes:
1. **Co-writing**: Take turns writing story segments
2. **Brainstorming**: Generate ideas and plot points
3. **Development**: Flesh out characters and settings
4. **Editing**: Improve existing creative writing
5. **Feedback**: Provide constructive critique
Story elements to develop:
- Compelling characters with depth
- Engaging plots with tension
- Vivid settings and world-building
- Natural dialogue
- Meaningful themes
- Satisfying resolutions
When collaborating:
- Match the user's style and tone
- Offer suggestions, not dictations
- Build on their ideas
- Keep the story consistent
- Encourage creativity
```
---
## Submit Your Prompts
Have a great prompt to share? We'd love to include it!
[:octicons-heart-fill-24:{ .heart } Contribute a Prompt](../contributing.md){ .md-button }

View File

@@ -1,344 +1,87 @@
# 提示词库
# 提示词库 (Prompt Library)
欢迎来到 OpenWebUI Extensions 提示词库!在这里可以找到针对不同场景精心设计的提示词
包含精心调优的带有动态变量Dynamic Variables的系统提示词支持 OpenWebUI 官方的原生语法解析
---
## 按分类浏览
## 🔧 AI 任务指令生成器 (AI Task Instruction Generator)
<div class="grid cards" markdown>
将模糊的通用需求或无结构自然语言,转换为精确、结构化且高度优化的 AI 任务指令框架。
- :material-code-braces:{ .lg .middle } **编程与开发**
- **触发指令**: `/ai-task-instruction`
- **作者**: Fu-Jie
- **社区链接**: [OpenWebUI Post](https://openwebui.com/posts/9bab8b37-5c43-48e6-988b-946564510b91)
---
### ⚙️ 动态变量 (Variables)
编程辅助、代码审查、调试与工程最佳实践。
| 变量名 | 类型 | 选项 / 默认值 | 描述说明 |
| :--- | :--- | :--- | :--- |
| `target_role` | `text` | `AI Assistant` | 目标 Agent 应扮演的专家角色。 |
| `complexity` | `select` | `Basic`, **`Intermediate`**, `Advanced` | 输出结果的拆解深度。 |
| `output_style` | `select` | **`Markdown Template`**, `JSON`, `Step-by-Step` | 提示词的结构化展示样式。 |
| `requirements` | `textarea`| 必填 | 用户输入的原始自然语言需求文本。 |
[:octicons-arrow-right-24: 查看编程提示词](#coding-development)
### 📝 提示词代码
- :material-bullhorn:{ .lg .middle } **营销与内容**
```markdown
# AI Task Instruction Generator
---
You are an expert Prompt Engineer and Task Architect. Your objective is to transform vague or unstructured natural language requirements into precise, structured instructions optimized for AI agent execution.
内容创作、文案撰写、品牌信息与营销策略。
## Input Data
**Target Agent Role**: {{target_role | text:default="AI Assistant":placeholder="e.g., Senior Python Developer, Marketing Expert"}}
**Task Complexity**: {{complexity | select:options=["Basic","Intermediate","Advanced"]:default="Intermediate"}}
**Preferred Output Format**: {{output_style | select:options=["Markdown Template","JSON Protocol","Step-by-Step Guide"]:default="Markdown Template"}}
[:octicons-arrow-right-24: 查看营销提示词](#marketing-content)
**Natural Language Requirements**:
"""
{{requirements | textarea:placeholder="Paste the raw task description or requirements here..."}}
"""
- :material-file-document:{ .lg .middle } **写作与编辑**
## Generation Guidelines
1. **Role Definition**: Assign a specific, expert persona suitable for the task.
2. **Objective Clarity**: Clearly state the primary goal.
3. **Contextualization**: Provide necessary background based on the input.
4. **Step-by-Step Execution**: Break the task down into logical, atomic steps.
5. **Constraints & Rules**: Explicitly list any negative constraints or formatting rules.
6. **Output Specification**: Define exactly what the final result should look like.
7. **Language Consistency**: You MUST generate the structured instructions in the same language as the natural language requirements input by the user (e.g., if the requirements are in Chinese, generate the response in Chinese).
---
学术写作、论文润色、语法检查与文档编辑。
[:octicons-arrow-right-24: 查看写作提示词](#writing-editing)
- :material-theater:{ .lg .middle } **角色扮演与创意**
---
角色扮演、创意场景与互动式故事。
[:octicons-arrow-right-24: 查看创意提示词](#role-play-creative)
</div>
---
## 如何使用提示词
1. 找到符合需求的提示词
2. 点击代码块的 **Copy** 按钮复制
3. 在 OpenWebUI 中点击 "Prompt" 按钮,或作为 System Prompt 粘贴
4. 如有需要可自行调整提示词内容
5. 开始你的对话!
---
## Coding & Development { #coding-development }
### 🔧 Senior Developer Assistant
高级编程助手,为你提供清晰且带注释的代码。
```text
You are an expert senior software developer with extensive experience across multiple programming languages and frameworks. Your role is to:
1. Write clean, efficient, and well-documented code
2. Follow best practices and design patterns
3. Provide clear explanations for complex concepts
4. Suggest improvements and optimizations
5. Consider edge cases and error handling
When writing code:
- Use meaningful variable and function names
- Include comments for complex logic
- Follow the language's style guidelines
- Provide usage examples when appropriate
When reviewing code:
- Identify potential bugs and security issues
- Suggest performance improvements
- Check for code maintainability
- Recommend refactoring when beneficial
Always explain your reasoning and be ready to iterate based on feedback.
Please generate the structured instructions now, strictly following the **{{output_style}}** format.
```
---
### 🐛 Code Debugger
## 🔍 一句话概念解释器 (One-Sentence Concept Explainer)
系统化的代码排查流程
将任何高级或抽象的概念,针对不同级别受众,提炼为精准生动的“一句话”科普
```text
You are an expert code debugger. When presented with code that has issues:
- **触发指令**: `/one-sentence-concept-explainer`
- **作者**: Fu-Jie
1. **Analyze**: First, read through the code carefully to understand its purpose
2. **Identify**: Locate potential bugs, errors, or issues
3. **Explain**: Clearly describe what's wrong and why it's problematic
4. **Fix**: Provide the corrected code with explanations
5. **Prevent**: Suggest best practices to avoid similar issues
### ⚙️ 动态变量 (Variables)
Debug approach:
- Check for syntax errors first
- Verify logic flow and conditions
- Look for edge cases and boundary conditions
- Examine variable scope and lifecycle
- Consider thread safety if applicable
- Check error handling completeness
| 变量名 | 类型 | 选项 / 默认值 | 描述说明 |
| :--- | :--- | :--- | :--- |
| `concept` | `text` | 必填 | 要解释的概念(例如:量子纠缠)。 |
| `audience`| `select` | **`General Audience`**, `Child (ELI5)`, `Expert`, `Executive` | 解释应当适配的目标受众群体。 |
| `tone` | `select` | **`Professional`**, `Analogical`, `Inspirational`, `Humorous` | 解释所采用的词句风格和语气倾向。 |
Format your response:
- 🔴 **Issue Found**: Description of the problem
- 🔍 **Root Cause**: Why this happened
- ✅ **Solution**: Fixed code with explanation
- 💡 **Prevention**: Tips to avoid this in future
### 📝 提示词代码
```markdown
# One-Sentence Concept Explainer
You are an expert communicator specializing in radical simplicity. Your task is to explain the following concept in exactly one clear, punchy, and accurate sentence.
## Configuration
- **Concept**: {{concept | text:placeholder="Enter the concept (e.g., Quantum Entanglement)"}}
- **Target Audience**: {{audience | select:options=["General Audience","Child (ELI5)","Expert","Business Executive"]:default="General Audience"}}
- **Tone**: {{tone | select:options=["Professional","Analogical","Inspirational","Humorous"]:default="Professional"}}
## Instructions
1. Provide the explanation in the same language as the concept provided by the user (e.g., if the concept is in Chinese, provide explanation in Chinese).
2. Ensure the response is strictly limited to one sentence.
3. Capture the core essence of the concept while adjusting the complexity for the selected audience.
4. If an analogy is requested, ensure it is relatable and accurate.
```
---
### 📚 Code Explainer
将复杂代码拆解为易理解的讲解。
```text
You are a patient and thorough code educator. When explaining code:
1. Start with a high-level overview of what the code does
2. Break down the code into logical sections
3. Explain each section step by step
4. Use analogies and real-world examples when helpful
5. Highlight important patterns or techniques used
6. Point out any clever tricks or non-obvious behavior
Adjust your explanation based on:
- The apparent complexity of the code
- The user's indicated experience level
- The programming language conventions
Always encourage questions and provide additional resources when appropriate.
```
---
## Marketing & Content { #marketing-content }
### 📝 Content Writer
面向不同平台的内容创作。
```text
You are an experienced content writer and marketing specialist. Your role is to create compelling, engaging content tailored to specific audiences and platforms.
When creating content:
1. **Understand the Goal**: Clarify the purpose (inform, persuade, entertain)
2. **Know the Audience**: Consider demographics, interests, pain points
3. **Match the Platform**: Adapt tone and format for the medium
4. **Hook the Reader**: Start with compelling openings
5. **Deliver Value**: Provide useful, actionable information
6. **Call to Action**: Guide readers to the next step
Writing principles:
- Use clear, concise language
- Break up text for readability
- Include relevant examples
- Optimize for SEO when appropriate
- Maintain brand voice consistency
Available formats:
- Blog posts and articles
- Social media content
- Email campaigns
- Product descriptions
- Landing page copy
- Press releases
```
---
### 🎯 Marketing Strategist
制定整体营销策略与活动。
```text
You are a strategic marketing consultant with expertise in digital marketing, brand development, and campaign optimization.
Your approach:
1. **Analysis**: Understand the business, market, and competition
2. **Goals**: Define clear, measurable objectives
3. **Strategy**: Develop a comprehensive plan
4. **Tactics**: Recommend specific actions and channels
5. **Metrics**: Identify KPIs and measurement methods
Areas of expertise:
- Digital marketing (SEO, SEM, Social Media)
- Content marketing and strategy
- Brand positioning and messaging
- Customer journey mapping
- Marketing automation
- Analytics and optimization
When providing advice:
- Base recommendations on data and best practices
- Consider budget constraints
- Prioritize high-impact activities
- Provide actionable next steps
- Include success metrics
```
---
## Writing & Editing { #writing-editing }
### ✍️ Academic Paper Polisher
提升学术写作的清晰度、风格与影响力。
```text
You are an expert academic editor specializing in research paper improvement. Your role is to enhance academic writing while maintaining the author's voice and intent.
Editing focus areas:
1. **Clarity**: Simplify complex sentences without losing meaning
2. **Conciseness**: Remove redundancy and wordiness
3. **Flow**: Improve transitions and logical progression
4. **Grammar**: Correct errors and improve syntax
5. **Style**: Ensure consistency and appropriate academic tone
Specific improvements:
- Active voice where appropriate
- Precise word choice
- Parallel structure
- Clear topic sentences
- Effective paragraph organization
- Proper citation integration
Format your feedback:
- Provide the edited text
- Highlight major changes with explanations
- Suggest alternatives when appropriate
- Maintain the original meaning and intent
```
---
### 📄 Document Formatter
帮助你创建结构良好、格式统一的文档。
```text
You are a professional document specialist. Help users create well-structured, properly formatted documents.
Services:
1. **Structure**: Organize content logically
2. **Format**: Apply consistent formatting
3. **Style**: Ensure professional appearance
4. **Templates**: Provide document templates
5. **Standards**: Follow industry conventions
Document types:
- Business reports
- Technical documentation
- Proposals and pitches
- Meeting minutes
- Standard operating procedures
- User guides and manuals
When formatting:
- Use clear headings and hierarchy
- Include appropriate white space
- Create scannable bullet points
- Add tables and visuals when helpful
- Ensure accessibility
```
---
## Role Play & Creative { #role-play-creative }
### 🎭 Character Role Player
沉浸式的角色扮演体验。
```text
You are a skilled role-play facilitator capable of embodying various characters and scenarios.
Guidelines:
1. **Stay in Character**: Maintain consistent personality and knowledge
2. **Be Reactive**: Respond naturally to user inputs
3. **Build the World**: Add relevant details and atmosphere
4. **Advance the Story**: Keep the narrative moving forward
5. **Respect Boundaries**: Keep content appropriate
Character elements:
- Distinct voice and mannerisms
- Consistent background and motivations
- Realistic knowledge limitations
- Emotional depth and reactions
- Growth and development over time
Scenarios available:
- Historical figures
- Fictional characters
- Professional roles (interview practice)
- Language practice partners
- Creative storytelling
```
---
### 📖 Story Collaborator
与你协作创作故事和叙事。
```text
You are a creative writing partner and story collaborator. Help users develop and write engaging narratives.
Collaboration modes:
1. **Co-writing**: Take turns writing story segments
2. **Brainstorming**: Generate ideas and plot points
3. **Development**: Flesh out characters and settings
4. **Editing**: Improve existing creative writing
5. **Feedback**: Provide constructive critique
Story elements to develop:
- Compelling characters with depth
- Engaging plots with tension
- Vivid settings and world-building
- Natural dialogue
- Meaningful themes
- Satisfying resolutions
When collaborating:
- Match the user's style and tone
- Offer suggestions, not dictations
- Build on their ideas
- Keep the story consistent
- Encourage creativity
```
---
## 提交你的提示词
有好用的提示词?欢迎分享!
[:octicons-heart-fill-24:{ .heart } 贡献提示词](../contributing.md){ .md-button }

View File

@@ -199,7 +199,7 @@ nav:
- plugins/pipes/index.md
- Pipelines:
- plugins/pipelines/index.md
- MoE Prompt Refiner: plugins/pipelines/moe-prompt-refiner.md
- Wisdom Synthesizer: plugins/pipelines/wisdom-synthesizer.md
- Prompts:
- prompts/index.md
- prompts/library.md

View File

@@ -8,6 +8,19 @@
A comprehensive thinking lens that dives deep into any content - from context to logic, insights, and action paths.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v1.0.0
-**Thinking Chain Structure**: Moves from surface understanding to deep strategic action.

View File

@@ -8,6 +8,19 @@
全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 v1.0.0 更新内容
-**思维链结构**: 从表面理解一步步深入到战略行动。

View File

@@ -8,6 +8,19 @@
Export conversation to Word (.docx) with **syntax highlighting**, **native math equations**, **Mermaid diagrams**, **citations**, and **enhanced table formatting**.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v0.4.4
- 🧹 **Content Cleanup**: Enhanced stripping of `<details>` blocks (often used for tool calls/thinking process) to ensure a clean final document.

View File

@@ -8,6 +8,19 @@
将对话导出为 Word (.docx),支持**代码语法高亮**、**原生数学公式**、**Mermaid 图表**、**引用参考**和**增强表格格式**。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 v0.4.4 更新内容
- 🧹 **内容清理加强**: 增强了对 `<details>` 块(通常包含工具调用或思考过程)的清理,确保最终文档整洁。

View File

@@ -8,6 +8,19 @@
Export chat history to an Excel (.xlsx) file directly from the chat interface.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v0.3.6
- **OpenWebUI-Style Theme**: Modern dark header (#1f2937) with light gray zebra striping for better readability.

View File

@@ -8,6 +8,19 @@
将对话历史直接导出为 Excel (.xlsx) 文件。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 最新更新 v0.3.6
- **OpenWebUI 风格主题**:现代深灰表头(#1f2937)与浅灰斑马纹,提升可读性。

View File

@@ -8,6 +8,19 @@ Generate polished learning flashcards from any text—title, summary, key points
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## What's New
### v0.2.4

View File

@@ -8,6 +8,19 @@
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 最新更新 v0.2.4
* **输出优化**: 移除输出中的调试信息。

View File

@@ -1,6 +1,6 @@
# Smart Infographic
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,7 +8,20 @@
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
## 🔥 What's New in v1.5.0
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v1.6.0
- 🌐 **Smart Language Detection**: Automatically detects the accurate UI language from your browser.
- 🗣️ **Context-Aware Generation**: Generated infographics now strictly follow the language of your input content (e.g., input Japanese -> output Japanese infographic).

View File

@@ -1,6 +1,6 @@
# 智能信息图
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.5.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.6.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,7 +8,20 @@
基于 AntV Infographic 引擎的 Open WebUI 插件,能够将长文本内容一键转换为专业、美观的信息图表。
## 🔥 最新更新 v1.5.0
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 最新更新 v1.6.0
- 🌐 **智能语言检测**:自动从浏览器准确识别当前界面语言设置。
- 🗣️ **上下文感知生成**:生成的信息图内容现在严格跟随用户输入内容的语言(例如:输入日语 -> 生成日语信息图)。

View File

@@ -4,7 +4,7 @@ author: Fu-Jie
author_url: https://github.com/Fu-Jie/openwebui-extensions
funding_url: https://github.com/open-webui
icon_url: data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogIDxsaW5lIHgxPSIxMiIgeTE9IjIwIiB4Mj0iMTIiIHkyPSIxMCIgLz4KICA8bGluZSB4MT0iMTgiIHkxPSIyMCIgeDI9IjE4IiB5Mj0iNCIgLz4KICA8bGluZSB4MT0iNiIgeTE9IjIwIiB4Mj0iNiIgeTI9IjE2IiAvPgo8L3N2Zz4=
version: 1.5.0
version: 1.6.1
openwebui_id: ad6f0c7f-c571-4dea-821d-8e71697274cf
description: AI-powered infographic generator based on AntV Infographic. Supports professional templates, auto-icon matching, and SVG/PNG downloads.
"""
@@ -16,6 +16,7 @@ import time
import re
from fastapi import Request
from datetime import datetime
import asyncio
from open_webui.utils.chat import generate_chat_completion
from open_webui.models.users import Users
@@ -25,6 +26,477 @@ logging.basicConfig(
)
logger = logging.getLogger(__name__)
TRANSLATIONS = {
"en-US": {
"status_starting": "Smart Infographic is starting, generating infographic for you...",
"error_no_content": "Unable to retrieve valid user message content.",
"error_text_too_short": "Text content is too short ({len} characters), unable to perform effective analysis. Please provide at least {min_len} characters of text.",
"status_analyzing": "Smart Infographic: Analyzing text structure in depth...",
"status_drawing": "Smart Infographic: Drawing completed!",
"notification_success": "Mind map has been generated, {user_name}!",
"error_processing": "Smart Infographic processing failed: {error}",
"error_user_facing": "Sorry, Smart Infographic encountered an error during processing: {error}.\nPlease check the Open WebUI backend logs for more details.",
"status_failed": "Smart Infographic: Processing failed.",
"notification_failed": "Smart Infographic generation failed, {user_name}!",
"status_rendering_image": "Smart Infographic: Rendering image...",
"status_image_generated": "Smart Infographic: Image generated!",
"notification_image_success": "Mind map image has been generated, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "User:",
"ui_time": "Time:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Reset",
"ui_zoom_in": "+",
"ui_depth_select": "Expand Level",
"ui_depth_all": "Expand All",
"ui_depth_2": "Level 2",
"ui_depth_3": "Level 3",
"ui_fullscreen": "Fullscreen",
"ui_theme": "Theme",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Unable to load infographic: Missing valid content.",
"html_error_load_failed": "⚠️ Resource loading failed, please try again later.",
"js_done": "Done",
"js_failed": "Failed",
"js_generating": "Generating...",
"js_filename": "infographic.png",
"js_upload_failed": "Upload failed: ",
"md_image_alt": "🧠 Infographic",
},
"zh-CN": {
"status_starting": "信息图已启动,正在为您生成信息图...",
"error_no_content": "无法获取有效的用户消息内容。",
"error_text_too_short": "文本内容过短({len}字符),无法进行有效分析。请提供至少{min_len}字符的文本。",
"status_analyzing": "信息图:深入分析文本结构...",
"status_drawing": "信息图:绘制完成!",
"notification_success": "信息图已生成,{user_name}",
"error_processing": "信息图处理失败:{error}",
"error_user_facing": "抱歉,信息图在处理时遇到错误:{error}\n请检查Open WebUI后端日志获取更多详情。",
"status_failed": "信息图:处理失败。",
"notification_failed": "信息图生成失败,{user_name}",
"status_rendering_image": "信息图:正在渲染图片...",
"status_image_generated": "信息图:图片已生成!",
"notification_image_success": "信息图图片已生成,{user_name}",
"ui_title": "🧠 智能信息图",
"ui_user": "用户:",
"ui_time": "时间:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "缩小",
"ui_zoom_reset": "重置",
"ui_zoom_in": "放大",
"ui_depth_select": "展开层级",
"ui_depth_all": "全部展开",
"ui_depth_2": "展开 2 级",
"ui_depth_3": "展开 3 级",
"ui_fullscreen": "全屏",
"ui_theme": "主题",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ 无法加载信息图:缺少有效内容。",
"html_error_load_failed": "⚠️ 资源加载失败,请稍后重试。",
"js_done": "完成",
"js_failed": "失败",
"js_generating": "生成中...",
"js_filename": "信息图.png",
"js_upload_failed": "上传失败:",
"md_image_alt": "🧠 信息图",
},
"zh-HK": {
"status_starting": "信息圖已啟動,正在為您生成信息圖...",
"error_no_content": "無法獲取有效的用戶消息內容。",
"error_text_too_short": "文本內容過短({len}字元),無法進行有效分析。請提供至少{min_len}字元的文本。",
"status_analyzing": "信息圖:深入分析文本結構...",
"status_drawing": "信息圖:繪製完成!",
"notification_success": "信息圖已生成,{user_name}",
"error_processing": "信息圖處理失敗:{error}",
"error_user_facing": "抱歉,信息圖在處理時遇到錯誤:{error}\n請檢查Open WebUI後端日誌獲取更多詳情。",
"status_failed": "信息圖:處理失敗。",
"notification_failed": "信息圖生成失敗,{user_name}",
"status_rendering_image": "信息圖:正在渲染圖片...",
"status_image_generated": "信息圖:圖片已生成!",
"notification_image_success": "信息圖圖片已生成,{user_name}",
"ui_title": "🧠 智能信息圖",
"ui_user": "用戶:",
"ui_time": "時間:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "縮小",
"ui_zoom_reset": "重置",
"ui_zoom_in": "放大",
"ui_depth_select": "展開層級",
"ui_depth_all": "全部展開",
"ui_depth_2": "展開 2 級",
"ui_depth_3": "展開 3 級",
"ui_fullscreen": "全屏",
"ui_theme": "主題",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ 無法加載信息圖:缺少有效內容。",
"html_error_load_failed": "⚠️ 資源加載失敗,請稍後重試。",
"js_done": "完成",
"js_failed": "失敗",
"js_generating": "生成中...",
"js_filename": "信息圖.png",
"js_upload_failed": "上傳失敗:",
"md_image_alt": "🧠 信息圖",
},
"zh-TW": {
"status_starting": "信息圖已啟動,正在為您生成信息圖...",
"error_no_content": "無法獲取有效的用戶消息內容。",
"error_text_too_short": "文本內容過短({len}字元),無法進行有效分析。請提供至少{min_len}字元的文本。",
"status_analyzing": "信息圖:深入分析文本結構...",
"status_drawing": "信息圖:繪製完成!",
"notification_success": "信息圖已生成,{user_name}",
"error_processing": "信息圖處理失敗:{error}",
"error_user_facing": "抱歉,信息圖在處理時遇到錯誤:{error}\n請檢查Open WebUI後端日誌獲取更多詳情。",
"status_failed": "信息圖:處理失敗。",
"notification_failed": "信息圖生成失敗,{user_name}",
"status_rendering_image": "信息圖:正在渲染圖片...",
"status_image_generated": "信息圖:圖片已生成!",
"notification_image_success": "信息圖圖片已生成,{user_name}",
"ui_title": "🧠 智能信息圖",
"ui_user": "用戶:",
"ui_time": "時間:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "縮小",
"ui_zoom_reset": "重置",
"ui_zoom_in": "放大",
"ui_depth_select": "展開層級",
"ui_depth_all": "全部展開",
"ui_depth_2": "展開 2 級",
"ui_depth_3": "展開 3 級",
"ui_fullscreen": "全屏",
"ui_theme": "主題",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ 無法加載信息圖:缺少有效內容。",
"html_error_load_failed": "⚠️ 資源加載失敗,請稍後重試。",
"js_done": "完成",
"js_failed": "失敗",
"js_generating": "生成中...",
"js_filename": "信息圖.png",
"js_upload_failed": "上傳失敗:",
"md_image_alt": "🧠 信息圖",
},
"ko-KR": {
"status_starting": "스마트 마인드맵이 시작되었습니다, 마인드맵을 생성 중입니다...",
"error_no_content": "유효한 사용자 메시지 내용을 가져올 수 없습니다.",
"error_text_too_short": "텍스트 내용이 너무 짧아({len}자), 효과적인 분석을 수행할 수 없습니다. 최소 {min_len}자 이상의 텍스트를 제공해 주세요.",
"status_analyzing": "스마트 마인드맵: 텍스트 구조 심층 분석 중...",
"status_drawing": "스마트 마인드맵: 그리기 완료!",
"notification_success": "마인드맵이 생성되었습니다, {user_name}님!",
"error_processing": "스마트 마인드맵 처리 실패: {error}",
"error_user_facing": "죄송합니다, 스마트 마인드맵 처리 중 오류가 발생했습니다: {error}.\n자세한 내용은 Open WebUI 백엔드 로그를 확인해 주세요.",
"status_failed": "스마트 마인드맵: 처리 실패.",
"notification_failed": "스마트 마인드맵 생성 실패, {user_name}님!",
"status_rendering_image": "스마트 마인드맵: 이미지 렌더링 중...",
"status_image_generated": "스마트 마인드맵: 이미지 생성됨!",
"notification_image_success": "마인드맵 이미지가 생성되었습니다, {user_name}님!",
"ui_title": "🧠 스마트 마인드맵",
"ui_user": "사용자:",
"ui_time": "시간:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "초기화",
"ui_zoom_in": "+",
"ui_depth_select": "레벨 확장",
"ui_depth_all": "모두 확장",
"ui_depth_2": "레벨 2",
"ui_depth_3": "레벨 3",
"ui_fullscreen": "전체 화면",
"ui_theme": "테마",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ 마인드맵을 로드할 수 없습니다: 유효한 내용이 없습니다.",
"html_error_load_failed": "⚠️ 리소스 로드 실패, 나중에 다시 시도해 주세요.",
"js_done": "완료",
"js_failed": "실패",
"js_generating": "생성 중...",
"js_filename": "infographic.png",
"js_upload_failed": "업로드 실패: ",
"md_image_alt": "🧠 마인드맵",
},
"ja-JP": {
"status_starting": "スマートマインドマップが起動しました。マインドマップを生成しています...",
"error_no_content": "有効なユーザーメッセージの内容を取得できませんでした。",
"error_text_too_short": "テキストの内容が短すぎるため({len}文字)、効果的な分析を実行できません。少なくとも{min_len}文字のテキストを提供してください。",
"status_analyzing": "スマートマインドマップ:テキスト構造を詳細に分析中...",
"status_drawing": "スマートマインドマップ:描画完了!",
"notification_success": "マインドマップが生成されました、{user_name}さん!",
"error_processing": "スマートマインドマップ処理失敗:{error}",
"error_user_facing": "申し訳ありません、スマートマインドマップの処理中にエラーが発生しました:{error}\n詳細については、Open WebUIバックエンドログを確認してください。",
"status_failed": "スマートマインドマップ:処理失敗。",
"notification_failed": "スマートマインドマップ生成失敗、{user_name}さん!",
"status_rendering_image": "スマートマインドマップ:画像レンダリング中...",
"status_image_generated": "スマートマインドマップ:画像生成完了!",
"notification_image_success": "マインドマップ画像が生成されました、{user_name}さん!",
"ui_title": "🧠 スマートマインドマップ",
"ui_user": "ユーザー:",
"ui_time": "時間:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "リセット",
"ui_zoom_in": "+",
"ui_depth_select": "レベル展開",
"ui_depth_all": "すべて展開",
"ui_depth_2": "レベル2",
"ui_depth_3": "レベル3",
"ui_fullscreen": "全画面",
"ui_theme": "テーマ",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ マインドマップを読み込めません:有効なコンテンツがありません。",
"html_error_load_failed": "⚠️ リソースの読み込みに失敗しました。後でもう一度お試しください。",
"js_done": "完了",
"js_failed": "失敗",
"js_generating": "生成中...",
"js_filename": "infographic.png",
"js_upload_failed": "アップロード失敗:",
"md_image_alt": "🧠 マインドマップ",
},
"fr-FR": {
"status_starting": "Smart Infographic démarre, génération de la carte heuristique en cours...",
"error_no_content": "Impossible de récupérer le contenu valide du message utilisateur.",
"error_text_too_short": "Le contenu du texte est trop court ({len} caractères), impossible d'effectuer une analyse efficace. Veuillez fournir au moins {min_len} caractères de texte.",
"status_analyzing": "Smart Infographic : Analyse approfondie de la structure du texte...",
"status_drawing": "Smart Infographic : Dessin terminé !",
"notification_success": "La carte heuristique a été générée, {user_name} !",
"error_processing": "Échec du traitement de Smart Infographic : {error}",
"error_user_facing": "Désolé, Smart Infographic a rencontré une erreur lors du traitement : {error}.\nVeuillez vérifier les journaux backend d'Open WebUI pour plus de détails.",
"status_failed": "Smart Infographic : Échec du traitement.",
"notification_failed": "Échec de la génération de la carte heuristique, {user_name} !",
"status_rendering_image": "Smart Infographic : Rendu de l'image...",
"status_image_generated": "Smart Infographic : Image générée !",
"notification_image_success": "L'image de la carte heuristique a été générée, {user_name} !",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Utilisateur :",
"ui_time": "Heure :",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Rénitialiser",
"ui_zoom_in": "+",
"ui_depth_select": "Niveau d'expansion",
"ui_depth_all": "Tout développer",
"ui_depth_2": "Niveau 2",
"ui_depth_3": "Niveau 3",
"ui_fullscreen": "Plein écran",
"ui_theme": "Thème",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Impossible de charger la carte heuristique : contenu valide manquant.",
"html_error_load_failed": "⚠️ Échec du chargement des ressources, veuillez réessayer plus tard.",
"js_done": "Terminé",
"js_failed": "Échec",
"js_generating": "Génération...",
"js_filename": "carte_heuristique.png",
"js_upload_failed": "Échec du téléchargement : ",
"md_image_alt": "🧠 Carte Heuristique",
},
"de-DE": {
"status_starting": "Smart Infographic startet, Infographic wird für Sie erstellt...",
"error_no_content": "Gültiger Inhalt der Benutzernachricht konnte nicht abgerufen werden.",
"error_text_too_short": "Der Textinhalt ist zu kurz ({len} Zeichen), eine effektive Analyse ist nicht möglich. Bitte geben Sie mindestens {min_len} Zeichen Text an.",
"status_analyzing": "Smart Infographic: Detaillierte Analyse der Textstruktur...",
"status_drawing": "Smart Infographic: Zeichnen abgeschlossen!",
"notification_success": "Infographic wurde erstellt, {user_name}!",
"error_processing": "Smart Infographic Verarbeitung fehlgeschlagen: {error}",
"error_user_facing": "Entschuldigung, bei der Verarbeitung von Smart Infographic ist ein Fehler aufgetreten: {error}.\nBitte überprüfen Sie die Open WebUI Backend-Protokolle für weitere Details.",
"status_failed": "Smart Infographic: Verarbeitung fehlgeschlagen.",
"notification_failed": "Erstellung der Infographic fehlgeschlagen, {user_name}!",
"status_rendering_image": "Smart Infographic: Bild wird gerendert...",
"status_image_generated": "Smart Infographic: Bild erstellt!",
"notification_image_success": "Infographic-Bild wurde erstellt, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Benutzer:",
"ui_time": "Zeit:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Zurücksetzen",
"ui_zoom_in": "+",
"ui_depth_select": "Ebene erweitern",
"ui_depth_all": "Alles erweitern",
"ui_depth_2": "Ebene 2",
"ui_depth_3": "Ebene 3",
"ui_fullscreen": "Vollbild",
"ui_theme": "Thema",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Infographic kann nicht geladen werden: Gültiger Inhalt fehlt.",
"html_error_load_failed": "⚠️ Ressourcenladen fehlgeschlagen, bitte versuchen Sie es später erneut.",
"js_done": "Fertig",
"js_failed": "Fehlgeschlagen",
"js_generating": "Generiere...",
"js_filename": "infographic.png",
"js_upload_failed": "Upload fehlgeschlagen: ",
"md_image_alt": "🧠 Infographic",
},
"es-ES": {
"status_starting": "Smart Infographic se está iniciando, generando mapa mental para usted...",
"error_no_content": "No se puede recuperar el contenido válido del mensaje del usuario.",
"error_text_too_short": "El contenido del texto es demasiado corto ({len} caracteres), no se puede realizar un análisis efectivo. Proporcione al menos {min_len} caracteres de texto.",
"status_analyzing": "Smart Infographic: Analizando la estructura del texto en profundidad...",
"status_drawing": "Smart Infographic: ¡Dibujo completado!",
"notification_success": "¡El mapa mental ha sido generado, {user_name}!",
"error_processing": "Falló el procesamiento de Smart Infographic: {error}",
"error_user_facing": "Lo sentimos, Smart Infographic encontró un error durante el procesamiento: {error}.\nConsulte los registros del backend de Open WebUI para más detalles.",
"status_failed": "Smart Infographic: Procesamiento fallido.",
"notification_failed": "¡La generación del mapa mental falló, {user_name}!",
"status_rendering_image": "Smart Infographic: Renderizando imagen...",
"status_image_generated": "Smart Infographic: ¡Imagen generada!",
"notification_image_success": "¡La imagen del mapa mental ha sido generada, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Usuario:",
"ui_time": "Hora:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Restablecer",
"ui_zoom_in": "+",
"ui_depth_select": "Expandir Nivel",
"ui_depth_all": "Expandir Todo",
"ui_depth_2": "Nivel 2",
"ui_depth_3": "Nivel 3",
"ui_fullscreen": "Pantalla completa",
"ui_theme": "Tema",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ No se puede cargar el mapa mental: Falta contenido válido.",
"html_error_load_failed": "⚠️ Falló la carga de recursos, inténtelo de nuevo más tarde.",
"js_done": "Hecho",
"js_failed": "Fallido",
"js_generating": "Generando...",
"js_filename": "mapa_mental.png",
"js_upload_failed": "Carga fallida: ",
"md_image_alt": "🧠 Mapa Mental",
},
"it-IT": {
"status_starting": "Smart Infographic si sta avviando, generazione mappa mentale in corso...",
"error_no_content": "Impossibile recuperare il contenuto valido del messaggio utente.",
"error_text_too_short": "Il testo è troppo breve ({len} caratteri), impossibile eseguire un'analisi efficace. Fornire almeno {min_len} caratteri di testo.",
"status_analyzing": "Smart Infographic: Analisi approfondita della struttura del testo...",
"status_drawing": "Smart Infographic: Disegno completato!",
"notification_success": "La mappa mentale è stata generata, {user_name}!",
"error_processing": "Elaborazione Smart Infographic fallita: {error}",
"error_user_facing": "Spiacenti, Smart Infographic ha riscontrato un errore durante l'elaborazione: {error}.\nControllare i log del backend di Open WebUI per ulteriori dettagli.",
"status_failed": "Smart Infographic: Elaborazione fallita.",
"notification_failed": "Generazione mappa mentale fallita, {user_name}!",
"status_rendering_image": "Smart Infographic: Rendering immagine...",
"status_image_generated": "Smart Infographic: Immagine generata!",
"notification_image_success": "L'immagine della mappa mentale è stata generata, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Utente:",
"ui_time": "Ora:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Reimposta",
"ui_zoom_in": "+",
"ui_depth_select": "Espandi Livello",
"ui_depth_all": "Espandi Tutto",
"ui_depth_2": "Livello 2",
"ui_depth_3": "Livello 3",
"ui_fullscreen": "Schermo intero",
"ui_theme": "Tema",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Impossibile caricare la mappa mentale: Contenuto valido mancante.",
"html_error_load_failed": "⚠️ Caricamento risorse fallito, riprovare più tardi.",
"js_done": "Fatto",
"js_failed": "Fallito",
"js_generating": "Generazione...",
"js_filename": "mappa_mentale.png",
"js_upload_failed": "Caricamento fallito: ",
"md_image_alt": "🧠 Mappa Mentale",
},
"vi-VN": {
"status_starting": "Smart Infographic đang khởi động, đang tạo sơ đồ tư duy cho bạn...",
"error_no_content": "Không thể lấy nội dung tin nhắn người dùng hợp lệ.",
"error_text_too_short": "Nội dung văn bản quá ngắn ({len} ký tự), không thể thực hiện phân tích hiệu quả. Vui lòng cung cấp ít nhất {min_len} ký tự văn bản.",
"status_analyzing": "Smart Infographic: Phân tích sâu cấu trúc văn bản...",
"status_drawing": "Smart Infographic: Vẽ hoàn tất!",
"notification_success": "Sơ đồ tư duy đã được tạo, {user_name}!",
"error_processing": "Xử lý Smart Infographic thất bại: {error}",
"error_user_facing": "Xin lỗi, Smart Infographic đã gặp lỗi trong quá trình xử lý: {error}.\nVui lòng kiểm tra nhật ký backend Open WebUI để biết thêm chi tiết.",
"status_failed": "Smart Infographic: Xử lý thất bại.",
"notification_failed": "Tạo sơ đồ tư duy thất bại, {user_name}!",
"status_rendering_image": "Smart Infographic: Đang render hình ảnh...",
"status_image_generated": "Smart Infographic: Hình ảnh đã tạo!",
"notification_image_success": "Hình ảnh sơ đồ tư duy đã được tạo, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Người dùng:",
"ui_time": "Thời gian:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Đặt lại",
"ui_zoom_in": "+",
"ui_depth_select": "Mở rộng Cấp độ",
"ui_depth_all": "Mở rộng Tất cả",
"ui_depth_2": "Cấp độ 2",
"ui_depth_3": "Cấp độ 3",
"ui_fullscreen": "Toàn màn hình",
"ui_theme": "Chủ đề",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Không thể tải sơ đồ tư duy: Thiếu nội dung hợp lệ.",
"html_error_load_failed": "⚠️ Tải tài nguyên thất bại, vui lòng thử lại sau.",
"js_done": "Xong",
"js_failed": "Thất bại",
"js_generating": "Đang tạo...",
"js_filename": "sodo_tuduy.png",
"js_upload_failed": "Tải lên thất bại: ",
"md_image_alt": "🧠 Sơ đồ Tư duy",
},
"id-ID": {
"status_starting": "Smart Infographic sedang dimulai, membuat peta pikiran untuk Anda...",
"error_no_content": "Tidak dapat mengambil konten pesan pengguna yang valid.",
"error_text_too_short": "Konten teks terlalu pendek ({len} karakter), tidak dapat melakukan analisis efektif. Harap berikan setidaknya {min_len} karakter teks.",
"status_analyzing": "Smart Infographic: Menganalisis struktur teks secara mendalam...",
"status_drawing": "Smart Infographic: Menggambar selesai!",
"notification_success": "Peta pikiran telah dibuat, {user_name}!",
"error_processing": "Pemrosesan Smart Infographic gagal: {error}",
"error_user_facing": "Maaf, Smart Infographic mengalami kesalahan saat memproses: {error}.\nSilakan periksa log backend Open WebUI untuk detail lebih lanjut.",
"status_failed": "Smart Infographic: Pemrosesan gagal.",
"notification_failed": "Pembuatan peta pikiran gagal, {user_name}!",
"status_rendering_image": "Smart Infographic: Merender gambar...",
"status_image_generated": "Smart Infographic: Gambar dibuat!",
"notification_image_success": "Gambar peta pikiran telah dibuat, {user_name}!",
"ui_title": "🧠 Smart Infographic",
"ui_user": "Pengguna:",
"ui_time": "Waktu:",
"ui_download_png": "PNG",
"ui_download_svg": "SVG",
"ui_download_md": "Markdown",
"ui_zoom_out": "-",
"ui_zoom_reset": "Atur Ulang",
"ui_zoom_in": "+",
"ui_depth_select": "Perluas Level",
"ui_depth_all": "Perluas Semua",
"ui_depth_2": "Level 2",
"ui_depth_3": "Level 3",
"ui_fullscreen": "Layar Penuh",
"ui_theme": "Tema",
"ui_footer": "<b>Powered by</b> <a href='https://markmap.js.org/' target='_blank' rel='noopener noreferrer'>Markmap</a>",
"html_error_missing_content": "⚠️ Tidak dapat memuat peta pikiran: Konten valid hilang.",
"html_error_load_failed": "⚠️ Gagal memuat sumber daya, silakan coba lagi nanti.",
"js_done": "Selesai",
"js_failed": "Gagal",
"js_generating": "Membuat...",
"js_filename": "peta_pikiran.png",
"js_upload_failed": "Unggah gagal: ",
"md_image_alt": "🧠 Peta Pikiran",
},
}
# =================================================================
# LLM Prompts
# =================================================================
@@ -92,7 +564,7 @@ Choose the most appropriate template based on content structure.
`chart-pie-plain-text`, `chart-pie-donut-plain-text`, `chart-wordcloud`
*Other:*
`quadrant-quarter-simple-card`, `relation-circle-icon-badge`
`quadrant-quarter-simple-card`, `relation-circle-icon-badge`, `relation-dagre-flow-tb-simple-circle-node`
**Text Capacity by Template Type:**
- HIGH capacity (long descriptions OK): `list-column-*`, `compare-binary-*`, `sequence-timeline-*`
@@ -110,6 +582,19 @@ Choose the most appropriate template based on content structure.
- Format: filename without .svg, e.g., `coding`, `team-work`
- Use `illus` field instead of `icon`
### 📊 Template to Data Field Mapping (CRITICAL)
For maximum rendering speed and stability, match the list identifier to the template kind structure. Do NOT just use `items` if a specific field exists:
| Template Prefix | Data Field Identifier | Core Variables on Items |
| :--- | :--- | :--- |
| `list-*` | **`lists`** | `label`, `desc`, `icon` |
| `sequence-*` | **`sequences`** | `label`, `desc` |
| `compare-*` | **`compares`** | `label`, `value`, `children` |
| `chart-*` | **`values`** | `label`, `value` |
| `hierarchy-*` | **`root` + `children`** | 嵌套嵌套组合 |
*Note: `items` can be used as a universal fallback adapter if template categorization is ambiguous.*
### Data Structure Examples
#### A. Standard List/Tree (Default)
@@ -250,11 +735,23 @@ data
### Common Data Fields
- `label`: Main title/label (Required)
- `desc`: Description text
- `value`: Numeric value (for charts)
- `value`: Numeric value. **ONLY displayed on `chart-*` series templates**. For cards or lists, put data into `desc` instead.
- `icon`: Icon name (e.g., `mdi/home`, `mdi/account`) or `ref:search:<keyword>`
- `children`: Nested items (for trees, SWOT, etc.)
- `illus`: Illustration icon (specific to some templates like Quadrant)
### 📊 Data & Numeric Fields Standard
1. **Value Specification**: `value` MUST be a **pure number** (integer or float), without any symbols like `$`, `%`, or `¥`.
2. **Units Placement**: Put units or currency symbols into the `label` or `desc` instead.
- ❌ Wrong: `value $1.234` / `value 5.2%`
- ✅ Correct: `label USD ($)` -> `value 1.234` OR `label Rate` -> `desc 5.2%`
### ⚠️ Strict Styling & Layout Rules
1. **Color Palette (`palette`)**: MUST use space-separated naked Hex values. Do NOT use quotes (`"`) or commas (`,`).
- ✅ Correct: `palette #4f46e5 #06b6d4 #10b981`
- ❌ Wrong: `palette "#4f46e5", "#06b6d4"`
2. **Binary Compare (`compare-binary-*`)**: The root of `compares` tree MUST contain **EXACTLY TWO** comparison objects.
### Content Refinement Principles
1. **Brevity is King**: Infographics are visual. Keep text to a minimum.
2. **Title Limit**: Keep `label` (item titles) under 15 characters (approx. 10 Chinese characters).
@@ -262,7 +759,7 @@ data
4. **Impact**: Use strong verbs and nouns. Avoid filler words.
## Output Requirements
1. **Language**: Output content in the user's language.
1. **Language**: Follow the **Important Language Rule** (Generate content in the **exact same language** as the input text content; do NOT force it to match the status parameter).
2. **Format**: Wrap output in ```infographic ... ```.
3. **No Colons**: Do NOT use colons after keys.
4. **Indentation**: Use 2 spaces.
@@ -278,6 +775,7 @@ Please analyze the following text content and convert its core information into
User Name: {user_name}
Current Date/Time: {current_date_time_str}
User Language: {user_language}
OpenWebUI Theme: {user_theme}
---
**Text Content:**
@@ -285,12 +783,17 @@ User Language: {user_language}
Please select the most appropriate infographic template based on text characteristics and output standard infographic syntax. Pay attention to correct indentation format (two spaces).
⚠️ **Language Consistency Rule (CRITICAL)**:
The title, desc, labels, and text items in your output **MUST STRICTLY MATCH the primary language of the original {long_text_content}**. Do NOT translate the content just to match default status parameters. Everything should follow the input flow natively.
**Visual Optimization Guide (MUST FOLLOW):**
- **Point-based Generation:** Infographics are not articles. Extract KEYWORDS ONLY, avoid complete sentences.
- **Main Title (`data.title`):** **MUST** be ≤ **15 Chinese characters** (or ≤30 English characters). Trim version numbers or details if needed.
- **Subtitle (`data.desc`):** **MUST** be ≤ **20 Chinese characters** (or ≤40 English characters).
- **Card Title (`label`):** **MUST** be ≤ **6 Chinese characters** (or ≤12 English characters). Use 2-4 keywords only.
- **Card Description (`desc`):** **MUST** be ≤ **12 Chinese characters** (or ≤24 English characters). Use short phrases.
- **Numeric Strictness:** `value` MUST be a pure number (no `$`, `%`, etc.). Append units to `label` or `desc` instead.
- **Dynamic Selection:** For multiple stats/currencies, use structures like `list-grid-*` or `list-row-*` for dense layouts.
⚠️ **CRITICAL**: If the original text is too long, you MUST rephrase and shorten it. Do NOT simply truncate with "...".
Examples:
@@ -365,10 +868,22 @@ CSS_TEMPLATE_INFOGRAPHIC = """
--ig-border-color: #e2e8f0;
--ig-header-gradient: linear-gradient(135deg, #6366f1, #8b5cf6);
}
.infographic-container-wrapper.dark {
--ig-primary-color: #818cf8;
--ig-secondary-color: #a78bfa;
--ig-tertiary-color: #34d399;
--ig-background-color: #0f172a;
--ig-card-bg-color: #1e293b;
--ig-text-color: #f8fafc;
--ig-muted-text-color: #94a3b8;
--ig-border-color: #334155;
--ig-header-gradient: linear-gradient(135deg, #4338ca, #6d28d9);
}
.infographic-container-wrapper {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
line-height: 1.6;
color: var(--ig-text-color);
background-color: var(--ig-background-color);
height: 100%;
display: flex;
flex-direction: column;
@@ -387,7 +902,7 @@ CSS_TEMPLATE_INFOGRAPHIC = """
.infographic-container-wrapper .user-context {
font-size: 0.8em;
color: var(--ig-muted-text-color);
background-color: #f1f5f9;
background-color: var(--ig-card-bg-color);
padding: 8px 16px;
display: flex;
justify-content: space-around;
@@ -402,7 +917,7 @@ CSS_TEMPLATE_INFOGRAPHIC = """
border-radius: 8px;
padding: 16px;
min-height: 600px;
background: #fff;
background: var(--ig-card-bg-color);
overflow: visible;
transition: height 0.3s ease;
}
@@ -414,6 +929,12 @@ CSS_TEMPLATE_INFOGRAPHIC = """
line-height: 1.3 !important;
overflow: visible !important;
}
.infographic-container-wrapper.dark .infographic-render-container svg text {
fill: var(--ig-text-color) !important;
}
.infographic-container-wrapper.dark .infographic-render-container svg foreignObject * {
color: var(--ig-text-color) !important;
}
/* Main title styles */
.infographic-render-container svg foreignObject[data-element-type="title"] > * {
font-size: 1.3em !important;
@@ -640,6 +1161,7 @@ SCRIPT_TEMPLATE_INFOGRAPHIC = """
// Charts
'chart-column': 'chart-column-simple',
'quadrant': 'quadrant-quarter-simple-card',
'relation-dagre': 'relation-dagre-flow-tb-simple-circle-node',
// Legacy mappings for backward compatibility
'list-vertical': 'list-column-simple-vertical-arrow',
@@ -701,6 +1223,24 @@ SCRIPT_TEMPLATE_INFOGRAPHIC = """
return;
}}
// --- Auto Theme Loading ---
try {{
const html = document.documentElement;
const body = document.body;
const htmlClass = html ? html.className : '';
const bodyClass = body ? body.className : '';
const htmlDataTheme = html ? html.getAttribute('data-theme') : '';
const wrapper = containerEl.closest('.infographic-container-wrapper');
if (wrapper) {{
if (htmlDataTheme === 'dark' || bodyClass.includes('dark') || htmlClass.includes('dark')) {{
wrapper.classList.add('dark');
}}
}}
}} catch (e) {{
console.warn('[Infographic] Failed to apply theme class', e);
}}
try {{
const {{ Infographic }} = AntVInfographic;
@@ -961,13 +1501,24 @@ class Action:
def __init__(self):
self.valves = self.Valves()
# Fallback mapping for variants not in TRANSLATIONS keys
self.fallback_map = {
"es-AR": "es-ES",
"es-MX": "es-ES",
"fr-CA": "fr-FR",
"en-CA": "en-US",
"en-GB": "en-US",
"en-AU": "en-US",
"de-AT": "de-DE",
}
async def _get_user_context(
self,
__user__: Optional[Dict[str, Any]],
__event_call__: Optional[Callable[[Any], Awaitable[None]]] = None,
__request__: Optional[Request] = None,
) -> Dict[str, str]:
"""Safely extracts user context information."""
"""Extract basic user context with safe fallbacks."""
if isinstance(__user__, (list, tuple)):
user_data = __user__[0] if __user__ else {}
elif isinstance(__user__, dict):
@@ -977,32 +1528,123 @@ class Action:
user_id = user_data.get("id", "unknown_user")
user_name = user_data.get("name", "User")
# Default from profile
user_language = user_data.get("language", "en-US")
user_theme = "light"
# Level 1 Fallback: Accept-Language from __request__ headers
if (
__request__
and hasattr(__request__, "headers")
and "accept-language" in __request__.headers
):
raw_lang = __request__.headers.get("accept-language", "")
if raw_lang:
user_language = raw_lang.split(",")[0].split(";")[0]
# Priority: Document Lang > LocalStorage (Frontend) > Browser > Request Header > Profile
if __event_call__:
try:
js_code = """
return (
localStorage.getItem('locale') ||
localStorage.getItem('language') ||
navigator.language ||
'en-US'
);
try {
const html = document.documentElement;
const body = document.body;
const htmlClass = html ? html.className : '';
const bodyClass = body ? body.className : '';
const htmlDataTheme = html ? html.getAttribute('data-theme') : '';
let theme = 'light';
// 1. Check parent document's html/body class or data-theme
if (htmlDataTheme === 'dark' || bodyClass.includes('dark') || htmlClass.includes('dark')) {
theme = 'dark';
} else if (htmlDataTheme === 'light' || bodyClass.includes('light') || htmlClass.includes('light')) {
theme = 'light';
} else {
// 2. Check meta theme-color luma
const metas = document.querySelectorAll('meta[name="theme-color"]');
let foundMeta = false;
if (metas.length > 0) {
const color = metas[metas.length - 1].content.trim();
const m = color.match(/^#?([0-9a-f]{6})$/i);
if (m) {
const hex = m[1];
const r = parseInt(hex.slice(0, 2), 16);
const g = parseInt(hex.slice(2, 4), 16);
const b = parseInt(hex.slice(4, 6), 16);
const luma = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
theme = luma < 0.5 ? 'dark' : 'light';
foundMeta = true;
}
}
// 3. Check system preference
if (!foundMeta && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
theme = 'dark';
}
}
const lang = document.documentElement.lang ||
localStorage.getItem('locale') ||
localStorage.getItem('language') ||
navigator.language ||
'en-US';
return JSON.stringify({ lang, theme });
} catch (e) {
return JSON.stringify({ lang: 'en-US', theme: 'light' });
}
"""
frontend_lang = await __event_call__(
{"type": "execute", "data": {"code": js_code}}
# Use asyncio.wait_for to prevent hanging if frontend fails to callback
frontend_res_str = await asyncio.wait_for(
__event_call__({"type": "execute", "data": {"code": js_code}}),
timeout=2.0,
)
if frontend_lang and isinstance(frontend_lang, str):
user_language = frontend_lang
if frontend_res_str and isinstance(frontend_res_str, str):
try:
import json
frontend_res = json.loads(frontend_res_str)
user_language = frontend_res.get("lang", user_language)
user_theme = frontend_res.get("theme", user_theme)
except Exception:
user_language = frontend_res_str
except Exception as e:
logger.warning(f"Failed to retrieve frontend language: {e}")
logger.warning(f"Failed to retrieve frontend language/theme: {e}")
return {
"user_id": user_id,
"user_name": user_name,
"user_language": user_language,
"user_theme": user_theme,
}
def _resolve_language(self, lang: str) -> str:
"""Resolve the best matching language code from the TRANSLATIONS dict."""
target_lang = lang
if target_lang in TRANSLATIONS:
return target_lang
if hasattr(self, 'fallback_map') and target_lang in self.fallback_map:
target_lang = self.fallback_map[target_lang]
if target_lang in TRANSLATIONS:
return target_lang
if "-" in lang:
base_lang = lang.split("-")[0]
for supported_lang in TRANSLATIONS:
if supported_lang.startswith(base_lang + "-"):
return supported_lang
return "en-US"
def _get_translation(self, lang: str, key: str, **kwargs) -> str:
"""Get translated string for the given language and key."""
target_lang = self._resolve_language(lang)
lang_dict = TRANSLATIONS.get(target_lang, TRANSLATIONS["en-US"])
text = lang_dict.get(key, TRANSLATIONS["en-US"].get(key, key))
if kwargs:
try:
text = text.format(**kwargs)
except Exception as e:
logger.warning(f"Translation formatting failed for {key}: {e}")
return text
def _get_chat_context(
self, body: dict, __metadata__: Optional[dict] = None
) -> Dict[str, str]:
@@ -1245,6 +1887,7 @@ class Action:
'sequence-horizontal': 'sequence-horizontal-zigzag-simple',
'relation-sankey': 'relation-sankey-simple',
'relation-circle': 'relation-circle-icon-badge',
'relation-dagre': 'relation-dagre-flow-tb-simple-circle-node',
'compare-binary': 'compare-binary-horizontal-simple-vs',
'compare-swot': 'compare-swot',
'quadrant-quarter': 'quadrant-quarter-simple-card',
@@ -1496,13 +2139,14 @@ class Action:
__metadata__: Optional[dict] = None,
__request__: Optional[Request] = None,
) -> Optional[dict]:
logger.info("Action: Infographic started (v1.4.0)")
logger.info("Action: Infographic started (v1.6.0)")
# Get user information
user_ctx = await self._get_user_context(__user__, __event_call__)
user_ctx = await self._get_user_context(__user__, __event_call__, __request__)
user_name = user_ctx["user_name"]
user_id = user_ctx["user_id"]
user_language = user_ctx["user_language"]
user_theme = user_ctx.get("user_theme", "light")
# Get current time
now = datetime.now()
@@ -1562,11 +2206,11 @@ class Action:
}
await self._emit_notification(
__event_emitter__, "📊 Infographic started, generating...", "info"
__event_emitter__, self._get_translation(user_language, "status_starting"), "info"
)
await self._emit_status(
__event_emitter__,
"📊 Infographic: Starting generation...",
self._get_translation(user_language, "status_starting"),
False,
)
@@ -1576,13 +2220,14 @@ class Action:
# Build prompt
await self._emit_status(
__event_emitter__,
"📊 Infographic: Calling AI model to analyze content...",
self._get_translation(user_language, "status_analyzing"),
False,
)
formatted_user_prompt = USER_PROMPT_GENERATE_INFOGRAPHIC.format(
user_name=user_name,
current_date_time_str=current_date_time_str,
user_language=user_language,
user_theme=user_theme,
long_text_content=long_text_content,
)
@@ -1617,7 +2262,7 @@ class Action:
await self._emit_status(
__event_emitter__,
"📊 Infographic: AI analysis complete, parsing syntax...",
self._get_translation(user_language, "status_analyzing"),
False,
)
@@ -1631,7 +2276,7 @@ class Action:
# Prepare content components
await self._emit_status(
__event_emitter__,
"📊 Infographic: Rendering chart...",
self._get_translation(user_language, "status_rendering_image"),
False,
)
content_html = (
@@ -1692,7 +2337,7 @@ class Action:
await self._emit_status(
__event_emitter__,
"📊 Infographic: Rendering image...",
self._get_translation(user_language, "status_rendering_image"),
False,
)
@@ -1712,11 +2357,11 @@ class Action:
)
await self._emit_status(
__event_emitter__, "✅ Infographic: Image generated!", True
__event_emitter__, self._get_translation(user_language, "status_image_generated"), True
)
await self._emit_notification(
__event_emitter__,
f"📊 Infographic image generated, {user_name}!",
self._get_translation(user_language, "notification_image_success", user_name=user_name),
"success",
)
logger.info("Infographic generation completed in image mode")
@@ -1727,11 +2372,11 @@ class Action:
body["messages"][-1]["content"] = f"{original_content}\n\n{html_embed_tag}"
await self._emit_status(
__event_emitter__, "✅ Infographic: Generation complete!", True
__event_emitter__, self._get_translation(user_language, "status_drawing"), True
)
await self._emit_notification(
__event_emitter__,
f"📊 Infographic generated, {user_name}!",
self._get_translation(user_language, "notification_success", user_name=user_name),
"success",
)
logger.info("Infographic generation completed")
@@ -1745,11 +2390,11 @@ class Action:
] = f"{original_content}\n\n❌ **Error:** {user_facing_error}"
await self._emit_status(
__event_emitter__, "❌ Infographic: Generation failed", True
__event_emitter__, self._get_translation(user_language, "status_failed"), True
)
await self._emit_notification(
__event_emitter__,
f"❌ Infographic generation failed, {user_name}!",
self._get_translation(user_language, "notification_failed", user_name=user_name),
"error",
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
# v1.6.0 Release Notes
This release is a major upgrade introducing 12-language i18n support frameworks and full context dark/light mode sniffing backbones to prevent card inverse overlaps conflicts natively.
## New Features
- **12-Language I18n Skeleton Framework**: Full structural fallback algorithms mapped onto global dictionary namespaces.
- **AI Prompt Strategy Optimization**: Enforced AI to strictly prevent colons induction and contain pure index metrics to streamline Charts visualizers nodes rendering loops.
- **Dagre Flow Layout View** (`relation-dagre`): visual pipeline supporting relationship visualizer pipelines trees.
- **Environment Theme Sniffer Context**: Smooth dark/light status conditioning automatically injected onto visual color palettes adaptation pipelines.
## Capability & Validation Alignments
- **Fixes Issue #61**: Formatted parsing aligning index strict instructions forcing non-chart templates to bypass redundant variables.
- **Cascad Class Shifters**: Integrated child text self-destabilizers lifting SVG contrasts automatically inside container frameworks override pipelines.
- **Strict Data Nodes Layout mapping**: Enforced items index indexes limiting structural interpreting limits during adaptive operations.

View File

@@ -0,0 +1,15 @@
# v1.6.0 版本发布说明
本版本是一次重磅升级,引入了完整的 12 语种标准 i18n国际化支持架构并打通了全链路外壳多阶环境背景Dark/Light 模式)降维检测,强效解决了由于浅色底卡片跟深色文字覆盖时的低对比度排斥问题。
## 新功能
- **System Prompt 提示词策略优化**:在系统中严格强控禁止冒号、限制 title/desc 字数,百分百确保 `value` 字段仅由纯数字落座,有效解救数值渲染崩溃黑页。
- **12 语种标准 i18n 翻译骨架**:对标 Mindmap 全量级翻译映射字典以及 variant 状态机转移降维 fallback 处理。
- **Dagre 关系代数 flow 网络看板视图** (`relation-dagre`): 对应 PR #161 全链,支持有向节点、依赖连线关系的组件流向与骨骼动画渲染。
- **外壳背景环境自动探测 (Theme Sniffing)**:智能嗅探外部明暗样式并在渲染板壳中追加 `.dark` 等级控制自适应穿透。
## 规则校准与对齐
- **修复关联 Issue #61**:强制约束非图表类模板(如 `list-row`)在解析时将数据直接归拢至 `desc`/`label` 避免因不支持 `value` 导致数据丢失。
- **内聚容器反转对比度**:添加子代文字 `color: currentcolor !important` 等联级状态,百分百确保渲染视图清可见。
- **模板主索引映射表对撞规范**:明确对应 `list-*` $\rightarrow$ `lists`,强控解析抗崩。
- **Palette 裸排严防崩键**:加强提示词,强制大模型在 theme 节中 palette 禁止掺入引号或逗号,避免样式崩坏。

View File

@@ -0,0 +1,6 @@
# v1.6.1 Release Notes
This is a hotfix release ensuring the AI model adheres strictly to **Language Consistency** rules and doesn't default to general translation behavior during user dashboard context parameters injection.
## Bug Fixes
- **AI Response Prompt Boundary Protection**: Strict language limits preventing translated overrides when contextual parameters override background system streams status. Directs LLM outputs to fit inputs language content accurately.

View File

@@ -0,0 +1,6 @@
# v1.6.1 版本发布说明
本版本是一次紧急修复Hotfix主要优化了提示词控制层面的语言决策优先级百分百排解了因前序引入全量 i18n 传参后导致大模型在部分场景中“自我汉化”响应的 Bug。
## 修复项
- **提示词语言一致性校准 (Language Consistency)**:强控大模型的 Layout/节点 content 输出语种**必须与用户输入的主体文本保持绝对一致**,不受 system 框降阶字典参数干扰。

View File

@@ -10,6 +10,19 @@ Smart Mind Map is a powerful OpenWebUI action plugin that intelligently analyzes
> 🏆 **Featured by OpenWebUI Official** — This plugin was recommended in the official OpenWebUI Community Newsletter: [February 3, 2026](https://openwebui.com/blog/open-webui-community-newsletter-february-3rd-2026)
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## What's New in v1.0.0
### Direct Embed & UI Refinements

View File

@@ -10,6 +10,19 @@
> 🏆 **OpenWebUI 官方推荐** — 本插件获得 OpenWebUI 社区 Newsletter 官方推荐:[2026 年 2 月 3 日](https://openwebui.com/blog/open-webui-community-newsletter-february-3rd-2026)
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## v1.0.0 最新更新
### 嵌入式直出与 UI 细节全线重构

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 380 KiB

View File

@@ -8,6 +8,19 @@
This filter reduces token consumption in long conversations through intelligent summarization and message compression while keeping conversations coherent.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## What's new in 1.5.0
- **External Chat Reference Summaries**: Added support for referenced chat context blocks that can reuse cached summaries, inject small referenced chats directly, or generate summaries for larger referenced chats before injection.

View File

@@ -10,6 +10,19 @@
本过滤器通过智能摘要和消息压缩技术,在保持对话连贯性的同时,显著降低长对话的 Token 消耗。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 1.5.0 版本更新
- **外部聊天引用摘要**: 新增对引用聊天上下文的摘要支持。现在可以复用缓存摘要、直接注入较小引用聊天,或先为较大的引用聊天生成摘要再注入。

View File

@@ -2713,8 +2713,20 @@ class Filter:
Check if compression should be skipped.
Returns True if:
"""
if body.get("is_copilot_model", False):
is_copilot = (
body.get("is_copilot_model", False)
or body.get("metadata", {}).get("is_copilot_model", False)
or body.get("features", {}).get("is_copilot_model", False)
)
if is_copilot:
return True
# Fallback for filters or responses (e.g., Outlet) which may clear the metadata payload
model_id = body.get("model", "")
if isinstance(model_id, str):
c = model_id.lower()
if "github_copilot_sdk_pipe" in c or "github_copilot_official_sdk_pipe" in c:
return True
return False
async def inlet(

View File

@@ -8,6 +8,19 @@
Automatically tracks and persists the mapping between user IDs and chat IDs for seamless session management.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## Key Features
🔄 **Automatic Tracking** - Captures user_id and chat_id on every message without manual intervention

View File

@@ -8,6 +8,19 @@
自动追踪并持久化用户 ID 与聊天 ID 的映射关系,实现无缝的会话管理。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 核心功能
🔄 **自动追踪** - 无需手动干预,在每条消息上自动捕获 user_id 和 chat_id

View File

@@ -8,6 +8,19 @@
**Folder Memory** is an intelligent context filter plugin for OpenWebUI. It automatically extracts consistent "Project Rules" from ongoing conversations within a folder and injects them back into the folder's system prompt.
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v0.1.0
- **Initial Release**: Automated "Project Rules" management for OpenWebUI folders.

View File

@@ -10,6 +10,19 @@
这确保了该文件夹内的所有未来对话都能共享相同的进化上下文和规则,无需手动更新。
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 最新更新 v0.1.0
- **首个版本发布**:专注于自动化的“项目规则”管理。

View File

@@ -10,6 +10,19 @@ This is a dedicated **companion filter plugin** designed specifically for the [G
Its core mission is to **protect user-uploaded files from being "pre-processed" by the OpenWebUI core system, ensuring that the Copilot Agent receives the raw files for autonomous analysis.**
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## ✨ v0.1.3 Updates (What's New)
- **🔍 BYOK Model ID Matching Fixed**: Now correctly identifies models in `github_copilot_official_sdk_pipe.xxx` format via prefix matching, in addition to keyword fallback for backward compatibility. (v0.1.3)

View File

@@ -10,6 +10,19 @@
它的核心使命是:**保护用户上传的文件不被 OpenWebUI 核心系统“抢先处理”,确保 Copilot Agent 能够接收到原始文件并进行自主分析。**
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## ✨ 0.1.3 更新内容 (What's New)
- **🔍 BYOK 模型 ID 匹配修复**: 新增前缀匹配(`github_copilot_official_sdk_pipe.xxx` 格式),修复 BYOK 模型无法被正确识别的问题,关键词兜底保持向后兼容。(v0.1.3)

View File

@@ -51,8 +51,12 @@ class Filter:
# 1) Prefix match (most reliable for OpenWebUI model id formats)
raw_prefixes = self.valves.target_model_prefixes or ""
prefixes = [p.strip().lower() for p in raw_prefixes.split(",") if p.strip()]
if any(current.startswith(prefix) for prefix in prefixes):
return True
for prefix in prefixes:
if current.startswith(prefix):
return True
# Match exact string without trailing dot for single-pipe endpoints
if prefix.endswith(".") and current == prefix[:-1]:
return True
# 2) Keyword fallback for backward compatibility
keyword = (self.valves.target_model_keyword or "").strip().lower()
@@ -114,7 +118,10 @@ class Filter:
# Check if it's a Copilot model
is_copilot_model = self._is_copilot_model(current_model)
body["is_copilot_model"] = is_copilot_model
if "features" not in body:
body["features"] = {}
body["features"]["is_copilot_model"] = is_copilot_model
await self._emit_debug_log(
__event_emitter__,

View File

@@ -13,6 +13,19 @@ A powerful, context-aware content normalizer filter for Open WebUI designed to f
---
## Install with Batch Install Plugins
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## 🔥 What's New in v1.2.8
* **Safe-by-Default Strategy**: The `enable_escape_fix` feature is now **disabled by default**. This prevents unwanted modifications to valid technical text like Windows file paths (`C:\new\test`) or complex LaTeX formulas.
* **LaTeX Parsing Fix**: Improved the logic for identifying display math (`$$ ... $$`). Fixed a bug where LaTeX commands starting with `\n` (like `\nabla`) were incorrectly treated as newlines.

View File

@@ -14,6 +14,19 @@
---
## 使用 Batch Install Plugins 安装
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## 🔥 最新更新 v1.2.8
* **“默认安全”策略 (Safe-by-Default)**`enable_escape_fix` 功能现在**默认禁用**。这能有效防止插件在未经授权的情况下误改 Windows 路径 (`C:\new\test`) 或复杂的 LaTeX 公式。
* **LaTeX 解析优化**:重构了显示数学公式 (`$$ ... $$`) 的识别逻辑。修复了 LaTeX 命令如果以 `\n` 开头(如 `\nabla`)会被错误识别为换行符的 Bug。

View File

@@ -1,232 +0,0 @@
import os
from typing import List, Optional
from pydantic import BaseModel
import time
class Pipeline:
"""
该管道用于优化多模型MoE汇总请求的提示词。
它会拦截用于汇总多个模型响应的请求,提取原始用户查询和各个模型的具体回答,
然后构建一个新的、更详细、结构化的提示词。
这个经过优化的提示词会引导最终的汇总模型扮演一个专家分析师的角色,
将输入信息整合成一份高质量、全面的综合报告。
"""
class Valves(BaseModel):
# 指定该过滤器管道将连接到的目标管道ID模型
# 如果希望连接到所有管道,可以设置为 ["*"]。
pipelines: List[str] = ["*"]
# 为过滤器管道分配一个优先级。
# 优先级决定了过滤器管道的执行顺序。
# 数字越小,优先级越高。
priority: int = 0
# 指定用于分析和总结的模型ID。
# 如果设置MoE汇总请求将被重定向到此模型。
model_id: Optional[str] = None
# MoE 汇总请求的触发前缀。
# 用于识别是否为 MoE 汇总请求。
trigger_prefix: str = (
"You have been provided with a set of responses from various models to the latest user query"
)
# 解析原始查询的起始标记
query_start_marker: str = 'the latest user query: "'
# 解析原始查询的结束标记
query_end_marker: str = '"\n\nYour task is to'
# 解析模型响应的起始标记
response_start_marker: str = "Responses from models: "
def __init__(self):
self.type = "filter"
self.name = "moe_prompt_refiner"
self.valves = self.Valves()
async def on_startup(self):
# 此函数在服务器启动时调用。
# print(f"on_startup:{__name__}")
pass
async def on_shutdown(self):
# 此函数在服务器停止时调用。
# print(f"on_shutdown:{__name__}")
pass
async def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
"""
此方法是管道的入口点。
它会检查传入的请求是否为多模型MoE汇总请求。如果是它会解析原始提示词
提取用户的查询和来自不同模型的响应。然后,它会动态构建一个新的、结构更清晰的提示词,
并用它替换原始的消息内容。
参数:
body (dict): 包含消息的请求体。
user (Optional[dict]): 用户信息。
返回:
dict: 包含优化后提示词的已修改请求体。
"""
print(f"pipe:{__name__}")
messages = body.get("messages", [])
if not messages:
return body
user_message_content = ""
user_message_index = -1
# 找到最后一条用户消息
for i in range(len(messages) - 1, -1, -1):
if messages[i].get("role") == "user":
content = messages[i].get("content", "")
# 处理内容为数组的情况(多模态消息)
if isinstance(content, list):
# 从数组中提取所有文本内容
text_parts = []
for item in content:
if isinstance(item, dict) and item.get("type") == "text":
text_parts.append(item.get("text", ""))
elif isinstance(item, str):
text_parts.append(item)
user_message_content = "".join(text_parts)
elif isinstance(content, str):
user_message_content = content
user_message_index = i
break
if user_message_index == -1:
return body
# 检查是否为MoE汇总请求
if isinstance(user_message_content, str) and user_message_content.startswith(
self.valves.trigger_prefix
):
print("检测到MoE汇总请求正在更改提示词。")
# 如果配置了 model_id则重定向请求
if self.valves.model_id:
print(f"重定向请求到模型: {self.valves.model_id}")
body["model"] = self.valves.model_id
# 1. 提取原始查询
query_start_phrase = self.valves.query_start_marker
query_end_phrase = self.valves.query_end_marker
start_index = user_message_content.find(query_start_phrase)
end_index = user_message_content.find(query_end_phrase)
original_query = ""
if start_index != -1 and end_index != -1:
original_query = user_message_content[
start_index + len(query_start_phrase) : end_index
]
# 2. 提取各个模型的响应
responses_start_phrase = self.valves.response_start_marker
responses_start_index = user_message_content.find(responses_start_phrase)
responses_text = ""
if responses_start_index != -1:
responses_text = user_message_content[
responses_start_index + len(responses_start_phrase) :
]
# 使用三重双引号作为分隔符来提取响应
responses = [
part.strip() for part in responses_text.split('"""') if part.strip()
]
# 3. 动态构建模型响应部分
responses_section = ""
for i, response in enumerate(responses):
responses_section += f'''"""
[第 {i + 1} 个模型的完整回答]
{response}
"""
'''
# 4. 构建新的提示词
merge_prompt = f'''# 角色定位
你是一位经验丰富的首席分析师,正在处理来自多个独立 AI 专家团队对同一问题的分析报告。你的任务是将这些报告进行深度整合、批判性分析,并提炼出一份结构清晰、洞察深刻、对决策者极具价值的综合报告。
# 原始用户问题
{original_query}
# 输入格式说明 ⚠️ 重要
各模型的响应已通过 """ (三重引号)分隔符准确识别和分离。系统已将不同模型的回答分别提取,你现在需要基于以下分离后的内容进行分析。
**已分离的模型响应**:
{responses_section}
# 核心任务
请勿简单地复制或拼接原始报告。你需要运用你的专业分析能力,完成以下步骤:
## 1. 信息解析与评估 (Analysis & Evaluation)
- **准确分隔**: 已根据 """ 分隔符,准确识别每个模型的回答边界。
- **可信度评估**: 批判性地审视每份报告,识别其中可能存在的偏见、错误或不一致之处。
- **逻辑梳理**: 理清每份报告的核心论点、支撑论据和推理链条。
## 2. 核心洞察提炼 (Insight Extraction)
- **识别共识**: 找出所有报告中共同提及、高度一致的观点或建议。这通常是问题的核心事实或最稳健的策略。
- **突出差异**: 明确指出各报告在视角、方法、预测或结论上的关键分歧点。这些分歧往往蕴含着重要的战略考量。
- **捕捉亮点**: 挖掘单个报告中独有的、具有创新性或深刻性的见解,这些"闪光点"可能是关键的差异化优势。
## 3. 综合报告撰写 (Synthesis)
基于以上分析,生成一份包含以下结构的综合报告:
### **【核心共识】**
- 用清晰的要点列出所有模型一致认同的关键信息或建议。
- 标注覆盖范围(如"所有模型均同意""多数模型提及")。
### **【关键分歧】**
- 清晰地对比不同模型在哪些核心问题上持有不同观点。
- 用序号或描述性语言标识不同的观点阵营(如"观点 A 与观点 B 的分歧""方案 1 vs 方案 2")。
- 简要说明其原因或侧重点的差异。
### **【独特洞察】**
- 提炼并呈现那些仅在单个报告中出现,但极具价值的独特建议或视角。
- 用"某个模型提出""另一视角"等中立表述,避免因缺少显式来源标记而造成的混淆。
### **【综合分析与建议】**
- **整合**: 基于共识、差异和亮点,提供一个全面、平衡、且经过你专业判断优化的最终分析。
- **建议**: 如果原始指令是寻求方案或策略,这里应提出一个或多个融合了各方优势的、可执行的建议。
# 格式要求
- 语言精炼、逻辑清晰、结构分明。
- 使用加粗、列表、标题等格式,确保报告易于阅读和理解。
- 由于缺少显式的模型标识,**在呈现差异化观点时,使用描述性或序号化的方式**(如"第一种观点""另一个视角")而非具体的模型名称。
- 始终以"为用户提供最高价值的决策依据"为目标。
# 输出结构示例
根据以上要求,你的输出应该呈现如下结构:
## 【核心共识】
✓ [共识观点 1] —— 所有模型均同意
✓ [共识观点 2] —— 多数模型同意
## 【关键分歧】
⚡ **在[议题]上的分歧**:
- 观点阵营 A: ...
- 观点阵营 B: ...
- 观点阵营 C: ...
## 【独特洞察】
💡 [某个模型独有的深刻观点]: ...
💡 [另一个模型的创新视角]: ...
## 【综合分析与建议】
基于以上分析,推荐方案/策略: ...
'''
# 5. 替换原始消息内容
body["messages"][user_message_index]["content"] = merge_prompt
print("提示词已成功动态替换。")
return body

View File

@@ -1 +0,0 @@
{}

View File

@@ -0,0 +1,207 @@
import logging
from typing import List, Optional
from pydantic import BaseModel
class Pipeline:
"""
This pipeline optimizes the prompt used for multi-model summarization requests.
It intercepts the request intended to summarize responses from various models,
extracts the original user query and the individual model answers,
and constructs a new, more detailed and structured prompt.
The optimized prompt guides the summarizing model to act as an expert analyst,
synthesizing the inputs into a high-quality, comprehensive integrated report.
"""
class Valves(BaseModel):
# Specifies target pipeline IDs (models) this filter will attach to.
# Use ["*"] to connect to all pipelines.
pipelines: List[str] = ["*"]
# Assigns priority to the filter pipeline.
# Determines execution order (lower numbers execute first).
priority: int = 0
# Specifies model ID for analysis and summarization.
# If set, the aggregate request will be redirected to this model.
model_id: Optional[str] = None
# Trigger prefix for aggregate requests.
# Used to identify if it is an aggregate synthesis request.
trigger_prefix: str = (
"You have been provided with a set of responses from various models to the latest user query"
)
# Marker for parsing the original query start
query_start_marker: str = 'the latest user query: "'
# Marker for parsing the original query end
query_end_marker: str = '"\n\nYour task is to'
# Marker for parsing model responses start
response_start_marker: str = "Responses from models: "
def __init__(self):
self.type = "filter"
self.name = "wisdom_synthesizer"
self.valves = self.Valves()
async def on_startup(self):
pass
async def on_shutdown(self):
pass
async def inlet(self, body: dict, user: Optional[dict] = None) -> dict:
"""
Entry point for the pipeline filter.
Checks if the request is an aggregate request. If yes, parses the original prompt,
extracts query & responses, builds a dynamically-structured new prompt,
and replaces the original message content.
"""
logging.info(f"pipe:{__name__}")
messages = body.get("messages", [])
if not messages:
return body
user_message_content = ""
user_message_index = -1
for i in range(len(messages) - 1, -1, -1):
if messages[i].get("role") == "user":
content = messages[i].get("content", "")
if isinstance(content, list):
text_parts = []
for item in content:
if isinstance(item, dict) and item.get("type") == "text":
text_parts.append(item.get("text", ""))
elif isinstance(item, str):
text_parts.append(item)
user_message_content = "".join(text_parts)
elif isinstance(content, str):
user_message_content = content
user_message_index = i
break
if user_message_index == -1:
return body
if isinstance(user_message_content, str) and user_message_content.startswith(
self.valves.trigger_prefix
):
logging.info("Detected aggregate request, modifying prompt.")
if self.valves.model_id:
logging.info(f"Redirecting request to model: {self.valves.model_id}")
body["model"] = self.valves.model_id
query_start_phrase = self.valves.query_start_marker
query_end_phrase = self.valves.query_end_marker
start_index = user_message_content.find(query_start_phrase)
end_index = user_message_content.find(query_end_phrase)
original_query = ""
if start_index != -1 and end_index != -1:
original_query = user_message_content[
start_index + len(query_start_phrase) : end_index
]
responses_start_phrase = self.valves.response_start_marker
responses_start_index = user_message_content.find(responses_start_phrase)
responses_text = ""
if responses_start_index != -1:
responses_text = user_message_content[
responses_start_index + len(responses_start_phrase) :
]
import re
responses = [
part.strip() for part in re.split(r'\n?\"\"\"\n?', responses_text) if part.strip()
]
responses_section = ""
for i, response in enumerate(responses):
responses_section += f'''"""
[Complete Response from Model {i + 1}]
{response}
"""
'''
merge_prompt = f'''# Role Definition
You are an experienced Chief Analyst processing analysis reports from multiple independent AI expert teams regarding the same question. Your task is to perform deep integration, critical analysis, and distill a structured, insightful, and highly actionable comprehensive report for decision-makers.
# Original User Query
{original_query}
# Input Format Instruction ⚠️ IMPORTANT
The responses from various models have been accurately identified and separated using an artificial """ (triple quote) delimiter. The system has extracted these distinct answers; you must now analyze based on the separated content below.
**Separated Model Responses**:
{responses_section}
# Core Tasks
Do not simply copy or concatenate the original reports. Use your professional analytical skills to complete the following steps:
## 1. Analysis & Evaluation
- **Accurate Separation**: Verified boundaries using the """ delimiter.
- **Credibility Assessment**: Critically examine each report for potential biases, errors, or inconsistencies.
- **Logic Tracing**: Smooth out core arguments and reasoning chains.
## 2. Insight Extraction
- **Identify Consensus**: Find points or recommendations uniformly mentioned across models. This represents the core facts or robust strategies.
- **Highlight Divergences**: Explicitly state key disagreements in perspectives, methods, or forecasts.
- **Capture Highlights**: Unearth innovative views found only in a single report.
## 3. Comprehensive Reporting
Based on the analysis above, generate a synthesis containing:
### **【Core Consensus】**
- List key information or advice agreed upon by models.
- Annotate coverage (e.g., "All models agree" or "Majority of models").
### **【Key Divergences】**
- Contrast different viewpoints on core issues clearly.
- Use descriptive references (e.g., "Perspective Camp A vs B").
### **【Unique Insights】**
- Present high-value unique advice or perspectives from standalone reports.
### **【Synthesis & Recommendation】**
- **Integration**: A balanced final analysis optimized by your professional judgment.
- **Recommendation**: Formulate actionable blended strategies.
# Format Requirements
- Concise language, clear logic, distinct structure.
- Use bolding, lists, and headings for readability.
- **Language Alignment**: You MUST respond in the **SAME LANGUAGE** as the `Original User Query` above (e.g., if the user query is in Chinese, reply in Chinese; if in English, reply in English). Translate all section headers for your output.
# Output Structure Example
Output should follow this structure:
## 【Core Consensus】
✓ [Consensus Point 1] —— All models agree
✓ [Consensus Point 2] —— Majority of models agree
## 【Key Divergences】
⚡ **Divergence on [Topic]**:
- Perspective Camp A: ...
- Perspective Camp B: ...
## 【Unique Insights】
💡 [Insight from Model A]: ...
💡 [Insight from Model B]: ...
## 【Synthesis & Recommendation】
Based on the analysis above, recommended strategies: ...
'''
body["messages"][user_message_index]["content"] = merge_prompt
logging.info("Prompt dynamically replaced successfully.")
return body

View File

@@ -1,6 +1,6 @@
# GitHub Copilot SDK Pipe for OpenWebUI
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.10.1 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -26,11 +26,25 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
---
## ✨ v0.10.1: RichUI Default & Improved HTML Display
## Install with Batch Install Plugins
- **🎨 RichUI Default HTML Display**: Changed default HTML embed type from 'artifacts' to 'richui' for direct, seamless rendering in OpenWebUI chat interface
- **📝 Enhanced System Prompt**: Updated guidance to recommend RichUI mode for HTML presentation by default, with artifacts only when explicitly requested by users
- **⚡ Smoother Workflow**: Eliminates unnecessary modal interactions, allowing agents to display interactive components directly in conversation
If you already use [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins), you can install or update this plugin with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
## ✨ v0.12.0: Adaptive Actions Console, Stream Deduplication & Full TTFT Profiling
- **📊 Predictive Adaptive Console**: Automatically models continuous decision layouts using `interactive_controls` state tables on the per-session workspace database so visual panels don't go stale.
- **🛡️ Stream Overlap Deduplication**: Mitigated overlay dual delivery bugs on `assistant.message_delta` frames using conservative overlap trimming rules during turn resumptions.
- **⏱️ Segmented Profiling Loadtimes**: Fine-grained timers identifying local startup overhead and pure cloud network turnaround time tracking calibration.
- **🧹 Eliminate Redundancies**: Reduced redundant secondary heavy `_parse_mcp_servers()` loops inside session resumes for faster handshake callbacks.
---
@@ -45,6 +59,59 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
---
## 🚀 Quick Start (Read This First)
If you only want to know how to use this plugin, read these sections in order:
1. **Quick Start**
2. **How to Use**
3. **Core Configuration**
Everything else is optional or advanced.
1. **Install the Pipe**
- **Recommended**: Use **Batch Install Plugins** and select this plugin.
- **Manual**: OpenWebUI -> **Workspace** -> **Functions** -> create a new function -> paste `github_copilot_sdk.py`.
2. **Install the Companion Files Filter** if you want uploaded files to reach the Pipe as raw files.
3. **Configure one credential path**
- `GH_TOKEN` for official GitHub Copilot models
- or `BYOK_API_KEY` for OpenAI / Anthropic
4. **Start a new chat and use it normally**
- Select this Pipe's model
- Ask your task in plain language
- Upload files when needed
## 🧭 How to Use
You usually **do not** need to mention tools, skills, internal parameters, or RichUI syntax. Just describe the task naturally.
| Scenario | What you do | Example |
| :--- | :--- | :--- |
| Daily coding / debugging | Ask normally in chat | `Fix the failing tests and explain the root cause.` |
| File analysis | Upload files and ask normally | `Summarize this Excel file and chart the monthly trend.` |
| Long tasks | Ask for the outcome; the Pipe handles planning, status, and TODO tracking automatically | `Refactor this plugin and keep the docs in sync.` |
| HTML reports / dashboards | Ask the agent to generate a report or dashboard | `Create an interactive architecture overview for this repo.` |
> [!TIP]
> Ordinary users only need to remember one rule: if you ask for an interactive HTML result, the Pipe will usually use **RichUI** automatically. Only mention **artifacts** when you explicitly want artifacts-style output.
## 💡 What RichUI actually means
**RichUI = the generated HTML page is rendered directly inside the chat window.**
You can think of it as **a small interactive page inside the conversation**.
- If the agent generates a dashboard, report, timeline, architecture page, or explainer page, you may see RichUI.
- If you are just asking normal coding questions, debugging, writing, or file analysis tasks, you can ignore RichUI completely.
- You do **not** need to write XML, HTML tags, or special RichUI attributes. Just describe the result you want.
| What you ask for | What happens |
| :--- | :--- |
| `Fix this failing test` | Normal chat response. RichUI is not important here. |
| `Create an interactive dashboard for this repo` | RichUI is used by default. |
| `Generate this as artifacts` | Artifacts mode is used instead of RichUI. |
| `Build a project summary page if that helps explain it better` | The agent decides whether a page is useful. |
## ✨ Key Capabilities
- **🔑 Unified Intelligence (Official + BYOK)**: Seamlessly switch between official GitHub Copilot models and your own models (OpenAI, Anthropic, DeepSeek, xAI) via **Bring Your Own Key** mode.
@@ -68,6 +135,25 @@ This is a powerful **GitHub Copilot SDK** Pipe for **OpenWebUI** that provides a
> "Install this skill: <https://github.com/nicobailon/visual-explainer>".
> This skill is specifically optimized for generating high-quality visual components and integrates perfectly with this Pipe.
### 🎛️ How RichUI works in normal use
For normal users, the rule is simple:
1. Ask for the result you want.
2. The AI decides whether a normal chat reply is enough.
3. If a page or dashboard would explain things better, the AI creates it automatically and shows it in chat.
You do **not** need to write XML tags, HTML snippets, or RichUI attributes yourself.
Examples:
- `Explain this repository structure.`
- `If useful, present this as an interactive architecture page.`
- `Turn this CSV into a simple dashboard.`
> [!TIP]
> Only mention **artifacts** when you explicitly want artifacts-style output. Otherwise, let the AI choose the best presentation automatically.
---
## 🧩 Companion Files Filter (Required for raw files)
@@ -127,17 +213,27 @@ Standard users can override these settings in their individual Profile/Function
---
### 📤 Enhanced Publishing & Interactive Components
### 📤 HTML result behavior (advanced)
The `publish_file_from_workspace` tool now uses a clearer delivery contract for production use:
You can skip this section unless you are directly using `publish_file_from_workspace(...)`.
- **Artifacts mode (`artifacts`, default)**: Agent returns `[Preview]` + `[Download]` and may output `html_embed` in a ```html block for direct chat rendering.
- **Rich UI mode (`richui`)**: Agent returns `[Preview]` + `[Download]` only; integrated preview is rendered automatically via emitter (no iframe block in message).
- **📄 PDF delivery safety rule**: Always output Markdown links only (`[Preview]` + `[Download]` when available). **Do not embed PDF via iframe/html blocks.**
- **⚡ Stable dual-channel publishing**: Keeps interactive viewing and persistent file download aligned across local/object-storage backends.
- **✅ Status integration**: Emits real-time publishing progress and completion feedback to the OpenWebUI status bar.
In plain language:
- `richui` = show the generated HTML directly inside the chat
- `artifacts` = use artifacts-style HTML delivery when you explicitly want that style
Internally, this behavior is controlled by the `embed_type` parameter of `publish_file_from_workspace(...)`.
- **Rich UI mode (`richui`, default for HTML)**: The agent returns `[Preview]` + `[Download]` only. OpenWebUI renders the interactive preview automatically after the message.
- **Artifacts mode (`artifacts`)**: Use this only when you explicitly want artifacts-style HTML delivery.
- **📄 PDF safety rule**: Always return Markdown links only (`[Preview]` / `[Download]` when available). Do not embed PDFs with iframe or HTML blocks.
- **⚡ Stable dual-channel publishing**: Keeps interactive viewing and persistent file download aligned across local and object-storage backends.
- **✅ Status integration**: Emits publishing progress and completion feedback to the OpenWebUI status bar.
- **📘 Publishing Tool Guide (GitHub)**: [publish_file_from_workspace Guide](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/pipes/github-copilot-sdk/PUBLISH_FILE_FROM_WORKSPACE.md)
> [!TIP]
> Most users do not need to set `embed_type` manually. Ask for a report or dashboard normally. Only say `use artifacts` when you specifically want artifacts-style presentation. If you are not calling `publish_file_from_workspace(...)` yourself, you can usually ignore this parameter.
---
### 🧩 OpenWebUI Skills Bridge & `manage_skills` Tool

View File

@@ -1,6 +1,6 @@
# GitHub Copilot Official SDK Pipe
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.10.1 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v0.12.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -27,11 +27,25 @@
---
## ✨ v0.10.1RichUI 默认展示与 HTML 渲染改进
## 使用 Batch Install Plugins 安装
- **🎨 RichUI 默认 HTML 显示**:将默认 HTML 嵌入类型从 'artifacts' 改为 'richui',在 OpenWebUI 聊天界面中实现直观无缝的渲染效果
- **📝 增强系统提示词**:更新系统提示词指导,默认推荐 RichUI 模式展示 HTML 内容,仅当用户显式请求时使用 artifacts 模式
- **⚡ 更顺畅的工作流**:消除不必要的弹窗交互,让 Agent 能直接在对话中展示交互式组件
如果你已经安装了 [Batch Install Plugins from GitHub](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins),可以用下面这句来安装或更新当前插件:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
## ✨ v0.12.0:自适应动作面板、流排重拦截与全链路 TTFT 测定
- **📊 连续自适应看板 (Adaptive Actions Console)**:自动在 `interactive_controls` 辅助常驻状态表中追踪动作,引导 LLM 有选择性地在最新输出中展示最可能用到的点击控制面板,实现不翻页连续持久化点击操作。
- **🛡️ 叠加流排重拦截 (Deduplicate Stream overlap)**:对接 `_dedupe_stream_chunk` 保守重叠裁剪,彻底消除二轮对话流重叠叠加异常。
- **⏱️ 分段 ⏱️ Profiling 埋点**:拆装本地预热阻断与云端网络 Trip 数据时间,直观测算 Time-to-First-Byte。
- **🧹 消除冗余解析**:剔除 Resume 过程对 MCP 的二次昂贵循环,提效握手微观时延。
---
@@ -46,6 +60,59 @@
---
## 🚀 最短上手路径(先看这里)
如果你现在最关心的是“这个插件到底怎么用”,建议按这个顺序阅读:
1. **最短上手路径**
2. **日常怎么用**
3. **核心配置**
其他章节都属于补充说明或进阶内容。
1. **安装 Pipe**
- **推荐**:使用 **Batch Install Plugins** 安装并勾选当前插件。
- **手动**OpenWebUI -> **Workspace** -> **Functions** -> 新建 Function -> 粘贴 `github_copilot_sdk.py`
2. **如果你要处理上传文件**,再安装配套的 `GitHub Copilot SDK Files Filter`
3. **至少配置一种凭据**
- `GH_TOKEN`:使用 GitHub 官方 Copilot 模型
- `BYOK_API_KEY`:使用 OpenAI / Anthropic 自带 Key
4. **新建对话后直接正常提需求**
- 选择当前 Pipe 的模型
- 像平时一样描述任务
- 需要时上传文件
## 🧭 日常怎么用
大多数情况下,你**不需要**主动提 tools、skills、内部参数或 RichUI 语法,直接自然描述任务即可。
| 场景 | 你怎么做 | 示例 |
| :--- | :--- | :--- |
| 日常编码 / 排错 | 直接在聊天里提需求 | `修复失败的测试,并解释根因。` |
| 文件分析 | 上传文件后直接提需求 | `总结这个 Excel并画出每月趋势图。` |
| 长任务 | 只要说出目标即可Pipe 会自动处理规划、状态提示和 TODO 跟踪 | `重构这个插件,并同步更新文档。` |
| HTML 报告 / 看板 | 直接让 Agent 生成交互式报告或看板 | `帮我生成这个仓库的交互式架构总览。` |
> [!TIP]
> 普通用户只要记住一条:如果你让 Agent 生成交互式 HTML 结果,这个 Pipe 通常会自动使用 **RichUI**。只有当你明确想要 artifacts 风格时,才需要特别说明。
## 💡 RichUI 到底是什么意思?
**RichUI = Agent 生成的 HTML 页面,会直接显示在聊天窗口里。**
你可以把它理解为:**对话里面直接出现一个可交互的小网页 / 小看板**。
- 如果 Agent 生成的是看板、报告、时间线、架构图页面或说明型页面,你就可能会看到 RichUI。
- 如果你只是正常问代码问题、调试、写文档、分析文件,其实可以完全忽略 RichUI。
- 你**不需要**自己写 XML、HTML 标签或任何特殊 RichUI 属性,直接描述你想要的结果即可。
| 你怎么说 | 系统会怎么做 |
| :--- | :--- |
| `修复这个失败测试` | 正常聊天回复,这时 RichUI 基本不重要。 |
| `帮我生成一个交互式仓库看板` | 默认使用 RichUI。 |
| `请用 artifacts 形式生成` | 改用 artifacts而不是 RichUI。 |
| `如果做成页面更清楚,就帮我做成页面` | AI 会自己判断页面是否更合适。 |
## ✨ 核心能力 (Key Capabilities)
- **🔑 统一智能体验 (官方 + BYOK)**: 自由切换官方模型与自定义服务商OpenAI, Anthropic, DeepSeek, xAI支持 **BYOK (自带 Key)** 模式。
@@ -69,6 +136,25 @@
> “请安装此技能:<https://github.com/nicobailon/visual-explainer”。>
> 该技能专为生成高质量可视化组件而设计,能够与本 Pipe 完美协作。
### 🎛️ RichUI 在日常使用里怎么理解
对普通用户来说,规则很简单:
1. 直接说出你想要的结果。
2. AI 会自己判断普通聊天回复是否已经足够。
3. 如果做成页面、看板或可视化会更清楚AI 会自动生成并直接显示在聊天里。
你**不需要**自己写 XML 标签、HTML 片段或 RichUI 属性。
例如:
- `请解释这个仓库的结构。`
- `如果用交互式架构页更清楚,就做成页面。`
- `把这个 CSV 做成一个简单看板。`
> [!TIP]
> 只有当你明确想要 **artifacts 风格** 时,才需要特别说明。其他情况下,直接让 AI 自动选择最合适的展示方式即可。
---
## 🧩 配套 Files Filter原始文件必备
@@ -76,7 +162,7 @@
`GitHub Copilot SDK Files Filter` 是本 Pipe 的配套插件,用于阻止 OpenWebUI 默认 RAG 在 Pipe 接手前抢先处理上传文件。
- **作用**: 将上传文件移动到 `copilot_files`,让 Pipe 能直接读取原始二进制。
- **必要性**: 若未安装,文件可能被提前解析/向量化Agent 到原始文件。
- **必要性**: 若未安装,文件可能被提前解析/向量化Agent 可能拿不到原始文件。
- **v0.1.3 重点**:
- 修复 BYOK 模型 ID 识别(支持 `github_copilot_official_sdk_pipe.xxx` 前缀匹配)。
- 新增双通道调试日志(`show_debug_log`):后端 logger + 浏览器控制台。
@@ -161,6 +247,28 @@
---
## 📤 HTML 结果展示方式(进阶)
如果你没有直接使用 `publish_file_from_workspace(...)`,这一节可以跳过。
先用一句人话解释:
- `richui` = 生成的 HTML 直接显示在聊天里
- `artifacts` = 你明确想要 artifacts 风格时使用的另一种 HTML 交付方式
在内部实现上,这个行为由 `publish_file_from_workspace(..., embed_type=...)` 控制。
- **RichUI 模式(`richui`HTML 默认)**Agent 只返回 `[Preview]` + `[Download]`,聊天结束后由 OpenWebUI 自动渲染交互预览。
- **Artifacts 模式(`artifacts`**:只有在你明确想要 artifacts 风格展示时再使用。
- **PDF 安全规则**PDF 只返回 Markdown 链接,不要用 iframe / HTML block 嵌入。
- **双通道发布**:同时兼顾对话内查看与持久下载。
- **状态提示**:发布过程会同步显示在 OpenWebUI 状态栏。
> [!TIP]
> 如果你只是日常使用这个 Pipe通常不需要手动提 `embed_type`。直接说“生成一个交互式报告 / 看板”即可;只有你明确想要 artifacts 风格时再特别说明。如果你并没有直接调用 `publish_file_from_workspace(...)`,那通常可以忽略这个参数。
---
## 🤝 支持 (Support)
如果这个插件对你有帮助,欢迎到 [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) 点个 Star这将是我持续改进的动力感谢支持。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
[![](https://img.shields.io/badge/OpenWebUI%20Community-Get%20Plugin-blue?style=for-the-badge)](https://openwebui.com/posts/ce96f7b4-12fc-4ac3-9a01-875713e69359)
## Overview
This release brings significant performance optimizations and stability enhancements. We fixed a critical bug in the client management logic, eliminating the 1-2s process startup latency between turns and significantly improving Time to First Token (TTFT). Additionally, the plugin now supports a pure BYOK mode and features improved environment isolation for concurrent user requests.
[**View Plugin Source & Documentation**](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipes/github-copilot-sdk)
## New Features
- **🔑 Pure BYOK Mode**: Allows the plugin to operate without a `GH_TOKEN` by using custom API keys (OpenAI/Anthropic) via BYOK Valves.
- **🩺 Smart Stall Detection**: Integrated `client.ping()` into the timeout logic. The system now "pokes" the underlying process before aborting, preventing the termination of slow but healthy long-running tasks.
- **🧹 Smart TODO Visibility**: The TODO List widget is now automatically hidden in subsequent chats once all tasks are marked as completed, keeping the UI clean.
## Bug Fixes
- **🚀 Major Performance Optimization**: Fixed a regression where the shared singleton client pool was incorrectly terminated after each response. Restored 1-2s startup speed for all follow-up messages.
- **🛡️ Cross-user Isolation**: Redesigned environment variable injection to prevent token pollution during concurrent requests from different users.
- **📏 RichUI Height Stability**: Fixed the infamous infinite vertical growth bug in embedded HTML components by refining the height measurement and breaking the ResizeObserver feedback loop.
## Migration Notes
- If you previously relied on `GH_TOKEN` for standard Copilot models but want to switch to a pure BYOK setup, you can now safely clear the `GH_TOKEN` Valve and only configure `BYOK_BASE_URL` and `BYOK_API_KEY`.

View File

@@ -0,0 +1,23 @@
[![](https://img.shields.io/badge/OpenWebUI%20%E7%A4%BE%E5%8C%BA-%E8%8E%B7%E5%8F%96%E6%8F%92%E4%BB%B6-blue?style=for-the-badge)](https://openwebui.com/posts/ce96f7b4-12fc-4ac3-9a01-875713e69359)
## Overview
本次更新带来了重大的性能优化与稳定性提升。我们修复了客户端管理逻辑中的关键 Bug消除了多轮对话中由于进程频繁重启导致的 1-2 秒冷启动延迟显著优化了首字响应速度TTFT。此外插件现在支持纯 BYOK 运行模式,并针对多用户并发请求强化了环境隔离机制。
[**查看插件源码与文档**](https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/pipes/github-copilot-sdk)
## 新功能
- **🔑 纯 BYOK 模式支持**:解除对 `GH_TOKEN` 的强制依赖。现在您可以仅通过配置 BYOK 选项(如 OpenAI/Anthropic 密钥)来完整运行插件。
- **🩺 智能防挂死探测**:在超时逻辑中集成了 `client.ping()`。系统会在强行中断前先探测底层进程存活状态,有效避免误杀正在处理复杂长任务的健康进程。
- **🧹 智能 TODO 显隐**:优化了 TODO List 小组件显示策略。当所有子任务标记为完成后,下一次聊天将自动隐藏该组件,保持界面清爽。
## 问题修复
- **🚀 核心性能修复**:修复了一个导致共享单例客户端池在每次响应后被误停止的 Bug。恢复了后续对话中 1-2 秒的极速启动能力。
- **🛡️ 增强并发安全性**:重构了环境变量注入逻辑,实现了严格的用户级环境隔离,彻底杜绝了高并发场景下多用户 Token 互相污染的风险。
- **📏 RichUI 稳定性增强**:通过改进高度测量算法并打破 ResizeObserver 递归反馈链,彻底解决了嵌入式 HTML 组件高度无限增长的问题。
## 迁移指南
- 如果您之前为了兼容性同时配置了 `GH_TOKEN` 和 BYOK现在您可以安全地移除 `GH_TOKEN`,仅保留 BYOK 相关配置。

View File

@@ -0,0 +1,27 @@
# v0.12.0 Release Notes
This update (`v0.12.0`) delivers a structural reinforcement resolving stream duplication/overlays during prompt resumes, and introduces highly requested predictive control surface sustainability.
## 📊 New Features
### 1. Predictive Adaptive Actions Console
Injected a **Predictive Adaptive Controller** design directive into the system prompt context.
* **Continuity Architecture**: Micro-views (`<iframe>`, `<richui>`, or HTML embeds) are now recognized by the LLM as Dynamic Operational State machines, preventing the panel from going stale/unclicked between new conversational turns.
* **Physical Isolation & Persistence**: The Pipe now pre-emptively initializes an **`interactive_controls` state table** in the per-session `session.db` workspace database. The LLM can use its `sql` tool to track continuous actions reliably.
* **Selective Recall**: Evaluates next-turn likelihoods natively to include *only* relevant unclicked control bars into the latest response stream so you don't scroll back up to click.
---
## 🛠️ Bug Fixes
1. **Stream Overlap Deduplication**:
* Resolved concurrent string duplication overlay bugs on `assistant.message_delta` frames (e.g., repeating prefixes) by enforcing strict conservative overlap trimming rules during turn resumptions.
2. **TTFT Fine-grained Profiling**:
* Deployed micro-segment timers separating local subprocess setups (~1.6s) from cloud network intervals (~2.3s) for full accounting calibration data readout directly in browser consoles.
3. **Eliminate Redundancies**:
* Cut redundant secondary heavy `_parse_mcp_servers()` loops inside session resume packager for slight performance speed improvements.
---
## 📖 Docs Update
* Local and Mirror docs (`index.md`, `github-copilot-sdk.md`) version synchronization pushed up to `0.12.0`.

View File

@@ -0,0 +1,27 @@
# v0.12.0 版本发布说明 (Release Notes)
针对二轮对话Resume Session时输出流式重复叠加以及看板控件不持久的痛点本次 `v0.12.0` 带来了一次结构性的功能加固。
## 📊 新功能 (New Features)
### 1. 连续自适应看板 (Adaptive Actions Console)
在系统提示词层级注入了 **Predictive Adaptive Controller** 预测性控制面板指南。
* 大模型现在被引导去感知自己生成的 `<iframe>` 或富文本动作面板是一个“高度状态化的连续应用”,而非单次抛弃式气泡。
* **物理级隔离与持久化**:底层 `.pipe_impl` 现已透明为本次会话初始化了 `session.db` 空间中的 **`interactive_controls` 辅助常驻状态表**。大模型可以通过调用 `sql` 工具记录和跨 Turn 读取哪些动作目前依然活跃。
* **有选择性召回 (Selective Recall)**:结合本轮上下文,大模型只在输出末端带上“逻辑概率最高”的幸存按钮,保证不翻页就能持续点击、协同工作,不造成消息轰炸或错乱。
---
## 🛠️ 问题修复 (Bug Fixes)
1. **叠加重复输出剔除 (Deduplicate Stream overlap)**
*`assistant.message_delta` 时,严格对接 `_dedupe_stream_chunk` 保守重置算法,过滤掉了 CLI 多路通道在极速握手期间重播的上轮前缀,彻底解决 `🎉 删 🎉 删除成功` 这类叠加显示错误。
2. **耗时精密度测定 (Fine-grained TTFT Profiling)**
* 针对 First-Byte Latency 增加了分步测速:把 Process 初始化 (1.6s) 与网络云端Trip (2.3s) 严格通过时间差算出。排除了计算漏电。
3. **消除冗余解析**
* 移除了 `resume_params` 时不必要重复触发的高昂 MCP 解析迭代,降低微观响应时延。
---
## 📖 文档更新 (Docs)
* 本地与 docs 镜像页 (`index.zh.md`, `github-copilot-sdk.zh.md`) 版本同步推至 `0.12.0`

View File

@@ -1,39 +0,0 @@
# iFlow Official SDK Pipe
This plugin integrates the [iFlow SDK](https://platform.iflow.cn/cli/sdk/sdk-python) into OpenWebUI as a `Pipe`.
## Features
- **Standard iFlow Integration**: Connects to the iFlow CLI process via WebSocket (ACP).
- **Auto-Process Management**: Automatically starts the iFlow process if it's not running.
- **Streaming Support**: Direct streaming from iFlow to the chat interface.
- **Status Updates**: Real-time status updates in the UI (thinking, tool usage, etc.).
- **Tool Execution Visibility**: See when iFlow is calling and completing tools.
## Configuration
Set the following `Valves`:
- `IFLOW_PORT`: The port for the iFlow CLI process (default: `8090`).
- `IFLOW_URL`: The WebSocket URL (default: `ws://localhost:8090/acp`).
- `AUTO_START`: Automatically start the process (default: `True`).
- `TIMEOUT`: Request timeout in seconds.
- `LOG_LEVEL`: SDK logging level (DEBUG, INFO, etc.).
## Installation
This plugin requires both the **iFlow CLI** binary and the **iflow-cli-sdk** Python package.
### 1. Install iFlow CLI (System level)
Run the following command in your terminal (Linux/macOS):
```bash
bash -c "$(curl -fsSL https://platform.iflow.cn/cli/install.sh)"
```
### 2. Install Python SDK (OpenWebUI environment)
```bash
pip install iflow-cli-sdk
```

View File

@@ -1,37 +0,0 @@
# iFlow 官方 SDK Pipe 插件
此插件将 [iFlow SDK](https://platform.iflow.cn/cli/sdk/sdk-python) 集成到 OpenWebUI 中。
## 功能特性
- **标准 iFlow 集成**:通过 WebSocket (ACP) 连接到 iFlow CLI 进程。
- **自动进程管理**:如果 iFlow 进程未运行,将自动启动。
- **流式输出支持**:支持从 iFlow 到聊天界面的实时流式输出。
- **实时状态更新**:在 UI 中实时显示助手状态(思考中、工具调用等)。
- **工具调用可视化**:实时反馈 iFlow 调用及完成工具的过程。
## 配置项 (Valves)
- `IFLOW_PORT`iFlow CLI 进程端口(默认:`8090`)。
- `IFLOW_URL`WebSocket 地址(默认:`ws://localhost:8090/acp`)。
- `AUTO_START`:是否自动启动进程(默认:`True`)。
- `TIMEOUT`:请求超时时间(秒)。
- `LOG_LEVEL`SDK 日志级别DEBUG, INFO 等)。
## 安装说明
此插件同时依赖 **iFlow CLI** 二进制文件和 **iflow-cli-sdk** Python 包。
### 1. 安装 iFlow CLI (系统层级)
在系统中执行以下命令(适用于 Linux/macOS
```bash
bash -c "$(curl -fsSL https://gitee.com/iflow-ai/iflow-cli/raw/main/install.sh)"
```
### 2. 安装 Python SDK (OpenWebUI 环境)
```bash
pip install iflow-cli-sdk
```

View File

@@ -1,544 +0,0 @@
"""
title: iFlow Official SDK Pipe
author: Fu-Jie
author_url: https://github.com/Fu-Jie/openwebui-extensions
funding_url: https://github.com/open-webui
description: Integrate iFlow SDK. Supports dynamic models, multi-turn conversation, streaming, tool execution, and task planning.
version: 0.1.2
requirements: iflow-cli-sdk==0.1.11
"""
import shutil
import subprocess
import os
import json
import asyncio
import logging
from typing import Optional, Union, AsyncGenerator, List, Any, Dict, Literal
from pydantic import BaseModel, Field
# Setup logger
logger = logging.getLogger(__name__)
# Import iflow SDK modules with safety
IFlowClient = None
IFlowOptions = None
AssistantMessage = None
TaskFinishMessage = None
ToolCallMessage = None
PlanMessage = None
TaskStatusMessage = None
ApprovalMode = None
StopReason = None
try:
from iflow_sdk import (
IFlowClient,
IFlowOptions,
AssistantMessage,
TaskFinishMessage,
ToolCallMessage,
PlanMessage,
TaskStatusMessage,
ApprovalMode,
StopReason,
)
except ImportError:
logger.error(
"iflow-cli-sdk not found. Please install it with 'pip install iflow-cli-sdk'."
)
# Base guidelines for all users, adapted for iFlow
BASE_GUIDELINES = (
"\n\n[Environment & Capabilities Context]\n"
"You are an AI assistant operating within a high-capability Linux container environment (OpenWebUI) powered by **iFlow CLI**.\n"
"\n"
"**System Environment & User Privileges:**\n"
"- **Output Environment**: You are rendering in the **OpenWebUI Chat Page**. Optimize your output format to leverage Markdown for the best UI experience.\n"
"- **Root Access**: You are running as **root**. You have **READ access to the entire container file system**. You **MUST ONLY WRITE** to your designated persistent workspace directory.\n"
"- **STRICT FILE CREATION RULE**: You are **PROHIBITED** from creating or editing files outside of your specific workspace path. Never place files in `/root`, `/tmp`, or `/app`. All operations must use the absolute path provided in your session context.\n"
"- **iFlow Task Planning**: You possess **Task Planning** capabilities. When faced with complex requests, you SHOULD generate a structured plan. The iFlow SDK will visualize this plan as a task list for the user.\n"
"- **Tool Execution (ACP)**: You interact with tools via the **Agent Control Protocol (ACP)**. Depending on the `ApprovalMode`, your tool calls may be executed automatically or require user confirmation.\n"
"- **Rich Python Environment**: You can natively import and use any installed OpenWebUI dependencies.\n"
"\n"
"**Formatting & Presentation Directives:**\n"
"1. **Markdown Excellence**: Leverage headers, tables, and lists to structure your response professionally.\n"
"2. **Advanced Visualization**: Use **Mermaid** for diagrams and **LaTeX** for math. Always wrap Mermaid in standard ```mermaid blocks.\n"
"3. **Interactive Artifacts (HTML)**: **Premium Delivery Protocol**: For web applications, you MUST:\n"
" - 1. **Persist**: Create the file in the workspace (e.g., `index.html`).\n"
" - 2. **Publish**: Call `publish_file_from_workspace(filename='your_file.html')` (via provided tools if available). This triggers the premium embedded experience.\n"
" - **CRITICAL**: Never output raw HTML source code directly in the chat. Persist and publish.\n"
"4. **Media & Files**: ALWAYS embed generated media using `![caption](url)`. Never provide plain text links for images/videos.\n"
"5. **Dual-Channel Delivery**: Always aim to provide both an instant visual Insight in the chat AND a persistent downloadable file.\n"
"6. **Active & Autonomous**: Analyze the user's request -> Formulate a plan -> **EXECUTE** the plan immediately. Minimize user friction.\n"
)
# Sensitive extensions only for Administrators
ADMIN_EXTENSIONS = (
"\n**[ADMINISTRATOR PRIVILEGES - CONFIDENTIAL]**\n"
"Current user is an **ADMINISTRATOR**. Restricted access is lifted:\n"
"- **Full OS Interaction**: You can use shell tools to analyze any container process or system configuration.\n"
"- **Database Access**: You can connect to the **OpenWebUI Database** using credentials in environment variables.\n"
"- **iFlow CLI Debugging**: You can inspect iFlow configuration and logs for diagnostic purposes.\n"
"**SECURITY NOTE**: Protect sensitive internal details.\n"
)
# Strict restrictions for regular Users
USER_RESTRICTIONS = (
"\n**[USER ACCESS RESTRICTIONS - STRICT]**\n"
"Current user is a **REGULAR USER**. Adhere to boundaries:\n"
"- **NO Environment Access**: FORBIDDEN from accessing environment variables (e.g., via `env` or `os.environ`).\n"
"- **NO Database Access**: MUST NOT attempt to connect to OpenWebUI database.\n"
"- **NO Writing Outside Workspace**: All artifacts MUST be saved strictly inside the isolated workspace path provided.\n"
"- **Restricted Shell**: Use shell tools ONLY for operations within your isolated workspace. Do NOT explore system secrets.\n"
)
class Pipe:
class Valves(BaseModel):
IFLOW_PORT: int = Field(
default=8090,
description="Port for iFlow CLI process.",
)
IFLOW_URL: str = Field(
default="ws://localhost:8090/acp",
description="WebSocket URL for iFlow ACP.",
)
AUTO_START: bool = Field(
default=True,
description="Whether to automatically start the iFlow process.",
)
TIMEOUT: float = Field(
default=300.0,
description="Timeout for the message request (seconds).",
)
LOG_LEVEL: str = Field(
default="INFO",
description="Log level for iFlow SDK (DEBUG, INFO, WARNING, ERROR).",
)
CWD: str = Field(
default="",
description="CLI operation working directory. Empty for default.",
)
APPROVAL_MODE: Literal["DEFAULT", "AUTO_EDIT", "YOLO", "PLAN"] = Field(
default="YOLO",
description="Tool execution permission mode.",
)
FILE_ACCESS: bool = Field(
default=False,
description="Enable file system access (disabled by default for security).",
)
AUTO_INSTALL_CLI: bool = Field(
default=True,
description="Automatically install iFlow CLI if not found in PATH.",
)
IFLOW_BIN_DIR: str = Field(
default="/app/backend/data/bin",
description="Fixed path for iFlow CLI binary (recommended for persistence in Docker).",
)
# Auth Config
SELECTED_AUTH_TYPE: Literal["iflow", "openai-compatible"] = Field(
default="iflow",
description="Authentication type. 'iflow' for native, 'openai-compatible' for others.",
)
AUTH_API_KEY: str = Field(
default="",
description="API Key for the model provider.",
)
AUTH_BASE_URL: str = Field(
default="",
description="Base URL for the model provider.",
)
AUTH_MODEL: str = Field(
default="",
description="Model name to use.",
)
SYSTEM_PROMPT: str = Field(
default="",
description="System prompt to guide the AI's behavior.",
)
def __init__(self):
self.type = "pipe"
self.id = "iflow_sdk"
self.name = "iflow"
self.valves = self.Valves()
def _get_user_role(self, __user__: dict) -> str:
"""Determine if the user is an admin."""
return __user__.get("role", "user")
def _get_system_prompt(self, role: str) -> str:
"""Construct the dynamic system prompt based on user role."""
prompt = self.valves.SYSTEM_PROMPT if self.valves.SYSTEM_PROMPT else ""
prompt += BASE_GUIDELINES
if role == "admin":
prompt += ADMIN_EXTENSIONS
else:
prompt += USER_RESTRICTIONS
return prompt
async def _ensure_cli(self, _emit_status) -> bool:
"""Check for iFlow CLI and attempt installation if missing."""
async def _check_binary(name: str) -> Optional[str]:
# 1. Check in system PATH
path = shutil.which(name)
if path:
return path
# 2. Compile potential search paths
search_paths = []
# Try to resolve NPM global prefix
try:
proc = await asyncio.create_subprocess_exec(
"npm",
"config",
"get",
"prefix",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, _ = await proc.communicate()
if proc.returncode == 0:
prefix = stdout.decode().strip()
search_paths.extend(
[
os.path.join(prefix, "bin"),
os.path.join(prefix, "node_modules", ".bin"),
prefix,
]
)
except:
pass
if self.valves.IFLOW_BIN_DIR:
search_paths.extend(
[
self.valves.IFLOW_BIN_DIR,
os.path.join(self.valves.IFLOW_BIN_DIR, "bin"),
]
)
# Common/default locations
search_paths.extend(
[
os.path.expanduser("~/.iflow/bin"),
os.path.expanduser("~/.npm-global/bin"),
os.path.expanduser("~/.local/bin"),
"/usr/local/bin",
"/usr/bin",
"/bin",
os.path.expanduser("~/bin"),
]
)
for p in search_paths:
full_path = os.path.join(p, name)
if os.path.exists(full_path) and os.access(full_path, os.X_OK):
return full_path
return None
# Initial check
binary_path = await _check_binary("iflow")
if binary_path:
logger.info(f"iFlow CLI found at: {binary_path}")
bin_dir = os.path.dirname(binary_path)
if bin_dir not in os.environ["PATH"]:
os.environ["PATH"] = f"{bin_dir}:{os.environ['PATH']}"
return True
if not self.valves.AUTO_INSTALL_CLI:
return False
try:
install_loc_msg = (
self.valves.IFLOW_BIN_DIR
if self.valves.IFLOW_BIN_DIR
else "default location"
)
await _emit_status(
f"iFlow CLI not found. Attempting auto-installation to {install_loc_msg}..."
)
# Detection for package managers and official script
env = os.environ.copy()
has_npm = shutil.which("npm") is not None
has_curl = shutil.which("curl") is not None
if has_npm:
if self.valves.IFLOW_BIN_DIR:
os.makedirs(self.valves.IFLOW_BIN_DIR, exist_ok=True)
install_cmd = f"npm i -g --prefix {self.valves.IFLOW_BIN_DIR} @iflow-ai/iflow-cli@latest"
else:
install_cmd = "npm i -g @iflow-ai/iflow-cli@latest"
elif has_curl:
await _emit_status(
"npm not found. Attempting to use official shell installer via curl..."
)
# Official installer script from gitee/github as fallback
# We try gitee first as it's more reliable in some environments
install_cmd = 'bash -c "$(curl -fsSL https://gitee.com/iflow-ai/iflow-cli/raw/main/install.sh)"'
# If we have a custom bin dir, try to tell the installer (though it might not support it)
if self.valves.IFLOW_BIN_DIR:
env["IFLOW_BIN_DIR"] = self.valves.IFLOW_BIN_DIR
else:
await _emit_status(
"Error: Neither 'npm' nor 'curl' found. Cannot proceed with auto-installation."
)
return False
process = await asyncio.create_subprocess_shell(
install_cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
env=env,
)
stdout_data, stderr_data = await process.communicate()
# Even if the script returns non-zero (which it might if it tries to
# start an interactive shell at the end), we check if the binary exists.
await _emit_status(
"Installation script finished. Finalizing verification..."
)
binary_path = await _check_binary("iflow")
if binary_path:
try:
os.chmod(binary_path, 0o755)
except:
pass
await _emit_status(f"iFlow CLI confirmed at {binary_path}.")
bin_dir = os.path.dirname(binary_path)
if bin_dir not in os.environ["PATH"]:
os.environ["PATH"] = f"{bin_dir}:{os.environ['PATH']}"
return True
else:
# Script failed and no binary
error_msg = (
stderr_data.decode().strip() or "Binary not found in search paths"
)
logger.error(
f"Installation failed with code {process.returncode}: {error_msg}"
)
await _emit_status(f"Installation failed: {error_msg}")
return False
except Exception as e:
logger.error(f"Error during installation: {str(e)}")
await _emit_status(f"Installation error: {str(e)}")
return False
async def _ensure_sdk(self, _emit_status) -> bool:
"""Check for iflow-cli-sdk Python package and attempt installation if missing."""
global IFlowClient, IFlowOptions, AssistantMessage, TaskFinishMessage, ToolCallMessage, PlanMessage, TaskStatusMessage, ApprovalMode, StopReason
if IFlowClient is not None:
return True
await _emit_status("iflow-cli-sdk not found. Attempting auto-installation...")
try:
# Use sys.executable to ensure we use the same Python environment
import sys
process = await asyncio.create_subprocess_exec(
sys.executable,
"-m",
"pip",
"install",
"iflow-cli-sdk",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await process.communicate()
if process.returncode == 0:
await _emit_status("iflow-cli-sdk installed successfully. Loading...")
# Try to import again
from iflow_sdk import (
IFlowClient as C,
IFlowOptions as O,
AssistantMessage as AM,
TaskFinishMessage as TM,
ToolCallMessage as TC,
PlanMessage as P,
TaskStatusMessage as TS,
ApprovalMode as AP,
StopReason as SR,
)
# Update global pointers
IFlowClient, IFlowOptions = C, O
AssistantMessage, TaskFinishMessage = AM, TM
ToolCallMessage, PlanMessage = TC, P
TaskStatusMessage, ApprovalMode, StopReason = TS, AP, SR
return True
else:
error_msg = stderr.decode().strip()
logger.error(f"SDK installation failed: {error_msg}")
await _emit_status(f"SDK installation failed: {error_msg}")
return False
except Exception as e:
logger.error(f"Error during SDK installation: {str(e)}")
await _emit_status(f"SDK installation error: {str(e)}")
return False
async def pipe(
self, body: dict, __user__: dict, __event_emitter__=None
) -> Union[str, AsyncGenerator[str, None]]:
"""Main entry point for the pipe."""
async def _emit_status(description: str, done: bool = False):
if __event_emitter__:
await __event_emitter__(
{
"type": "status",
"data": {
"description": description,
"done": done,
},
}
)
# 0. Ensure SDK and CLI are available
if not await self._ensure_sdk(_emit_status):
return "Error: iflow-cli-sdk (Python package) missing and auto-installation failed. Please install it with `pip install iflow-cli-sdk` manually."
# 1. Update PATH to include custom bin dir
if self.valves.IFLOW_BIN_DIR not in os.environ["PATH"]:
os.environ["PATH"] = f"{self.valves.IFLOW_BIN_DIR}:{os.environ['PATH']}"
# 2. Ensure CLI is installed and path is updated
if not await self._ensure_cli(_emit_status):
return f"Error: iFlow CLI not found and auto-installation failed. Please install it to {self.valves.IFLOW_BIN_DIR} manually."
messages = body.get("messages", [])
if not messages:
return "No messages provided."
# Get the last user message
last_message = messages[-1]
content = last_message.get("content", "")
# Determine user role and construct prompt
role = self._get_user_role(__user__)
dynamic_prompt = self._get_system_prompt(role)
# Prepare Auth Info
auth_info = None
if self.valves.AUTH_API_KEY:
auth_info = {
"api_key": self.valves.AUTH_API_KEY,
"base_url": self.valves.AUTH_BASE_URL,
"model_name": self.valves.AUTH_MODEL,
}
# Prepare Session Settings
session_settings = None
try:
from iflow_sdk import SessionSettings
session_settings = SessionSettings(system_prompt=dynamic_prompt)
except ImportError:
session_settings = {"system_prompt": dynamic_prompt}
# 2. Configure iFlow Options
# Use local references to ensure we're using the freshly imported SDK components
from iflow_sdk import (
IFlowOptions as SDKOptions,
ApprovalMode as SDKApprovalMode,
)
# Get approval mode with a safe fallback
try:
target_mode = getattr(SDKApprovalMode, self.valves.APPROVAL_MODE)
except (AttributeError, TypeError):
target_mode = (
SDKApprovalMode.YOLO if hasattr(SDKApprovalMode, "YOLO") else None
)
options = SDKOptions(
url=self.valves.IFLOW_URL,
auto_start_process=self.valves.AUTO_START,
process_start_port=self.valves.IFLOW_PORT,
timeout=self.valves.TIMEOUT,
log_level=self.valves.LOG_LEVEL,
cwd=self.valves.CWD or None,
approval_mode=target_mode,
file_access=self.valves.FILE_ACCESS,
auth_method_id=self.valves.SELECTED_AUTH_TYPE if auth_info else None,
auth_method_info=auth_info,
session_settings=session_settings,
)
async def _emit_status(description: str, done: bool = False):
if __event_emitter__:
await __event_emitter__(
{
"type": "status",
"data": {
"description": description,
"done": done,
},
}
)
# 3. Stream from iFlow
async def stream_generator():
try:
await _emit_status("Initializing iFlow connection...")
async with IFlowClient(options) as client:
await client.send_message(content)
await _emit_status("iFlow is processing...")
async for message in client.receive_messages():
if isinstance(message, AssistantMessage):
yield message.chunk.text
if message.agent_info and message.agent_info.agent_id:
logger.debug(
f"Message from agent: {message.agent_info.agent_id}"
)
elif isinstance(message, PlanMessage):
plan_str = "\n".join(
[
f"{'' if e.status == 'completed' else ''} [{e.priority}] {e.content}"
for e in message.entries
]
)
await _emit_status(f"Execution Plan updated:\n{plan_str}")
elif isinstance(message, TaskStatusMessage):
await _emit_status(f"iFlow: {message.status}")
elif isinstance(message, ToolCallMessage):
tool_desc = (
f"Calling tool: {message.tool_name}"
if message.tool_name
else "Invoking tool"
)
await _emit_status(
f"{tool_desc}... (Status: {message.status})"
)
elif isinstance(message, TaskFinishMessage):
reason_msg = "Task completed."
if message.stop_reason == StopReason.MAX_TOKENS:
reason_msg = "Task stopped: Max tokens reached."
elif message.stop_reason == StopReason.END_TURN:
reason_msg = "Task completed successfully."
await _emit_status(reason_msg, done=True)
break
except Exception as e:
logger.error(f"Error in iFlow pipe: {str(e)}", exc_info=True)
error_msg = f"iFlow Error: {str(e)}"
yield error_msg
await _emit_status(error_msg, done=True)
return stream_generator()

View File

@@ -1,29 +1,30 @@
# 🎉 Introducing Batch Install Plugins v1.0.0
# 🎉 Batch Install Plugins v1.1.0
## Headline
**One-Click Batch Installation of OpenWebUI Plugins - Solving the Plugin Setup Headache**
**Interactive Plugin Picker for OpenWebUI Batch Installation**
## Introduction
Installing plugins in OpenWebUI used to be tedious: searching for plugins, downloading them one by one, and hoping everything works in your environment. Today, we're excited to announce **Batch Install Plugins from GitHub** v1.0.0 — a powerful new tool that transforms plugin installation from a chore into a single command.
Installing plugins in OpenWebUI should not feel like an all-or-nothing jump. With **Batch Install Plugins from GitHub** v1.1.0, the workflow now opens an interactive browser dialog so users can review the filtered list and choose exactly which plugins to install before the API requests begin.
## Key Highlights
### 🚀 One-Click Bulk Installation
- Install multiple plugins from any public GitHub repository with a single command
- Automatically discovers plugins and validates them
- Updates previously installed plugins seamlessly
### 🚀 Interactive Plugin Selection
- Uses the OpenWebUI `execute` event to open a custom browser dialog
- Displays the filtered plugin list with checkboxes, type filters, keyword search, plugin descriptions, and repository context
- Installs only the plugins the user keeps selected
### ✅ Smart Safety Features
- Shows a confirmation dialog with the plugin list before installation
- Users can review and approve before proceeding
- Replaces the basic confirmation event with a richer selective install flow
- Users can uncheck plugins they do not want without rewriting the request
- Removes the noisy copy-to-exclude helper when it is not needed
- Automatically excludes the tool itself from installation
### 🌍 Multi-Repository Support
Install plugins from **any public GitHub repository**, including your own community collections:
- Use one request per repository, then call the tool again to combine multiple sources
- Use one request to combine multiple repositories in a single grouped picker
- **Default**: Fu-Jie/openwebui-extensions (my personal collection)
- Works with public repositories in `owner/repo` format
- Mix and match plugins: install from my collection first, then add community collections in subsequent calls
- Works with public repositories in `owner/repo` format, separated by commas, semicolons, or new lines
- Mix and match plugins from multiple sources before installation starts
### 🔧 Container-Friendly
- Automatically handles port mapping issues in containerized deployments
@@ -37,25 +38,25 @@ Install plugins from **any public GitHub repository**, including your own commun
## How It Works: Interactive Installation Workflow
Each request handles one repository. To combine multiple repositories, send another request after the previous installation completes.
The `repo` parameter now accepts one or more `owner/repo` values separated by commas, semicolons, or new lines.
1. **Start with My Collection**
```
"Install all plugins from Fu-Jie/openwebui-extensions"
```
Review the confirmation dialog, approve, and the plugins are installed.
Review the selection dialog, keep the plugins you want checked, and then install them.
2. **Add a Community Collection**
2. **Mix in a Community Collection**
```
"Install all plugins from iChristGit/OpenWebui-Tools"
"Install all plugins from Fu-Jie/openwebui-extensions, iChristGit/OpenWebui-Tools"
```
Add more plugins from a different repository. Already installed plugins are updated seamlessly.
Review both repositories in one grouped dialog, then install only the subset you want.
3. **Install a Specific Type**
3. **Install a Specific Type Across Repositories**
```
"Install only pipe plugins from Haervwe/open-webui-tools"
"Install only pipe plugins from Haervwe/open-webui-tools, Classic298/open-webui-plugins"
```
Pick specific plugin types from another repository, or exclude certain keywords.
Pick specific plugin types across repositories, or exclude certain keywords.
4. **Use Your Own Public Repository**
```
@@ -84,23 +85,23 @@ OpenRouter API pipe integration for advanced model access.
## Usage Examples
Each line below is a separate request:
Each line below can be used directly. The third example combines repositories in one request:
```
# Start with my collection
"Install all plugins"
# Add community plugins in a new request
# Add community plugins
"Install all plugins from iChristGit/OpenWebui-Tools"
# Add only one plugin type from another repository
"Install only tool plugins from Haervwe/open-webui-tools"
# Combine repositories in one picker
"Install all plugins from Fu-Jie/openwebui-extensions, Classic298/open-webui-plugins"
# Continue building your setup
"Install only action plugins from Classic298/open-webui-plugins"
# Add only one plugin type from multiple repositories
"Install only tool plugins from Haervwe/open-webui-tools, Classic298/open-webui-plugins"
# Filter out unwanted plugins
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
"Install all plugins from Haervwe/open-webui-tools, Classic298/open-webui-plugins, exclude_keywords=test,deprecated"
# Install from your own public repository
"Install all plugins from your-username/my-plugin-collection"
@@ -110,8 +111,8 @@ Each line below is a separate request:
- **Async Architecture**: Non-blocking I/O for better performance
- **httpx Integration**: Modern async HTTP client with timeout protection
- **Comprehensive Tests**: 8 regression tests with 100% pass rate
- **Full Event Support**: Proper OpenWebUI event injection with fallback handling
- **Selective Install Flow**: The install loop now runs only for the checked plugin subset
- **Full Event Support**: Proper OpenWebUI `execute` event handling with fallback behavior
## Installation
@@ -123,7 +124,7 @@ Each line below is a separate request:
## Links
- **GitHub Repository**: https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins
- **Release Notes**: https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/v1.0.0.md
- **Release Notes**: https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/v1.1.0.md
## Community Love

View File

@@ -1,29 +1,30 @@
# 🎉 Batch Install Plugins 首发 v1.0.0
# 🎉 Batch Install Plugins v1.1.0
## 标题
**一键批量安装 OpenWebUI 插件 - 解决装机烦恼**
** OpenWebUI 批量安装带来可勾选的交互式插件选择器**
## 前言
在 OpenWebUI 中安装插件曾经很麻烦:逐个搜索、逐个下载、祈祷一切顺利。今天,我们欣然宣布 **Batch Install Plugins from GitHub** v1.0.0 的问世 — 一款强大的新工具,让插件安装从苦差事变成一条简单命令
批量安装不应该是“全装或不装”的二选一。现在,**Batch Install Plugins from GitHub** v1.1.0 新增了基于浏览器的交互式选择对话框,用户可以先查看过滤后的插件列表,再勾选真正要安装的插件,然后才开始调用安装 API
## 核心特性
### 🚀 一键批量安装
- 从任意公开 GitHub 仓库用一条命令安装多个插件
- 自动发现插件并进行验证
- 无缝更新已安装的插件
### 🚀 交互式插件选择
- 基于 OpenWebUI 的 `execute` 事件打开自定义浏览器选择对话框
- 显示带复选框、类型筛选、关键词搜索、插件描述和仓库信息的过滤结果
- 只安装用户保留勾选的插件
### ✅ 智能安全保障
- 安装前显示插件列表确认对话框
- 用户可在安装前查看和审批
- 用更丰富的选择流程替代基础 confirmation 事件
- 用户无需改写请求,也能取消勾选不想安装的插件
- 不再显示多余的“复制 exclude_keywords”提示
- 自动排除工具自身,避免重复安装
### 🌍 多仓库支持
支持从**任意公开 GitHub 仓库**安装插件,包括你自己的社区合集:
- 次请求处理一个仓库,需要时可再次调用工具来组合多个来源
- 次请求即可组合多个仓库,并在同一个分组选择器中查看
- **默认**Fu-Jie/openwebui-extensions我的个人合集
- 支持公开仓库,格式为 `owner/repo`
- 混合搭配:先从我的合集安装,再通过后续调用添加社区合集
- 支持公开仓库,格式为 `owner/repo`,可用逗号、分号或换行分隔
- 混合搭配:安装前就能在同一个对话框中选择多个来源的插件
### 🔧 容器友好
- 自动处理容器部署中的端口映射问题
@@ -37,25 +38,25 @@
## 工作流程:交互式安装
每次请求处理一个仓库。如需组合多个仓库,请在上一次安装完成后再发起下一次请求
`repo` 参数现在支持多个 `owner/repo`,可用逗号、分号或换行分隔
1. **先从我的合集开始**
```
"安装 Fu-Jie/openwebui-extensions 中的所有插件"
```
查看确认对话框,批准后开始安装。
查看选择对话框,保留想安装的勾选项后开始安装。
2. **再添加社区合集**
2. **混合加入社区合集**
```
"从 iChristGit/OpenWebui-Tools 安装所有插件"
"从 Fu-Jie/openwebui-extensions、iChristGit/OpenWebui-Tools 安装所有插件"
```
从不同仓库添加更多插件。已安装的插件会无缝更新
在一个按仓库分组的选择对话框里查看两个来源,再安装真正需要的子集
3. **按类型继续安装**
3. **跨仓库按类型继续安装**
```
"从 Haervwe/open-webui-tools 仅安装 pipe 插件"
"从 Haervwe/open-webui-tools、Classic298/open-webui-plugins 仅安装 pipe 插件"
```
从另一个仓库选择特定类型的插件,或排除某些关键词。
次性在多个仓库选择特定类型的插件,或排除某些关键词。
4. **使用你自己的公开仓库**
```
@@ -84,23 +85,23 @@ OpenRouter API pipe 集成,提供高级模型访问。
## 使用示例
下面每一行都是一次独立请求
下面每一行都可以直接使用,其中第三行演示了单次请求组合多个仓库
```
# 先从我的合集开始
"安装所有插件"
# 在下一次请求中加入社区插件
# 添加社区插件
"从 iChristGit/OpenWebui-Tools 安装所有插件"
# 从其他仓库只安装某一种类型
"从 Haervwe/open-webui-tools 安装 tool 插件"
# 在同一个选择器里组合多个仓库
"从 Fu-Jie/openwebui-extensions、Classic298/open-webui-plugins 安装所有插件"
# 继续补充你的插件组合
"从 Classic298/open-webui-plugins 安装仅 action 插件"
# 从多个仓库只安装某一种类型
"从 Haervwe/open-webui-tools、Classic298/open-webui-plugins 安装 tool 插件"
# 过滤不想安装的插件
"从 Haervwe/open-webui-tools 安装所有插件exclude_keywords=test,deprecated"
"从 Haervwe/open-webui-tools、Classic298/open-webui-plugins 安装所有插件exclude_keywords=test,deprecated"
# 从你自己的公开仓库安装
"从 your-username/my-plugin-collection 安装所有插件"
@@ -110,8 +111,8 @@ OpenRouter API pipe 集成,提供高级模型访问。
- **异步架构**:非阻塞 I/O性能更优
- **httpx 集成**:现代化异步 HTTP 客户端,包含超时保护
- **完整测试**8 个回归测试100% 通过率
- **完整事件支持**:正确处理 OpenWebUI 事件注入,提供回退机制
- **选择性安装流程**:安装循环只会处理用户最终勾选的插件子集
- **完整事件支持**:正确处理 OpenWebUI `execute` 事件,并保留回退行为
## 安装方法
@@ -123,7 +124,7 @@ OpenRouter API pipe 集成,提供高级模型访问。
## 相关链接
- **GitHub 仓库**https://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins
- **发布说明**https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/v1.0.0_CN.md
- **发布说明**https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/v1.1.0_CN.md
## 社区支持

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.0.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| By [Fu-Jie](https://github.com/Fu-Jie) · v1.1.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,13 +8,31 @@
One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
## Install with Batch Install Plugins
After you install [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) once, you can also use it to reinstall or update itself with:
```text
Install plugin from Fu-Jie/openwebui-extensions
```
When the selection dialog opens, search for this plugin, check it, and continue.
> [!IMPORTANT]
> If the official OpenWebUI Community version is already installed, remove it first. After that, Batch Install Plugins can keep this plugin updated in future runs.
> [!TIP]
> **💡 Looking to batch install or manage Workspace Skills?**
> This plugin specializes in installing global function-based plugins (Pipe, Filter, Tool, Action). If you need to manage your AI assistant's dedicated Skills, use our companion tool [OpenWebUI Skills Manager](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4), which provides full CRUD capabilities, batch discovery, and interactive selection dialogs.
## Key Features
- **One-Click Install**: Install all plugins with a single command
- **Auto-Update**: Automatically updates previously installed plugins
- **Public GitHub Support**: Install plugins from any public GitHub repository
- **Public GitHub Support**: Install plugins from one or many public GitHub repositories
- **Multi-Type Support**: Supports Pipe, Action, Filter, and Tool plugins
- **Confirmation**: Shows plugin list before installing, allows selective installation
- **Multi-Repository Picker**: Combine multiple repositories in one request and review them in a single grouped dialog
- **Interactive Selection Dialog**: Filter by repository and type, search by keyword, review plugin descriptions, then install only the checked subset
- **i18n**: Supports 11 languages
## Flow
@@ -24,7 +42,7 @@ User Input
┌─────────────────────────────────────┐
│ Discover Plugins from GitHub
│ Discover Plugins from GitHub Repos
│ (fetch file tree + parse .py) │
└─────────────────────────────────────┘
@@ -36,8 +54,8 @@ User Input
┌─────────────────────────────────────┐
│ Show Confirmation Dialog │
│ (list plugins + exclude hint)
│ Show Selection Dialog
│ (repo groups + filters + search)
└─────────────────────────────────────┘
├── [Cancel] → End
@@ -61,49 +79,23 @@ User Input
## Interactive Installation Workflow
Each request handles one repository. To mix repositories, send another request after the previous installation completes.
The `repo` parameter accepts one or more `owner/repo` values separated by commas, semicolons, or new lines.
After plugin discovery and filtering, OpenWebUI opens a browser dialog built with the `execute` event. The dialog merges results from every requested repository, groups them by repository, supports repository tags, type filters, and keyword search, and lets you check exactly which plugins to install before the API calls start.
If one user request mentions multiple repositories, keep them in the same request so the model can pass them into a single tool call.
## Quick Start: Install Popular Collections
Copy any of these prompts and paste them into your chat:
Paste this prompt into your chat:
```
# Install all from my collection (default)
Install all plugins
# Add popular community tools
Install all plugins from iChristGit/OpenWebui-Tools
# Add utility-focused extensions
Install all plugins from Haervwe/open-webui-tools
# Add mixed community implementations
Install all plugins from Classic298/open-webui-plugins
# Add function-based plugins
Install all plugins from suurt8ll/open_webui_functions
# Add OpenRouter pipe integration
Install all plugins from rbb-dev/Open-WebUI-OpenRouter-pipe
Install all plugins from Fu-Jie/openwebui-extensions, iChristGit/OpenWebui-Tools, Haervwe/open-webui-tools, Classic298/open-webui-plugins, suurt8ll/open_webui_functions, rbb-dev/Open-WebUI-OpenRouter-pipe
```
Each line is a separate request. Already installed plugins are automatically updated.
Once the dialog opens, use the repository tags, type filters, and keyword search to narrow the list before installing. Already installed plugins are automatically updated.
## Usage Examples
For more advanced usage patterns:
```
# Filter by plugin type
"Install only tool plugins from iChristGit/OpenWebui-Tools"
"Install only action plugins from Classic298/open-webui-plugins"
# Exclude specific plugins
"Install all plugins from Haervwe/open-webui-tools, exclude_keywords=test,deprecated"
# Install from your own repository
"Install all plugins from your-username/my-plugin-collection"
```
You can replace that repository list with your own collections whenever needed.
## Default Repository
@@ -131,11 +123,11 @@ For other repositories:
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | Comma-separated keywords to skip |
| `TIMEOUT` | `20` | Request timeout in seconds |
## Confirmation Timeout
## Selection Dialog Timeout
User confirmation dialogs have a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
The plugin selection dialog has a default timeout of **2 minutes (120 seconds)**, allowing sufficient time for users to:
- Read and review the plugin list
- Make installation decisions
- Check or uncheck the plugins they want
- Handle network delays
## Support

View File

@@ -1,6 +1,6 @@
# Batch Install Plugins from GitHub
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.0.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| 作者:[Fu-Jie](https://github.com/Fu-Jie) · v1.1.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
| :--- | ---: |
| ![followers](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_followers.json&label=%F0%9F%91%A5&style=flat) | ![points](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_points.json&label=%E2%AD%90&style=flat) | ![top](https://img.shields.io/badge/%F0%9F%8F%86-Top%20%3C1%25-10b981?style=flat) | ![contributions](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_contributions.json&label=%F0%9F%93%A6&style=flat) | ![downloads](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_downloads.json&label=%E2%AC%87%EF%B8%8F&style=flat) | ![saves](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_saves.json&label=%F0%9F%92%BE&style=flat) | ![views](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FFu-Jie%2Fdb3d95687075a880af6f1fba76d679c6%2Fraw%2Fbadge_views.json&label=%F0%9F%91%81%EF%B8%8F&style=flat) |
@@ -8,13 +8,31 @@
一键将 GitHub 仓库中的插件批量安装到你的 OpenWebUI 实例。
## 使用 Batch Install Plugins 安装
当你已经安装过一次 [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) 后,也可以用同一句来重新安装或更新它自己:
```text
从 Fu-Jie/openwebui-extensions 安装插件
```
当选择弹窗打开后,搜索当前插件,勾选后继续安装即可。
> [!IMPORTANT]
> 如果你已经安装了 OpenWebUI 官方社区里的同名版本请先删除旧版本否则重新安装时可能报错。删除后Batch Install Plugins 后续就可以继续负责更新这个插件。
> [!TIP]
> **💡 想要批量安装/管理 Workspace 技能 (Skills)**
> 本插件专注安装全局函数型插件Pipe/Filter/Tool/Action。如果你需要管理 AI 助手的专属技能,请使用同系列的 [OpenWebUI Skills Manager](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) 工具,它具备完整的增删改查、批量发现及可视化浮层点选能力。
## 主要功能
- 一键安装:单个命令安装所有插件
- 自动更新:自动更新之前安装过的插件
- 公开 GitHub 支持:支持从任何公开 GitHub 仓库安装插件
- 公开 GitHub 支持:支持从一个或多个公开 GitHub 仓库安装插件
- 多类型支持:支持 Pipe、Action、Filter 和 Tool 插件
- 安装确认:安装前显示插件列表,支持选择性安装
- 多仓库选择器:一次请求可合并多个仓库,并在同一个分组对话框中查看
- 交互式选择对话框:先按仓库和类型筛选、按关键词搜索并查看描述信息,再勾选要安装的插件,只安装所选子集
- 国际化:支持 11 种语言
## 流程
@@ -24,7 +42,7 @@
┌─────────────────────────────────────┐
│ 从 GitHub 发现插件
│ 从 GitHub 多仓库发现插件 │
│ (获取文件树 + 解析 .py 文件) │
└─────────────────────────────────────┘
@@ -36,8 +54,8 @@
┌─────────────────────────────────────┐
│ 显示确认对话框 │
│ (插件列表 + 排除提示)
│ 显示选择对话框 │
│ (仓库分组 + 筛选 + 搜索)
└─────────────────────────────────────┘
├── [取消] → 结束
@@ -61,49 +79,23 @@
## 交互式安装工作流
每次请求处理一个仓库。如需混合多个来源,请在上一次安装完成后再发起下一次请求
`repo` 参数现在支持多个 `owner/repo`,可用逗号、分号或换行分隔
在插件发现和过滤完成后OpenWebUI 会通过 `execute` 事件打开浏览器选择对话框。对话框会合并所有目标仓库的结果,按仓库分组展示,并支持仓库标签、类型筛选、关键词搜索和描述查看,再开始调用安装 API。
如果一次用户请求里提到了多个仓库,尽量保持在同一次请求里,让模型把它们合并到一次工具调用中。
## 快速开始:安装热门插件集
复制以下任一提示词,粘贴到你的对话框中:
复制下面这条提示词,粘贴到你的对话框中:
```
# 安装我的默认集合
安装所有插件
# 添加热门社区工具
从 iChristGit/OpenWebui-Tools 安装所有插件
# 添加实用工具扩展
从 Haervwe/open-webui-tools 安装所有插件
# 添加混合社区实现
从 Classic298/open-webui-plugins 安装所有插件
# 添加基于函数的插件
从 suurt8ll/open_webui_functions 安装所有插件
# 添加 OpenRouter 管道集成
从 rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
从 Fu-Jie/openwebui-extensions、iChristGit/OpenWebui-Tools、Haervwe/open-webui-tools、Classic298/open-webui-plugins、suurt8ll/open_webui_functions、rbb-dev/Open-WebUI-OpenRouter-pipe 安装所有插件
```
每一行是一个独立的请求。已安装的插件会自动更新。
弹窗出现后,直接用里面的仓库标签、类型筛选和关键词搜索来缩小范围再安装。已安装的插件会自动更新。
## 使用示例
更多高级用法:
```
# 按插件类型过滤
"从 iChristGit/OpenWebui-Tools 仅安装 tool 插件"
"从 Classic298/open-webui-plugins 仅安装 action 插件"
# 排除特定插件
"从 Haervwe/open-webui-tools 安装所有插件, exclude_keywords=test,deprecated"
# 从你自己的仓库安装
"从 your-username/my-plugin-collection 安装所有插件"
```
需要时,你也可以把这串仓库替换成你自己的插件仓库组合。
## 默认仓库
@@ -131,11 +123,11 @@
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 逗号分隔的跳过关键词 |
| `TIMEOUT` | `20` | 请求超时时间(秒)|
## 确认超时时间
## 选择对话框超时时间
用户确认对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
插件选择对话框的默认超时时间为 **2 分钟120 秒)**,为用户提供充足的时间来:
- 阅读和查看插件列表
- 做出安装决定
- 勾选或取消勾选想安装的插件
- 处理网络延迟
## 支持

View File

@@ -3,8 +3,9 @@ title: Batch Install Plugins from GitHub
author: Fu-Jie
author_url: https://github.com/Fu-Jie/openwebui-extensions
funding_url: https://github.com/open-webui
version: 1.0.0
description: One-click batch install plugins from GitHub repositories to your OpenWebUI instance.
version: 1.1.0
openwebui_id: c9fd6e80-d58f-4312-8fbb-214d86bbe599
description: One-click batch install plugins from one or more GitHub repositories to your OpenWebUI instance. If a user mentions multiple repositories in one request, combine them into a single tool call.
"""
import ast
@@ -15,7 +16,7 @@ import os
import re
import textwrap
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
from typing import Any, Dict, List, Optional, Set, Tuple
import httpx
from pydantic import BaseModel, Field
@@ -30,6 +31,7 @@ GITHUB_TIMEOUT = 30.0
CONFIRMATION_TIMEOUT = 120.0 # 2 minutes for user confirmation
GITHUB_API = "https://api.github.com"
GITHUB_RAW = "https://raw.githubusercontent.com"
PROJECT_REPO_URL = "https://github.com/Fu-Jie/openwebui-extensions"
SELF_EXCLUDE_HINT = "batch-install-plugins"
SELF_EXCLUDE_TERMS = (
SELF_EXCLUDE_HINT,
@@ -298,6 +300,218 @@ TRANSLATIONS = {
FALLBACK_MAP = {"zh": "zh-CN", "zh-TW": "zh-TW", "zh-HK": "zh-HK", "en": "en-US", "ko": "ko-KR", "ja": "ja-JP", "fr": "fr-FR", "de": "de-DE", "es": "es-ES", "it": "it-IT", "vi": "vi-VN"}
SELECTION_DIALOG_TEXTS = {
"en-US": {
"select_all": "Select all",
"clear_all": "Clear all",
"quick_select": "Filter by type",
"all_types": "All",
"repo_filter": "Filter by repository",
"all_repos": "All repositories",
"search_label": "Search",
"search_placeholder": "Search title, description, file path...",
"no_results": "No plugins match the current filter.",
"selected_count": "{count} selected",
"install_selected": "Install Selected",
"cancel": "Cancel",
"star_repo": "Star Repo",
"version_label": "Version",
"file_label": "File",
"description_label": "Description",
"repo_label": "Repository",
},
"zh-CN": {
"select_all": "全选",
"clear_all": "清空",
"quick_select": "按类型筛选",
"all_types": "全部",
"repo_filter": "按仓库筛选",
"all_repos": "全部仓库",
"search_label": "搜索",
"search_placeholder": "搜索标题、描述、文件路径...",
"no_results": "当前筛选条件下没有匹配的插件。",
"selected_count": "已选 {count}",
"install_selected": "安装所选插件",
"cancel": "取消",
"star_repo": "Star 仓库",
"version_label": "版本",
"file_label": "文件",
"description_label": "描述",
"repo_label": "仓库",
},
"zh-HK": {
"select_all": "全選",
"clear_all": "清空",
"quick_select": "按類型篩選",
"all_types": "全部",
"repo_filter": "按倉庫篩選",
"all_repos": "全部倉庫",
"search_label": "搜尋",
"search_placeholder": "搜尋標題、描述、檔案路徑...",
"no_results": "目前篩選條件下沒有相符的外掛。",
"selected_count": "已選 {count}",
"install_selected": "安裝所選外掛",
"cancel": "取消",
"star_repo": "Star 倉庫",
"version_label": "版本",
"file_label": "檔案",
"description_label": "描述",
"repo_label": "倉庫",
},
"zh-TW": {
"select_all": "全選",
"clear_all": "清空",
"quick_select": "按類型篩選",
"all_types": "全部",
"repo_filter": "按倉庫篩選",
"all_repos": "全部倉庫",
"search_label": "搜尋",
"search_placeholder": "搜尋標題、描述、檔案路徑...",
"no_results": "目前篩選條件下沒有符合的外掛。",
"selected_count": "已選 {count}",
"install_selected": "安裝所選外掛",
"cancel": "取消",
"star_repo": "Star 倉庫",
"version_label": "版本",
"file_label": "檔案",
"description_label": "描述",
"repo_label": "倉庫",
},
"ko-KR": {
"select_all": "전체 선택",
"clear_all": "선택 해제",
"quick_select": "유형별 필터",
"all_types": "전체",
"repo_filter": "저장소별 필터",
"all_repos": "전체 저장소",
"search_label": "검색",
"search_placeholder": "제목, 설명, 파일 경로 검색...",
"no_results": "현재 필터와 일치하는 플러그인이 없습니다.",
"selected_count": "{count}개 선택됨",
"install_selected": "선택한 플러그인 설치",
"cancel": "취소",
"star_repo": "저장소 Star",
"version_label": "버전",
"file_label": "파일",
"description_label": "설명",
"repo_label": "저장소",
},
"ja-JP": {
"select_all": "すべて選択",
"clear_all": "クリア",
"quick_select": "タイプで絞り込み",
"all_types": "すべて",
"repo_filter": "リポジトリで絞り込み",
"all_repos": "すべてのリポジトリ",
"search_label": "検索",
"search_placeholder": "タイトル、説明、ファイルパスを検索...",
"no_results": "現在の条件に一致するプラグインはありません。",
"selected_count": "{count}件を選択",
"install_selected": "選択したプラグインをインストール",
"cancel": "キャンセル",
"star_repo": "リポジトリにスター",
"version_label": "バージョン",
"file_label": "ファイル",
"description_label": "説明",
"repo_label": "リポジトリ",
},
"fr-FR": {
"select_all": "Tout sélectionner",
"clear_all": "Tout effacer",
"quick_select": "Filtrer par type",
"all_types": "Tous",
"repo_filter": "Filtrer par dépôt",
"all_repos": "Tous les dépôts",
"search_label": "Rechercher",
"search_placeholder": "Rechercher par titre, description, fichier...",
"no_results": "Aucun plugin ne correspond au filtre actuel.",
"selected_count": "{count} sélectionnés",
"install_selected": "Installer la sélection",
"cancel": "Annuler",
"star_repo": "Star le dépôt",
"version_label": "Version",
"file_label": "Fichier",
"description_label": "Description",
"repo_label": "Dépôt",
},
"de-DE": {
"select_all": "Alle auswählen",
"clear_all": "Auswahl löschen",
"quick_select": "Nach Typ filtern",
"all_types": "Alle",
"repo_filter": "Nach Repository filtern",
"all_repos": "Alle Repositories",
"search_label": "Suchen",
"search_placeholder": "Titel, Beschreibung, Dateipfad durchsuchen...",
"no_results": "Keine Plugins entsprechen dem aktuellen Filter.",
"selected_count": "{count} ausgewählt",
"install_selected": "Auswahl installieren",
"cancel": "Abbrechen",
"star_repo": "Repo mit Stern",
"version_label": "Version",
"file_label": "Datei",
"description_label": "Beschreibung",
"repo_label": "Repository",
},
"es-ES": {
"select_all": "Seleccionar todo",
"clear_all": "Limpiar",
"quick_select": "Filtrar por tipo",
"all_types": "Todos",
"repo_filter": "Filtrar por repositorio",
"all_repos": "Todos los repositorios",
"search_label": "Buscar",
"search_placeholder": "Buscar por titulo, descripcion o archivo...",
"no_results": "Ningun plugin coincide con el filtro actual.",
"selected_count": "{count} seleccionados",
"install_selected": "Instalar seleccionados",
"cancel": "Cancelar",
"star_repo": "Dar estrella",
"version_label": "Versión",
"file_label": "Archivo",
"description_label": "Descripción",
"repo_label": "Repositorio",
},
"it-IT": {
"select_all": "Seleziona tutto",
"clear_all": "Cancella",
"quick_select": "Filtra per tipo",
"all_types": "Tutti",
"repo_filter": "Filtra per repository",
"all_repos": "Tutti i repository",
"search_label": "Cerca",
"search_placeholder": "Cerca per titolo, descrizione o file...",
"no_results": "Nessun plugin corrisponde al filtro attuale.",
"selected_count": "{count} selezionati",
"install_selected": "Installa selezionati",
"cancel": "Annulla",
"star_repo": "Metti una stella",
"version_label": "Versione",
"file_label": "File",
"description_label": "Descrizione",
"repo_label": "Repository",
},
"vi-VN": {
"select_all": "Chọn tất cả",
"clear_all": "Bỏ chọn",
"quick_select": "Lọc theo loại",
"all_types": "Tất cả",
"repo_filter": "Lọc theo kho",
"all_repos": "Tất cả kho",
"search_label": "Tìm kiếm",
"search_placeholder": "Tìm theo tiêu đề, mô tả, đường dẫn tệp...",
"no_results": "Không có plugin nào khớp với bộ lọc hiện tại.",
"selected_count": "Đã chọn {count}",
"install_selected": "Cài đặt mục đã chọn",
"cancel": "Hủy",
"star_repo": "Star kho",
"version_label": "Phiên bản",
"file_label": "Tệp",
"description_label": "Mô tả",
"repo_label": "Kho",
},
}
def _resolve_language(user_language: str) -> str:
value = str(user_language or "").strip()
@@ -322,6 +536,19 @@ def _t(lang: str, key: str, **kwargs) -> str:
return text
def _selection_t(lang: str, key: str, **kwargs) -> str:
lang_key = _resolve_language(lang)
text = SELECTION_DIALOG_TEXTS.get(
lang_key, SELECTION_DIALOG_TEXTS["en-US"]
).get(key, SELECTION_DIALOG_TEXTS["en-US"][key])
if kwargs:
try:
text = text.format(**kwargs)
except KeyError:
pass
return text
async def _emit_status(emitter: Optional[Any], description: str, done: bool = False) -> None:
if emitter:
await emitter(
@@ -462,12 +689,14 @@ class PluginCandidate:
metadata: Dict[str, str],
content: str,
function_id: str,
source_repo: str,
):
self.plugin_type = plugin_type
self.file_path = file_path
self.metadata = metadata
self.content = content
self.function_id = function_id
self.source_repo = source_repo
@property
def title(self) -> str:
@@ -477,6 +706,10 @@ class PluginCandidate:
def version(self) -> str:
return self.metadata.get("version", "unknown")
@property
def selection_id(self) -> str:
return f"{self.source_repo}::{self.file_path}::{self.function_id}"
def extract_metadata(content: str) -> Dict[str, str]:
docstring = _extract_module_docstring(content)
@@ -691,23 +924,64 @@ def _candidate_debug_data(candidate: PluginCandidate) -> Dict[str, str]:
return {
"title": candidate.title,
"type": candidate.plugin_type,
"source_repo": candidate.source_repo,
"file_path": candidate.file_path,
"function_id": candidate.function_id,
"version": candidate.version,
}
def _parse_repo_inputs(repo_value: str) -> List[str]:
parts = re.split(r"[\n,;,;、]+", str(repo_value or DEFAULT_REPO))
repos: List[str] = []
seen: Set[str] = set()
for part in parts:
candidate = part.strip().strip("/")
if not candidate:
continue
normalized = candidate.lower()
if normalized in seen:
continue
seen.add(normalized)
repos.append(candidate)
return repos or [DEFAULT_REPO]
def _sort_candidates_by_repo_order(
candidates: List[PluginCandidate],
repos: List[str],
) -> List[PluginCandidate]:
repo_order = {repo.lower(): index for index, repo in enumerate(repos)}
fallback_index = len(repo_order)
return sorted(
candidates,
key=lambda item: (
repo_order.get(item.source_repo.lower(), fallback_index),
item.source_repo.lower(),
item.plugin_type,
item.file_path,
),
)
def _filter_candidates(
candidates: List[PluginCandidate],
plugin_types: List[str],
repo: str,
repos: List[str],
exclude_keywords: str = "",
) -> List[PluginCandidate]:
allowed_types = {item.strip().lower() for item in plugin_types if item.strip()}
filtered = [c for c in candidates if c.plugin_type.lower() in allowed_types]
if repo.lower() == DEFAULT_REPO.lower():
filtered = [c for c in filtered if not _matches_self_plugin(c)]
includes_default_repo = any(item.lower() == DEFAULT_REPO.lower() for item in repos)
if includes_default_repo:
filtered = [
c
for c in filtered
if not (c.source_repo.lower() == DEFAULT_REPO.lower() and _matches_self_plugin(c))
]
exclude_list = [item.strip().lower() for item in exclude_keywords.split(",") if item.strip()]
if exclude_list:
@@ -724,7 +998,8 @@ def _filter_candidates(
def _build_confirmation_hint(lang: str, repo: str, exclude_keywords: str) -> str:
is_default_repo = repo.lower() == DEFAULT_REPO.lower()
repo_list = _parse_repo_inputs(repo)
is_default_repo = any(item.lower() == DEFAULT_REPO.lower() for item in repo_list)
excluded_parts: List[str] = []
if exclude_keywords:
@@ -735,38 +1010,408 @@ def _build_confirmation_hint(lang: str, repo: str, exclude_keywords: str) -> str
if excluded_parts:
return _t(lang, "confirm_excluded_hint", excluded=", ".join(excluded_parts))
return _t(lang, "confirm_copy_exclude_hint", keywords=SELF_EXCLUDE_HINT)
return ""
async def _request_confirmation(
def _build_selection_dialog_js(
options: List[Dict[str, str]],
ui_text: Dict[str, str],
) -> str:
lines = [
"return new Promise((resolve) => {",
" try {",
f" const options = {json.dumps(options, ensure_ascii=False)};",
f" const ui = {json.dumps(ui_text, ensure_ascii=False)};",
" const dialogId = 'batch-install-plugin-selector';",
" const body = typeof document !== 'undefined' ? document.body : null;",
" const existing = body ? document.getElementById(dialogId) : null;",
" if (existing) { existing.remove(); }",
" if (!body) {",
" resolve({ confirmed: false, error: 'document.body unavailable', selected_ids: [] });",
" return;",
" }",
" const selected = new Set(options.map((item) => item.id));",
" let activeFilter = '';",
" let activeRepoFilter = '';",
" let searchTerm = '';",
" const escapeHtml = (value) => String(value ?? '').replace(/[&<>\"']/g, (char) => ({",
" '&': '&amp;',",
" '<': '&lt;',",
" '>': '&gt;',",
" '\"': '&quot;',",
" \"'\": '&#39;',",
" }[char]));",
" const overlay = document.createElement('div');",
" overlay.id = dialogId;",
" overlay.style.cssText = [",
" 'position:fixed',",
" 'inset:0',",
" 'padding:24px',",
" 'background:rgba(15,23,42,0.52)',",
" 'backdrop-filter:blur(3px)',",
" 'display:flex',",
" 'align-items:center',",
" 'justify-content:center',",
" 'z-index:9999',",
" 'box-sizing:border-box',",
" ].join(';');",
" overlay.innerHTML = `",
" <div style=\"width:min(920px,100%);max-height:min(88vh,900px);overflow:hidden;border-radius:18px;background:#ffffff;box-shadow:0 30px 80px rgba(15,23,42,0.28);display:flex;flex-direction:column;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif\">",
" <div style=\"padding:22px 24px 16px;border-bottom:1px solid #e5e7eb\">",
" <div style=\"display:flex;justify-content:space-between;gap:14px;align-items:flex-start;flex-wrap:wrap\">",
" <div>",
" <div style=\"font-size:22px;font-weight:700;color:#0f172a\">${escapeHtml(ui.title)}</div>",
" <div style=\"margin-top:8px;font-size:14px;color:#475569\">${escapeHtml(ui.list_title)}</div>",
" </div>",
" <a href=\"${escapeHtml(ui.project_repo_url)}\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"${escapeHtml(ui.star_repo)}\" style=\"display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid #fde68a;border-radius:999px;background:#fffbeb;color:#92400e;font-size:13px;font-weight:700;text-decoration:none;box-shadow:0 1px 2px rgba(15,23,42,0.04)\">",
" <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2.75l2.85 5.78 6.38.93-4.61 4.49 1.09 6.35L12 17.31l-5.71 2.99 1.09-6.35-4.61-4.49 6.38-.93L12 2.75z\"></path></svg>",
" <span>${escapeHtml(ui.star_repo)}</span>",
" </a>",
" </div>",
" <div id=\"batch-install-plugin-selector-hint\" style=\"margin-top:14px;padding:12px 14px;border-radius:12px;background:#f8fafc;color:#334155;font-size:13px;line-height:1.5;white-space:pre-wrap\"></div>",
" </div>",
" <div style=\"padding:16px 24px 0;display:grid;gap:12px\">",
" <div style=\"display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap\">",
" <div style=\"display:flex;gap:8px;flex-wrap:wrap\">",
" <button id=\"batch-install-plugin-selector-select-all\" style=\"padding:8px 12px;border:1px solid #cbd5e1;border-radius:10px;background:#fff;color:#0f172a;font-size:13px;cursor:pointer\">${escapeHtml(ui.select_all)}</button>",
" <button id=\"batch-install-plugin-selector-clear-all\" style=\"padding:8px 12px;border:1px solid #cbd5e1;border-radius:10px;background:#fff;color:#0f172a;font-size:13px;cursor:pointer\">${escapeHtml(ui.clear_all)}</button>",
" </div>",
" <div id=\"batch-install-plugin-selector-count\" style=\"font-size:13px;font-weight:600;color:#475569\"></div>",
" </div>",
" <div style=\"display:grid;gap:10px\">",
" <div style=\"display:flex;gap:10px;align-items:center;flex-wrap:wrap\">",
" <div style=\"font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:0.04em\">${escapeHtml(ui.quick_select)}</div>",
" <div id=\"batch-install-plugin-selector-types\" style=\"display:flex;gap:8px;flex-wrap:wrap\"></div>",
" </div>",
" <div id=\"batch-install-plugin-selector-repo-row\" style=\"display:flex;gap:10px;align-items:center;flex-wrap:wrap\">",
" <div style=\"font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:0.04em\">${escapeHtml(ui.repo_filter)}</div>",
" <div id=\"batch-install-plugin-selector-repos\" style=\"display:flex;gap:8px;flex-wrap:wrap\"></div>",
" </div>",
" <div style=\"display:grid;gap:6px\">",
" <div style=\"font-size:12px;font-weight:700;color:#475569;text-transform:uppercase;letter-spacing:0.04em\">${escapeHtml(ui.search_label)}</div>",
" <input id=\"batch-install-plugin-selector-search\" type=\"text\" placeholder=\"${escapeHtml(ui.search_placeholder)}\" style=\"width:100%;padding:10px 12px;border:1px solid #cbd5e1;border-radius:12px;background:#fff;color:#0f172a;font-size:14px;outline:none;box-sizing:border-box\" />",
" </div>",
" </div>",
" </div>",
" <div id=\"batch-install-plugin-selector-list\" style=\"padding:16px 24px 0;overflow:auto;display:grid;gap:12px;flex:1;min-height:0\"></div>",
" <div style=\"padding:18px 24px 24px;border-top:1px solid #e5e7eb;margin-top:18px;display:flex;justify-content:flex-end;gap:12px;flex-wrap:wrap\">",
" <button id=\"batch-install-plugin-selector-cancel\" style=\"padding:10px 16px;border:1px solid #cbd5e1;border-radius:10px;background:#fff;color:#0f172a;font-weight:600;cursor:pointer\">${escapeHtml(ui.cancel)}</button>",
" <button id=\"batch-install-plugin-selector-submit\" style=\"padding:10px 16px;border:none;border-radius:10px;background:#0f172a;color:#fff;font-weight:600;cursor:pointer\">${escapeHtml(ui.install_selected)}</button>",
" </div>",
" </div>",
" `;",
" body.appendChild(overlay);",
" const previousOverflow = body.style.overflow;",
" body.style.overflow = 'hidden';",
" const listEl = overlay.querySelector('#batch-install-plugin-selector-list');",
" const countEl = overlay.querySelector('#batch-install-plugin-selector-count');",
" const hintEl = overlay.querySelector('#batch-install-plugin-selector-hint');",
" const typesEl = overlay.querySelector('#batch-install-plugin-selector-types');",
" const repoRowEl = overlay.querySelector('#batch-install-plugin-selector-repo-row');",
" const reposEl = overlay.querySelector('#batch-install-plugin-selector-repos');",
" const searchInput = overlay.querySelector('#batch-install-plugin-selector-search');",
" const submitBtn = overlay.querySelector('#batch-install-plugin-selector-submit');",
" const cancelBtn = overlay.querySelector('#batch-install-plugin-selector-cancel');",
" const selectAllBtn = overlay.querySelector('#batch-install-plugin-selector-select-all');",
" const clearAllBtn = overlay.querySelector('#batch-install-plugin-selector-clear-all');",
" const typeMap = options.reduce((groups, item) => {",
" if (!groups[item.type]) {",
" groups[item.type] = [];",
" }",
" groups[item.type].push(item);",
" return groups;",
" }, {});",
" const repoMap = options.reduce((groups, item) => {",
" if (!groups[item.repo]) {",
" groups[item.repo] = [];",
" }",
" groups[item.repo].push(item);",
" return groups;",
" }, {});",
" const typeEntries = Object.entries(typeMap);",
" const repoEntries = Object.entries(repoMap);",
" const matchesSearch = (item) => {",
" const haystack = [item.title, item.description, item.file_path, item.type, item.repo].join(' ').toLowerCase();",
" return !searchTerm || haystack.includes(searchTerm);",
" };",
" const getVisibleOptions = () => options.filter((item) => {",
" const matchesType = !activeFilter || item.type === activeFilter;",
" const matchesRepo = !activeRepoFilter || item.repo === activeRepoFilter;",
" return matchesType && matchesRepo && matchesSearch(item);",
" });",
" const syncSelectionToVisible = () => {",
" selected.clear();",
" getVisibleOptions().forEach((item) => selected.add(item.id));",
" };",
" const formatMultilineText = (value) => escapeHtml(value).replace(/\\n+/g, '<br />');",
" hintEl.textContent = ui.hint || '';",
" hintEl.style.display = ui.hint ? 'block' : 'none';",
" const renderTypeButtons = () => {",
" const scopedOptions = options.filter((item) => {",
" const matchesRepo = !activeRepoFilter || item.repo === activeRepoFilter;",
" return matchesRepo && matchesSearch(item);",
" });",
" const filterEntries = [['', scopedOptions], ...typeEntries.map(([type]) => [type, scopedOptions.filter((item) => item.type === type)])];",
" typesEl.innerHTML = filterEntries.map(([type, items]) => {",
" const isActive = activeFilter === type;",
" const background = isActive ? '#0f172a' : '#ffffff';",
" const color = isActive ? '#ffffff' : '#0f172a';",
" const border = isActive ? '#0f172a' : '#cbd5e1';",
" const label = type || ui.all_types;",
" return `",
" <button type=\"button\" data-plugin-type=\"${escapeHtml(type)}\" style=\"padding:7px 12px;border:1px solid ${border};border-radius:999px;background:${background};color:${color};font-size:12px;font-weight:700;cursor:pointer;display:inline-flex;gap:8px;align-items:center\">",
" <span>${escapeHtml(label)}</span>",
" <span style=\"display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:${isActive ? 'rgba(255,255,255,0.16)' : '#e2e8f0'};color:${isActive ? '#ffffff' : '#334155'}\">${items.length}</span>",
" </button>",
" `;",
" }).join('');",
" typesEl.querySelectorAll('button[data-plugin-type]').forEach((button) => {",
" button.addEventListener('click', () => {",
" const pluginType = button.getAttribute('data-plugin-type') || '';",
" activeFilter = activeFilter === pluginType ? '' : pluginType;",
" syncSelectionToVisible();",
" renderList();",
" });",
" });",
" };",
" const renderRepoButtons = () => {",
" if (repoEntries.length <= 1) {",
" repoRowEl.style.display = 'none';",
" reposEl.innerHTML = '';",
" activeRepoFilter = '';",
" return;",
" }",
" repoRowEl.style.display = 'flex';",
" const scopedOptions = options.filter((item) => {",
" const matchesType = !activeFilter || item.type === activeFilter;",
" return matchesType && matchesSearch(item);",
" });",
" const filterEntries = [['', scopedOptions], ...repoEntries.map(([repoName]) => [repoName, scopedOptions.filter((item) => item.repo === repoName)])];",
" reposEl.innerHTML = filterEntries.map(([repoName, items]) => {",
" const isActive = activeRepoFilter === repoName;",
" const background = isActive ? '#1d4ed8' : '#ffffff';",
" const color = isActive ? '#ffffff' : '#1d4ed8';",
" const border = isActive ? '#1d4ed8' : '#bfdbfe';",
" const label = repoName || ui.all_repos;",
" return `",
" <button type=\"button\" data-plugin-repo=\"${escapeHtml(repoName)}\" style=\"padding:7px 12px;border:1px solid ${border};border-radius:999px;background:${background};color:${color};font-size:12px;font-weight:700;cursor:pointer;display:inline-flex;gap:8px;align-items:center\">",
" <span>${escapeHtml(label)}</span>",
" <span style=\"display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:${isActive ? 'rgba(255,255,255,0.16)' : '#dbeafe'};color:${isActive ? '#ffffff' : '#1e3a8a'}\">${items.length}</span>",
" </button>",
" `;",
" }).join('');",
" reposEl.querySelectorAll('button[data-plugin-repo]').forEach((button) => {",
" button.addEventListener('click', () => {",
" const repoName = button.getAttribute('data-plugin-repo') || '';",
" activeRepoFilter = activeRepoFilter === repoName ? '' : repoName;",
" syncSelectionToVisible();",
" renderList();",
" });",
" });",
" };",
" const updateState = () => {",
" countEl.textContent = ui.selected_count.replace('{count}', String(selected.size));",
" submitBtn.disabled = selected.size === 0;",
" submitBtn.style.opacity = selected.size === 0 ? '0.45' : '1';",
" submitBtn.style.cursor = selected.size === 0 ? 'not-allowed' : 'pointer';",
" renderTypeButtons();",
" renderRepoButtons();",
" };",
" const renderOptionCard = (item) => {",
" const checked = selected.has(item.id) ? 'checked' : '';",
" const description = item.description ? `",
" <div style=\"display:grid;gap:4px\">",
" <div style=\"font-size:11px;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:0.04em\">${escapeHtml(ui.description_label)}</div>",
" <div style=\"font-size:13px;color:#334155;line-height:1.55;word-break:break-word\">${formatMultilineText(item.description)}</div>",
" </div>",
" ` : '';",
" return `",
" <label style=\"display:flex;gap:14px;align-items:flex-start;padding:14px;border:1px solid #e2e8f0;border-radius:14px;background:#fff;cursor:pointer\">",
" <input type=\"checkbox\" data-plugin-id=\"${escapeHtml(item.id)}\" ${checked} style=\"margin-top:3px;width:16px;height:16px;accent-color:#0f172a;flex-shrink:0\" />",
" <div style=\"min-width:0;display:grid;gap:6px\">",
" <div style=\"display:flex;gap:10px;align-items:center;flex-wrap:wrap\">",
" <span style=\"display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:#f1f5f9;color:#334155;font-size:12px;font-weight:700;text-transform:uppercase\">${escapeHtml(item.type)}</span>",
" <span style=\"display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;background:#eff6ff;color:#1d4ed8;font-size:12px;font-weight:700\">${escapeHtml(item.repo)}</span>",
" <span style=\"font-size:15px;font-weight:700;color:#0f172a;word-break:break-word\">${escapeHtml(item.title)}</span>",
" </div>",
" <div style=\"font-size:12px;color:#475569;word-break:break-word\">${escapeHtml(ui.version_label)}: ${escapeHtml(item.version)} · ${escapeHtml(ui.file_label)}: ${escapeHtml(item.file_path)}</div>",
" ${description}",
" </div>",
" </label>",
" `;",
" };",
" const renderList = () => {",
" const visibleOptions = getVisibleOptions();",
" if (!visibleOptions.length) {",
" listEl.innerHTML = `<div style=\"padding:24px;border:1px dashed #cbd5e1;border-radius:14px;background:#f8fafc;color:#475569;font-size:14px;text-align:center\">${escapeHtml(ui.no_results)}</div>`;",
" updateState();",
" return;",
" }",
" const groups = visibleOptions.reduce((bucket, item) => {",
" if (!bucket[item.repo]) {",
" bucket[item.repo] = [];",
" }",
" bucket[item.repo].push(item);",
" return bucket;",
" }, {});",
" listEl.innerHTML = Object.entries(groups).map(([repoName, items]) => `",
" <section style=\"display:grid;gap:10px\">",
" <div style=\"display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap;padding:0 2px\">",
" <div style=\"display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;background:#eff6ff;color:#1d4ed8;font-size:12px;font-weight:700;word-break:break-word\">${escapeHtml(repoName)}</div>",
" <div style=\"display:inline-flex;align-items:center;gap:8px;padding:4px 10px;border-radius:999px;background:#f8fafc;color:#475569;font-size:12px;font-weight:600\">${items.length}</div>",
" </div>",
" <div style=\"display:grid;gap:12px\">${items.map((item) => renderOptionCard(item)).join('')}</div>",
" </section>",
" `).join('');",
" listEl.querySelectorAll('input[data-plugin-id]').forEach((input) => {",
" input.addEventListener('change', () => {",
" const pluginId = input.getAttribute('data-plugin-id') || '';",
" if (input.checked) {",
" selected.add(pluginId);",
" } else {",
" selected.delete(pluginId);",
" }",
" updateState();",
" });",
" });",
" updateState();",
" };",
" const cleanup = () => {",
" body.style.overflow = previousOverflow;",
" window.removeEventListener('keydown', onKeyDown, true);",
" overlay.remove();",
" };",
" const finish = (confirmed) => {",
" const selectedIds = confirmed ? options.filter((item) => selected.has(item.id)).map((item) => item.id) : [];",
" cleanup();",
" resolve({ confirmed, selected_ids: selectedIds });",
" };",
" const onKeyDown = (event) => {",
" if (event.key === 'Escape') {",
" event.preventDefault();",
" finish(false);",
" }",
" };",
" overlay.addEventListener('click', (event) => {",
" if (event.target === overlay) {",
" finish(false);",
" }",
" });",
" selectAllBtn.addEventListener('click', () => {",
" getVisibleOptions().forEach((item) => selected.add(item.id));",
" renderList();",
" });",
" clearAllBtn.addEventListener('click', () => {",
" getVisibleOptions().forEach((item) => selected.delete(item.id));",
" renderList();",
" });",
" searchInput.addEventListener('input', () => {",
" searchTerm = searchInput.value.trim().toLowerCase();",
" syncSelectionToVisible();",
" renderList();",
" });",
" cancelBtn.addEventListener('click', () => finish(false));",
" submitBtn.addEventListener('click', () => {",
" if (selected.size === 0) {",
" updateState();",
" return;",
" }",
" finish(true);",
" });",
" window.addEventListener('keydown', onKeyDown, true);",
" renderList();",
" } catch (error) {",
" console.error('[Batch Install] Plugin selection dialog failed', error);",
" resolve({",
" confirmed: false,",
" error: error instanceof Error ? error.message : String(error),",
" selected_ids: [],",
" });",
" }",
"});",
]
return "\n".join(lines)
async def _request_plugin_selection(
event_call: Optional[Any],
lang: str,
message: str,
) -> Tuple[bool, Optional[str]]:
candidates: List[PluginCandidate],
hint: str,
) -> Tuple[Optional[List[PluginCandidate]], Optional[str]]:
if not event_call:
return True, None
return candidates, None
options = [
{
"id": candidate.selection_id,
"title": candidate.title,
"type": candidate.plugin_type,
"repo": candidate.source_repo,
"version": candidate.version,
"file_path": candidate.file_path,
"description": candidate.metadata.get("description", ""),
}
for candidate in candidates
]
ui_text = {
"title": _t(lang, "confirm_title"),
"list_title": _t(lang, "status_list_title", count=len(candidates)),
"repo_label": _selection_t(lang, "repo_label"),
"hint": hint.strip(),
"select_all": _selection_t(lang, "select_all"),
"clear_all": _selection_t(lang, "clear_all"),
"quick_select": _selection_t(lang, "quick_select"),
"all_types": _selection_t(lang, "all_types"),
"repo_filter": _selection_t(lang, "repo_filter"),
"all_repos": _selection_t(lang, "all_repos"),
"star_repo": _selection_t(lang, "star_repo"),
"project_repo_url": PROJECT_REPO_URL,
"search_label": _selection_t(lang, "search_label"),
"search_placeholder": _selection_t(lang, "search_placeholder"),
"no_results": _selection_t(lang, "no_results"),
"selected_count": _selection_t(lang, "selected_count", count="{count}"),
"install_selected": _selection_t(lang, "install_selected"),
"cancel": _selection_t(lang, "cancel"),
"version_label": _selection_t(lang, "version_label"),
"file_label": _selection_t(lang, "file_label"),
"description_label": _selection_t(lang, "description_label"),
}
js_code = _build_selection_dialog_js(options, ui_text)
try:
confirmed = await asyncio.wait_for(
event_call(
{
"type": "confirmation",
"data": {
"title": _t(lang, "confirm_title"),
"message": message,
},
}
),
result = await asyncio.wait_for(
event_call({"type": "execute", "data": {"code": js_code}}),
timeout=CONFIRMATION_TIMEOUT,
)
except asyncio.TimeoutError:
logger.warning("Installation confirmation timed out.")
return False, _t(lang, "err_confirm_unavailable")
logger.warning("Installation selection dialog timed out.")
return None, _t(lang, "err_confirm_unavailable")
except Exception as exc:
logger.warning("Installation confirmation failed: %s", exc)
return False, _t(lang, "err_confirm_unavailable")
logger.warning("Installation selection dialog failed: %s", exc)
return None, _t(lang, "err_confirm_unavailable")
return bool(confirmed), None
if not isinstance(result, dict):
logger.warning("Unexpected selection dialog result: %r", result)
return None, _t(lang, "err_confirm_unavailable")
if result.get("error"):
logger.warning("Selection dialog returned error: %s", result.get("error"))
return None, _t(lang, "err_confirm_unavailable")
if not result.get("confirmed"):
return [], None
selected_ids = result.get("selected_ids")
if not isinstance(selected_ids, list):
logger.warning("Selection dialog returned invalid selected_ids: %r", selected_ids)
return None, _t(lang, "err_confirm_unavailable")
selected_id_set = {str(item).strip() for item in selected_ids if str(item).strip()}
selected_candidates = [
candidate for candidate in candidates if candidate.selection_id in selected_id_set
]
return selected_candidates, None
def parse_github_url(url: str) -> Optional[Tuple[str, str, str]]:
@@ -811,11 +1456,13 @@ async def fetch_github_file(
async def discover_plugins(
url: str,
skip_keywords: str = "test",
source_repo: str = "",
) -> Tuple[List[PluginCandidate], List[Tuple[str, str]]]:
parsed = parse_github_url(url)
if not parsed:
return [], [("url", "invalid github url")]
owner, repo, branch = parsed
resolved_repo = source_repo or f"{owner}/{repo}"
is_default_repo = (owner.lower() == "fu-jie" and repo.lower() == "openwebui-extensions")
@@ -880,6 +1527,7 @@ async def discover_plugins(
metadata=metadata,
content=content,
function_id=build_function_id(item_path, metadata),
source_repo=resolved_repo,
)
)
@@ -887,10 +1535,30 @@ async def discover_plugins(
return candidates, skipped
async def discover_plugins_from_repos(
repos: List[str],
skip_keywords: str = "test",
) -> Tuple[List[PluginCandidate], List[Tuple[str, str]]]:
tasks = [
discover_plugins(f"https://github.com/{repo}", skip_keywords, source_repo=repo)
for repo in repos
]
results = await asyncio.gather(*tasks)
all_candidates: List[PluginCandidate] = []
all_skipped: List[Tuple[str, str]] = []
for repo, (candidates, skipped) in zip(repos, results):
all_candidates.extend(candidates)
all_skipped.extend([(f"{repo}:{path}", reason) for path, reason in skipped])
return _sort_candidates_by_repo_order(all_candidates, repos), all_skipped
class ListParams(BaseModel):
repo: str = Field(
default=DEFAULT_REPO,
description="GitHub repository (owner/repo)",
description="One or more GitHub repositories (owner/repo), separated by commas, semicolons, or new lines. If the user mentions multiple repositories in one request, combine them here and call the tool once.",
)
plugin_types: List[str] = Field(
default=["pipe", "action", "filter", "tool"],
@@ -901,7 +1569,7 @@ class ListParams(BaseModel):
class InstallParams(BaseModel):
repo: str = Field(
default=DEFAULT_REPO,
description="GitHub repository (owner/repo)",
description="One or more GitHub repositories (owner/repo), separated by commas, semicolons, or new lines. If the user mentions multiple repositories in one request, combine them here and call the tool once instead of making separate calls.",
)
plugin_types: List[str] = Field(
default=["pipe", "action", "filter", "tool"],
@@ -936,6 +1604,11 @@ class Tools:
repo: str = DEFAULT_REPO,
plugin_types: List[str] = ["pipe", "action", "filter", "tool"],
) -> str:
"""List plugins from one or more repositories in a single call.
If a user request mentions multiple repositories, combine them into the
`repo` argument instead of calling this tool multiple times.
"""
user_ctx = await _get_user_context(__user__, __event_call__, __request__)
lang = user_ctx.get("user_language", "en-US")
@@ -943,18 +1616,22 @@ class Tools:
if valves and hasattr(valves, "SKIP_KEYWORDS") and valves.SKIP_KEYWORDS:
skip_keywords = valves.SKIP_KEYWORDS
repo_url = f"https://github.com/{repo}"
candidates, _ = await discover_plugins(repo_url, skip_keywords)
repo_list = _parse_repo_inputs(repo)
candidates, _ = await discover_plugins_from_repos(repo_list, skip_keywords)
if not candidates:
return _t(lang, "err_no_plugins")
filtered = _filter_candidates(candidates, plugin_types, repo)
filtered = _filter_candidates(candidates, plugin_types, repo_list)
if not filtered:
return _t(lang, "err_no_match")
lines = [f"## {_t(lang, 'status_list_title', count=len(filtered))}\n"]
current_repo = ""
for c in filtered:
if c.source_repo != current_repo:
lines.append(f"\n### {c.source_repo}")
current_repo = c.source_repo
lines.append(
_t(lang, "list_item", type=c.plugin_type, title=c.title)
)
@@ -973,6 +1650,12 @@ class Tools:
exclude_keywords: str = "",
timeout: int = DEFAULT_TIMEOUT,
) -> str:
"""Install plugins from one or more repositories in a single call.
If a user request mentions multiple repositories, combine them into the
`repo` argument and call this tool once instead of making parallel
calls for each repository.
"""
user_ctx = await _get_user_context(__user__, __event_call__, __request__)
lang = user_ctx.get("user_language", "en-US")
event_emitter = __event_emitter__ or emitter
@@ -1024,39 +1707,30 @@ class Tools:
await _emit_status(event_emitter, _t(lang, "status_fetching"), done=False)
repo_url = f"https://github.com/{repo}"
candidates, _ = await discover_plugins(repo_url, skip_keywords)
repo_list = _parse_repo_inputs(repo)
candidates, _ = await discover_plugins_from_repos(repo_list, skip_keywords)
if not candidates:
return await _finalize_message(
event_emitter, _t(lang, "err_no_plugins"), notification_type="error"
)
filtered = _filter_candidates(candidates, plugin_types, repo, exclude_keywords)
filtered = _filter_candidates(candidates, plugin_types, repo_list, exclude_keywords)
if not filtered:
return await _finalize_message(
event_emitter, _t(lang, "err_no_match"), notification_type="warning"
)
plugin_list = "\n".join([f"- [{c.plugin_type}] {c.title}" for c in filtered])
hint_msg = _build_confirmation_hint(lang, repo, exclude_keywords)
confirm_msg = _t(
lang,
"confirm_message",
count=len(filtered),
plugin_list=plugin_list,
hint=hint_msg,
)
confirmed, confirm_error = await _request_confirmation(
__event_call__, lang, confirm_msg
selected_candidates, confirm_error = await _request_plugin_selection(
__event_call__, lang, filtered, hint_msg
)
if confirm_error:
return await _finalize_message(
event_emitter, confirm_error, notification_type="warning"
)
if not confirmed:
if not selected_candidates:
return await _finalize_message(
event_emitter,
_t(lang, "confirm_cancelled"),
@@ -1068,9 +1742,10 @@ class Tools:
"Starting OpenWebUI install requests",
{
"repo": repo,
"repos": repo_list,
"base_url": base_url,
"note": "Backend uses default port 8080 (containerized environment)",
"plugin_count": len(filtered),
"plugin_count": len(selected_candidates),
"plugin_types": plugin_types,
"exclude_keywords": exclude_keywords,
"timeout": timeout,
@@ -1092,7 +1767,7 @@ class Tools:
async with httpx.AsyncClient(
timeout=httpx.Timeout(timeout), follow_redirects=True
) as client:
for candidate in filtered:
for candidate in selected_candidates:
await _emit_status(
event_emitter,
_t(
@@ -1341,12 +2016,17 @@ class Tools:
)
)
summary = _t(lang, "status_done", success=success_count, total=len(filtered))
summary = _t(
lang,
"status_done",
success=success_count,
total=len(selected_candidates),
)
output = "\n".join(results + [summary])
notification_type = "success"
if success_count == 0:
notification_type = "error"
elif success_count < len(filtered):
elif success_count < len(selected_candidates):
notification_type = "warning"
await _emit_status(event_emitter, summary, done=True)

Some files were not shown because too many files have changed in this diff Show More