From 0149bf65588ffdbc57287a7542a0b9300efafae8 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Fri, 14 Nov 2025 00:10:27 +0800 Subject: [PATCH] =?UTF-8?q?docs(terminology):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=9C=AF=E8=AF=AD=E6=A0=87=E5=87=86=20-=20=E5=B0=86"=E4=BE=9B?= =?UTF-8?q?=E5=BA=94=E5=95=86"=E8=A7=84=E8=8C=83=E4=B8=BA"=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=95=86"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将项目中所有文档、注释和用户界面中的"供应商"术语统一修改为"提供商",提升术语一致性。同时: - 优化提供商健康检查频率从30分钟调整为10分钟,提高监控及时性 - 新增路由URL动态更新功能,支持不同部署环境的路径适配 - 更新相关样式类名和注释,确保代码与文档术语保持一致 --- README-ZH.md | 8 +-- UI_README.md | 12 ++-- src/provider-pool-manager.js | 14 ++--- src/ui-manager.js | 14 ++--- static/app/config-manager.js | 12 ++-- static/app/event-handlers.js | 16 ++--- static/app/event-stream.js | 6 +- static/app/modal.js | 92 ++++++++++++++--------------- static/app/provider-manager.js | 14 ++--- static/app/styles.css | 10 ++-- static/app/upload-config-manager.js | 4 +- static/index.html | 41 +++++++++++-- 12 files changed, 137 insertions(+), 106 deletions(-) diff --git a/README-ZH.md b/README-ZH.md index 0c4455e..25638a3 100644 --- a/README-ZH.md +++ b/README-ZH.md @@ -202,7 +202,7 @@ install-and-run.bat **⚙️ 配置管理**:实时参数修改,支持所有提供商(Gemini、OpenAI、Claude、Kiro、Qwen),包含高级设置和文件上传 -**🔗 供应商池**:监控活动连接、提供商健康统计、启用/禁用管理 +**🔗 提供商池**:监控活动连接、提供商健康统计、启用/禁用管理 **📁 配置文件**:OAuth 凭据集中管理,支持搜索过滤和文件操作 @@ -261,17 +261,17 @@ install-and-run.bat --- -### 🔄 模型供应商切换 +### 🔄 模型提供商切换 本项目提供两种灵活的模型切换方式,满足不同使用场景的需求。 -通过在 API 请求路径中指定供应商标识,实现即时切换: +通过在 API 请求路径中指定提供商标识,实现即时切换: | 路由路径 | 说明 | 适用场景 | |---------|------|---------| | `/claude-custom` | 使用配置文件中的 Claude API | 官方 Claude API 调用 | | `/claude-kiro-oauth` | 通过 Kiro OAuth 访问 Claude | 免费使用 Claude Sonnet 4.5 | -| `/openai-custom` | 使用 OpenAI 供应商处理请求 | 标准 OpenAI API 调用 | +| `/openai-custom` | 使用 OpenAI 提供商处理请求 | 标准 OpenAI API 调用 | | `/gemini-cli-oauth` | 通过 Gemini CLI OAuth 访问 | 突破 Gemini 免费限制 | | `/openai-qwen-oauth` | 通过 Qwen OAuth 访问 | 使用 Qwen Code Plus | | `/openaiResponses-custom` | OpenAI Responses API | 结构化对话场景 | diff --git a/UI_README.md b/UI_README.md index 06e331d..e878704 100644 --- a/UI_README.md +++ b/UI_README.md @@ -2,7 +2,7 @@ ## 概述 -AIClient2API 现在包含一个功能完整的可视化 Web UI 管理控制台,允许您通过浏览器轻松管理配置、监控供应商池状态、查看实时日志、配置AI模型提供商等。 +AIClient2API 现在包含一个功能完整的可视化 Web UI 管理控制台,允许您通过浏览器轻松管理配置、监控提供商池状态、查看实时日志、配置AI模型提供商等。 ## 功能特性 @@ -14,7 +14,7 @@ AIClient2API 现在包含一个功能完整的可视化 Web UI 管理控制台 ### 📊 实时监控 - **仪表盘**:显示运行时间、系统信息、Node.js版本、服务器时间、内存使用 -- **供应商池管理**:查看各提供商账户状态、使用统计、错误率 +- **提供商池管理**:查看各提供商账户状态、使用统计、错误率 - **活动统计**:活动连接、活跃提供商、健康提供商数量 ### ⚙️ 配置管理 @@ -32,7 +32,7 @@ AIClient2API 现在包含一个功能完整的可视化 Web UI 管理控制台 - 提示日志配置 - 请求重试机制(最大重试次数、基础延迟) - OAuth令牌自动刷新设置 - - 供应商池配置文件路径 + - 提供商池配置文件路径 ### 🔧 上传配置管理 - 搜索配置文件功能 @@ -87,7 +87,7 @@ node src/api-server.js --port 3000 --api-key 123456 1. **仪表盘** - 系统概览、统计信息和路径路由示例 2. **配置管理** - 修改服务器配置和提供商设置 -3. **供应商池管理** - 管理多个API提供商账户 +3. **提供商池管理** - 管理多个API提供商账户 4. **上传配置管理** - 管理配置文件和搜索过滤 5. **实时日志** - 查看服务器运行日志 @@ -103,7 +103,7 @@ node src/api-server.js --port 3000 --api-key 123456 ### 系统信息 - `GET /api/system` - 获取系统信息 -- `GET /api/providers` - 获取供应商池信息 +- `GET /api/providers` - 获取提供商池信息 ### 实时数据 - `GET /api/events` - Server-Sent Events 流,用于实时更新 @@ -203,7 +203,7 @@ A: 在配置管理页面选择对应的OAuth提供商,填写项目ID和OAuth A: 上传配置文件可以将本地配置文件上传到服务器,方便管理和在不同环境间同步配置。 ### Q: 如何查看更详细的提供商信息? -A: 在"供应商池"页面可以看到每个提供商的使用次数、错误次数、最后使用时间等详细信息。 +A: 在"提供商池"页面可以看到每个提供商的使用次数、错误次数、最后使用时间等详细信息。 ### Q: 配置修改后需要重启服务器吗? A: 大部分配置(如系统提示、API密钥)会立即生效,但网络端口等更改需要重启服务器。 diff --git a/src/provider-pool-manager.js b/src/provider-pool-manager.js index 092759d..4ed6058 100644 --- a/src/provider-pool-manager.js +++ b/src/provider-pool-manager.js @@ -12,7 +12,7 @@ export class ProviderPoolManager { this.providerStatus = {}; // Tracks health and usage for each provider instance this.roundRobinIndex = {}; // Tracks the current index for round-robin selection for each provider type this.maxErrorCount = options.maxErrorCount || 3; // Default to 1 errors before marking unhealthy - this.healthCheckInterval = options.healthCheckInterval || 30 * 60 * 1000; // Default to 30 minutes + this.healthCheckInterval = options.healthCheckInterval || 10 * 60 * 1000; // Default to 10 minutes // 优化1: 添加防抖机制,避免频繁的文件 I/O 操作 this.saveDebounceTime = options.saveDebounceTime || 1000; // 默认1秒防抖 @@ -140,9 +140,9 @@ export class ProviderPoolManager { } /** - * 禁用指定供应商 - * @param {string} providerType - 供应商类型 - * @param {object} providerConfig - 供应商配置 + * 禁用指定提供商 + * @param {string} providerType - 提供商类型 + * @param {object} providerConfig - 提供商配置 */ disableProvider(providerType, providerConfig) { const pool = this.providerStatus[providerType]; @@ -159,9 +159,9 @@ export class ProviderPoolManager { } /** - * 启用指定供应商 - * @param {string} providerType - 供应商类型 - * @param {object} providerConfig - 供应商配置 + * 启用指定提供商 + * @param {string} providerType - 提供商类型 + * @param {object} providerConfig - 提供商配置 */ enableProvider(providerType, providerConfig) { const pool = this.providerStatus[providerType]; diff --git a/src/ui-manager.js b/src/ui-manager.js index 7dd83d6..97297fa 100644 --- a/src/ui-manager.js +++ b/src/ui-manager.js @@ -628,7 +628,7 @@ export async function handleUIApiRequests(method, pathParam, req, res, currentCo timestamp: new Date().toISOString() }); - // 广播供应商更新事件 + // 广播提供商更新事件 broadcastEvent('provider_update', { action: 'add', providerType, @@ -1216,13 +1216,13 @@ async function scanConfigFiles(currentConfig, providerPoolManager) { } } - // 使用最新的供应商池数据 + // 使用最新的提供商池数据 let providerPools = currentConfig.providerPools; if (providerPoolManager && providerPoolManager.providerPools) { providerPools = providerPoolManager.providerPools; } - // 检查供应商池文件中的所有OAuth凭据路径 - 标准化路径格式 + // 检查提供商池文件中的所有OAuth凭据路径 - 标准化路径格式 if (providerPools) { for (const [providerType, providers] of Object.entries(providerPools)) { for (const provider of providers) { @@ -1409,7 +1409,7 @@ function getFileUsageInfo(relativePath, fileName, usedPaths, currentConfig) { }); } - // 检查供应商池中的使用情况 + // 检查提供商池中的使用情况 if (currentConfig.providerPools) { // 使用 flatMap 将双重循环优化为单层循环 O(n) const allProviders = Object.entries(currentConfig.providerPools).flatMap( @@ -1424,7 +1424,7 @@ function getFileUsageInfo(relativePath, fileName, usedPaths, currentConfig) { (pathsEqual(relativePath, provider.GEMINI_OAUTH_CREDS_FILE_PATH) || pathsEqual(relativePath, provider.GEMINI_OAUTH_CREDS_FILE_PATH.replace(/\\/g, '/')))) { providerUsages.push({ - type: '供应商池', + type: '提供商池', location: `Gemini OAuth凭据 (节点${index + 1})`, providerType: providerType, providerIndex: index, @@ -1436,7 +1436,7 @@ function getFileUsageInfo(relativePath, fileName, usedPaths, currentConfig) { (pathsEqual(relativePath, provider.KIRO_OAUTH_CREDS_FILE_PATH) || pathsEqual(relativePath, provider.KIRO_OAUTH_CREDS_FILE_PATH.replace(/\\/g, '/')))) { providerUsages.push({ - type: '供应商池', + type: '提供商池', location: `Kiro OAuth凭据 (节点${index + 1})`, providerType: providerType, providerIndex: index, @@ -1448,7 +1448,7 @@ function getFileUsageInfo(relativePath, fileName, usedPaths, currentConfig) { (pathsEqual(relativePath, provider.QWEN_OAUTH_CREDS_FILE_PATH) || pathsEqual(relativePath, provider.QWEN_OAUTH_CREDS_FILE_PATH.replace(/\\/g, '/')))) { providerUsages.push({ - type: '供应商池', + type: '提供商池', location: `Qwen OAuth凭据 (节点${index + 1})`, providerType: providerType, providerIndex: index, diff --git a/static/app/config-manager.js b/static/app/config-manager.js index 3f7e9a5..6251f6e 100644 --- a/static/app/config-manager.js +++ b/static/app/config-manager.js @@ -86,7 +86,7 @@ async function loadConfiguration() { if (cronRefreshTokenEl) cronRefreshTokenEl.checked = data.CRON_REFRESH_TOKEN || false; if (providerPoolsFilePathEl) providerPoolsFilePathEl.value = data.PROVIDER_POOLS_FILE_PATH || ''; - // 触发供应商配置显示 + // 触发提供商配置显示 handleProviderChange(); // 根据Gemini凭据类型设置显示 @@ -105,7 +105,7 @@ async function loadConfiguration() { handleKiroCredsTypeChange({ target: kiroRadio }); } - // 检查并设置供应商池菜单显示状态 + // 检查并设置提供商池菜单显示状态 const providerPoolsFilePath = data.PROVIDER_POOLS_FILE_PATH; const providersMenuItem = document.querySelector('.nav-item[data-section="providers"]'); if (providerPoolsFilePath && providerPoolsFilePath.trim() !== '') { @@ -131,7 +131,7 @@ async function saveConfiguration() { systemPrompt: document.getElementById('systemPrompt')?.value || '', }; - // 根据不同供应商保存不同的配置 + // 根据不同提供商保存不同的配置 const provider = document.getElementById('modelProvider')?.value; switch (provider) { @@ -194,12 +194,12 @@ async function saveConfiguration() { showToast('配置已保存', 'success'); - // 检查当前是否在供应商池管理页面,如果是则刷新数据 + // 检查当前是否在提供商池管理页面,如果是则刷新数据 const providersSection = document.getElementById('providers'); if (providersSection && providersSection.classList.contains('active')) { - // 当前在供应商池页面,刷新数据 + // 当前在提供商池页面,刷新数据 await loadProviders(); - showToast('供应商池数据已刷新', 'success'); + showToast('提供商池数据已刷新', 'success'); } } catch (error) { console.error('Failed to save configuration:', error); diff --git a/static/app/event-handlers.js b/static/app/event-handlers.js index 85c634b..f21d6c9 100644 --- a/static/app/event-handlers.js +++ b/static/app/event-handlers.js @@ -66,7 +66,7 @@ function initEventListeners() { button.addEventListener('click', handlePasswordToggle); }); - // 供应商池配置监听 + // 提供商池配置监听 const providerPoolsInput = document.getElementById('providerPoolsFilePath'); if (providerPoolsInput) { providerPoolsInput.addEventListener('input', handleProviderPoolsConfigChange); @@ -92,7 +92,7 @@ function initEventListeners() { } /** - * 供应商配置切换处理 + * 提供商配置切换处理 */ function handleProviderChange() { const selectedProvider = elements.modelProvider?.value; @@ -100,12 +100,12 @@ function handleProviderChange() { const allProviderConfigs = document.querySelectorAll('.provider-config'); - // 隐藏所有供应商配置 + // 隐藏所有提供商配置 allProviderConfigs.forEach(config => { config.style.display = 'none'; }); - // 显示当前选中的供应商配置 + // 显示当前选中的提供商配置 const targetConfig = document.querySelector(`[data-provider="${selectedProvider}"]`); if (targetConfig) { targetConfig.style.display = 'block'; @@ -172,7 +172,7 @@ function handlePasswordToggle(event) { } /** - * 供应商池配置变化处理 + * 提供商池配置变化处理 * @param {Event} event - 事件对象 */ function handleProviderPoolsConfigChange(event) { @@ -180,13 +180,13 @@ function handleProviderPoolsConfigChange(event) { const providersMenuItem = document.querySelector('.nav-item[data-section="providers"]'); if (filePath) { - // 显示供应商池菜单 + // 显示提供商池菜单 if (providersMenuItem) providersMenuItem.style.display = 'flex'; } else { - // 隐藏供应商池菜单 + // 隐藏提供商池菜单 if (providersMenuItem) providersMenuItem.style.display = 'none'; - // 如果当前在供应商池页面,切换到仪表盘 + // 如果当前在提供商池页面,切换到仪表盘 if (providersMenuItem && providersMenuItem.classList.contains('active')) { const dashboardItem = document.querySelector('.nav-item[data-section="dashboard"]'); const dashboardSection = document.getElementById('dashboard'); diff --git a/static/app/event-stream.js b/static/app/event-stream.js index bb7103d..396a4fc 100644 --- a/static/app/event-stream.js +++ b/static/app/event-stream.js @@ -106,19 +106,19 @@ function updateProviderStatus(data) { } /** - * 处理供应商更新事件 + * 处理提供商更新事件 * @param {Object} data - 更新数据 */ function handleProviderUpdate(data) { if (data.action && data.providerType) { - // 如果当前打开的模态框是更新事件的供应商类型,则刷新该模态框 + // 如果当前打开的模态框是更新事件的提供商类型,则刷新该模态框 const modal = document.querySelector('.provider-modal'); if (modal && modal.getAttribute('data-provider-type') === data.providerType) { if (typeof refreshProviderConfig === 'function') { refreshProviderConfig(data.providerType); } } else { - // 否则更新主界面的供应商列表 + // 否则更新主界面的提供商列表 if (typeof loadProviders === 'function') { loadProviders(); } diff --git a/static/app/modal.js b/static/app/modal.js index 923a1bd..5605595 100644 --- a/static/app/modal.js +++ b/static/app/modal.js @@ -4,8 +4,8 @@ import { showToast, getFieldLabel, getProviderTypeFields } from './utils.js'; import { handleProviderPasswordToggle } from './event-handlers.js'; /** - * 显示供应商管理模态框 - * @param {Object} data - 供应商数据 + * 显示提供商管理模态框 + * @param {Object} data - 提供商数据 */ function showProviderManagerModal(data) { const { providerType, providers, totalCount, healthyCount } = data; @@ -27,7 +27,7 @@ function showProviderManagerModal(data) { modal.innerHTML = `
-

管理 ${providerType} 供应商配置

+

管理 ${providerType} 提供商配置

@@ -44,7 +44,7 @@ function showProviderManagerModal(data) {
@@ -149,8 +149,8 @@ function closeProviderModal(button) { } /** - * 渲染供应商列表 - * @param {Array} providers - 供应商数组 + * 渲染提供商列表 + * @param {Array} providers - 提供商数组 * @returns {string} HTML字符串 */ function renderProviderList(providers) { @@ -188,7 +188,7 @@ function renderProviderList(providers) {
-