From ce7d78f7d04879751c7fde499e8e546fc8369955 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Sun, 25 Jan 2026 19:40:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(plugins):=20=E6=96=B0=E5=A2=9E=20AI=20?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=8F=92=E4=BB=B6=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 AI 监控插件 (ai-monitor),支持全链路协议转换监控 - 捕获 AI 接口请求参数(转换前后) - 监控流式和非流式响应(转换前后) - 支持内部请求转换监控 - 新增日志清空功能,支持前端和服务器端同时清空当日日志 - 默认禁用 api-potluck 和 ai-monitor 插件 - 更新多语言文档和配置示例 - 优化提供商适配器开发指南 --- OPENCODE_CONFIG_EXAMPLE.md | 111 +++++++++++++ PROVIDER_ADAPTER_GUIDE.md | 73 +++++--- README-JA.md | 1 + README-ZH.md | 1 + README.md | 1 + UI_README.md | 238 --------------------------- configs/plugins.json.example | 2 +- src/core/plugin-manager.js | 11 +- src/plugins/ai-monitor/index.js | 130 +++++++++++++++ src/providers/claude/claude-kiro.js | 33 +++- src/services/ui-manager.js | 5 + src/ui-modules/system-api.js | 40 +++++ src/utils/common.js | 55 ++++++- src/utils/logger.js | 33 ++++ static/app/event-handlers.js | 58 ++++++- static/app/i18n.js | 46 ++++++ static/components/section-guide.html | 36 ++-- 17 files changed, 581 insertions(+), 293 deletions(-) create mode 100644 OPENCODE_CONFIG_EXAMPLE.md delete mode 100644 UI_README.md create mode 100644 src/plugins/ai-monitor/index.js diff --git a/OPENCODE_CONFIG_EXAMPLE.md b/OPENCODE_CONFIG_EXAMPLE.md new file mode 100644 index 0000000..76016bd --- /dev/null +++ b/OPENCODE_CONFIG_EXAMPLE.md @@ -0,0 +1,111 @@ +# OpenCode 配置示例及重点解释 + +本文档提供了一个典型的 `opencode` 配置文件示例,并对其中的关键配置项进行了详细解释,帮助您快速理解如何配置不同的 AI 服务提供商。 + +## 配置示例 (`config.json`) + +```json +{ + "plugin": [], + "provider": { + "kiro": { + "npm": "@ai-sdk/anthropic", + "name": "AIClient2API-kiro", + "options": { + "baseURL": "http://localhost:3000/claude-kiro-oauth/v1", + "apiKey": "123456" + }, + "models": { + "claude-opus-4-5": { + "name": "Claude Opus 4.5 Kiro" + }, + "claude-sonnet-4-5-20250929": { + "name": "Claude Sonnet 4.5 Kiro" + } + } + }, + "qwen": { + "npm": "@ai-sdk/openai-compatible", + "name": "AIClient2API-qwen", + "options": { + "baseURL": "http://localhost:3000/openai-qwen-oauth/v1", + "apiKey": "123456" + }, + "models": { + "qwen3-coder-plus": { + "name": "Qwen3 Coder Plus Openai " + } + } + }, + "gemini-antigravity": { + "npm": "@ai-sdk/google", + "name": "AIClient2API-antigravity", + "options": { + "baseURL": "http://localhost:3000/gemini-antigravity/v1beta", + "apiKey": "123456" + }, + "models": { + "gemini-2.5-flash-preview": { + "name": "gemini-2.5-flash-antigravity" + }, + "gemini-3-flash-preview": { + "name": "gemini-3-flash-antigravity" + }, + "gemini-3-pro-preview": { + "name": "gemini-3-pro-antigravity" + } + } + }, + "gemini-cli": { + "npm": "@ai-sdk/google", + "name": "AIClient2API-geminicli", + "options": { + "baseURL": "http://localhost:3000/v1beta", + "apiKey": "123456" + }, + "models": { + "gemini-2.5-flash-preview": { + "name": "gemini-2.5-flash-geminicli" + }, + "gemini-3-flash-preview": { + "name": "gemini-3-flash-geminicli" + }, + "gemini-3-pro-preview": { + "name": "gemini-3-pro-geminicli" + } + } + } + }, + "$schema": "https://opencode.ai/config.json" +} +``` + +## 配置重点解释 + +### 1. `provider` (服务提供商配置) +这是配置的核心部分,每个键(如 `kiro`, `qwen`, `gemini-cli`)代表一个独立的服务提供商实例。 + +* **`npm` (SDK 适配器)**: + * 指定底层使用的 AI SDK。例如: + * `@ai-sdk/anthropic`: 用于 Anthropic (Claude) 系列模型。 + * `@ai-sdk/openai-compatible`: 用于兼容 OpenAI 接口标准的模型(如通义千问 Qwen)。 + * `@ai-sdk/google`: 用于 Google Gemini 系列模型。 + * **重点**: 必须确保 `npm` 字段与您要使用的模型协议匹配,否则会导致连接失败。 + +* **`options` (连接参数)**: + * **`baseURL`**: API 的访问地址。在示例中,许多是内网或中转地址(如 `http://localhost:3000/...`)。 + * **`apiKey`**: 访问 API 所需的身份验证密钥。 + +* **`models` (模型映射)**: + * 定义该提供商下可用的模型列表。 + * **键名 (ID)**: 实际调用时使用的模型 ID(例如 `claude-opus-4-5`)。 + * **`name`**: 在 UI 界面上显示的友好名称。 + * **重点**: 这里的键名必须与服务端实际支持的模型标识符一致。 + +### 2. 区分同类型的不同实例 +在示例中,有两个 `gemini` 相关的配置:`gemini-antigravity` 和 `gemini-cli`。 +* 它们虽然都使用 `@ai-sdk/google`,但通过不同的 `baseURL` 区分。 +* 这允许您在同一配置中接入来自不同网关或环境的同类模型,并通过自定义的 `name`(如 `gemini-2.5-flash-antigravity` vs `gemini-2.5-flash-geminicli`)在前端进行区分。 + +### 3. `$schema` +* 用于提供 JSON 模式验证。在支持的编辑器(如 VS Code)中,它可以为您提供自动补全和实时错误检查。 diff --git a/PROVIDER_ADAPTER_GUIDE.md b/PROVIDER_ADAPTER_GUIDE.md index 67bab7c..54f44b9 100644 --- a/PROVIDER_ADAPTER_GUIDE.md +++ b/PROVIDER_ADAPTER_GUIDE.md @@ -6,13 +6,17 @@ 1. **后端常量定义**:在 `src/utils/common.js` 中添加标识。 2. **核心 Service 开发**:在 `src/providers/` 实现 API 请求逻辑。 -3. **适配器注册**:在 `src/providers/adapter.js` 注册。 +3. **适配器注册**:在 `src/providers/adapter.js` 注册并实现适配器类。 4. **模型与号池配置**:在 `src/providers/provider-models.js` 和 `src/providers/provider-pool-manager.js` 配置。 5. **前端 UI 全方位调整**: * `static/app/provider-manager.js`:号池显示与顺序。 * `static/app/file-upload.js`:上传路径映射。 + * `static/app/modal.js`:配置字段显示顺序。 + * `static/app/utils.js`:定义配置字段元数据。 * `static/components/section-config.html`:配置按钮。 * `static/components/section-guide.html`:使用指南。 + * `static/app/routing-examples.js`:路由调用示例。 + * `src/handlers/ollama-handler.js`:Ollama 协议前缀与支持映射。 6. **系统级映射(必做)**:在 OAuth 处理器、凭据关联工具、用量统计等模块中建立映射。 --- @@ -25,36 +29,49 @@ ### 2.2 核心 Service (Core) 在 `src/providers/` 下创建新目录并实现 `NewProviderApiService` 类。 **必选方法**:`constructor(config)`, `initialize()`, `listModels()`, `generateContent()`, `generateContentStream()`。 +**可选功能**:若支持用量查询,需实现 `getUsageLimits()`;若支持 Token 统计,需实现 `countTokens()`。 ### 2.3 注册适配器 -在 [`src/providers/adapter.js`](src/providers/adapter.js) 中继承 `ApiServiceAdapter`,并在 `getServiceAdapter` 工厂方法中添加 `switch` 分支。 +在 [`src/providers/adapter.js`](src/providers/adapter.js) 中: +1. 继承 `ApiServiceAdapter` 实现特定提供商的适配器类。 +2. 适配器类需按需重写 `generateContent`, `generateContentStream`, `listModels`, `getUsageLimits`, `countTokens`, `refreshToken` 等方法,并转发给核心 Service。 +3. 在 `getServiceAdapter` 工厂方法中添加对应的 `switch` 分支,根据 `MODEL_PROVIDER` 返回实例。 ### 2.4 模型与号池默认配置 * **模型列表**:在 [`src/providers/provider-models.js`](src/providers/provider-models.js) 的 `PROVIDER_MODELS` 对象中添加默认支持的模型 ID。 -* **健康检查默认值**:在 [`src/providers/provider-pool-manager.js`](src/providers/provider-pool-manager.js) 的 `DEFAULT_HEALTH_CHECK_MODELS` 中指定用于健康检查的默认模型。 +* **健康检查默认值**:在 [`src/providers/provider-pool-manager.js`](src/providers/provider-pool-manager.js) 的以下位置配置: + * `DEFAULT_HEALTH_CHECK_MODELS`:指定用于健康检查的默认模型。 + * `checkAndRefreshExpiringNodes`:指定凭据文件路径键名。 + * `_buildHealthCheckRequests`:若有特殊请求格式需求,需在此添加逻辑。 --- ## 3. 前端界面调整 -### 3.1 号池显示逻辑 ([`static/app/provider-manager.js`](static/app/provider-manager.js)) -* **显示顺序**:将新标识添加到 `providerDisplayOrder` 数组。 -* **授权按钮**:若支持 OAuth,在 `generateAuthButton` 的 `oauthProviders` 数组中添加标识。 -* **路径提示**:在 `getAuthFilePath` 中返回凭据文件的默认建议路径。 +### 3.1 字段定义与元数据 ([`static/app/utils.js`](static/app/utils.js)) +在 `getProviderTypeFields` 函数中定义该提供商所需的配置字段(如 API Key, Base URL, 凭据路径等),指定字段类型和占位符。 -### 3.2 凭据上传路由 ([`static/app/file-upload.js`](static/app/file-upload.js)) +### 3.2 字段显示顺序 ([`static/app/modal.js`](static/app/modal.js)) +在 `getFieldOrder` 函数的 `fieldOrderMap` 中添加新提供商的字段显示顺序。 + +### 3.3 号池显示逻辑 ([`static/app/provider-manager.js`](static/app/provider-manager.js)) +* **显示顺序**:将新标识和显示名称添加到 `providerConfigs` 数组。 +* **授权按钮**:若支持 OAuth,在 `generateAuthButton` 的 `oauthProviders` 数组中添加标识。 +* **认证逻辑**:若支持 OAuth 或批量导入,需在 `handleGenerateAuthUrl` 中实现相应的触发逻辑(如弹出认证方式选择器)。 + +### 3.4 凭据上传路由 ([`static/app/file-upload.js`](static/app/file-upload.js)) * 修改 `getProviderKey`,建立提供商标识与 `configs/` 子目录名的映射(例如:`new-provider-api` -> `new-provider`)。 -### 3.3 凭据文件管理筛选器 +### 3.5 凭据文件管理筛选器 需要在以下三个位置添加新提供商的筛选支持: -#### 3.3.1 HTML 筛选器选项 ([`static/components/section-upload-config.html`](static/components/section-upload-config.html)) +#### 3.5.1 HTML 筛选器选项 ([`static/components/section-upload-config.html`](static/components/section-upload-config.html)) 在 `id="configProviderFilter"` 的 `