From f8acc48184fc43534280b44d55bc828097c617f0 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Sun, 26 Apr 2026 16:24:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor=EF=BC=9A=E7=A7=BB=E9=99=A4=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E5=92=8C=E5=89=8D=E7=AB=AF=E7=9A=84=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=8F=90=E4=BE=9B=E7=A8=8B=E5=BA=8F=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 system_router.py 中用于添加、更新和删除自定义提供程序的端点。 - 从 system_api.js 中移除了自定义提供程序 API 函数。 - 更新了 ModelProvidersComponent.vue,以反映自定义提供程序管理的移除,包括 UI 更改和迁移到新模型配置的提示。 - 清理了 ModelSelectorComponent.vue,移除了旧模型处理和不必要的依赖项。 Co-authored-by: Copilot --- backend/package/yuxi/agents/models.py | 5 + backend/package/yuxi/config/app.py | 156 --- backend/package/yuxi/models/chat.py | 5 + backend/server/routers/system_router.py | 50 - web/src/apis/system_api.js | 49 - .../components/ModelProvidersComponent.vue | 1217 +---------------- web/src/components/ModelSelectorComponent.vue | 32 - 7 files changed, 70 insertions(+), 1444 deletions(-) diff --git a/backend/package/yuxi/agents/models.py b/backend/package/yuxi/agents/models.py index f21aa28e..0b26ec97 100644 --- a/backend/package/yuxi/agents/models.py +++ b/backend/package/yuxi/agents/models.py @@ -80,6 +80,11 @@ def load_chat_model(fully_specified_name: str, **kwargs) -> BaseChatModel: f"Available chat models ({len(available_specs)}): {available_ids}" ) + logger.warning( + f"旧版本的模型选择逻辑已废弃,建议尽快迁移至新的模型配置;" + f"当前模型选择参数: {fully_specified_name=}" + ) + # v1 逻辑:spec 必须包含 / if "/" not in fully_specified_name: raise ValueError( diff --git a/backend/package/yuxi/config/app.py b/backend/package/yuxi/config/app.py index e169072b..02176c37 100644 --- a/backend/package/yuxi/config/app.py +++ b/backend/package/yuxi/config/app.py @@ -428,131 +428,6 @@ class Config(BaseModel): except Exception as e: logger.error(f"Failed to save models config to {self._config_file}: {e}") - # ============================================================ - # 自定义供应商管理方法 - # ============================================================ - - def add_custom_provider(self, provider_id: str, provider_data: dict[str, Any]) -> bool: - """添加自定义供应商 - - Args: - provider_id: 供应商唯一标识符 - provider_data: 供应商配置数据 - - Returns: - 是否添加成功 - """ - try: - # 处理环境变量,移除 ${} 包裹 - if "env" in provider_data and provider_data["env"]: - env_value = provider_data["env"] - if isinstance(env_value, str) and env_value.startswith("${") and env_value.endswith("}"): - provider_data["env"] = env_value[2:-1] - - # 确保标记为自定义供应商 - provider_data["custom"] = True - - # 检查供应商ID是否已存在(无论是内置还是自定义) - if provider_id in self.model_names: - logger.error(f"Provider ID already exists: {provider_id}") - return False - - # 添加到配置中 - self.model_names[provider_id] = ChatModelProvider(**provider_data) - - # 保存到自定义供应商配置文件 - self._save_custom_providers() - - # 重新处理环境变量 - self._handle_environment() - - logger.info(f"Added custom provider: {provider_id}") - return True - - except Exception as e: - logger.error(f"Failed to add custom provider {provider_id}: {e}") - return False - - def update_custom_provider(self, provider_id: str, provider_data: dict) -> bool: - """更新自定义供应商 - - Args: - provider_id: 供应商唯一标识符 - provider_data: 新的供应商配置数据 - - Returns: - 是否更新成功 - """ - try: - # 处理环境变量,移除 ${} 包裹 - if "env" in provider_data and provider_data["env"]: - env_value = provider_data["env"] - if isinstance(env_value, str) and env_value.startswith("${") and env_value.endswith("}"): - provider_data["env"] = env_value[2:-1] - - # 检查供应商是否存在且为自定义供应商 - if provider_id not in self.model_names: - logger.error(f"Provider not found: {provider_id}") - return False - - if not self.model_names[provider_id].custom: - logger.error(f"Cannot update non-custom provider: {provider_id}") - return False - - # 确保保持自定义供应商标记 - provider_data["custom"] = True - - # 更新供应商配置 - self.model_names[provider_id] = ChatModelProvider(**provider_data) - - # 保存到自定义供应商配置文件 - self._save_custom_providers() - - # 重新处理环境变量 - self._handle_environment() - - logger.info(f"Updated custom provider: {provider_id}") - return True - - except Exception as e: - logger.error(f"Failed to update custom provider {provider_id}: {e}") - return False - - def delete_custom_provider(self, provider_id: str) -> bool: - """删除自定义供应商 - - Args: - provider_id: 供应商唯一标识符 - - Returns: - 是否删除成功 - """ - try: - # 检查供应商是否存在且为自定义供应商 - if provider_id not in self.model_names: - logger.error(f"Provider not found: {provider_id}") - return False - - if not self.model_names[provider_id].custom: - logger.error(f"Cannot delete non-custom provider: {provider_id}") - return False - - # 从配置中删除 - del self.model_names[provider_id] - - # 保存到自定义供应商配置文件 - self._save_custom_providers() - - # 重新处理环境变量 - self._handle_environment() - - logger.info(f"Deleted custom provider: {provider_id}") - return True - - except Exception as e: - logger.error(f"Failed to delete custom provider {provider_id}: {e}") - return False - def get_custom_providers(self) -> dict[str, ChatModelProvider]: """获取所有自定义供应商 @@ -561,37 +436,6 @@ class Config(BaseModel): """ return {k: v for k, v in self.model_names.items() if v.custom} - def _save_custom_providers(self) -> None: - """保存自定义供应商到独立配置文件""" - if not self._config_file: - logger.warning("Config file path not set") - return - - custom_config_file = self._config_file.parent / "custom_providers.toml" - - try: - # 获取所有自定义供应商 - custom_providers = self.get_custom_providers() - - # 创建配置数据 - custom_config = {} - if custom_providers: - custom_config["model_names"] = { - provider: info.model_dump() for provider, info in custom_providers.items() - } - - # 确保目录存在 - custom_config_file.parent.mkdir(parents=True, exist_ok=True) - - # 写入配置文件 - with open(custom_config_file, "wb") as f: - tomli_w.dump(custom_config, f) - - logger.info(f"Custom providers saved to {custom_config_file}") - - except Exception as e: - logger.error(f"Failed to save custom providers to {custom_config_file}: {e}") - # 全局配置实例 config = Config() diff --git a/backend/package/yuxi/models/chat.py b/backend/package/yuxi/models/chat.py index 96c9a989..272ee263 100644 --- a/backend/package/yuxi/models/chat.py +++ b/backend/package/yuxi/models/chat.py @@ -133,6 +133,11 @@ def select_model(model_provider=None, model_name=None, model_spec=None): if model_cache.is_v2_spec(model_spec): return select_model_v2(model_spec) + logger.warning( + f"旧版本的模型选择逻辑已废弃,建议尽快迁移至新的模型配置;" + f"当前模型选择参数: provider={model_provider}, model_name={model_name}, spec={model_spec}" + ) + if model_spec: spec_provider, spec_model_name = split_model_spec(model_spec) model_provider = model_provider or spec_provider diff --git a/backend/server/routers/system_router.py b/backend/server/routers/system_router.py index d4a451b6..9318e8ae 100644 --- a/backend/server/routers/system_router.py +++ b/backend/server/routers/system_router.py @@ -210,53 +210,3 @@ async def get_custom_providers(current_user: User = Depends(get_admin_user)): except Exception as e: logger.error(f"获取自定义供应商失败: {e}") raise HTTPException(status_code=500, detail=f"获取自定义供应商失败: {str(e)}") - - -@system.post("/custom-providers") -async def add_custom_provider( - provider_id: str = Body(..., description="供应商ID"), - provider_data: dict = Body(..., description="供应商配置数据"), - current_user: User = Depends(get_admin_user), -): - """添加自定义供应商""" - try: - success = config.add_custom_provider(provider_id, provider_data) - if success: - return {"message": f"自定义供应商 {provider_id} 添加成功"} - else: - raise HTTPException(status_code=400, detail=f"供应商ID {provider_id} 已存在,请使用其他ID") - except Exception as e: - logger.error(f"添加自定义供应商失败 {provider_id}: {e}") - raise HTTPException(status_code=500, detail=f"添加自定义供应商失败: {str(e)}") - - -@system.put("/custom-providers/{provider_id}") -async def update_custom_provider( - provider_id: str, - provider_data: dict = Body(..., description="供应商配置数据"), - current_user: User = Depends(get_admin_user), -): - """更新自定义供应商""" - try: - success = config.update_custom_provider(provider_id, provider_data) - if success: - return {"message": f"自定义供应商 {provider_id} 更新成功"} - else: - raise HTTPException(status_code=404, detail=f"自定义供应商 {provider_id} 不存在或更新失败") - except Exception as e: - logger.error(f"更新自定义供应商失败 {provider_id}: {e}") - raise HTTPException(status_code=500, detail=f"更新自定义供应商失败: {str(e)}") - - -@system.delete("/custom-providers/{provider_id}") -async def delete_custom_provider(provider_id: str, current_user: User = Depends(get_admin_user)): - """删除自定义供应商""" - try: - success = config.delete_custom_provider(provider_id) - if success: - return {"message": f"自定义供应商 {provider_id} 删除成功"} - else: - raise HTTPException(status_code=404, detail=f"自定义供应商 {provider_id} 不存在或删除失败") - except Exception as e: - logger.error(f"删除自定义供应商失败 {provider_id}: {e}") - raise HTTPException(status_code=500, detail=f"删除自定义供应商失败: {str(e)}") diff --git a/web/src/apis/system_api.js b/web/src/apis/system_api.js index abe07ef9..67c905da 100644 --- a/web/src/apis/system_api.js +++ b/web/src/apis/system_api.js @@ -99,55 +99,6 @@ export const ocrApi = { export const chatModelApi = { } -// ============================================================================= -// === 自定义供应商管理分组 === -// ============================================================================= - -export const customProviderApi = { - /** - * 获取所有自定义供应商 - * @returns {Promise} - 自定义供应商列表 - */ - getCustomProviders: async () => { - return apiAdminGet('/api/system/custom-providers') - }, - - /** - * 添加自定义供应商 - * @param {string} providerId - 供应商ID - * @param {Object} providerData - 供应商配置数据 - * @returns {Promise} - 添加结果 - */ - addCustomProvider: async (providerId, providerData) => { - return apiAdminPost('/api/system/custom-providers', { - provider_id: providerId, - provider_data: providerData - }) - }, - - /** - * 更新自定义供应商 - * @param {string} providerId - 供应商ID - * @param {Object} providerData - 供应商配置数据 - * @returns {Promise} - 更新结果 - */ - updateCustomProvider: async (providerId, providerData) => { - return apiAdminPut( - `/api/system/custom-providers/${encodeURIComponent(providerId)}`, - providerData - ) - }, - - /** - * 删除自定义供应商 - * @param {string} providerId - 供应商ID - * @returns {Promise} - 删除结果 - */ - deleteCustomProvider: async (providerId) => { - return apiAdminDelete(`/api/system/custom-providers/${encodeURIComponent(providerId)}`) - } -} - // ============================================================================= // === 独立模型供应商配置分组 === // ============================================================================= diff --git a/web/src/components/ModelProvidersComponent.vue b/web/src/components/ModelProvidersComponent.vue index 3c38636b..e721b815 100644 --- a/web/src/components/ModelProvidersComponent.vue +++ b/web/src/components/ModelProvidersComponent.vue @@ -3,1191 +3,94 @@
自定义供应商
-

