diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index a09f1ce36..4a77553d7 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -265,6 +265,7 @@ CONFIG_METADATA_2 = { "path_mapping": { "description": "路径映射", "type": "list", + "items": {"type": "string"}, "obvious_hint": True, "hint": "此功能解决由于文件系统不一致导致路径不存在的问题。格式为 <原路径>:<映射路径>。如 `/app/.config/QQ:/var/lib/docker/volumes/xxxx/_data`。这样,当消息平台下发的事件中图片和语音路径以 `/app/.config/QQ` 开头时,开头被替换为 `/var/lib/docker/volumes/xxxx/_data`。这在 AstrBot 或者平台协议端使用 Docker 部署时特别有用。", } diff --git a/astrbot/core/provider/manager.py b/astrbot/core/provider/manager.py index 018f48724..3709d9f43 100644 --- a/astrbot/core/provider/manager.py +++ b/astrbot/core/provider/manager.py @@ -13,6 +13,7 @@ class ProviderManager(): self.providers_config: List = config['provider'] self.provider_settings: dict = config['provider_settings'] self.provider_stt_settings: dict = config.get('provider_stt_settings', {}) + self.provider_tts_settings: dict = config.get('provider_tts_settings', {}) self.persona_configs: list = config.get('persona', []) self.default_persona_name = self.provider_settings.get('default_personality', 'default') @@ -64,7 +65,7 @@ class ProviderManager(): '''加载的 Provider 的实例''' self.stt_provider_insts: List[STTProvider] = [] '''加载的 Speech To Text Provider 的实例''' - self.tts_provider_insts: List[TTSProvider] = [] + self.tts_provider_insts: Lieist[TTSProvider] = [] '''加载的 Text To Speech Provider 的实例''' self.llm_tools = llm_tools self.curr_provider_inst: Provider = None @@ -123,7 +124,7 @@ class ProviderManager(): selected_tts_provider_id = self.provider_settings.get("provider_id") provider_enabled = self.provider_settings.get("enable", False) stt_enabled = self.provider_stt_settings.get("enable", False) - tts_enabled = self.provider_settings.get("enable", False) + tts_enabled = self.provider_tts_settings.get("enable", False) for provider_config in self.providers_config: if not provider_config['enable']: diff --git a/astrbot/dashboard/routes/config.py b/astrbot/dashboard/routes/config.py index 0e14b6036..464e02ea4 100644 --- a/astrbot/dashboard/routes/config.py +++ b/astrbot/dashboard/routes/config.py @@ -9,6 +9,7 @@ from astrbot.core.star.config import update_config from astrbot.core.core_lifecycle import AstrBotCoreLifecycle from astrbot.core.platform.register import platform_registry from astrbot.core.provider.register import provider_registry +from astrbot.core import logger def try_cast(value: str, type_: str): if type_ == "int" and value.isdigit(): @@ -56,13 +57,23 @@ def validate_config(data, config: AstrBotConfig): elif meta["type"] == "object" and not isinstance(value, dict): errors.append(f"错误的类型 {path}{key}: 期望是 dict, 得到了 {type(value).__name__}") validate(value, meta["items"], path=f"{path}{key}.") - validate(data) + + for key, group in CONFIG_METADATA_2.items(): + group_meta = group.get("metadata") + if not group_meta: + continue + logger.info(f"验证配置: 组 {key} ...") + validate(data, group_meta, path=f"{key}.") return errors def save_astrbot_config(post_config: dict, config: AstrBotConfig): '''验证并保存配置''' - errors = validate_config(post_config, config) + errors = None + try: + errors = validate_config(post_config, config) + except BaseException as e: + logger.warning(f"验证配置时出现异常: {e}") if errors: raise ValueError(f"格式校验未通过: {errors}") config.save_config(post_config) @@ -110,7 +121,7 @@ class ConfigRoute(Route): await self._save_astrbot_configs(post_configs) return Response().ok(None, "保存成功~ 机器人正在重载配置。").__dict__ except Exception as e: - traceback.print_exc() + logger.error(e) return Response().error(str(e)).__dict__ async def post_extension_configs(self):