From c89623967e9f2ffd5340ebcea947e04691226bf7 Mon Sep 17 00:00:00 2001 From: RockChinQ <1010553892@qq.com> Date: Sat, 2 Mar 2024 16:37:30 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=BA=94=E7=94=A8=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=B5=81=E7=A8=8B=E5=88=9D=E6=AD=A5=E5=88=86?= =?UTF-8?q?=E9=98=B6=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/core/boot.py | 100 +++++--------------------------- pkg/core/stage.py | 30 ++++++++++ pkg/core/stages/__init__.py | 0 pkg/core/stages/build_app.py | 95 ++++++++++++++++++++++++++++++ pkg/core/stages/load_config.py | 19 ++++++ pkg/core/stages/setup_logger.py | 15 +++++ 6 files changed, 173 insertions(+), 86 deletions(-) create mode 100644 pkg/core/stage.py create mode 100644 pkg/core/stages/__init__.py create mode 100644 pkg/core/stages/build_app.py create mode 100644 pkg/core/stages/load_config.py create mode 100644 pkg/core/stages/setup_logger.py diff --git a/pkg/core/boot.py b/pkg/core/boot.py index c04fa798..6a395c7f 100644 --- a/pkg/core/boot.py +++ b/pkg/core/boot.py @@ -21,100 +21,28 @@ from ..plugin import manager as plugin_mgr from ..audit.center import v2 as center_v2 from ..utils import version, proxy, announce +from .stages import build_app, load_config, setup_logger +from . import stage + + +stage_order = [ + "LoadConfigStage", + "SetupLoggerStage", + "BuildAppStage" +] + async def make_app() -> app.Application: - qcg_logger = await log.init_logging() - # 生成标识符 identifier.init() - # ========== 加载配置文件 ========== - - command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json") - pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json") - platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json") - provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json") - system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json") - - # ========== 构建应用实例 ========== ap = app.Application() - ap.logger = qcg_logger - ap.command_cfg = command_cfg - ap.pipeline_cfg = pipeline_cfg - ap.platform_cfg = platform_cfg - ap.provider_cfg = provider_cfg - ap.system_cfg = system_cfg - - proxy_mgr = proxy.ProxyManager(ap) - await proxy_mgr.initialize() - ap.proxy_mgr = proxy_mgr - - ver_mgr = version.VersionManager(ap) - await ver_mgr.initialize() - ap.ver_mgr = ver_mgr - - center_v2_api = center_v2.V2CenterAPI( - ap, - basic_info={ - "host_id": identifier.identifier["host_id"], - "instance_id": identifier.identifier["instance_id"], - "semantic_version": ver_mgr.get_current_version(), - "platform": sys.platform, - }, - runtime_info={ - "admin_id": "{}".format(system_cfg.data["admin-sessions"]), - "msg_source": str([ - adapter_cfg['adapter'] if 'adapter' in adapter_cfg else 'unknown' - for adapter_cfg in platform_cfg.data['platform-adapters'] if adapter_cfg['enable'] - ]), - }, - ) - ap.ctr_mgr = center_v2_api - - # 发送公告 - ann_mgr = announce.AnnouncementManager(ap) - await ann_mgr.show_announcements() - - ap.query_pool = pool.QueryPool() - - await ap.ver_mgr.show_version_update() - - plugin_mgr_inst = plugin_mgr.PluginManager(ap) - await plugin_mgr_inst.initialize() - ap.plugin_mgr = plugin_mgr_inst - - cmd_mgr_inst = cmdmgr.CommandManager(ap) - await cmd_mgr_inst.initialize() - ap.cmd_mgr = cmd_mgr_inst - - llm_model_mgr_inst = llm_model_mgr.ModelManager(ap) - await llm_model_mgr_inst.initialize() - ap.model_mgr = llm_model_mgr_inst - - llm_session_mgr_inst = llm_session_mgr.SessionManager(ap) - await llm_session_mgr_inst.initialize() - ap.sess_mgr = llm_session_mgr_inst - - llm_prompt_mgr_inst = llm_prompt_mgr.PromptManager(ap) - await llm_prompt_mgr_inst.initialize() - ap.prompt_mgr = llm_prompt_mgr_inst - - llm_tool_mgr_inst = llm_tool_mgr.ToolManager(ap) - await llm_tool_mgr_inst.initialize() - ap.tool_mgr = llm_tool_mgr_inst - - im_mgr_inst = im_mgr.PlatformManager(ap=ap) - await im_mgr_inst.initialize() - ap.im_mgr = im_mgr_inst - - stage_mgr = stagemgr.StageManager(ap) - await stage_mgr.initialize() - ap.stage_mgr = stage_mgr - - ctrl = controller.Controller(ap) - ap.ctrl = ctrl + for stage_name in stage_order: + stage_cls = stage.preregistered_stages[stage_name] + stage_inst = stage_cls() + await stage_inst.run(ap) await ap.initialize() diff --git a/pkg/core/stage.py b/pkg/core/stage.py new file mode 100644 index 00000000..cb2e4868 --- /dev/null +++ b/pkg/core/stage.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +import abc +import typing + +from . import app + + +preregistered_stages: list[typing.Type[BootingStage]] = {} + +def stage_class( + name: str +): + def decorator(cls: typing.Type[BootingStage]) -> typing.Type[BootingStage]: + preregistered_stages[name] = cls + return cls + + return decorator + + +class BootingStage(abc.ABC): + """启动阶段 + """ + name: str = None + + @abc.abstractmethod + async def run(self, ap: app.Application): + """启动 + """ + pass diff --git a/pkg/core/stages/__init__.py b/pkg/core/stages/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py new file mode 100644 index 00000000..7a840b86 --- /dev/null +++ b/pkg/core/stages/build_app.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import sys + +from .. import stage, app +from ...utils import version, proxy, announce +from ...audit.center import v2 as center_v2 +from ...audit import identifier +from ...pipeline import pool, controller, stagemgr +from ...plugin import manager as plugin_mgr +from ...command import cmdmgr +from ...provider.session import sessionmgr as llm_session_mgr +from ...provider.requester import modelmgr as llm_model_mgr +from ...provider.sysprompt import sysprompt as llm_prompt_mgr +from ...provider.tools import toolmgr as llm_tool_mgr +from ...platform import manager as im_mgr + + +@stage.stage_class("BuildAppStage") +class BuildAppStage(stage.BootingStage): + """构建应用阶段 + """ + + async def run(self, ap: app.Application): + """启动 + """ + + proxy_mgr = proxy.ProxyManager(ap) + await proxy_mgr.initialize() + ap.proxy_mgr = proxy_mgr + + ver_mgr = version.VersionManager(ap) + await ver_mgr.initialize() + ap.ver_mgr = ver_mgr + + center_v2_api = center_v2.V2CenterAPI( + ap, + basic_info={ + "host_id": identifier.identifier["host_id"], + "instance_id": identifier.identifier["instance_id"], + "semantic_version": ver_mgr.get_current_version(), + "platform": sys.platform, + }, + runtime_info={ + "admin_id": "{}".format(ap.system_cfg.data["admin-sessions"]), + "msg_source": str([ + adapter_cfg['adapter'] if 'adapter' in adapter_cfg else 'unknown' + for adapter_cfg in ap.platform_cfg.data['platform-adapters'] if adapter_cfg['enable'] + ]), + }, + ) + ap.ctr_mgr = center_v2_api + + # 发送公告 + ann_mgr = announce.AnnouncementManager(ap) + await ann_mgr.show_announcements() + + ap.query_pool = pool.QueryPool() + + await ap.ver_mgr.show_version_update() + + plugin_mgr_inst = plugin_mgr.PluginManager(ap) + await plugin_mgr_inst.initialize() + ap.plugin_mgr = plugin_mgr_inst + + cmd_mgr_inst = cmdmgr.CommandManager(ap) + await cmd_mgr_inst.initialize() + ap.cmd_mgr = cmd_mgr_inst + + llm_model_mgr_inst = llm_model_mgr.ModelManager(ap) + await llm_model_mgr_inst.initialize() + ap.model_mgr = llm_model_mgr_inst + + llm_session_mgr_inst = llm_session_mgr.SessionManager(ap) + await llm_session_mgr_inst.initialize() + ap.sess_mgr = llm_session_mgr_inst + + llm_prompt_mgr_inst = llm_prompt_mgr.PromptManager(ap) + await llm_prompt_mgr_inst.initialize() + ap.prompt_mgr = llm_prompt_mgr_inst + + llm_tool_mgr_inst = llm_tool_mgr.ToolManager(ap) + await llm_tool_mgr_inst.initialize() + ap.tool_mgr = llm_tool_mgr_inst + + im_mgr_inst = im_mgr.PlatformManager(ap=ap) + await im_mgr_inst.initialize() + ap.im_mgr = im_mgr_inst + + stage_mgr = stagemgr.StageManager(ap) + await stage_mgr.initialize() + ap.stage_mgr = stage_mgr + + ctrl = controller.Controller(ap) + ap.ctrl = ctrl diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py new file mode 100644 index 00000000..0ee2c1e4 --- /dev/null +++ b/pkg/core/stages/load_config.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from .. import stage, app +from ..bootutils import config + + +@stage.stage_class("LoadConfigStage") +class LoadConfigStage(stage.BootingStage): + """加载配置文件阶段 + """ + + async def run(self, ap: app.Application): + """启动 + """ + ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json") + ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json") + ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json") + ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json") + ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json") diff --git a/pkg/core/stages/setup_logger.py b/pkg/core/stages/setup_logger.py new file mode 100644 index 00000000..02446b85 --- /dev/null +++ b/pkg/core/stages/setup_logger.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from .. import stage, app +from ..bootutils import log + + +@stage.stage_class("SetupLoggerStage") +class SetupLoggerStage(stage.BootingStage): + """设置日志器阶段 + """ + + async def run(self, ap: app.Application): + """启动 + """ + ap.logger = await log.init_logging()