diff --git a/pkg/entity/errors/__init__.py b/pkg/entity/errors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/entity/errors/platform.py b/pkg/entity/errors/platform.py new file mode 100644 index 00000000..75fc2299 --- /dev/null +++ b/pkg/entity/errors/platform.py @@ -0,0 +1,9 @@ +from __future__ import annotations + + +class AdapterNotFoundError(Exception): + def __init__(self, adapter_name: str): + self.adapter_name = adapter_name + + def __str__(self): + return f'Adapter {self.adapter_name} not found' diff --git a/pkg/entity/errors/provider.py b/pkg/entity/errors/provider.py new file mode 100644 index 00000000..b495a6b0 --- /dev/null +++ b/pkg/entity/errors/provider.py @@ -0,0 +1,9 @@ +from __future__ import annotations + + +class RequesterNotFoundError(Exception): + def __init__(self, requester_name: str): + self.requester_name = requester_name + + def __str__(self): + return f'Requester {self.requester_name} not found' diff --git a/pkg/platform/botmgr.py b/pkg/platform/botmgr.py index 12803916..5855525f 100644 --- a/pkg/platform/botmgr.py +++ b/pkg/platform/botmgr.py @@ -15,6 +15,8 @@ from ..discover import engine from ..entity.persistence import bot as persistence_bot +from ..entity.errors import platform as platform_errors + from .logger import EventLogger # 处理 3.4 移除了 YiriMirai 之后,插件的兼容性问题 @@ -205,7 +207,12 @@ class PlatformManager: for bot in bots: # load all bots here, enable or disable will be handled in runtime - await self.load_bot(bot) + try: + await self.load_bot(bot) + except platform_errors.AdapterNotFoundError as e: + self.ap.logger.warning(f'Adapter {e.adapter_name} not found, skipping bot {bot.uuid}') + except Exception as e: + self.ap.logger.error(f'Failed to load bot {bot.uuid}: {e}\n{traceback.format_exc()}') async def load_bot( self, @@ -219,6 +226,9 @@ class PlatformManager: logger = EventLogger(name=f'platform-adapter-{bot_entity.name}', ap=self.ap) + if bot_entity.adapter not in self.adapter_dict: + raise platform_errors.AdapterNotFoundError(bot_entity.adapter) + adapter_inst = self.adapter_dict[bot_entity.adapter]( bot_entity.adapter_config, self.ap, diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 6bc80fe3..b15e53a9 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -1,12 +1,14 @@ from __future__ import annotations import sqlalchemy +import traceback from . import entities, requester from ...core import app from ...discover import engine from . import token from ...entity.persistence import model as persistence_model +from ...entity.errors import provider as provider_errors FETCH_MODEL_LIST_URL = 'https://api.qchatgpt.rockchin.top/api/v2/fetch/model_list' @@ -64,7 +66,12 @@ class ModelManager: # load models for llm_model in llm_models: - await self.load_llm_model(llm_model) + try: + await self.load_llm_model(llm_model) + except provider_errors.RequesterNotFoundError as e: + self.ap.logger.warning(f'Requester {e.requester_name} not found, skipping model {llm_model.uuid}') + except Exception as e: + self.ap.logger.error(f'Failed to load model {llm_model.uuid}: {e}\n{traceback.format_exc()}') async def init_runtime_llm_model( self, @@ -76,6 +83,9 @@ class ModelManager: elif isinstance(model_info, dict): model_info = persistence_model.LLMModel(**model_info) + if model_info.requester not in self.requester_dict: + raise provider_errors.RequesterNotFoundError(model_info.requester) + requester_inst = self.requester_dict[model_info.requester](ap=self.ap, config=model_info.requester_config) await requester_inst.initialize()