diff --git a/astrbot/api/__init__.py b/astrbot/api/__init__.py index e75cde6ff..dd2e0fbc7 100644 --- a/astrbot/api/__init__.py +++ b/astrbot/api/__init__.py @@ -2,6 +2,7 @@ from astrbot.core.config.astrbot_config import AstrBotConfig from astrbot import logger from astrbot.core.utils.personality import personalities from astrbot.core import html_renderer +from astrbot.core import sp from astrbot.core.star.register import register_llm_tool as llm_tool __all__ = [ @@ -10,4 +11,5 @@ __all__ = [ "personalities", "html_renderer", "llm_tool", + "sp" ] \ No newline at end of file diff --git a/astrbot/core/__init__.py b/astrbot/core/__init__.py index 94e32224c..f7876a78a 100644 --- a/astrbot/core/__init__.py +++ b/astrbot/core/__init__.py @@ -1,6 +1,7 @@ import os from .log import LogManager, LogBroker from astrbot.core.utils.t2i.renderer import HtmlRenderer +from astrbot.core.utils.shared_preferences import SharedPreferences from astrbot.core.db.sqlite import SQLiteDatabase from astrbot.core.config.default import DB_PATH @@ -13,4 +14,5 @@ if os.environ.get('TESTING', ""): logger.setLevel('DEBUG') db_helper = SQLiteDatabase(DB_PATH) -WEBUI_SK = "Advanced_System_for_Text_Response_and_Bot_Operations_Tool" \ No newline at end of file +sp = SharedPreferences() # 简单的偏好设置存储 +WEBUI_SK = "Advanced_System_for_Text_Response_and_Bot_Operations_Tool" diff --git a/astrbot/core/provider/manager.py b/astrbot/core/provider/manager.py index ea90470db..d72b4b5aa 100644 --- a/astrbot/core/provider/manager.py +++ b/astrbot/core/provider/manager.py @@ -5,7 +5,7 @@ from typing import List from astrbot.core.db import BaseDatabase from collections import defaultdict from .register import provider_cls_map, llm_tools -from astrbot.core import logger +from astrbot.core import logger, sp class ProviderManager(): def __init__(self, config: AstrBotConfig, db_helper: BaseDatabase): @@ -48,21 +48,25 @@ class ProviderManager(): if not provider_config['enable']: continue if provider_config['type'] not in provider_cls_map: - logger.error(f"未找到适用于 {provider_config['type']}({provider_config['id']}) 的 大模型提供商适配器,请检查是否已经安装或者名称填写错误。已跳过。") + logger.error(f"未找到适用于 {provider_config['type']}({provider_config['id']}) 的提供商适配器,请检查是否已经安装或者名称填写错误。已跳过。") continue + selected_provider_id = sp.get("curr_provider") cls_type = provider_cls_map[provider_config['type']] - logger.info(f"尝试实例化 {provider_config['type']}({provider_config['id']}) 大模型提供商适配器 ...") + logger.info(f"尝试实例化 {provider_config['type']}({provider_config['id']}) 提供商适配器 ...") try: inst = cls_type(provider_config, self.provider_settings, self.db_helper, self.provider_settings.get('persistant_history', True)) self.provider_insts.append(inst) + if selected_provider_id == provider_config['id']: + self.curr_provider_inst = inst + logger.info(f"已选择 {provider_config['type']}({provider_config['id']}) 作为当前提供商适配器。") except Exception as e: traceback.print_exc() - logger.error(f"实例化 {provider_config['type']}({provider_config['id']}) 大模型提供商适配器 失败:{e}") + logger.error(f"实例化 {provider_config['type']}({provider_config['id']}) 提供商适配器失败:{e}") - if len(self.provider_insts) > 0: + if len(self.provider_insts) > 0 and not self.curr_provider_inst: self.curr_provider_inst = self.provider_insts[0] else: - logger.warning("未启用任何大模型提供商适配器。") + logger.warning("未启用任何提供商适配器。") def get_insts(self): return self.provider_insts diff --git a/astrbot/core/utils/shared_preferences.py b/astrbot/core/utils/shared_preferences.py new file mode 100644 index 000000000..e9a9ed0d7 --- /dev/null +++ b/astrbot/core/utils/shared_preferences.py @@ -0,0 +1,33 @@ +import json +import os + +class SharedPreferences: + def __init__(self, path="data/shared_preferences.json"): + self.path = path + self._data = self._load_preferences() + + def _load_preferences(self): + if os.path.exists(self.path): + with open(self.path, "r") as f: + return json.load(f) + return {} + + def _save_preferences(self): + with open(self.path, "w") as f: + json.dump(self._data, f, indent=4) + + def get(self, key, default=None): + return self._data.get(key, default) + + def put(self, key, value): + self._data[key] = value + self._save_preferences() + + def remove(self, key): + if key in self._data: + del self._data[key] + self._save_preferences() + + def clear(self): + self._data.clear() + self._save_preferences() \ No newline at end of file diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 0af740faf..c81fa8f88 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -3,7 +3,7 @@ import datetime import astrbot.api.star as star import astrbot.api.event.filter as filter from astrbot.api.event import AstrMessageEvent, MessageEventResult -from astrbot.api import personalities +from astrbot.api import personalities, sp from astrbot.api.provider import Personality, ProviderRequest from typing import Union @@ -169,8 +169,9 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo if idx is None: ret = "## 当前载入的 LLM 提供商\n" for idx, llm in enumerate(self.context.get_all_providers()): - ret += f"{idx + 1}. {llm.meta().id} ({llm.meta().model})" - if self.provider == llm: + id_ = llm.meta().id + ret += f"{idx + 1}. {id_} ({llm.meta().model})" + if self.context.get_using_provider().meta().id == id_: ret += " (当前使用)" ret += "\n" @@ -180,9 +181,12 @@ UID: {user_id} 此 ID 可用于设置管理员。/op 授权管理员, /deo if idx > len(self.context.get_all_providers()) or idx < 1: event.set_result(MessageEventResult().message("无效的序号。")) - self.context.provider_manager.curr_provider_inst = self.context.get_all_providers()[idx - 1] + provider = self.context.get_all_providers()[idx - 1] + id_ = provider.meta().id + self.context.provider_manager.curr_provider_inst = provider + sp.put("curr_provider", id_) - event.set_result(MessageEventResult().message(f"成功切换到 {self.context.provider_manager.curr_provider_inst.meta().id}。")) + event.set_result(MessageEventResult().message(f"成功切换到 {id_}。")) @filter.command("reset") async def reset(self, message: AstrMessageEvent):