feat(plugins): release Copilot SDK Pipe v0.8.0 and Files Filter v0.1.3 (#50)

* feat(plugins): release copilot sdk pipe v0.8.0 and files filter v0.1.3

- Add P1~P4 conditional tool filtering and admin/server gating behavior

- Fix artifact publishing reliability, strict /api file URLs, and HTML preview/download delivery

- Update bilingual README/docs, release notes, and filter matching/debug improvements

* fix(docs): remove duplicate code block in tool-filtering zh doc

- Remove incorrectly placed duplicate 'if not is_enabled: continue' block
  outside code fence on line 161-163 of copilot-sdk-tool-filtering.zh.md
- Addresses review comment from gemini-code-assist (#50)
This commit is contained in:
Fu-Jie
2026-02-26 01:05:31 +08:00
committed by GitHub
parent 5b6dddd517
commit db33f44cbc
20 changed files with 1175 additions and 247 deletions

View File

@@ -1,11 +1,16 @@
# GitHub Copilot SDK Files Filter
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.1.2 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **License:** MIT
**Author:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **Version:** 0.1.3 | **Project:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **License:** MIT
This is a dedicated **companion filter plugin** designed specifically for the [GitHub Copilot SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4).
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.**
## ✨ 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)
- **🐛 Dual-channel Debug Log**: Added `show_debug_log` valve. When enabled, logs are written to both server-side logger and browser console (`console.group`). (v0.1.3)
## 🎯 Why is this needed?
In OpenWebUI's default workflow, when you upload a file (e.g., PDF, Excel, Python script), OpenWebUI automatically initiates a **RAG (Retrieval-Augmented Generation)** process: parsing the file, vectorizing it, extracting text, and injecting it into the prompt.
@@ -49,5 +54,5 @@ Default settings work for most users:
## ⚠️ Important Notes
* **Must be used with Copilot SDK Pipe**: If you install this plugin without the main Pipe plugin, uploaded files will simply "disappear" (as no subsequent plugin will look for them).
* **Gemini Filter Compatibility**: Fully compatible with the Gemini Multimodal Filter. Just ensure priorities don't conflict.
- **Must be used with Copilot SDK Pipe**: If you install this plugin without the main Pipe plugin, uploaded files will simply "disappear" (as no subsequent plugin will look for them).
- **Gemini Filter Compatibility**: Fully compatible with the Gemini Multimodal Filter. Just ensure priorities don't conflict.

View File

@@ -1,11 +1,16 @@
# GitHub Copilot SDK 文件过滤器
**作者:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **版本:** 0.1.2 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **许可证:** MIT
**作者:** [Fu-Jie](https://github.com/Fu-Jie/openwebui-extensions) | **版本:** 0.1.3 | **项目:** [OpenWebUI Extensions](https://github.com/Fu-Jie/openwebui-extensions) | **许可证:** MIT
这是一个专门为 [GitHub Copilot SDK Pipe](https://openwebui.com/posts/github_copilot_official_sdk_pipe_ce96f7b4) 设计的**伴侣过滤器插件**。
它的核心使命是:**保护用户上传的文件不被 OpenWebUI 核心系统“抢先处理”,确保 Copilot Agent 能够接收到原始文件并进行自主分析。**
## ✨ 0.1.3 更新内容 (What's New)
- **🔍 BYOK 模型 ID 匹配修复**: 新增前缀匹配(`github_copilot_official_sdk_pipe.xxx` 格式),修复 BYOK 模型无法被正确识别的问题,关键词兜底保持向后兼容。(v0.1.3)
- **🐛 双通道调试日志**: 新增 `show_debug_log` 配置项,启用后同时向后端日志和浏览器控制台(`console.group`)输出调试信息。(v0.1.3)
## 🎯 为什么需要它?
在 OpenWebUI 的默认流程中,当你上传一个文件(如 PDF、Excel、Python 脚本OpenWebUI 会自动启动 **RAG检索增强生成** 流程:解析文件、向量化、提取文本并注入到提示词中。
@@ -47,5 +52,5 @@
## ⚠️ 注意事项
* **必须配合 Copilot SDK Pipe 使用**:如果你没有安装主 Pipe 插件,本插件将导致上传的文件“凭空消失”。
* **Gemini Filter 兼容性**:已完美兼容 Gemini 多模态过滤器。只要优先级设置正确,它们可以共存互不干扰。
- **必须配合 Copilot SDK Pipe 使用**:如果你没有安装主 Pipe 插件,本插件将导致上传的文件“凭空消失”。
- **Gemini Filter 兼容性**:已完美兼容 Gemini 多模态过滤器。只要优先级设置正确,它们可以共存互不干扰。

View File

@@ -4,13 +4,18 @@ id: github_copilot_sdk_files_filter
author: Fu-Jie
author_url: https://github.com/Fu-Jie/openwebui-extensions
funding_url: https://github.com/open-webui
version: 0.1.2
version: 0.1.3
openwebui_id: 403a62ee-a596-45e7-be65-fab9cc249dd6
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.
"""
from pydantic import BaseModel, Field
from typing import Optional, Callable, Awaitable
import logging
import json
logger = logging.getLogger(__name__)
class Filter:
@@ -23,10 +28,62 @@ class Filter:
default="copilot_sdk",
description="Keyword to identify Copilot models (e.g., 'copilot_sdk').",
)
target_model_prefixes: str = Field(
default="github_copilot_official_sdk_pipe.,github_copilot_sdk_pipe.",
description="Comma-separated model id prefixes to identify Copilot SDK models.",
)
show_debug_log: bool = Field(
default=False,
description="Whether to print model matching debug logs in backend console.",
)
def __init__(self):
self.valves = self.Valves()
def _is_copilot_model(self, model_id: str) -> bool:
if not isinstance(model_id, str) or not model_id:
return False
current = model_id.strip().lower()
if not current:
return False
# 1) Prefix match (most reliable for OpenWebUI model id formats)
raw_prefixes = self.valves.target_model_prefixes or ""
prefixes = [p.strip().lower() for p in raw_prefixes.split(",") if p.strip()]
if any(current.startswith(prefix) for prefix in prefixes):
return True
# 2) Keyword fallback for backward compatibility
keyword = (self.valves.target_model_keyword or "").strip().lower()
return bool(keyword and keyword in current)
async def _emit_debug_log(
self,
__event_emitter__: Optional[Callable[[dict], Awaitable[None]]],
title: str,
data: dict,
):
if not self.valves.show_debug_log:
return
logger.info("[Copilot Files Filter] %s: %s", title, data)
if not __event_emitter__:
return
try:
js_code = f"""
(async function() {{
console.group('🧩 Copilot Files Filter: {title}');
console.log({json.dumps(data, ensure_ascii=False)});
console.groupEnd();
}})();
"""
await __event_emitter__({"type": "execute", "data": {"code": js_code}})
except Exception as e:
logger.debug("[Copilot Files Filter] frontend debug emit failed: %s", e)
async def inlet(
self,
body: dict,
@@ -45,8 +102,30 @@ class Filter:
current_model = base_model_id if base_model_id else body.get("model", "")
await self._emit_debug_log(
__event_emitter__,
"model-debug",
{
"body_model": body.get("model", ""),
"base_model_id": base_model_id,
"current_model": current_model,
},
)
# Check if it's a Copilot model
if self.valves.target_model_keyword.lower() in current_model.lower():
is_copilot_model = self._is_copilot_model(current_model)
await self._emit_debug_log(
__event_emitter__,
"match-result",
{
"is_copilot_model": is_copilot_model,
"prefixes": self.valves.target_model_prefixes,
"keyword": self.valves.target_model_keyword,
},
)
if is_copilot_model:
# If files exist, move them to 'copilot_files' and clear 'files'
# This prevents OpenWebUI from triggering RAG on these files
if "files" in body and body["files"]: