Compare commits
8 Commits
codex/batc
...
github-cop
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f8c871658 | ||
|
|
bf3ba97b9a | ||
|
|
31496a191e | ||
|
|
c6171be0d1 | ||
|
|
6b8cb9630a | ||
|
|
8573a0d7b0 | ||
|
|
f142b32486 | ||
|
|
04a05ac47c |
@@ -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 |
|
||||
|
||||
72
.agent/learnings/github-copilot-sdk-hang-analysis.md
Normal file
72
.agent/learnings/github-copilot-sdk-hang-analysis.md
Normal 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.*
|
||||
27
.agent/learnings/richui-declarative-priority.md
Normal file
27
.agent/learnings/richui-declarative-priority.md
Normal 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.
|
||||
23
.agent/learnings/richui-default-actions-optout.md
Normal file
23
.agent/learnings/richui-default-actions-optout.md
Normal 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.
|
||||
89
.agent/learnings/richui-interaction-api.md
Normal file
89
.agent/learnings/richui-interaction-api.md
Normal 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.
|
||||
@@ -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
173
.continues-handoff.md
Normal 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.**
|
||||
28
README.md
28
README.md
@@ -11,24 +11,24 @@ A collection of enhancements, plugins, and prompts for [open-webui](https://gith
|
||||
## 📊 Community Stats
|
||||
> 
|
||||
|
||||
| 👤 Author | 👥 Followers | ⭐ Points | 🏆 Contributions |
|
||||
| 👤 Author | 👥 Followers | ⭐ Points | 🧩 Plugin Contributions |
|
||||
| :---: | :---: | :---: | :---: |
|
||||
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) |  |  |  |
|
||||
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) |  |  |  |
|
||||
|
||||
| 📝 Posts | ⬇️ Downloads | 👁️ Views | 👍 Upvotes | 💾 Saves |
|
||||
| 📝 Posts | ⬇️ Plugin Downloads | 👁️ Plugin Views | 👍 Upvotes | 💾 Plugin Saves |
|
||||
| :---: | :---: | :---: | :---: | :---: |
|
||||
|  |  |  |  |  |
|
||||
|  |  |  |  |  |
|
||||
|
||||
|
||||
### 🔥 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) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
|
||||
### 📈 Total Downloads Trend
|
||||

|
||||
@@ -90,6 +90,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) [](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.
|
||||
|
||||

|
||||
> *A single install dialog can merge multiple repositories and let you filter visually before anything is installed.*
|
||||
|
||||
## 📦 Project Contents
|
||||
|
||||
<!-- markdownlint-disable MD033 -->
|
||||
@@ -111,6 +118,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
|
||||
|
||||
|
||||
28
README_CN.md
28
README_CN.md
@@ -8,24 +8,24 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
||||
## 📊 社区统计
|
||||
> 
|
||||
|
||||
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🏆 贡献 |
|
||||
| 👤 作者 | 👥 粉丝 | ⭐ 积分 | 🧩 插件贡献 |
|
||||
| :---: | :---: | :---: | :---: |
|
||||
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) |  |  |  |
|
||||
| [Fu-Jie](https://openwebui.com/u/Fu-Jie) |  |  |  |
|
||||
|
||||
| 📝 发布 | ⬇️ 下载 | 👁️ 浏览 | 👍 点赞 | 💾 收藏 |
|
||||
| 📝 发布 | ⬇️ 插件下载 | 👁️ 插件浏览 | 👍 点赞 | 💾 插件收藏 |
|
||||
| :---: | :---: | :---: | :---: | :---: |
|
||||
|  |  |  |  |  |
|
||||
|  |  |  |  |  |
|
||||
|
||||
|
||||
### 🔥 热门插件 Top 6
|
||||
| 排名 | 插件 | 版本 | 下载 | 浏览 | 📅 更新 |
|
||||
| :---: | :--- | :---: | :---: | :---: | :---: |
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
| 🥇 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) |  |  |  |  |
|
||||
| 🥈 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) |  |  |  |  |
|
||||
| 🥉 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) |  |  |  |  |
|
||||
| 4️⃣ | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) |  |  |  |  |
|
||||
| 5️⃣ | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) |  |  |  |  |
|
||||
| 6️⃣ | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) |  |  |  |  |
|
||||
|
||||
### 📈 总下载量累计趋势
|
||||

|
||||
@@ -87,6 +87,13 @@ OpenWebUI 增强功能集合。包含个人开发与收集的插件、提示词
|
||||
|
||||
**挑战 Token 極限。** 采用多专家异步压缩逻辑,在保持高吞吐量推理链的同时,大幅降低 Token 消耗。
|
||||
|
||||
### 6. [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) [](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80)
|
||||
|
||||
**更快试用多个社区插件仓库。** 一次请求即可聚合多个 GitHub 仓库里的插件,再通过交互式对话框里的仓库标签、类型筛选、关键词搜索和描述信息,把要安装的范围缩小到真正需要的子集。
|
||||
|
||||

