feat: release github-copilot-sdk v0.6.0 and files-filter v0.1.2
This commit is contained in:
73
plugins/pipes/github-copilot-sdk/INTERNAL_KNOWLEDGE.md
Normal file
73
plugins/pipes/github-copilot-sdk/INTERNAL_KNOWLEDGE.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# GitHub Copilot SDK Pipe - Internal Architecture & Knowledge
|
||||
|
||||
This document details the core runtime mechanisms, file layout, and deep integration logic of the GitHub Copilot SDK plugin within the OpenWebUI environment.
|
||||
|
||||
## 1. Core Environmental Context
|
||||
|
||||
### 1.1 Filesystem Layout
|
||||
|
||||
| Path | Description | Permissions |
|
||||
| :--- | :--- | :--- |
|
||||
| `/app/backend` | OpenWebUI backend Python source code | Read-Only |
|
||||
| `/app/build` | OpenWebUI frontend assets (Artifacts renderer location) | Read-Only |
|
||||
| `/root/.copilot/` | SDK core configuration and state storage | **Full Control** |
|
||||
| `/app/backend/data/copilot_workspace/` | Plugin-specific persistent workspace | **Read/Write** |
|
||||
|
||||
### 1.2 Identity Mapping Mechanism
|
||||
|
||||
* **Session ID Binding**: The plugin strictly maps OpenWebUI's `Chat ID` to the Copilot SDK's `Session ID`.
|
||||
* **Outcome**: Every chat session has its own isolated physical directory: `/root/.copilot/session-state/{chat_id}/`.
|
||||
|
||||
## 2. TODO List Persistence (TODO Intelligence)
|
||||
|
||||
### 2.1 Data Source
|
||||
|
||||
TODO data is **not** stored in a standalone database table for basic operations but is captured from the session event stream via the `update_todo` tool:
|
||||
|
||||
* **Storage File**: `/root/.copilot/session-state/{chat_id}/events.jsonl`
|
||||
* **Detection**: Scans for the latest `tool.execution_complete` event where `toolName` is `update_todo`.
|
||||
|
||||
### 2.2 Data Format (NDJSON)
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "tool.execution_complete",
|
||||
"data": {
|
||||
"toolName": "update_todo",
|
||||
"result": {
|
||||
"detailedContent": "TODO List content...",
|
||||
"toolTelemetry": { "metrics": { "total_items": 3 } }
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 3. Toolchain Integration
|
||||
|
||||
The plugin harmonizes three distinct tool systems:
|
||||
|
||||
1. **Copilot Native**: Built-in capabilities like `bash`, `edit`, and `task`.
|
||||
2. **OpenWebUI Ecosystem**: Dynamically mounts local Python tools and built-in `Web Search` via `get_tools`.
|
||||
3. **MCP (Model Context Protocol)**: External capability extensions via servers like `GDMap` or `Pandoc`.
|
||||
|
||||
## 4. Security & Permissions
|
||||
|
||||
### 4.1 Admin Mode (God Mode)
|
||||
|
||||
When `__user__['role'] == 'admin'`:
|
||||
|
||||
* `ADMIN_EXTENSIONS` are enabled.
|
||||
* Access to `DATABASE_URL` via environment variables is permitted.
|
||||
* `bash` can be used to diagnose internal state within `/root/.copilot/`.
|
||||
|
||||
### 4.2 Regular User Mode
|
||||
|
||||
* `USER_RESTRICTIONS` are strictly enforced.
|
||||
* Probing environment variables or database credentials is prohibited.
|
||||
* `bash` activity is strictly confined to the isolated workspace.
|
||||
|
||||
## 5. Common Maintenance
|
||||
|
||||
* **Reset Session**: Delete the `/root/.copilot/session-state/{chat_id}` directory.
|
||||
* **Clear Cache**: Disable `ENABLE_TOOL_CACHE` in Valves.
|
||||
* **View Logs**: Check latest logs under `/root/.copilot/logs/`.
|
||||
70
plugins/pipes/github-copilot-sdk/INTERNAL_KNOWLEDGE_CN.md
Normal file
70
plugins/pipes/github-copilot-sdk/INTERNAL_KNOWLEDGE_CN.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# GitHub Copilot SDK Pipe - 内部架构与通用知识 (Internal Knowledge)
|
||||
|
||||
本文档记录了 GitHub Copilot SDK 插件在 OpenWebUI 环境下的核心运行机制、文件布局及深度集成逻辑。
|
||||
|
||||
## 1. 核心环境上下文 (Environment)
|
||||
|
||||
### 1.1 文件系统布局
|
||||
|
||||
| 路径 | 说明 | 权限 |
|
||||
| :--- | :--- | :--- |
|
||||
| `/app/backend` | OpenWebUI 后端 Python 源码 | 只读 |
|
||||
| `/app/build` | OpenWebUI 前端静态资源 (Artifacts 渲染器位置) | 只读 |
|
||||
| `/root/.copilot/` | SDK 核心配置与状态存储 | **完全控制** |
|
||||
| `/app/backend/data/copilot_workspace/` | 插件指定的持久化工作区 | **读写自如** |
|
||||
|
||||
### 1.2 身份映射机制
|
||||
|
||||
* **Session ID 绑定**: 插件强制将 OpenWebUI 的 `Chat ID` 映射为 Copilot SDK 的 `Session ID`。
|
||||
* **结果**: 每个对话窗口都有独立的物理存储目录:`/root/.copilot/session-state/{chat_id}/`。
|
||||
|
||||
## 2. TODO List 存储机制 (TODO Intelligence)
|
||||
|
||||
### 2.1 数据源
|
||||
|
||||
TODO 数据**并不**仅存储在独立数据库,而是通过 `update_todo` 工具写入会话事件流:
|
||||
|
||||
* **文件**: `/root/.copilot/session-state/{chat_id}/events.jsonl`
|
||||
* **识别**: 查找类型为 `tool.execution_complete` 且 `toolName` 为 `update_todo` 的最新 JSON 行。
|
||||
|
||||
### 2.2 数据格式 (NDJSON)
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "tool.execution_complete",
|
||||
"data": {
|
||||
"toolName": "update_todo",
|
||||
"result": { "detailedContent": "TODO List内容...", "toolTelemetry": { "metrics": { "total_items": 39 } } }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 3. 工具体系 (Toolchain)
|
||||
|
||||
插件整合了三套工具系统:
|
||||
|
||||
1. **Copilot Native**: SDK 内置的 `bash`, `edit`, `task` 等。
|
||||
2. **OpenWebUI Ecosystem**: 通过 `get_tools` 挂载的本地 Python 脚本和内置 `Web Search`。
|
||||
3. **MCP (Model Context Protocol)**: 通过 `GDMap`, `Pandoc` 等服务器扩展的外部能力。
|
||||
|
||||
## 4. 安全与权限 (Security)
|
||||
|
||||
### 4.1 管理员模式 (God Mode)
|
||||
|
||||
当 `__user__['role'] == 'admin'` 时:
|
||||
|
||||
* 启用 `ADMIN_EXTENSIONS`。
|
||||
* 允许通过环境变量获取 `DATABASE_URL`。
|
||||
* 允许使用 `bash` 诊断 `/root/.copilot/` 内部状态。
|
||||
|
||||
### 4.2 普通用户模式
|
||||
|
||||
* 启用 `USER_RESTRICTIONS`。
|
||||
* 严禁探测环境变量和数据库。
|
||||
* 限制 `bash` 只能在工作区内活动。
|
||||
|
||||
## 5. 常见维护操作
|
||||
|
||||
* **重置会话**: 删除 `/root/.copilot/session-state/{chat_id}` 目录。
|
||||
* **清理缓存**: 在 Valves 中关闭 `ENABLE_TOOL_CACHE`。
|
||||
* **查看日志**: 检查 `/root/.copilot/logs/` 下的最新日志。
|
||||
@@ -1,117 +1,118 @@
|
||||
# GitHub Copilot SDK Pipe for OpenWebUI
|
||||
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.5.1 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
|
||||
**Author:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **Version:** 0.6.0 | **Project:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **License:** MIT
|
||||
|
||||
This is an advanced Pipe function for [OpenWebUI](https://github.com/open-webui/open-webui) that integrates the official [GitHub Copilot SDK](https://github.com/github/copilot-sdk). It enables you to use **GitHub Copilot models** (e.g., `gpt-5.2-codex`, `claude-sonnet-4.5`,`gemini-3-pro`, `gpt-5-mini`) **AND** your own models via **BYOK** (OpenAI, Anthropic) directly within OpenWebUI, providing a unified agentic experience.
|
||||
This is an advanced Pipe function for [OpenWebUI](https://github.com/open-webui/open-webui) that integrates the official [GitHub Copilot SDK](https://github.com/github/copilot-sdk). It enables you to use **GitHub Copilot models** (e.g., `gpt-5.2-codex`, `claude-sonnet-4.5`,`gemini-3-pro`, `gpt-5-mini`) **AND** your own models via **BYOK** (OpenAI, Anthropic) directly within OpenWebUI, providing a unified agentic experience with **strict User & Chat-level Workspace Isolation**.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Essential Companion**
|
||||
> To unlock file handling and data analysis capabilities, you must install the [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/403a62ee-a596-45e7-be65-fab9cc249dd6).
|
||||
|
||||
> [!TIP]
|
||||
> **No Subscription Required for BYOK**
|
||||
> If you are using your own API keys (BYOK mode with OpenAI/Anthropic), **you do NOT need a GitHub Copilot subscription.**
|
||||
> A subscription is only required to access GitHub's official models.
|
||||
> If you are using your own API keys (BYOK mode with OpenAI/Anthropic), **you do NOT need a GitHub Copilot subscription.** A subscription is only required to access GitHub's official models.
|
||||
|
||||
## 🚀 What's New (v0.5.1) - Major Upgrade
|
||||
---
|
||||
|
||||
- **🧠 Smarter BYOK Detection**: Improved logic to correctly identify BYOK vs. Official Copilot models, supporting custom models (Characters/Prompts) and fixing multiplier detection (e.g., `(0x)`, `(1x)`).
|
||||
- **⚡ Performance Boost**: Implemented **Tool Caching** to persist tool definitions across requests, significantly reducing overhead.
|
||||
- **🧩 Enriched Tool Integration**: Tool descriptions now include source grouping (Built-in/User/Server) and automatic metadata extraction (Title/Description) from Python docstrings.
|
||||
- **🛡️ Precise Control**: Added support for OpenWebUI's `function_name_filter_list` to filter MCP and OpenAPI functions.
|
||||
- **🔑 User-Level BYOK**: Fully leverage Copilot SDK with your own Model Providers (OpenAI, Anthropic) with user-level API Key overrides.
|
||||
- **📝 Better Formatting**: Enforced standard Markdown tables in system prompts to prevent rendering issues with HTML tables.
|
||||
## ✨ v0.6.0 Updates (What's New)
|
||||
|
||||
- **👥 User & Chat Management**: Physical management architecture (`user_id/chat_id`) for absolute resource independence.
|
||||
- **🤖 Empowering Agent Autonomy**: Automatic synchronization of raw files to the workspace, enabling direct Python-based analysis of Excel/CSV.
|
||||
- **🔧 OpenAPI & External Tool Fixes**: Full support for tools mounted via OpenAPI servers.
|
||||
- **📊 Cost Control**: Enhanced **Billing Multiplier Limits** (`MAX_MULTIPLIER`, e.g., set to 0 for free models only) and **Model Keyword Filtering** (`EXCLUDE_KEYWORDS`) for precise cost management.
|
||||
- **🧠 Persistent TODO Lists**: Database-backed task tracking that persists across sessions.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Key Capabilities
|
||||
|
||||
- **🔑 Flexible Auth & BYOK**: Supports GitHub Copilot subscription (PAT) OR Bring Your Own Key (OpenAI/Anthropic), giving you total control over model access and billing.
|
||||
- **🌉 The Ultimate Bridge**: The first and only plugin that creates a seamless bridge between **OpenWebUI Tools** and **GitHub Copilot SDK**.
|
||||
- **🚀 Official & Native**: Built directly on the official Python SDK, providing the most stable and authentic Copilot experience.
|
||||
- **🌊 Advanced Streaming (Thought Process)**: Supports full model reasoning/thinking display with typewriter effects.
|
||||
- **🖼️ Intelligent Multimodal**: Full support for images and attachments, enabling Copilot to "see" your workspace.
|
||||
- **🛠️ Effortless Setup**: Automatic CLI detection, version enforcement, and dependency management.
|
||||
- **🛡️ Integrated Security**: Supports secure PAT authentication for standard and extended capabilities.
|
||||
- **🔑 Flexible Auth & BYOK**: Official Copilot subscriptions (PAT) or Bring Your Own Key (OpenAI/Anthropic).
|
||||
- **🔌 Universal Tool Protocol**: Native support for **MCP (Model Context Protocol)**, OpenAPI, and OpenWebUI built-in tools.
|
||||
- **🛡️ Sandbox Workspace Isolation**: Strict per-session sandboxing for data privacy and security.
|
||||
- **♾️ Infinite Session Management**: Smart context window management with automatic compaction for indefinite conversation capability.
|
||||
- **🧠 Deep Database Integration**: Real-time persistence of TOD·O lists for long-running workflows.
|
||||
- **🌊 Advanced Streaming**: Full support for thinking process/Chain of Thought visualization.
|
||||
- **🖼️ Intelligent Multimodal**: Vision capabilities and raw file analysis support.
|
||||
- **⚡ Interactive Artifacts**: Automatically renders HTML/JS apps generated by the agent directly in the chat interface.
|
||||
|
||||
## Installation & Configuration
|
||||
---
|
||||
|
||||
### 1) Import Function
|
||||
## ⚙️ Core Configuration (Valves)
|
||||
|
||||
1. Open OpenWebUI.
|
||||
2. Go to **Workspace** -> **Functions**.
|
||||
3. Click **+** (Create Function).
|
||||
4. Paste the content of `github_copilot_sdk.py` (or `github_copilot_sdk_cn.py` for Chinese) completely.
|
||||
5. Save.
|
||||
### 1. Administrator Settings (Base)
|
||||
|
||||
### 2) Configure Valves (Settings)
|
||||
Administrators define the default behavior for all users in the function settings.
|
||||
|
||||
Find "GitHub Copilot" in the function list and click the **⚙️ (Valves)** icon to configure:
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| Valve | Default | Description |
|
||||
| :--- | :--- | :--- |
|
||||
| **GH_TOKEN** | **(Required)** GitHub Access Token (PAT or OAuth Token). Access to Chat. | - |
|
||||
| **DEBUG** | Whether to enable debug logs (output to browser console). | `False` |
|
||||
| **LOG_LEVEL** | Copilot CLI log level: none, error, warning, info, debug, all. | `error` |
|
||||
| **SHOW_THINKING** | Show model reasoning/thinking process (requires streaming + model support). | `True` |
|
||||
| **COPILOT_CLI_VERSION** | Specific Copilot CLI version to install/enforce. | `0.0.405` |
|
||||
| **EXCLUDE_KEYWORDS** | Exclude models containing these keywords (comma separated). | - |
|
||||
| **WORKSPACE_DIR** | Restricted workspace directory for file operations. | - |
|
||||
| **INFINITE_SESSION** | Enable Infinite Sessions (automatic context compaction). | `True` |
|
||||
| **COMPACTION_THRESHOLD** | Background compaction threshold (0.0-1.0). | `0.8` |
|
||||
| **BUFFER_THRESHOLD** | Buffer exhaustion threshold (0.0-1.0). | `0.95` |
|
||||
| **TIMEOUT** | Timeout for each stream chunk (seconds). | `300` |
|
||||
| **CUSTOM_ENV_VARS** | Custom environment variables (JSON format). | - |
|
||||
| **REASONING_EFFORT** | Reasoning effort level: low, medium, high. `xhigh` is supported for some models. | `medium` |
|
||||
| **ENABLE_MCP_SERVER** | Enable Direct MCP Client connection (Recommended). | `True` |
|
||||
| **ENABLE_OPENWEBUI_TOOLS** | Enable OpenWebUI Tools (includes defined and server tools). | `True` |
|
||||
| **BYOK_ENABLED** | Enable BYOK (Bring Your Own Key) to use custom providers. | `False` |
|
||||
| **BYOK_TYPE** | BYOK Provider Type: `openai`, `azure`, `anthropic`. | `openai` |
|
||||
| **BYOK_BASE_URL** | BYOK Base URL (e.g., `https://api.openai.com/v1`). | - |
|
||||
| **BYOK_API_KEY** | BYOK API Key (Global Setting). | - |
|
||||
| **BYOK_BEARER_TOKEN** | BYOK Bearer Token (Global, overrides API Key). | - |
|
||||
| **BYOK_WIRE_API** | BYOK Wire API: `completions`, `responses`. | `completions` |
|
||||
| `GH_TOKEN` | `""` | Global GitHub Token (Requires 'Copilot Requests' permission). |
|
||||
| `ENABLE_OPENWEBUI_TOOLS` | `True` | Enable OpenWebUI Tools (includes defined Tools and Built-in Tools). |
|
||||
| `ENABLE_OPENAPI_SERVER` | `True` | Enable OpenAPI Tool Server connection. |
|
||||
| `ENABLE_MCP_SERVER` | `True` | Enable Direct MCP Client connection (Recommended). |
|
||||
| `REASONING_EFFORT` | `medium` | Reasoning effort level: low, medium, high. |
|
||||
| `SHOW_THINKING` | `True` | Show model reasoning/thinking process. |
|
||||
| `INFINITE_SESSION` | `True` | Enable Infinite Sessions (automatic context compaction). |
|
||||
| `MAX_MULTIPLIER` | `1.0` | Max allowed billing multiplier (0x for free models only). |
|
||||
| `EXCLUDE_KEYWORDS` | `""` | Exclude models containing these keywords (comma separated). |
|
||||
| `TIMEOUT` | `300` | Timeout for each stream chunk (seconds). |
|
||||
| `BYOK_TYPE` | `openai` | BYOK Provider Type: `openai`, `anthropic`. |
|
||||
| `BYOK_BASE_URL` | `""` | BYOK Base URL (e.g., <https://api.openai.com/v1>). |
|
||||
| `BYOK_MODELS` | `""` | BYOK Model List (comma separated). Leave empty to fetch from API. |
|
||||
| `CUSTOM_ENV_VARS` | `""` | Custom environment variables (JSON format). |
|
||||
| `DEBUG` | `False` | Enable this to see detailed logs in your browser console. |
|
||||
|
||||
#### User Valves (per-user overrides)
|
||||
### 2. User Settings (Individual Overrides)
|
||||
|
||||
These optional settings can be set per user (overrides global Valves):
|
||||
Standard users can override these settings in their individual Profile/Function settings.
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| :--- | :--- | :--- |
|
||||
| **GH_TOKEN** | Personal GitHub Token (overrides global setting). | - |
|
||||
| **REASONING_EFFORT** | Reasoning effort level (low/medium/high/xhigh). | - |
|
||||
| **DEBUG** | Enable technical debug logs. | `False` |
|
||||
| **SHOW_THINKING** | Show model reasoning/thinking process. | `True` |
|
||||
| **ENABLE_OPENWEBUI_TOOLS** | Enable OpenWebUI Tools (overrides global). | `True` |
|
||||
| **ENABLE_MCP_SERVER** | Enable MCP server loading (overrides global). | `True` |
|
||||
| Valve | Description |
|
||||
| :--- | :--- |
|
||||
| `GH_TOKEN` | Use your personal GitHub Token. |
|
||||
| `REASONING_EFFORT` | Individual reasoning effort preference. |
|
||||
| `SHOW_THINKING` | Show model reasoning/thinking process. |
|
||||
| `MAX_MULTIPLIER` | Maximum allowed billing multiplier override. |
|
||||
| `EXCLUDE_KEYWORDS` | Exclude models containing these keywords. |
|
||||
| `BYOK_API_KEY` | Use your personal OpenAI/Anthropic API Key. |
|
||||
|
||||
| **BYOK_API_KEY** | BYOK API Key (User override). | - |
|
||||
---
|
||||
|
||||
## 🎯 Use Cases (What can you do?)
|
||||
|
||||
- **📁 Fully Autonomous DevOps**: Agent analyzes code, runs tests, and applies patches within its isolated sandbox.
|
||||
- **📊 Deep Data Auditing**: Directly process raw Excel/CSV data via Python (bypassing RAG) and generate visual reports.
|
||||
- **📝 Long-Task Management**: Automatically decomposes complex requests and persists TOD·O progress across sessions.
|
||||
|
||||
---
|
||||
|
||||
## ⭐ Support
|
||||
|
||||
If this plugin has been useful, a star on [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) is a big motivation for me. Thank you for the support.
|
||||
If this plugin has been useful, a **Star** on [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) would be a great motivation for me. Thank you!
|
||||
|
||||
### Get Token
|
||||
---
|
||||
|
||||
To use GitHub Copilot, you need a GitHub Personal Access Token (PAT) with appropriate permissions.
|
||||
## 🚀 Installation & Configuration
|
||||
|
||||
**Steps to generate your token:**
|
||||
### 1) Import Function
|
||||
|
||||
1. Open OpenWebUI, go to **Workspace** -> **Functions**.
|
||||
2. Click **+** (Create Function), paste the content of `github_copilot_sdk.py`.
|
||||
3. Save and ensure it is enabled.
|
||||
|
||||
### 2) Get Token
|
||||
|
||||
1. Visit [GitHub Token Settings](https://github.com/settings/tokens?type=beta).
|
||||
2. Click **Generate new token (fine-grained)**.
|
||||
3. **Repository access**: Select **Public Repositories** (simplest) or **All repositories**.
|
||||
4. **Permissions**:
|
||||
- If you chose **All repositories**, you must click **Account permissions**.
|
||||
- Find **Copilot Requests**, and select **Access**.
|
||||
5. Generate and copy the Token.
|
||||
2. Create **Fine-grained token**, granting **Account permissions** -> **Copilot Requests** access.
|
||||
3. Paste the generated Token into the `GH_TOKEN` field in Valves.
|
||||
|
||||
## 📋 Dependencies
|
||||
---
|
||||
|
||||
This Pipe will automatically attempt to install the following dependencies:
|
||||
## 📋 Troubleshooting & Dependencies
|
||||
|
||||
- `github-copilot-sdk` (Python package)
|
||||
- `github-copilot-cli` (Binary file, installed via official script)
|
||||
- **Agent ignores files?**: Ensure the Files Filter is enabled, otherwise RAG will interfere with raw binaries.
|
||||
- **No progress bar?**: The bar only appears when the Agent uses the `update_todo` tool.
|
||||
- **Dependencies**: This Pipe automatically installs `github-copilot-sdk` (Python) and `github-copilot-cli` (Binary).
|
||||
|
||||
## Troubleshooting ❓
|
||||
|
||||
- **Images not recognized**:
|
||||
- Ensure `MODEL_ID` is a model that supports multimodal input.
|
||||
- **Thinking not shown**:
|
||||
- Ensure **streaming is enabled** and the selected model supports reasoning output.
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
|
||||
@@ -1,117 +1,123 @@
|
||||
# GitHub Copilot SDK 官方管道
|
||||
|
||||
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.5.1 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
|
||||
**作者:** [Fu-Jie](https://github.com/Fu-Jie/awesome-openwebui) | **版本:** 0.6.0 | **项目:** [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) | **许可证:** MIT
|
||||
|
||||
这是一个用于 [OpenWebUI](https://github.com/open-webui/open-webui) 的高级 Pipe 函数,深度集成了 **GitHub Copilot SDK**。它不仅支持 **GitHub Copilot 官方模型**(如 `gpt-5.2-codex`, `claude-sonnet-4.5`, `gemini-3-pro`, `gpt-5-mini`),还支持 **BYOK (自带 Key)** 模式对接自定义服务商(OpenAI, Anthropic),提供统一的 Agent 交互体验。
|
||||
这是一个用于 [OpenWebUI](https://github.com/open-webui/open-webui) 的高级 Pipe 函数,深度集成了 **GitHub Copilot SDK**。它不仅支持 **GitHub Copilot 官方模型**(如 `gpt-5.2-codex`, `claude-sonnet-4.5`, `gemini-3-pro`, `gpt-5-mini`),还支持 **BYOK (自带 Key)** 模式对接自定义服务商(OpenAI, Anthropic),并具备**严格的用户与会话级工作区隔离**能力,提供统一且安全的 Agent 交互体验。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **核心伴侣组件**
|
||||
> 如需启用文件处理与数据分析能力,请务必安装 [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/403a62ee-a596-45e7-be65-fab9cc249dd6)。
|
||||
|
||||
> [!TIP]
|
||||
> **使用 BYOK 模式无需订阅**
|
||||
> 如果您使用自己的 API Key (OpenAI, Anthropic) 运行 BYOK 模式,**则完全不需要** GitHub Copilot 订阅。
|
||||
> 仅当您希望使用 GitHub 官方提供的模型时,才需要订阅。
|
||||
> **BYOK 模式无需订阅**
|
||||
> 如果您使用自带的 API Key (BYOK 模式对接 OpenAI/Anthropic),**您不需要 GitHub Copilot 官方订阅**。只有在访问 GitHub 官方模型时才需要订阅。
|
||||
|
||||
## 🚀 最新特性 (v0.5.1) - 重大升级
|
||||
---
|
||||
|
||||
- **🧠 智能 BYOK 检测**: 优化了 BYOK 与官方 Copilot 模型的识别逻辑,完美支持自定义模型(角色/提示词)及倍率检测(如 `(0x)`, `(1x)`)。
|
||||
- **⚡ 性能飙升**: 引入 **工具缓存 (Tool Caching)** 机制,在请求间持久化工具定义,显著降低调用开销。
|
||||
- **🧩 丰富工具集成**: 工具描述现包含来源分组(内置/用户/服务器)及 Docstring 元数据自动解析。
|
||||
- **🛡️ 精确控制**: 完美兼容 OpenWebUI 全局函数过滤配置 (`function_name_filter_list`),可精准控制暴露给 LLM 的函数。
|
||||
- **🔑 用户级 BYOK**: 支持在用户层面配置自定义 API Key 对接 AI 供应商(OpenAI, Anthropic)。
|
||||
- **📝 格式优化**: 系统提示词强制使用标准 Markdown 表格,彻底解决 HTML 表格渲染问题。
|
||||
## ✨ 0.6.0 更新内容 (What's New)
|
||||
|
||||
## ✨ 核心能力
|
||||
- **👥 多用户与会话管理**: 采用 `user_id/chat_id` 的物理隔离架构,确保资源独立与稳健管理。
|
||||
- **🤖 赋予 Agent 文件自主权**: 自动将上传的文件同步至物理工作区,支持 Python 直接分析 Excel/CSV。
|
||||
- **🔧 OpenAPI & 外部工具修复**: 完美支持通过 OpenAPI 服务器挂载的工具调用。
|
||||
- **📊 计费与成本控制**: 增强的**计费倍率限制** (`MAX_MULTIPLIER`,例如设为 0 即仅限免费模型) 和**模型关键词过滤** (`EXCLUDE_KEYWORDS`),实现更精准的成本管控。
|
||||
- **🧠 数据库持久化 TODO**: 任务进度跨会话保存,Agent 拥有更持久的任务记忆。
|
||||
|
||||
- **🔑 灵活鉴权与 BYOK**: 支持 GitHub Copilot 订阅 (PAT) 或自带 Key (OpenAI/Anthropic),完全掌控模型访问与计费。
|
||||
- **🌉 强大的生态桥接**: 首个且唯一完美打通 **OpenWebUI Tools** 与 **GitHub Copilot SDK** 的插件。
|
||||
- **🚀 官方原生产体验**: 基于官方 Python SDK 构建,提供最稳定、最纯正的 Copilot 交互体验。
|
||||
---
|
||||
|
||||
## ✨ 核心能力 (Key Capabilities)
|
||||
|
||||
- **🔑 灵活鉴权与 BYOK**: 支持 GitHub Copilot 官方订阅 (PAT) 或自带 Key (OpenAI/Anthropic)。
|
||||
- **🔌 通用工具协议**: 原生支持 **MCP (Model Context Protocol)**、OpenAPI 以及 OpenWebUI 内置工具。
|
||||
- **🛡️ 物理级工作区隔离**: 强制执行严格的用户特定沙箱,确保数据隐私与文件安全。
|
||||
- **♾️ 无限会话管理**: 智能上下文窗口管理与自动压缩算法,支持无限时长的对话交互。
|
||||
- **🧠 深度数据库集成**: 实时持久化 TOD·O 列表到 UI 进度条。
|
||||
- **🌊 深度推理展示**: 完整支持模型思考过程 (Thinking Process) 的流式渲染。
|
||||
- **🖼️ 智能多模态**: 支持图像识别与附件上传,让 Copilot 拥有视觉能力。
|
||||
- **🛠️ 极简部署流程**: 自动检测环境、自动下载 CLI、自动管理依赖,全自动化开箱即用。
|
||||
- **🛡️ 纯净安全体系**: 支持标准 PAT 认证,确保数据安全。
|
||||
- **🖼️ 智能多模态**: 完整支持图像识别与附件上传分析。
|
||||
- **⚡ 交互式伪影 (Artifacts)**: 自动渲染 Agent 生成的 HTML/JS 应用程序,直接在聊天界面交互。
|
||||
|
||||
## 安装与配置
|
||||
---
|
||||
|
||||
### 1. 导入函数
|
||||
## ⚙️ 核心配置参数 (Valves)
|
||||
|
||||
1. 打开 OpenWebUI。
|
||||
2. 进入 **Workspace** -> **Functions**。
|
||||
3. 点击 **+** (创建函数)。
|
||||
4. 将 `github_copilot_sdk_cn.py` 的内容完整粘贴进去。
|
||||
5. 保存。
|
||||
### 1. 管理员配置 (基础设置)
|
||||
|
||||
### 2. 配置 Valves (设置)
|
||||
管理员可在函数设置中定义全局默认行为。
|
||||
|
||||
在函数列表中找到 "GitHub Copilot",点击 **⚙️ (Valves)** 图标进行配置:
|
||||
|
||||
| 参数 | 说明 | 默认值 |
|
||||
| 参数 | 默认值 | 说明 |
|
||||
| :--- | :--- | :--- |
|
||||
| **GH_TOKEN** | **(必填)** GitHub 访问令牌 (PAT 或 OAuth Token)。用于聊天。 | - |
|
||||
| **DEBUG** | 是否开启调试日志(输出到浏览器控制台)。 | `False` |
|
||||
| **LOG_LEVEL** | Copilot CLI 日志级别: none, error, warning, info, debug, all。 | `error` |
|
||||
| **SHOW_THINKING** | 是否显示模型推理/思考过程(需开启流式 + 模型支持)。 | `True` |
|
||||
| **COPILOT_CLI_VERSION** | 指定安装/强制使用的 Copilot CLI 版本。 | `0.0.405` |
|
||||
| **EXCLUDE_KEYWORDS** | 排除包含这些关键词的模型(逗号分隔)。 | - |
|
||||
| **WORKSPACE_DIR** | 文件操作的受限工作区目录。 | - |
|
||||
| **INFINITE_SESSION** | 启用无限会话(自动上下文压缩)。 | `True` |
|
||||
| **COMPACTION_THRESHOLD** | 后台压缩阈值 (0.0-1.0)。 | `0.8` |
|
||||
| **BUFFER_THRESHOLD** | 缓冲区耗尽阈值 (0.0-1.0)。 | `0.95` |
|
||||
| **TIMEOUT** | 每个流式分块超时(秒)。 | `300` |
|
||||
| **CUSTOM_ENV_VARS** | 自定义环境变量 (JSON 格式)。 | - |
|
||||
| **REASONING_EFFORT** | 推理强度级别: low, medium, high. `xhigh` 仅部分模型支持。 | `medium` |
|
||||
| **ENABLE_MCP_SERVER** | 启用直接 MCP 客户端连接 (建议)。 | `True` |
|
||||
| **ENABLE_OPENWEBUI_TOOLS** | 启用 OpenWebUI 工具 (包括自定义和服务器工具)。 | `True` |
|
||||
| **BYOK_ENABLED** | 启用 BYOK (自带 Key) 模式以使用自定义供应商。 | `False` |
|
||||
| **BYOK_TYPE** | BYOK 供应商类型: `openai`, `azure`, `anthropic`。 | `openai` |
|
||||
| **BYOK_BASE_URL** | BYOK 基础 URL (如 `https://api.openai.com/v1`)。 | - |
|
||||
| **BYOK_API_KEY** | BYOK API Key (全局设置)。 | - |
|
||||
| **BYOK_BEARER_TOKEN** | BYOK Bearer Token (全局,覆盖 API Key)。 | - |
|
||||
| **BYOK_WIRE_API** | BYOK 通信协议: `completions`, `responses`。 | `completions` |
|
||||
| `GH_TOKEN` | `""` | 全局 GitHub Token (需具备 'Copilot Requests' 权限)。 |
|
||||
| `ENABLE_OPENWEBUI_TOOLS` | `True` | 启用 OpenWebUI 工具 (包括定义工具和内置工具)。 |
|
||||
| `ENABLE_OPENAPI_SERVER` | `True` | 启用 OpenAPI 工具服务器连接。 |
|
||||
| `ENABLE_MCP_SERVER` | `True` | 启用直接 MCP 客户端连接 (推荐)。 |
|
||||
| `REASONING_EFFORT` | `medium` | 推理强度:low, medium, high。 |
|
||||
| `SHOW_THINKING` | `True` | 显示模型推理/思考过程。 |
|
||||
| `INFINITE_SESSION` | `True` | 启用无限会话 (自动上下文压缩)。 |
|
||||
| `MAX_MULTIPLIER` | `1.0` | 最大允许的模型计费倍率 (0x 为仅限免费模型)。 |
|
||||
| `EXCLUDE_KEYWORDS` | `""` | 排除包含这些关键字的模型 (逗号分隔)。 |
|
||||
| `TIMEOUT` | `300` | 每个流数据块的超时时间 (秒)。 |
|
||||
| `BYOK_TYPE` | `openai` | BYOK 服务商类型:`openai`, `anthropic`。 |
|
||||
| `BYOK_BASE_URL` | `""` | BYOK 基础 URL (例如: <https://api.openai.com/v1)。> |
|
||||
| `BYOK_MODELS` | `""` | BYOK 模型列表 (逗号分隔)。留空则从 API 获取。 |
|
||||
| `CUSTOM_ENV_VARS` | `""` | 自定义环境变量 (JSON 格式)。 |
|
||||
| `DEBUG` | `False` | 开启此项以在前端控制台输出详细调试日志。 |
|
||||
|
||||
#### 用户 Valves(按用户覆盖)
|
||||
### 2. 用户配置 (个人覆盖)
|
||||
|
||||
以下设置可按用户单独配置(覆盖全局 Valves):
|
||||
普通用户可在各自的个人设置中根据需要覆盖以下参数。
|
||||
|
||||
| 参数 | 说明 | 默认值 |
|
||||
| :--- | :--- | :--- |
|
||||
| **GH_TOKEN** | 个人 GitHub Token(覆盖全局设置)。 | - |
|
||||
| **REASONING_EFFORT** | 推理强度级别(low/medium/high/xhigh)。 | - |
|
||||
| **DEBUG** | 是否启用技术调试日志。 | `False` |
|
||||
| **SHOW_THINKING** | 是否显示思考过程。 | `True` |
|
||||
| **ENABLE_OPENWEBUI_TOOLS** | 启用 OpenWebUI 工具(覆盖全局设置)。 | `True` |
|
||||
| **ENABLE_MCP_SERVER** | 启用动态 MCP 服务器加载(覆盖全局设置)。 | `True` |
|
||||
| 参数 | 说明 |
|
||||
| :--- | :--- |
|
||||
| `GH_TOKEN` | 使用个人的 GitHub Token。 |
|
||||
| `REASONING_EFFORT`| 个人偏好的推理强度。 |
|
||||
| `SHOW_THINKING` | 显示模型推理/思考过程。 |
|
||||
| `MAX_MULTIPLIER` | 最大允许的模型计费倍率覆盖。 |
|
||||
| `EXCLUDE_KEYWORDS` | 排除包含这些关键字的模型。 |
|
||||
| `BYOK_API_KEY` | 使用个人的 OpenAI/Anthropic API Key。 |
|
||||
|
||||
## ⭐ 支持
|
||||
---
|
||||
|
||||
如果这个插件对你有帮助,欢迎到 [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) 点个 Star,这将是我持续改进的动力,感谢支持。
|
||||
## 🎯 典型应用场景 (Use Cases)
|
||||
|
||||
### 获取 Token
|
||||
- **📁 全自主仓库维护**: Agent 在隔离工作区内自动分析代码、运行测试并应用补丁。
|
||||
- **📊 深度财务数据审计**: 直接通过 Python 加载 Excel/CSV 原始数据(绕过 RAG),生成图表并实时预览。
|
||||
- **📝 长任务项目管理**: 自动拆解复杂任务并持久化 TOD·O 进度,跨会话跟踪执行状态。
|
||||
|
||||
要使用 GitHub Copilot,您需要一个具有适当权限的 GitHub 个人访问令牌 (PAT)。
|
||||
---
|
||||
|
||||
**获取步骤:**
|
||||
## ⭐ 支持与交流 (Support)
|
||||
|
||||
1. 访问 [GitHub 令牌设置](https://github.com/settings/tokens?type=beta)。
|
||||
2. 点击 **Generate new token (fine-grained)**。
|
||||
3. **Repository access**: 选择 **Public Repositories** (最简单) 或 **All repositories**。
|
||||
4. **Permissions**:
|
||||
- 如果您选择了 **All repositories**,则必须点击 **Account permissions**。
|
||||
- 找到 **Copilot Requests**,选择 **Access**。
|
||||
5. 生成并复制令牌。
|
||||
如果这个插件对您有所帮助,请在 [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui) 项目上点个 **Star** 💫,这是对我最大的鼓励。
|
||||
|
||||
## 📋 依赖说明
|
||||
---
|
||||
|
||||
该 Pipe 会自动尝试安装以下依赖(如果环境中缺失):
|
||||
## 🚀 安装与配置 (Installation)
|
||||
|
||||
- `github-copilot-sdk` (Python 包)
|
||||
- `github-copilot-cli` (二进制文件,通过官方脚本安装)
|
||||
### 1) 导入函数
|
||||
|
||||
## 故障排除 (Troubleshooting) ❓
|
||||
1. 打开 OpenWebUI,前往 **工作区** -> **函数**。
|
||||
2. 点击 **+** (创建函数),完整粘贴 `github_copilot_sdk_cn.py` 的内容。
|
||||
3. 点击保存并确保已启用。
|
||||
|
||||
- **图片及多模态使用说明**:
|
||||
- 确保 `MODEL_ID` 是支持多模态的模型。
|
||||
- **看不到思考过程**:
|
||||
- 确认已开启**流式输出**,且所选模型支持推理输出。
|
||||
### 2) 获取 Token (Get Token)
|
||||
|
||||
## 更新日志
|
||||
1. 访问 [GitHub Token 设置](https://github.com/settings/tokens?type=beta)。
|
||||
2. 创建 **Fine-grained token**,授予 **Account permissions** -> **Copilot Requests** 访问权限。
|
||||
3. 将生成的 Token 填入插件的 `GH_TOKEN` 配置项中。
|
||||
|
||||
完整历史请查看 GitHub 项目: [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
|
||||
### 3) 配套插件 (强烈推荐)
|
||||
|
||||
为了获得最佳的文件处理体验,请安装 [GitHub Copilot SDK Files Filter](https://openwebui.com/posts/403a62ee-a596-45e7-be65-fab9cc249dd6)。
|
||||
|
||||
---
|
||||
|
||||
## 📋 常见问题与依赖 (Troubleshooting)
|
||||
|
||||
- **Agent 无法识别文件?**: 请确保已安装并启用了 Files Filter 插件,否则原始文件会被 RAG 干扰。
|
||||
- **看不到 TODO 进度条?**: 进度条仅在 Agent 使用 `update_todo` 工具(通常是处理复杂任务)时出现。
|
||||
- **依赖安装**: 本管道会自动尝试安装 `github-copilot-sdk` (Python 包) 和 `github-copilot-cli` (官方二进制)。
|
||||
|
||||
---
|
||||
|
||||
## 更新日志 (Changelog)
|
||||
|
||||
完整历史记录请见 GitHub: [Awesome OpenWebUI](https://github.com/Fu-Jie/awesome-openwebui)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
103
plugins/pipes/github-copilot-sdk/scripts/sync_to_workspace.py
Normal file
103
plugins/pipes/github-copilot-sdk/scripts/sync_to_workspace.py
Normal file
@@ -0,0 +1,103 @@
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import asyncio
|
||||
from typing import List, Dict
|
||||
|
||||
# 1. 尝试导入 OpenWebUI 环境
|
||||
try:
|
||||
from open_webui.models.models import Models, ModelForm, ModelMeta, ModelParams
|
||||
from open_webui.internal.db import get_session
|
||||
except ImportError:
|
||||
print("❌ 错误: 无法导入 OpenWebUI 模块。请确保在 OpenWebUI 环境(如 conda ai)中运行此脚本。")
|
||||
sys.exit(1)
|
||||
|
||||
# 2. 导入 Copilot SDK
|
||||
try:
|
||||
from copilot import CopilotClient
|
||||
except ImportError:
|
||||
print("❌ 错误: 无法导入 copilot SDK。请运行: pip install github-copilot-sdk==0.1.23")
|
||||
sys.exit(1)
|
||||
|
||||
async def fetch_real_models() -> List[Dict]:
|
||||
gh_token = os.environ.get("GH_TOKEN")
|
||||
if not gh_token:
|
||||
print("❌ 错误: 未设置 GH_TOKEN 环境变量。")
|
||||
return []
|
||||
|
||||
client = CopilotClient()
|
||||
try:
|
||||
await client.start()
|
||||
raw_models = await client.list_models()
|
||||
processed = []
|
||||
for m in raw_models:
|
||||
m_id = getattr(m, "id", str(m))
|
||||
# 提取倍率
|
||||
billing = getattr(m, "billing", {})
|
||||
if not isinstance(billing, dict): billing = vars(billing)
|
||||
multiplier = billing.get("multiplier", 1)
|
||||
|
||||
# 提取能力
|
||||
cap = getattr(m, "capabilities", None)
|
||||
vision = False
|
||||
reasoning = False
|
||||
if cap:
|
||||
supports = getattr(cap, "supports", {})
|
||||
if not isinstance(supports, dict): supports = vars(supports)
|
||||
vision = supports.get("vision", False)
|
||||
reasoning = supports.get("reasoning_effort", False)
|
||||
|
||||
processed.append({
|
||||
"id": m_id,
|
||||
"name": f"GitHub Copilot ({m_id})",
|
||||
"vision": vision,
|
||||
"reasoning": reasoning,
|
||||
"multiplier": multiplier
|
||||
})
|
||||
return processed
|
||||
except Exception as e:
|
||||
print(f"❌ 获取模型失败: {e}")
|
||||
return []
|
||||
finally:
|
||||
await client.stop()
|
||||
|
||||
async def sync_to_db():
|
||||
models = await fetch_real_models()
|
||||
if not models: return
|
||||
|
||||
print(f"🔄 发现 {len(models)} 个 Copilot 模型,正在同步到工作区...")
|
||||
|
||||
# 默认管理员 ID
|
||||
admin_user_id = "00000000-0000-0000-0000-000000000000"
|
||||
|
||||
for m in models:
|
||||
# 对应插件中的 ID 格式
|
||||
full_id = f"copilot-{m['id']}"
|
||||
|
||||
existing = Models.get_model_by_id(full_id)
|
||||
if existing:
|
||||
print(f"⚠️ 跳过: {full_id} (已存在)")
|
||||
continue
|
||||
|
||||
form_data = ModelForm(
|
||||
id=full_id,
|
||||
base_model_id=None,
|
||||
name=m['name'],
|
||||
meta=ModelMeta(
|
||||
description=f"GitHub Copilot 官方模型。倍率: {m['multiplier']}x。支持推理: {m['reasoning']}。",
|
||||
capabilities={
|
||||
"vision": m['vision'],
|
||||
"reasoning": m['reasoning']
|
||||
}
|
||||
),
|
||||
params=ModelParams()
|
||||
)
|
||||
|
||||
try:
|
||||
if Models.insert_new_model(form_data, admin_user_id):
|
||||
print(f"✅ 成功同步: {m['name']}")
|
||||
except Exception as e:
|
||||
print(f"❌ 同步 {m['id']} 失败: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(sync_to_db())
|
||||
111
plugins/pipes/github-copilot-sdk/scripts/test_sdk.py
Normal file
111
plugins/pipes/github-copilot-sdk/scripts/test_sdk.py
Normal file
@@ -0,0 +1,111 @@
|
||||
import asyncio
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
from typing import Any
|
||||
from datetime import datetime
|
||||
from copilot import CopilotClient
|
||||
|
||||
# 自定义 JSON 编码器,处理 datetime 等对象
|
||||
class SDKEncoder(json.JSONEncoder):
|
||||
def default(self, obj):
|
||||
if isinstance(obj, datetime):
|
||||
return obj.isoformat()
|
||||
if hasattr(obj, "to_dict"):
|
||||
return obj.to_dict()
|
||||
try:
|
||||
return super().default(obj)
|
||||
except TypeError:
|
||||
return str(obj)
|
||||
|
||||
async def run_debug_test(client, model_id, effort, prompt):
|
||||
print(f"\n" + "🔍" * 15)
|
||||
print(f"DEBUGGING: {model_id} | {effort.upper()}")
|
||||
print("🔍" * 15)
|
||||
|
||||
session_config = {
|
||||
"model": model_id,
|
||||
"reasoning_effort": effort
|
||||
}
|
||||
|
||||
queue = asyncio.Queue()
|
||||
done = asyncio.Event()
|
||||
SENTINEL = object()
|
||||
|
||||
def handler(event):
|
||||
try:
|
||||
etype = getattr(event, "type", "unknown")
|
||||
if hasattr(etype, "value"): etype = etype.value
|
||||
|
||||
raw_data = {}
|
||||
# 优先尝试 SDK 自带的 to_dict
|
||||
if hasattr(event, "to_dict"):
|
||||
raw_data = event.to_dict()
|
||||
elif hasattr(event, "data"):
|
||||
data_obj = event.data
|
||||
if isinstance(data_obj, dict):
|
||||
raw_data = data_obj
|
||||
elif hasattr(data_obj, "to_dict"):
|
||||
raw_data = data_obj.to_dict()
|
||||
else:
|
||||
raw_data = {k: v for k, v in vars(data_obj).items() if not k.startswith('_')}
|
||||
else:
|
||||
raw_data = {k: v for k, v in vars(event).items() if not k.startswith('_')}
|
||||
|
||||
queue.put_nowait((etype, raw_data))
|
||||
|
||||
if etype in ["session.idle", "session.error"]:
|
||||
done.set()
|
||||
queue.put_nowait(SENTINEL)
|
||||
except Exception as e:
|
||||
print(f"Handler Error: {e}")
|
||||
|
||||
try:
|
||||
session = await client.create_session(config=session_config)
|
||||
unsubscribe = session.on(handler)
|
||||
|
||||
print(f"Sending prompt...")
|
||||
asyncio.create_task(session.send({"prompt": prompt, "mode": "immediate"}))
|
||||
|
||||
event_count = 0
|
||||
while True:
|
||||
try:
|
||||
item = await asyncio.wait_for(queue.get(), timeout=180)
|
||||
if item is SENTINEL: break
|
||||
|
||||
etype, data = item
|
||||
event_count += 1
|
||||
|
||||
# 打印所有事件,不进行过滤,这样我们可以看到完整的生命周期
|
||||
print(f"\n[#{event_count} EVENT: {etype}]")
|
||||
print(json.dumps(data, indent=2, ensure_ascii=False, cls=SDKEncoder))
|
||||
|
||||
except asyncio.TimeoutError:
|
||||
print("\n⚠️ Timeout: No events for 180s")
|
||||
break
|
||||
|
||||
unsubscribe()
|
||||
await session.destroy()
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Session Failed: {e}")
|
||||
|
||||
async def main():
|
||||
gh_token = os.environ.get("GH_TOKEN")
|
||||
if not gh_token:
|
||||
print("❌ Error: GH_TOKEN not set")
|
||||
return
|
||||
|
||||
client = CopilotClient()
|
||||
await client.start()
|
||||
|
||||
# 使用一个简单但需要思考的问题
|
||||
prompt = "123 * 456 等于多少?请给出思考过程。"
|
||||
target_model = "gpt-5-mini"
|
||||
|
||||
await run_debug_test(client, target_model, "high", prompt)
|
||||
|
||||
await client.stop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user