重构整个插件系统,尝试恢复可启动性,新增插件系统maibot-plugin-sdk依赖

This commit is contained in:
DrSmoothl
2026-03-07 19:40:51 +08:00
parent 2e3dd44ee9
commit ce8d8dfd0a
90 changed files with 3785 additions and 10061 deletions

View File

@@ -6,7 +6,7 @@ import json
from src.common.logger import get_logger
from src.common.toml_utils import save_toml_with_format
from src.config.config import MMC_VERSION
from src.plugin_system.base.config_types import ConfigField
from src.core.config_types import ConfigField
from src.webui.services.git_mirror_service import get_git_mirror_service, set_update_progress_callback
from src.webui.core import get_token_manager
from src.webui.routers.websocket.plugin_progress import update_progress
@@ -222,15 +222,16 @@ def coerce_types(schema_part: Dict[str, Any], config_part: Dict[str, Any]) -> No
def find_plugin_instance(plugin_id: str) -> Optional[Any]:
"""
按 plugin_id 或 plugin_name 查找已加载的插件实例
局部导入 plugin_manager 以规避循环依赖
按 plugin_id 查找已加载的插件信息
新运行时中插件运行在子进程,无法获取实例,返回注册信息
"""
from src.plugin_system.core.plugin_manager import plugin_manager
from src.plugin_runtime.integration import get_plugin_runtime_manager
for loaded_plugin_name in plugin_manager.list_loaded_plugins():
instance = plugin_manager.get_plugin_instance(loaded_plugin_name)
if instance and (instance.plugin_name == plugin_id or instance.get_manifest_info("id", "") == plugin_id):
return instance
mgr = get_plugin_runtime_manager()
for sv in mgr.supervisors:
reg = sv._registered_plugins.get(plugin_id)
if reg is not None:
return reg
return None
@@ -1497,26 +1498,10 @@ async def get_plugin_config_schema(
logger.info(f"获取插件配置 Schema: {plugin_id}")
try:
# 尝试从已加载的插件中获取
from src.plugin_system.core.plugin_manager import plugin_manager
# 查找插件实例
# 新运行时中插件运行在子进程,无法直接获取实例的 webui_config_schema
# 尝试从文件系统读取
plugin_instance = None
# 遍历所有已加载的插件
for loaded_plugin_name in plugin_manager.list_loaded_plugins():
instance = plugin_manager.get_plugin_instance(loaded_plugin_name)
if instance:
# 匹配 plugin_name 或 manifest 中的 id
if instance.plugin_name == plugin_id:
plugin_instance = instance
break
# 也尝试匹配 manifest 中的 id
manifest_id = instance.get_manifest_info("id", "")
if manifest_id == plugin_id:
plugin_instance = instance
break
if plugin_instance and hasattr(plugin_instance, "get_webui_config_schema"):
# 从插件实例获取 schema
schema = plugin_instance.get_webui_config_schema()