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格式。
-查看自定义的LLM供应商配置。
- 请在 .env 文件中配置对应的 APIKEY,并重新启动服务
-
- 勾选您希望在系统中启用的模型,请注意,列表中可能包含非对话模型,请仔细甄别。 -
-检测到配置中包含当前供应商列表中不存在的模型。以下模型可能已失效或被供应商移除:
-