添加自定义的LLM供应商,支持OpenAI兼容的API格式。

-
- - - - 添加自定义供应商 - - -
- -
- -
-
-
-

{{ provider.name }}

- ID: {{ providerId }} -
-
- - - 编辑 - - - - - 删除 - - -
-
-
-
-
- API地址: - {{ provider.base_url }} -
-
- 默认模型: - {{ provider.default }} -
-
- 可用模型: - {{ provider.models?.join(', ') || '无' }} -
-
-
-
- - -
- - - +

查看自定义的LLM供应商配置。

- + + + + - -
-
-
系统内置供应商
-
- {{ modelKeys.length }} 可用 - {{ notModelKeys.length }} 未配置 -
-
-

- 请在 .env 文件中配置对应的 APIKEY,并重新启动服务 -

- - -
-
-
- 模型图标 -
-
-
{{ modelNames[item].name }}
-
-
- - - 已选 {{ modelNames[item].models?.length || 0 }} 个模型 - - -
-
-
-
-
-
{{ model }}
-
-
-
-
- - -
-
-
- 模型图标 -
-
-
{{ modelNames[item].name }}
- - 查看信息 - -
-
- 需配置{{ modelNames[item].env }} -
-
-
+
+
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 支持直接输入API密钥,或使用环境变量名(如:MY_API_KEY),如无密钥填写"无"。 -
-
- - - -
每行输入一个模型名称,例如:gpt-5
-
- - - - -
-
+
+

{{ item.name }} ({{ item.id }})

+ + {{ item.base_url }} + {{ item.default }} + {{ item.env }} + + {{ item.url }} + + + {{ item.models?.join(', ') || '无' }} + +
diff --git a/web/src/components/ModelSelectorComponent.vue b/web/src/components/ModelSelectorComponent.vue index 48b1aa9a..a3eea304 100644 --- a/web/src/components/ModelSelectorComponent.vue +++ b/web/src/components/ModelSelectorComponent.vue @@ -58,21 +58,6 @@ {{ model.display_name }} - - - - - - {{ model }} - - @@ -80,7 +65,6 @@