|
||||
> *一个安装对话框就能合并多个仓库,并在真正安装前先完成可视化筛选。*
|
||||
|
||||
## 📦 项目内容
|
||||
|
||||
<!-- markdownlint-disable MD033 -->
|
||||
@@ -108,6 +115,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 (消息处理)
|
||||
|
||||
|
||||
@@ -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
|
||||
|  |  |  |  |  |  |  |
|
||||
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
||||
|
||||
## Preview
|
||||
|
||||
<!-- Add a screenshot or description here -->
|
||||
<!-- If you have a screenshot, add it as:  -->
|
||||
<!-- 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)
|
||||
|
||||
6
docs/badges/contributions.json
Normal file
6
docs/badges/contributions.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "contributions",
|
||||
"message": "21",
|
||||
"color": "green"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "downloads",
|
||||
"message": "9.3k",
|
||||
"message": "9.5k",
|
||||
"color": "blue",
|
||||
"namedLogo": "openwebui"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "followers",
|
||||
"message": "363",
|
||||
"message": "367",
|
||||
"color": "blue"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "points",
|
||||
"message": "366",
|
||||
"message": "378",
|
||||
"color": "orange"
|
||||
}
|
||||
6
docs/badges/saves.json
Normal file
6
docs/badges/saves.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "saves",
|
||||
"message": "428",
|
||||
"color": "lightgrey"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "upvotes",
|
||||
"message": "307",
|
||||
"message": "315",
|
||||
"color": "brightgreen"
|
||||
}
|
||||
6
docs/badges/views.json
Normal file
6
docs/badges/views.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "views",
|
||||
"message": "99.8k",
|
||||
"color": "blueviolet"
|
||||
}
|
||||
@@ -1,16 +1,17 @@
|
||||
{
|
||||
"total_posts": 28,
|
||||
"total_downloads": 9293,
|
||||
"total_views": 97430,
|
||||
"total_upvotes": 307,
|
||||
"total_downloads": 9491,
|
||||
"total_views": 99759,
|
||||
"total_upvotes": 315,
|
||||
"total_downvotes": 4,
|
||||
"total_saves": 465,
|
||||
"total_comments": 78,
|
||||
"total_saves": 428,
|
||||
"total_comments": 79,
|
||||
"plugin_contributions": 21,
|
||||
"by_type": {
|
||||
"tool": 3,
|
||||
"filter": 4,
|
||||
"action": 13,
|
||||
"tool": 2,
|
||||
"pipe": 1,
|
||||
"action": 12,
|
||||
"filter": 4,
|
||||
"prompt": 1
|
||||
},
|
||||
"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": 1818,
|
||||
"views": 15611,
|
||||
"downloads": 1852,
|
||||
"views": 15897,
|
||||
"upvotes": 32,
|
||||
"saves": 75,
|
||||
"saves": 77,
|
||||
"comments": 23,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-27",
|
||||
"updated_at": "2026-03-15",
|
||||
"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": 1378,
|
||||
"views": 13731,
|
||||
"downloads": 1392,
|
||||
"views": 13891,
|
||||
"upvotes": 28,
|
||||
"saves": 54,
|
||||
"comments": 12,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 871,
|
||||
"views": 8976,
|
||||
"upvotes": 21,
|
||||
"saves": 47,
|
||||
"comments": 5,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-12",
|
||||
"updated_at": "2026-03-08",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 842,
|
||||
"views": 7568,
|
||||
"upvotes": 18,
|
||||
"saves": 55,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-14",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 822,
|
||||
"views": 6340,
|
||||
"upvotes": 21,
|
||||
"saves": 42,
|
||||
"comments": 5,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-03",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
|
||||
},
|
||||
{
|
||||
@@ -101,11 +107,12 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 716,
|
||||
"views": 7973,
|
||||
"downloads": 740,
|
||||
"views": 8152,
|
||||
"upvotes": 10,
|
||||
"saves": 22,
|
||||
"saves": 23,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-28",
|
||||
"updated_at": "2026-01-28",
|
||||
"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": 621,
|
||||
"views": 3556,
|
||||
"upvotes": 11,
|
||||
"saves": 12,
|
||||
"downloads": 626,
|
||||
"views": 3609,
|
||||
"upvotes": 12,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-05-30",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d"
|
||||
},
|
||||
{
|
||||
@@ -133,11 +141,12 @@
|
||||
"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,
|
||||
"downloads": 543,
|
||||
"views": 6549,
|
||||
"upvotes": 8,
|
||||
"saves": 25,
|
||||
"saves": 27,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4"
|
||||
@@ -146,16 +155,17 @@
|
||||
"title": "GitHub Copilot Official SDK Pipe",
|
||||
"slug": "github_copilot_official_sdk_pipe_ce96f7b4",
|
||||
"type": "pipe",
|
||||
"version": "0.10.0",
|
||||
"version": "0.10.1",
|
||||
"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,
|
||||
"downloads": 410,
|
||||
"views": 5867,
|
||||
"upvotes": 16,
|
||||
"saves": 12,
|
||||
"comments": 8,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-26",
|
||||
"updated_at": "2026-03-07",
|
||||
"updated_at": "2026-03-15",
|
||||
"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": 340,
|
||||
"views": 4824,
|
||||
"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-15",
|
||||
"url": "https://openwebui.com/posts/flash_card_65a2ea8f"
|
||||
},
|
||||
{
|
||||
@@ -181,11 +192,12 @@
|
||||
"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,
|
||||
"downloads": 240,
|
||||
"views": 1943,
|
||||
"upvotes": 7,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-08",
|
||||
"updated_at": "2026-01-08",
|
||||
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
|
||||
@@ -197,31 +209,16 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 172,
|
||||
"views": 3065,
|
||||
"downloads": 173,
|
||||
"views": 3088,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-04",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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": 132,
|
||||
"views": 2204,
|
||||
"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 +226,33 @@
|
||||
"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,
|
||||
"downloads": 141,
|
||||
"views": 2607,
|
||||
"upvotes": 6,
|
||||
"saves": 6,
|
||||
"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": "📂 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": 133,
|
||||
"views": 2215,
|
||||
"upvotes": 7,
|
||||
"saves": 13,
|
||||
"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 +260,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,
|
||||
"downloads": 96,
|
||||
"views": 2505,
|
||||
"upvotes": 4,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-09",
|
||||
"updated_at": "2026-03-03",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee"
|
||||
},
|
||||
{
|
||||
@@ -262,12 +278,13 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 72,
|
||||
"views": 1590,
|
||||
"views": 1605,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/智能信息图_e04a48ff"
|
||||
},
|
||||
{
|
||||
@@ -277,11 +294,12 @@
|
||||
"version": "0.9.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 56,
|
||||
"views": 827,
|
||||
"downloads": 57,
|
||||
"views": 835,
|
||||
"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 +311,12 @@
|
||||
"version": "1.2.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 42,
|
||||
"views": 913,
|
||||
"downloads": 44,
|
||||
"views": 918,
|
||||
"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 +329,11 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 38,
|
||||
"views": 719,
|
||||
"views": 724,
|
||||
"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"
|
||||
@@ -326,28 +346,30 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 34,
|
||||
"views": 935,
|
||||
"views": 949,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/闪记卡生成插件_4a31eac3"
|
||||
},
|
||||
{
|
||||
"title": "🚀 Batch Install Plugins - Install Popular Plugins in Seconds",
|
||||
"title": "Batch Install Plugins from GitHub",
|
||||
"slug": "batch_install_plugins_install_popular_plugins_in_s_c9fd6e80",
|
||||
"type": "tool",
|
||||
"version": "1.0.0",
|
||||
"type": "action",
|
||||
"version": "1.1.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "One-click batch install plugins from GitHub repositories to your OpenWebUI instance.",
|
||||
"downloads": 1,
|
||||
"views": 14,
|
||||
"upvotes": 1,
|
||||
"saves": 0,
|
||||
"comments": 1,
|
||||
"downloads": 25,
|
||||
"views": 697,
|
||||
"upvotes": 4,
|
||||
"saves": 3,
|
||||
"comments": 2,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-03-15",
|
||||
"updated_at": "2026-03-15",
|
||||
"updated_at": "2026-03-16",
|
||||
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
|
||||
},
|
||||
{
|
||||
@@ -358,10 +380,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3434,
|
||||
"views": 3490,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"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 +397,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1833,
|
||||
"views": 1850,
|
||||
"upvotes": 5,
|
||||
"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 +414,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2812,
|
||||
"views": 2827,
|
||||
"upvotes": 8,
|
||||
"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 +431,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2444,
|
||||
"views": 2454,
|
||||
"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 +448,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2030,
|
||||
"upvotes": 13,
|
||||
"views": 2042,
|
||||
"upvotes": 14,
|
||||
"saves": 24,
|
||||
"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 +465,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 272,
|
||||
"views": 273,
|
||||
"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 +482,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1596,
|
||||
"views": 1599,
|
||||
"upvotes": 16,
|
||||
"saves": 13,
|
||||
"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 +497,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,
|
||||
"followers": 367,
|
||||
"following": 7,
|
||||
"total_points": 366,
|
||||
"post_points": 306,
|
||||
"comment_points": 60,
|
||||
"total_points": 378,
|
||||
"post_points": 314,
|
||||
"comment_points": 64,
|
||||
"contributions": 76
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,17 @@
|
||||
{
|
||||
"total_posts": 27,
|
||||
"total_downloads": 9120,
|
||||
"total_views": 95785,
|
||||
"total_upvotes": 305,
|
||||
"total_posts": 28,
|
||||
"total_downloads": 9409,
|
||||
"total_views": 98746,
|
||||
"total_upvotes": 312,
|
||||
"total_downvotes": 4,
|
||||
"total_saves": 452,
|
||||
"total_comments": 77,
|
||||
"total_saves": 424,
|
||||
"total_comments": 78,
|
||||
"plugin_contributions": 21,
|
||||
"by_type": {
|
||||
"filter": 4,
|
||||
"tool": 2,
|
||||
"tool": 3,
|
||||
"pipe": 1,
|
||||
"action": 12,
|
||||
"filter": 4,
|
||||
"prompt": 1
|
||||
},
|
||||
"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": 1841,
|
||||
"views": 15798,
|
||||
"upvotes": 32,
|
||||
"saves": 76,
|
||||
"comments": 23,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-27",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 1383,
|
||||
"views": 13816,
|
||||
"upvotes": 28,
|
||||
"saves": 53,
|
||||
"saves": 54,
|
||||
"comments": 12,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 867,
|
||||
"views": 8939,
|
||||
"upvotes": 21,
|
||||
"saves": 46,
|
||||
"saves": 47,
|
||||
"comments": 5,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-12",
|
||||
"updated_at": "2026-03-08",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 835,
|
||||
"views": 7511,
|
||||
"upvotes": 18,
|
||||
"saves": 54,
|
||||
"saves": 55,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-11-08",
|
||||
"updated_at": "2026-03-14",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"saves": 41,
|
||||
"downloads": 819,
|
||||
"views": 6315,
|
||||
"upvotes": 21,
|
||||
"saves": 42,
|
||||
"comments": 5,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-03",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315"
|
||||
},
|
||||
{
|
||||
@@ -101,11 +107,12 @@
|
||||
"version": "",
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 692,
|
||||
"views": 7783,
|
||||
"downloads": 730,
|
||||
"views": 8094,
|
||||
"upvotes": 10,
|
||||
"saves": 20,
|
||||
"saves": 23,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-28",
|
||||
"updated_at": "2026-01-28",
|
||||
"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": 625,
|
||||
"views": 3591,
|
||||
"upvotes": 12,
|
||||
"saves": 13,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-05-30",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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,
|
||||
"downloads": 535,
|
||||
"views": 6465,
|
||||
"upvotes": 8,
|
||||
"saves": 23,
|
||||
"saves": 26,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-28",
|
||||
"updated_at": "2026-03-14",
|
||||
"updated_at": "2026-03-15",
|
||||
"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.10.1",
|
||||
"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,
|
||||
"downloads": 407,
|
||||
"views": 5825,
|
||||
"upvotes": 16,
|
||||
"saves": 12,
|
||||
"comments": 8,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-26",
|
||||
"updated_at": "2026-03-07",
|
||||
"updated_at": "2026-03-15",
|
||||
"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": 339,
|
||||
"views": 4807,
|
||||
"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-15",
|
||||
"url": "https://openwebui.com/posts/flash_card_65a2ea8f"
|
||||
},
|
||||
{
|
||||
@@ -181,11 +192,12 @@
|
||||
"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,
|
||||
"downloads": 236,
|
||||
"views": 1926,
|
||||
"upvotes": 6,
|
||||
"saves": 15,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-08",
|
||||
"updated_at": "2026-01-08",
|
||||
"url": "https://openwebui.com/posts/deep_dive_c0b846e4"
|
||||
@@ -197,31 +209,16 @@
|
||||
"version": "0.4.4",
|
||||
"author": "Fu-Jie",
|
||||
"description": "将对话导出为 Word (.docx),支持 Mermaid 图表 (客户端渲染 SVG+PNG)、LaTeX 数学公式、真实超链接、增强表格格式、代码高亮和引用块。",
|
||||
"downloads": 172,
|
||||
"views": 3038,
|
||||
"downloads": 173,
|
||||
"views": 3084,
|
||||
"upvotes": 14,
|
||||
"saves": 7,
|
||||
"comments": 4,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-01-04",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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 +226,33 @@
|
||||
"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": 135,
|
||||
"views": 2549,
|
||||
"upvotes": 6,
|
||||
"saves": 5,
|
||||
"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": "📂 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": 132,
|
||||
"views": 2206,
|
||||
"upvotes": 7,
|
||||
"saves": 13,
|
||||
"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 +260,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,
|
||||
"downloads": 94,
|
||||
"views": 2497,
|
||||
"upvotes": 4,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-02-09",
|
||||
"updated_at": "2026-03-03",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee"
|
||||
},
|
||||
{
|
||||
@@ -262,12 +278,13 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "基于 AntV Infographic 的智能信息图生成插件。支持多种专业模板,自动图标匹配,并提供 SVG/PNG 下载功能。",
|
||||
"downloads": 72,
|
||||
"views": 1572,
|
||||
"views": 1604,
|
||||
"upvotes": 10,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-28",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/智能信息图_e04a48ff"
|
||||
},
|
||||
{
|
||||
@@ -277,11 +294,12 @@
|
||||
"version": "0.9.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "智能分析文本内容,生成交互式思维导图,帮助用户结构化和可视化知识。",
|
||||
"downloads": 56,
|
||||
"views": 814,
|
||||
"downloads": 57,
|
||||
"views": 831,
|
||||
"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 +311,12 @@
|
||||
"version": "1.2.2",
|
||||
"author": "Fu-Jie",
|
||||
"description": "通过智能摘要和消息压缩,降低长对话的 token 消耗,同时保持对话连贯性。",
|
||||
"downloads": 42,
|
||||
"views": 904,
|
||||
"downloads": 44,
|
||||
"views": 918,
|
||||
"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 +328,12 @@
|
||||
"version": "1.0.0",
|
||||
"author": "Fu-Jie",
|
||||
"description": "全方位的思维透镜 —— 从背景全景到逻辑脉络,从深度洞察到行动路径。",
|
||||
"downloads": 37,
|
||||
"views": 708,
|
||||
"downloads": 38,
|
||||
"views": 722,
|
||||
"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"
|
||||
@@ -326,14 +346,32 @@
|
||||
"author": "Fu-Jie",
|
||||
"description": "快速将文本提炼为精美的学习记忆卡片,支持核心要点提取与分类。",
|
||||
"downloads": 34,
|
||||
"views": 926,
|
||||
"views": 947,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"comments": 0,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2025-12-30",
|
||||
"updated_at": "2026-02-13",
|
||||
"updated_at": "2026-03-15",
|
||||
"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": 13,
|
||||
"views": 301,
|
||||
"upvotes": 2,
|
||||
"saves": 2,
|
||||
"comments": 1,
|
||||
"is_published_plugin": true,
|
||||
"created_at": "2026-03-15",
|
||||
"updated_at": "2026-03-15",
|
||||
"url": "https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80"
|
||||
},
|
||||
{
|
||||
"title": "An Unconventional Use of Open Terminal ⚡",
|
||||
"slug": "an_unconventional_use_of_open_terminal_35498f8f",
|
||||
@@ -342,10 +380,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 3335,
|
||||
"views": 3468,
|
||||
"upvotes": 7,
|
||||
"saves": 1,
|
||||
"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 +397,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1803,
|
||||
"views": 1840,
|
||||
"upvotes": 5,
|
||||
"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 +414,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2797,
|
||||
"views": 2816,
|
||||
"upvotes": 8,
|
||||
"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 +431,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2442,
|
||||
"views": 2444,
|
||||
"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 +448,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 2014,
|
||||
"upvotes": 13,
|
||||
"saves": 23,
|
||||
"views": 2035,
|
||||
"upvotes": 14,
|
||||
"saves": 24,
|
||||
"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 +465,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 271,
|
||||
"views": 273,
|
||||
"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 +482,11 @@
|
||||
"author": "",
|
||||
"description": "",
|
||||
"downloads": 0,
|
||||
"views": 1588,
|
||||
"views": 1599,
|
||||
"upvotes": 16,
|
||||
"saves": 13,
|
||||
"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 +497,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": 367,
|
||||
"following": 7,
|
||||
"total_points": 375,
|
||||
"post_points": 311,
|
||||
"comment_points": 64,
|
||||
"contributions": 76
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
> *Blue: Downloads | Purple: Views (Real-time dynamic)*
|
||||
|
||||
### 📂 Content Distribution
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 Overview
|
||||
@@ -16,46 +16,47 @@
|
||||
| Metric | Value |
|
||||
|------|------|
|
||||
| 📝 Total Posts |  |
|
||||
| ⬇️ Total Downloads |  |
|
||||
| 👁️ Total Views |  |
|
||||
| ⬇️ Total Plugin Downloads |  |
|
||||
| 👁️ Total Plugin Views |  |
|
||||
| 👍 Total Upvotes |  |
|
||||
| 💾 Total Saves |  |
|
||||
| 💾 Total Plugin Saves |  |
|
||||
| ⭐ Author Points |  |
|
||||
| 👥 Followers |  |
|
||||
| 🧩 Published Plugins |  |
|
||||
|
||||
## 📂 By Type
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
|
||||
## 📋 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 |  |  |  |  |  | 2026-02-27 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-08 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-14 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-01-28 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-15 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-07 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-15 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 13 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter |  |  |  |  |  | 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 |  |  |  |  |  | 2026-03-05 |
|
||||
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter |  |  |  |  |  | 2026-03-03 |
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 13 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool |  |  |  |  |  | 2026-03-05 |
|
||||
| 14 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter |  |  |  |  |  | 2026-01-20 |
|
||||
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 17 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 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 |  |  |  |  |  | 2026-03-15 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 21 | [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | action |  |  |  |  |  | 2026-03-16 |
|
||||
| 22 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action |  |  |  |  |  | 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 |  |  |  |  |  | 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 |  |  |  |  |  | 2026-02-28 |
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
> *蓝色: 总下载量 | 紫色: 总浏览量 (实时动态生成)*
|
||||
|
||||
### 📂 内容分类占比 (Distribution)
|
||||

|
||||

|
||||
|
||||
|
||||
## 📈 总览
|
||||
@@ -16,46 +16,47 @@
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 📝 发布数量 |  |
|
||||
| ⬇️ 总下载量 |  |
|
||||
| 👁️ 总浏览量 |  |
|
||||
| ⬇️ 插件总下载量 |  |
|
||||
| 👁️ 插件总浏览量 |  |
|
||||
| 👍 总点赞数 |  |
|
||||
| 💾 总收藏数 |  |
|
||||
| 💾 插件总收藏数 |  |
|
||||
| ⭐ 作者总积分 |  |
|
||||
| 👥 粉丝数量 |  |
|
||||
| 🧩 已发布插件数 |  |
|
||||
|
||||
## 📂 按类型分类
|
||||
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
- 
|
||||
|
||||
## 📋 发布列表
|
||||
|
||||
| 排名 | 标题 | 类型 | 版本 | 下载 | 浏览 | 点赞 | 收藏 | 更新日期 |
|
||||
|:---:|------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-02-27 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-08 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-14 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 1 | [Smart Mind Map](https://openwebui.com/posts/turn_any_text_into_beautiful_mind_maps_3094c59a) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 2 | [Smart Infographic](https://openwebui.com/posts/smart_infographic_ad6f0c7f) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 3 | [Markdown Normalizer](https://openwebui.com/posts/markdown_normalizer_baaa8732) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 4 | [Async Context Compression](https://openwebui.com/posts/async_context_compression_b1655bc8) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 5 | [Export to Word Enhanced](https://openwebui.com/posts/export_to_word_enhanced_formatting_fca6a315) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 6 | [AI Task Instruction Generator](https://openwebui.com/posts/ai_task_instruction_generator_9bab8b37) | prompt |  |  |  |  |  | 2026-01-28 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 7 | [Export to Excel](https://openwebui.com/posts/export_mulit_table_to_excel_244b8f9d) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 8 | [OpenWebUI Skills Manager Tool](https://openwebui.com/posts/openwebui_skills_manager_tool_b4bce8e4) | tool |  |  |  |  |  | 2026-03-15 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-07 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 9 | [GitHub Copilot Official SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) | pipe |  |  |  |  |  | 2026-03-15 |
|
||||
| 10 | [Flash Card](https://openwebui.com/posts/flash_card_65a2ea8f) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 11 | [Deep Dive](https://openwebui.com/posts/deep_dive_c0b846e4) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 13 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter |  |  |  |  |  | 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 |  |  |  |  |  | 2026-03-05 |
|
||||
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter |  |  |  |  |  | 2026-03-03 |
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 12 | [导出为Word增强版](https://openwebui.com/posts/导出为_word_支持公式流程图表格和代码块_8a6306c0) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 13 | [🧠 Smart Mind Map Tool: Auto-Generate Interactive Knowledge Graphs](https://openwebui.com/posts/smart_mind_map_tool_auto_generate_interactive_know_d25f4e3d) | tool |  |  |  |  |  | 2026-03-05 |
|
||||
| 14 | [📂 Folder Memory – Auto-Evolving Project Context](https://openwebui.com/posts/folder_memory_auto_evolving_project_context_4a9875b2) | filter |  |  |  |  |  | 2026-01-20 |
|
||||
| 15 | [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/github_copilot_sdk_files_filter_403a62ee) | filter |  |  |  |  |  | 2026-03-15 |
|
||||
| 16 | [智能信息图](https://openwebui.com/posts/智能信息图_e04a48ff) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 17 | [思维导图](https://openwebui.com/posts/智能生成交互式思维导图帮助用户可视化知识_8d4b097b) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 18 | [异步上下文压缩](https://openwebui.com/posts/异步上下文压缩_5c0617cb) | action |  |  |  |  |  | 2026-02-13 |
|
||||
| 19 | [精读](https://openwebui.com/posts/精读_99830b0f) | action |  |  |  |  |  | 2026-01-08 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 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 |  |  |  |  |  | 2026-03-15 |
|
||||
| 20 | [闪记卡 (Flash Card)](https://openwebui.com/posts/闪记卡生成插件_4a31eac3) | action |  |  |  |  |  | 2026-03-15 |
|
||||
| 21 | [Batch Install Plugins from GitHub](https://openwebui.com/posts/batch_install_plugins_install_popular_plugins_in_s_c9fd6e80) | action |  |  |  |  |  | 2026-03-16 |
|
||||
| 22 | [An Unconventional Use of Open Terminal ⚡](https://openwebui.com/posts/an_unconventional_use_of_open_terminal_35498f8f) | action |  |  |  |  |  | 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 |  |  |  |  |  | 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 |  |  |  |  |  | 2026-02-28 |
|
||||
|
||||
@@ -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.11.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -26,11 +26,27 @@ 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.11.0: High-Speed Pool Fix, BYOK-only Mode & Stable RichUI
|
||||
|
||||
- **🚀 Shared Client Pool Fix**: Resolved a critical bug where the shared singleton pool was incorrectly stopped, restoring instant response speeds for subsequent turns.
|
||||
- **🔑 BYOK-only Mode**: You can now use the plugin with only BYOK settings (OpenAI/Anthropic keys) without requiring a `GH_TOKEN`.
|
||||
- **🛡️ Environment Isolation**: Improved security by isolating user-specific environment variables, preventing token pollution in concurrent requests.
|
||||
- **📏 RichUI Height Stability**: Fixed the infinite sizing loop bug in embedded components, ensuring precise auto-height calculation.
|
||||
- **🩺 Smart Stall Detection**: Integrated `client.ping()` to rescue slow but alive processes from being prematurely aborted during heavy tasks.
|
||||
- **🧹 Smart TODO Visibility**: Automatically hides the TODO widget in subsequent chats once all tasks are completed to keep the interface clean.
|
||||
|
||||
---
|
||||
|
||||
@@ -45,6 +61,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 +137,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 +215,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
|
||||
|
||||
@@ -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.11.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -27,11 +27,27 @@
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.1:RichUI 默认展示与 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.11.0:单例进程池修复、纯 BYOK 模式与 RichUI 高度稳定性
|
||||
|
||||
- **🚀 共享进程池修复**:修复了 `stream_response` 误停止单例客户端的重大 Bug,显著提升多轮对话响应速度。
|
||||
- **🔑 支持纯 BYOK 模式**:现在支持仅配置自带密钥(BYOK)而不提供 `GH_TOKEN` 的运行模式。
|
||||
- **🛡️ 并发环境隔离**:重构环境变量注入逻辑,实现用户级 Token 隔离,杜绝高并发下的信息污染。
|
||||
- **📏 RichUI 稳定性增强**:彻底解决了嵌入式组件高度计算循环导致的页面无限变高问题。
|
||||
- **🩺 智能防挂死检测**:引入 `client.ping()` 探测机制,有效减少复杂任务(如长时间运行的脚本)被误杀的概率。
|
||||
- **🧹 智能 TODO 显隐**:当 TODO 任务全部完成后,下一次对话将自动隐藏 UI,保持界面整洁。
|
||||
|
||||
---
|
||||
|
||||
@@ -46,6 +62,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 +138,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 +164,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 +249,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,这将是我持续改进的动力,感谢支持。
|
||||
|
||||
@@ -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.11.0) - Official GitHub Copilot SDK integration. Features **Workspace Isolation**, **Zero-config OpenWebUI Tool Bridge**, **BYOK** support, and **dynamic MCP discovery**. **NEW in v0.11.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.
|
||||
|
||||
|
||||
@@ -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.11.0) - GitHub Copilot SDK 官方集成。具备**工作区安全隔离**、**零配置工具桥接**与**BYOK (自带 Key) 支持**。**v0.11.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 工具对录屏进行加速、缩放及双阶段色彩优化处理。
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 秒)**,为用户提供充足的时间来:
|
||||
- 阅读和查看插件列表
|
||||
- 做出安装决定
|
||||
- 勾选或取消勾选想安装的插件
|
||||
- 处理网络延迟
|
||||
|
||||
## 支持
|
||||
|
||||
@@ -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) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -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
|
||||
|
||||
@@ -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) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -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 秒)**,为用户提供充足的时间来:
|
||||
- 阅读和查看插件列表
|
||||
- 做出安装决定
|
||||
- 勾选或取消勾选想安装的插件
|
||||
- 处理网络延迟
|
||||
|
||||
## 支持
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) - 智能分析文本内容并主动生成交互式思维导图,帮助用户结构化与可视化知识。
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 更新内容
|
||||
|
||||
- ✨ **思维链结构**: 从表面理解一步步深入到战略行动。
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>` 块(通常包含工具调用或思考过程)的清理,确保最终文档整洁。
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)与浅灰斑马纹,提升可读性。
|
||||
|
||||
@@ -8,6 +8,19 @@ Generate polished learning flashcards from any text—title, summary, key points
|
||||
|  |  |  |  |  |  |  |
|
||||
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
||||
|
||||
## 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
|
||||
|
||||
@@ -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 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🔥 最新更新 v0.2.4
|
||||
|
||||
* **输出优化**: 移除输出中的调试信息。
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
An Open WebUI plugin powered by the AntV Infographic engine. It transforms long text into professional, beautiful infographics with a single click.
|
||||
|
||||
## 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.5.0
|
||||
|
||||
- 🌐 **Smart Language Detection**: Automatically detects the accurate UI language from your browser.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
基于 AntV Infographic 引擎的 Open WebUI 插件,能够将长文本内容一键转换为专业、美观的信息图表。
|
||||
|
||||
## 使用 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.5.0
|
||||
|
||||
- 🌐 **智能语言检测**:自动从浏览器准确识别当前界面语言设置。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 细节全线重构
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 版本更新
|
||||
|
||||
- **外部聊天引用摘要**: 新增对引用聊天上下文的摘要支持。现在可以复用缓存摘要、直接注入较小引用聊天,或先为较大的引用聊天生成摘要再注入。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
- **首个版本发布**:专注于自动化的“项目规则”管理。
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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。
|
||||
|
||||
@@ -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.11.0 | [⭐ Star this repo](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -26,11 +26,27 @@ 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.11.0: High-Speed Pool Fix, BYOK-only Mode & Stable RichUI
|
||||
|
||||
- **🚀 Shared Client Pool Fix**: Resolved a critical bug where the shared singleton pool was incorrectly stopped, restoring instant response speeds for subsequent turns.
|
||||
- **🔑 BYOK-only Mode**: You can now use the plugin with only BYOK settings (OpenAI/Anthropic keys) without requiring a `GH_TOKEN`.
|
||||
- **🛡️ Environment Isolation**: Improved security by isolating user-specific environment variables, preventing token pollution in concurrent requests.
|
||||
- **📏 RichUI Height Stability**: Fixed the infinite sizing loop bug in embedded components, ensuring precise auto-height calculation.
|
||||
- **🩺 Smart Stall Detection**: Integrated `client.ping()` to rescue slow but alive processes from being prematurely aborted during heavy tasks.
|
||||
- **🧹 Smart TODO Visibility**: Automatically hides the TODO widget in subsequent chats once all tasks are completed to keep the interface clean.
|
||||
|
||||
---
|
||||
|
||||
@@ -45,6 +61,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 +137,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 +215,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
|
||||
|
||||
@@ -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.11.0 | [⭐ 点个 Star 支持项目](https://github.com/Fu-Jie/openwebui-extensions) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -27,11 +27,27 @@
|
||||
|
||||
---
|
||||
|
||||
## ✨ v0.10.1:RichUI 默认展示与 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.11.0:单例进程池修复、纯 BYOK 模式与 RichUI 高度稳定性
|
||||
|
||||
- **🚀 共享进程池修复**:修复了 `stream_response` 误停止单例客户端的重大 Bug,显著提升多轮对话响应速度。
|
||||
- **🔑 支持纯 BYOK 模式**:现在支持仅配置自带密钥(BYOK)而不提供 `GH_TOKEN` 的运行模式。
|
||||
- **🛡️ 并发环境隔离**:重构环境变量注入逻辑,实现用户级 Token 隔离,杜绝高并发下的信息污染。
|
||||
- **📏 RichUI 稳定性增强**:彻底解决了嵌入式组件高度计算循环导致的页面无限变高问题。
|
||||
- **🩺 智能防挂死检测**:引入 `client.ping()` 探测机制,有效减少复杂任务(如长时间运行的脚本)被误杀的概率。
|
||||
- **🧹 智能 TODO 显隐**:当 TODO 任务全部完成后,下一次对话将自动隐藏 UI,保持界面整洁。
|
||||
|
||||
---
|
||||
|
||||
@@ -46,6 +62,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 +138,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 +164,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 +249,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
23
plugins/pipes/github-copilot-sdk/v0.11.0.md
Normal file
23
plugins/pipes/github-copilot-sdk/v0.11.0.md
Normal file
@@ -0,0 +1,23 @@
|
||||
[](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`.
|
||||
23
plugins/pipes/github-copilot-sdk/v0.11.0_CN.md
Normal file
23
plugins/pipes/github-copilot-sdk/v0.11.0_CN.md
Normal file
@@ -0,0 +1,23 @@
|
||||
[](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 相关配置。
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
This plugin integrates the [iFlow SDK](https://platform.iflow.cn/cli/sdk/sdk-python) into OpenWebUI as a `Pipe`.
|
||||
|
||||
## 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.
|
||||
|
||||
## Features
|
||||
|
||||
- **Standard iFlow Integration**: Connects to the iFlow CLI process via WebSocket (ACP).
|
||||
|
||||
@@ -2,6 +2,19 @@
|
||||
|
||||
此插件将 [iFlow SDK](https://platform.iflow.cn/cli/sdk/sdk-python) 集成到 OpenWebUI 中。
|
||||
|
||||
## 使用 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 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **标准 iFlow 集成**:通过 WebSocket (ACP) 连接到 iFlow CLI 进程。
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
## 社区支持
|
||||
|
||||
|
||||
@@ -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) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -8,13 +8,27 @@
|
||||
|
||||
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://github.com/Fu-Jie/openwebui-extensions/tree/main/plugins/tools/batch-install-plugins) 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.
|
||||
|
||||
## 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 +38,7 @@ User Input
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Discover Plugins from GitHub │
|
||||
│ Discover Plugins from GitHub Repos │
|
||||
│ (fetch file tree + parse .py) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
@@ -36,8 +50,8 @@ User Input
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ Show Confirmation Dialog │
|
||||
│ (list plugins + exclude hint) │
|
||||
│ Show Selection Dialog │
|
||||
│ (repo groups + filters + search) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [Cancel] → End
|
||||
@@ -61,49 +75,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 +119,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
|
||||
|
||||
@@ -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) |
|
||||
| :--- | ---: |
|
||||
|
||||
|  |  |  |  |  |  |  |
|
||||
@@ -8,13 +8,27 @@
|
||||
|
||||
一键将 GitHub 仓库中的插件批量安装到你的 OpenWebUI 实例。
|
||||
|
||||
## 使用 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 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 一键安装:单个命令安装所有插件
|
||||
- 自动更新:自动更新之前安装过的插件
|
||||
- 公开 GitHub 支持:支持从任何公开 GitHub 仓库安装插件
|
||||
- 公开 GitHub 支持:支持从一个或多个公开 GitHub 仓库安装插件
|
||||
- 多类型支持:支持 Pipe、Action、Filter 和 Tool 插件
|
||||
- 安装确认:安装前显示插件列表,支持选择性安装
|
||||
- 多仓库选择器:一次请求可合并多个仓库,并在同一个分组对话框中查看
|
||||
- 交互式选择对话框:先按仓库和类型筛选、按关键词搜索并查看描述信息,再勾选要安装的插件,只安装所选子集
|
||||
- 国际化:支持 11 种语言
|
||||
|
||||
## 流程
|
||||
@@ -24,7 +38,7 @@
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 从 GitHub 发现插件 │
|
||||
│ 从 GitHub 多仓库发现插件 │
|
||||
│ (获取文件树 + 解析 .py 文件) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
@@ -36,8 +50,8 @@
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────┐
|
||||
│ 显示确认对话框 │
|
||||
│ (插件列表 + 排除提示) │
|
||||
│ 显示选择对话框 │
|
||||
│ (仓库分组 + 筛选 + 搜索) │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
├── [取消] → 结束
|
||||
@@ -61,49 +75,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 +119,11 @@
|
||||
| `SKIP_KEYWORDS` | `test,verify,example,template,mock` | 逗号分隔的跳过关键词 |
|
||||
| `TIMEOUT` | `20` | 请求超时时间(秒)|
|
||||
|
||||
## 确认超时时间
|
||||
## 选择对话框超时时间
|
||||
|
||||
用户确认对话框的默认超时时间为 **2 分钟(120 秒)**,为用户提供充足的时间来:
|
||||
插件选择对话框的默认超时时间为 **2 分钟(120 秒)**,为用户提供充足的时间来:
|
||||
- 阅读和查看插件列表
|
||||
- 做出安装决定
|
||||
- 勾选或取消勾选想安装的插件
|
||||
- 处理网络延迟
|
||||
|
||||
## 支持
|
||||
|
||||
@@ -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) => ({",
|
||||
" '&': '&',",
|
||||
" '<': '<',",
|
||||
" '>': '>',",
|
||||
" '\"': '"',",
|
||||
" \"'\": ''',",
|
||||
" }[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)
|
||||
|
||||
BIN
plugins/tools/batch-install-plugins/install.png
Normal file
BIN
plugins/tools/batch-install-plugins/install.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 205 KiB |
36
plugins/tools/batch-install-plugins/v1.1.0.md
Normal file
36
plugins/tools/batch-install-plugins/v1.1.0.md
Normal file
@@ -0,0 +1,36 @@
|
||||
[](https://openwebui.com/t/fujie/batch_install_plugins)
|
||||
|
||||
## Overview
|
||||
|
||||
Batch Install Plugins from GitHub v1.1.0 upgrades the install confirmation step into an interactive plugin picker powered by the OpenWebUI `execute` event. Users can now review the filtered plugin list in a browser dialog, uncheck anything they do not want, and install only the selected subset.
|
||||
|
||||
**[📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/README.md)**
|
||||
|
||||
## Highlights
|
||||
|
||||
- **Interactive Selection Dialog**: Opens a checkbox-based browser dialog with type filters, keyword search, and visible plugin descriptions
|
||||
- **Multi-Repository Input**: Accepts multiple `owner/repo` values in one request and groups the dialog by repository
|
||||
- **Selective Installation**: The install loop now runs only for the plugins the user keeps selected
|
||||
- **Repository Context**: Displays the current repository and only shows useful exclusion information inside the dialog
|
||||
- **Localized UI**: Dialog controls are localized for all supported languages
|
||||
- **No Workflow Regression**: Existing discovery, filtering, auto-update, and fallback connection logic remain unchanged
|
||||
|
||||
## Technical Notes
|
||||
|
||||
- Replaced the install confirmation step with `__event_call__({"type": "execute"})`
|
||||
- Added a repository parser plus multi-repository discovery fan-out before filtering and installation
|
||||
- Returns a structured payload containing `confirmed` and `selected_ids`
|
||||
- Preserves the existing 120-second timeout for user interaction
|
||||
- Keeps installation ordering aligned with the requested repository order and filtered candidate list
|
||||
|
||||
## Validation
|
||||
|
||||
- Python syntax validated with `python -m py_compile plugins/tools/batch-install-plugins/batch_install_plugins.py`
|
||||
- README and mirrored docs updated to match the new interactive selection flow
|
||||
|
||||
## Upgrade Notes
|
||||
|
||||
- No new Valves are required
|
||||
- Existing prompts continue to work
|
||||
- Users now get a plugin picker before installation begins
|
||||
- One request can now merge multiple repositories into the same selection dialog
|
||||
36
plugins/tools/batch-install-plugins/v1.1.0_CN.md
Normal file
36
plugins/tools/batch-install-plugins/v1.1.0_CN.md
Normal file
@@ -0,0 +1,36 @@
|
||||
[](https://openwebui.com/t/fujie/batch_install_plugins)
|
||||
|
||||
## 概述
|
||||
|
||||
Batch Install Plugins from GitHub v1.1.0 将原本的安装确认步骤升级为基于 OpenWebUI `execute` 事件的交互式插件选择器。现在,用户可以先在浏览器对话框中查看过滤后的插件列表,取消勾选不想安装的项,然后只安装最终选中的插件子集。
|
||||
|
||||
**[📖 README](https://github.com/Fu-Jie/openwebui-extensions/blob/main/plugins/tools/batch-install-plugins/README_CN.md)**
|
||||
|
||||
## 亮点
|
||||
|
||||
- **交互式选择对话框**:不再只使用基础 confirmation 事件,而是打开带类型筛选、关键词搜索、描述信息和复选框的浏览器对话框
|
||||
- **多仓库输入**:一次请求支持多个 `owner/repo`,并在对话框中按仓库分组展示
|
||||
- **选择性安装**:安装循环只会处理用户最终保留勾选的插件
|
||||
- **仓库上下文**:对话框中会显示当前仓库,并且只展示真正有用的排除信息
|
||||
- **本地化 UI**:对话框控件已为所有支持语言提供本地化文本
|
||||
- **工作流不回退**:原有的插件发现、过滤、自动更新和连接回退逻辑保持不变
|
||||
|
||||
## 技术说明
|
||||
|
||||
- 使用 `__event_call__({"type": "execute"})` 替换安装确认步骤
|
||||
- 新增仓库解析和多仓库发现聚合流程,再进入过滤与安装阶段
|
||||
- 返回包含 `confirmed` 与 `selected_ids` 的结构化结果
|
||||
- 保留原有的 120 秒用户交互超时时间
|
||||
- 安装顺序仍与用户传入的仓库顺序和过滤后的候选列表保持一致
|
||||
|
||||
## 验证
|
||||
|
||||
- 已通过 `python -m py_compile plugins/tools/batch-install-plugins/batch_install_plugins.py` 进行 Python 语法校验
|
||||
- README 与镜像文档已同步为新的交互式选择流程
|
||||
|
||||
## 升级说明
|
||||
|
||||
- 不需要新增 Valves
|
||||
- 现有提示词仍可继续使用
|
||||
- 安装开始前会新增一个插件选择器步骤
|
||||
- 现在单次请求就可以把多个仓库合并到同一个选择对话框
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
A standalone OpenWebUI Tool plugin to manage native **Workspace > Skills** for any model.
|
||||
|
||||
## 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
|
||||
|
||||
- **🤖 Automatic Repo Root Discovery**: Install any GitHub repo by providing just the root URL (e.g., `https://github.com/owner/repo`). System auto-converts to discovery mode and installs all skills.
|
||||
|
||||
@@ -8,6 +8,19 @@
|
||||
|
||||
一个 OpenWebUI 原生 Tool 插件,用于让任意模型直接管理 **Workspace > Skills**。
|
||||
|
||||
## 使用 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 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 最新更新
|
||||
|
||||
- **🤖 自动发现仓库根目录**:现在可以直接提供 GitHub 仓库根 URL(如 `https://github.com/owner/repo`),系统会自动转换为发现模式并安装所有 skill。
|
||||
|
||||
@@ -12,6 +12,19 @@ Smart Mind Map Tool is the tool version of the popular Smart Mind Map action plu
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
|
||||
## Why is there a Tool version?
|
||||
|
||||
1. **Powered by OpenWebUI 0.8.0 Rich UI**: Previous versions of OpenWebUI did not support embedding custom HTML/iframes directly into the chat stream. Starting with 0.8.0, the platform introduced full Rich UI rendering support for **both Actions and Tools**, unleashing interactive frontend possibilities.
|
||||
|
||||
@@ -12,6 +12,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 后续就可以继续负责更新这个插件。
|
||||
|
||||
## 🚀 为什么会有工具(Tool)版本?
|
||||
|
||||
1. **得益于 OpenWebUI 0.8.0 的 Rich UI 特性**:在以前的版本中,是不支持直接将自定义的 HTML/iframe 嵌入到对话流中的。而从 0.8.0 开始,平台不仅支持了这种顺滑的前端组件直出(Rich UI),而且同时对 **Action** 和 **Tool** 开放了该能力。
|
||||
|
||||
Reference in New Issue
Block a user