From c1f4de425aa266bcd78e3285e9bb1f9ad484d7a4 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 10 Mar 2025 22:34:45 +0800 Subject: [PATCH 001/205] refactor: move entities --- pkg/api/http/controller/groups/models.py | 27 ++++++++++++++ pkg/api/http/controller/groups/user.py | 2 +- pkg/api/http/controller/main.py | 2 +- pkg/api/http/service/model.py | 35 +++++++++++++++++++ pkg/api/http/service/user.py | 2 +- pkg/core/app.py | 3 ++ pkg/core/stages/build_app.py | 4 +++ .../entities => entity}/__init__.py | 0 pkg/entity/persistence/__init__.py | 0 .../entities => entity/persistence}/base.py | 1 + pkg/entity/persistence/model.py | 19 ++++++++++ .../entities => entity/persistence}/user.py | 2 ++ pkg/persistence/mgr.py | 7 +++- pkg/provider/modelmgr/modelmgr.py | 9 ++--- 14 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 pkg/api/http/controller/groups/models.py create mode 100644 pkg/api/http/service/model.py rename pkg/{persistence/entities => entity}/__init__.py (100%) create mode 100644 pkg/entity/persistence/__init__.py rename pkg/{persistence/entities => entity/persistence}/base.py (82%) create mode 100644 pkg/entity/persistence/model.py rename pkg/{persistence/entities => entity/persistence}/user.py (67%) diff --git a/pkg/api/http/controller/groups/models.py b/pkg/api/http/controller/groups/models.py new file mode 100644 index 00000000..e8921d5f --- /dev/null +++ b/pkg/api/http/controller/groups/models.py @@ -0,0 +1,27 @@ +import quart + +from .. import group +from .....entity.persistence import model + + +@group.group_class('models/llm', '/api/v1/provider/models/llm') +class LLMModelsRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('', methods=['GET', 'POST']) + async def _() -> str: + if quart.request.method == 'GET': + return self.success(data={ + 'models': await self.ap.model_service.get_llm_models() + }) + elif quart.request.method == 'POST': + pass + + @self.route('/', methods=['GET', 'PUT', 'DELETE']) + async def _(model_uuid: str) -> str: + if quart.request.method == 'GET': + pass + elif quart.request.method == 'PUT': + pass + elif quart.request.method == 'DELETE': + pass \ No newline at end of file diff --git a/pkg/api/http/controller/groups/user.py b/pkg/api/http/controller/groups/user.py index ce8e7448..adf7d87c 100644 --- a/pkg/api/http/controller/groups/user.py +++ b/pkg/api/http/controller/groups/user.py @@ -3,7 +3,7 @@ import sqlalchemy import argon2 from .. import group -from .....persistence.entities import user +from .....entity.persistence import user @group.group_class('user', '/api/v1/user') diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index acbfa104..e644e7e4 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -7,7 +7,7 @@ import quart import quart_cors from ....core import app, entities as core_entities -from .groups import logs, system, settings, plugins, stats, user +from .groups import logs, system, settings, plugins, stats, user, models from . import group diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py new file mode 100644 index 00000000..729b815c --- /dev/null +++ b/pkg/api/http/service/model.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +import sqlalchemy + +from ....core import app +from ....entity.persistence import model + + +class ModelsService: + + ap: app.Application + + def __init__(self, ap: app.Application) -> None: + self.ap = ap + + async def get_llm_models(self) -> list[model.LLMModel]: + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(model.LLMModel) + ) + + result_list = result.all() + + return result_list + + async def create_llm_model(self, model: model.LLMModel) -> None: + pass + + async def get_llm_model(self, model_uuid: str) -> model.LLMModel: + pass + + async def update_llm_model(self, model: model.LLMModel) -> None: + pass + + async def delete_llm_model(self, model_uuid: str) -> None: + pass diff --git a/pkg/api/http/service/user.py b/pkg/api/http/service/user.py index 93774778..b09eef3c 100644 --- a/pkg/api/http/service/user.py +++ b/pkg/api/http/service/user.py @@ -6,7 +6,7 @@ import jwt import datetime from ....core import app -from ....persistence.entities import user +from ....entity.persistence import user from ....utils import constants diff --git a/pkg/core/app.py b/pkg/core/app.py index 8fd36d63..9f359239 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -25,6 +25,7 @@ from ..utils import version as version_mgr, proxy as proxy_mgr, announce as anno from ..persistence import mgr as persistencemgr from ..api.http.controller import main as http_controller from ..api.http.service import user as user_service +from ..api.http.service import model as model_service from ..discover import engine as discover_engine from ..utils import logcache, ip from . import taskmgr @@ -112,6 +113,8 @@ class Application: user_service: user_service.UserService = None + model_service: model_service.ModelsService = None + def __init__(self): pass diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index e4fd0ea5..067044e5 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -18,6 +18,7 @@ from ...platform import manager as im_mgr from ...persistence import mgr as persistencemgr from ...api.http.controller import main as http_controller from ...api.http.service import user as user_service +from ...api.http.service import model as model_service from ...discover import engine as discover_engine from ...utils import logcache from .. import taskmgr @@ -123,5 +124,8 @@ class BuildAppStage(stage.BootingStage): user_service_inst = user_service.UserService(ap) ap.user_service = user_service_inst + model_service_inst = model_service.ModelsService(ap) + ap.model_service = model_service_inst + ctrl = controller.Controller(ap) ap.ctrl = ctrl diff --git a/pkg/persistence/entities/__init__.py b/pkg/entity/__init__.py similarity index 100% rename from pkg/persistence/entities/__init__.py rename to pkg/entity/__init__.py diff --git a/pkg/entity/persistence/__init__.py b/pkg/entity/persistence/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/persistence/entities/base.py b/pkg/entity/persistence/base.py similarity index 82% rename from pkg/persistence/entities/base.py rename to pkg/entity/persistence/base.py index b0d8b5db..9d9ea759 100644 --- a/pkg/persistence/entities/base.py +++ b/pkg/entity/persistence/base.py @@ -1,4 +1,5 @@ import sqlalchemy.orm +import pydantic class Base(sqlalchemy.orm.DeclarativeBase): diff --git a/pkg/entity/persistence/model.py b/pkg/entity/persistence/model.py new file mode 100644 index 00000000..9ef875db --- /dev/null +++ b/pkg/entity/persistence/model.py @@ -0,0 +1,19 @@ +import sqlalchemy + +from .base import Base + + +class LLMModel(Base): + """LLM 模型""" + __tablename__ = 'llm_models' + + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + requester = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + requester_config = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={}) + api_keys = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) + abilities = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=[]) + extra_args = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={}) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) \ No newline at end of file diff --git a/pkg/persistence/entities/user.py b/pkg/entity/persistence/user.py similarity index 67% rename from pkg/persistence/entities/user.py rename to pkg/entity/persistence/user.py index 55597b4f..b15969c1 100644 --- a/pkg/persistence/entities/user.py +++ b/pkg/entity/persistence/user.py @@ -9,3 +9,5 @@ class User(Base): id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) user = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) password = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 0eef4800..b2e674c4 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -7,7 +7,7 @@ import sqlalchemy.ext.asyncio as sqlalchemy_asyncio import sqlalchemy from . import database -from .entities import user, base +from ..entity.persistence import user, model, base from ..core import app from .databases import sqlite @@ -34,6 +34,11 @@ class PersistenceManager: await self.create_tables() + # auto migrate + async with self.get_db_engine().connect() as conn: + await conn.run_sync(self.meta.drop_all) + await conn.run_sync(self.meta.create_all) + async def create_tables(self): # TODO: 对扩展友好 diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index e8c231c5..3d86dfad 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -6,6 +6,7 @@ from . import entities, requester from ...core import app from ...discover import engine from . import token +from ...entity.persistence import model from .requesters import bailianchatcmpl, chatcmpl, anthropicmsgs, moonshotchatcmpl, deepseekchatcmpl, ollamachat, giteeaichatcmpl, volcarkchatcmpl, xaichatcmpl, zhipuaichatcmpl, lmstudiochatcmpl, siliconflowchatcmpl, volcarkchatcmpl FETCH_MODEL_LIST_URL = "https://api.qchatgpt.rockchin.top/api/v2/fetch/model_list" @@ -23,12 +24,16 @@ class ModelManager: requesters: dict[str, requester.LLMAPIRequester] token_mgrs: dict[str, token.TokenManager] + + models: list[model.LLMModel] def __init__(self, ap: app.Application): self.ap = ap + self.requester_components = [] self.model_list = [] self.requesters = {} self.token_mgrs = {} + self.models = [] async def get_model_by_name(self, name: str) -> entities.LLMModelInfo: """通过名称获取模型 @@ -46,10 +51,6 @@ class ModelManager: for k, v in self.ap.provider_cfg.data['keys'].items(): self.token_mgrs[k] = token.TokenManager(k, v) - # for api_cls in requester.preregistered_requesters: - # api_inst = api_cls(self.ap) - # await api_inst.initialize() - # self.requesters[api_inst.name] = api_inst for component in self.requester_components: api_cls = component.get_python_component_class() api_inst = api_cls(self.ap) From b9d46d997216ae915509cc495771bdabf4fe1fb4 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 20:56:35 +0800 Subject: [PATCH 002/205] chore: change default db path to `langbot.db` --- templates/system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/system.json b/templates/system.json index c090ea0e..f3e69feb 100644 --- a/templates/system.json +++ b/templates/system.json @@ -20,7 +20,7 @@ }, "persistence": { "sqlite": { - "path": "data/persistence.db" + "path": "data/langbot.db" }, "use": "sqlite" } From a89a20a374d2dbc6b827e39b4a699d697f971bb4 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 21:14:55 +0800 Subject: [PATCH 003/205] feat: update persistence models --- pkg/core/bootutils/deps.py | 1 + pkg/entity/persistence/model.py | 5 +++-- pkg/entity/persistence/user.py | 5 +++-- pkg/persistence/mgr.py | 5 ----- requirements.txt | 1 + 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index c1db6482..47b87d35 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -35,6 +35,7 @@ required_deps = { "telegram": "python-telegram-bot", "certifi": "certifi", "mcp": "mcp", + "sqlmodel": "sqlmodel", } diff --git a/pkg/entity/persistence/model.py b/pkg/entity/persistence/model.py index 9ef875db..a77ffd27 100644 --- a/pkg/entity/persistence/model.py +++ b/pkg/entity/persistence/model.py @@ -1,4 +1,5 @@ import sqlalchemy +import datetime from .base import Base @@ -15,5 +16,5 @@ class LLMModel(Base): api_keys = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) abilities = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=[]) extra_args = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default={}) - updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) - created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) \ No newline at end of file + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) \ No newline at end of file diff --git a/pkg/entity/persistence/user.py b/pkg/entity/persistence/user.py index b15969c1..23d309c4 100644 --- a/pkg/entity/persistence/user.py +++ b/pkg/entity/persistence/user.py @@ -1,4 +1,5 @@ import sqlalchemy +import sqlmodel from .base import Base @@ -9,5 +10,5 @@ class User(Base): id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) user = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) password = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) - created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) - updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) \ No newline at end of file diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index b2e674c4..27ffe522 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -34,11 +34,6 @@ class PersistenceManager: await self.create_tables() - # auto migrate - async with self.get_db_engine().connect() as conn: - await conn.run_sync(self.meta.drop_all) - await conn.run_sync(self.meta.create_all) - async def create_tables(self): # TODO: 对扩展友好 diff --git a/requirements.txt b/requirements.txt index 243d2da7..e01eb373 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,6 +34,7 @@ dashscope python-telegram-bot certifi mcp +sqlmodel # indirect taskgroup==0.0.0a4 \ No newline at end of file From 47d835827213ac0dd29c5982228c8db693442713 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 22:07:09 +0800 Subject: [PATCH 004/205] feat: llmmodels crud --- pkg/api/http/controller/group.py | 5 ++- pkg/api/http/controller/groups/models.py | 24 +++++++++-- pkg/api/http/service/model.py | 52 ++++++++++++++++++------ pkg/persistence/mgr.py | 7 ++++ pkg/provider/modelmgr/modelmgr.py | 24 ++++++++++- 5 files changed, 92 insertions(+), 20 deletions(-) diff --git a/pkg/api/http/controller/group.py b/pkg/api/http/controller/group.py index 5a6ab97e..7186802f 100644 --- a/pkg/api/http/controller/group.py +++ b/pkg/api/http/controller/group.py @@ -4,6 +4,7 @@ import abc import typing import enum import quart +import traceback from quart.typing import RouteCallable from ....core import app @@ -75,7 +76,9 @@ class RouterGroup(abc.ABC): try: return await f(*args, **kwargs) except Exception as e: # 自动 500 - return self.http_status(500, -2, str(e)) + traceback.print_exc() + # return self.http_status(500, -2, str(e)) + return self.http_status(500, -2, 'internal server error') new_f = handler_error new_f.__name__ = (self.name + rule).replace('/', '__') diff --git a/pkg/api/http/controller/groups/models.py b/pkg/api/http/controller/groups/models.py index e8921d5f..d88df866 100644 --- a/pkg/api/http/controller/groups/models.py +++ b/pkg/api/http/controller/groups/models.py @@ -1,4 +1,5 @@ import quart +import uuid from .. import group from .....entity.persistence import model @@ -15,13 +16,28 @@ class LLMModelsRouterGroup(group.RouterGroup): 'models': await self.ap.model_service.get_llm_models() }) elif quart.request.method == 'POST': - pass + json_data = await quart.request.json + + await self.ap.model_service.create_llm_model(json_data) + + return self.success() @self.route('/', methods=['GET', 'PUT', 'DELETE']) async def _(model_uuid: str) -> str: if quart.request.method == 'GET': - pass + model = await self.ap.model_service.get_llm_model(model_uuid) + + if model is None: + return self.http_status(404, -1, 'model not found') + + return self.success(data=model) elif quart.request.method == 'PUT': - pass + json_data = await quart.request.json + + await self.ap.model_service.update_llm_model(model_uuid, json_data) + + return self.success() elif quart.request.method == 'DELETE': - pass \ No newline at end of file + await self.ap.model_service.delete_llm_model(model_uuid) + + return self.success() diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py index 729b815c..a68999fd 100644 --- a/pkg/api/http/service/model.py +++ b/pkg/api/http/service/model.py @@ -1,9 +1,11 @@ from __future__ import annotations +import uuid +import datetime import sqlalchemy from ....core import app -from ....entity.persistence import model +from ....entity.persistence import model as persistence_model class ModelsService: @@ -13,23 +15,47 @@ class ModelsService: def __init__(self, ap: app.Application) -> None: self.ap = ap - async def get_llm_models(self) -> list[model.LLMModel]: + async def get_llm_models(self) -> list[dict]: result = await self.ap.persistence_mgr.execute_async( - sqlalchemy.select(model.LLMModel) + sqlalchemy.select(persistence_model.LLMModel) ) - result_list = result.all() - - return result_list + models = result.all() + return [ + self.ap.persistence_mgr.serialize_model(persistence_model.LLMModel, model) + for model in models + ] - async def create_llm_model(self, model: model.LLMModel) -> None: - pass + async def create_llm_model(self, model_data: dict) -> None: - async def get_llm_model(self, model_uuid: str) -> model.LLMModel: - pass + model_data['uuid'] = str(uuid.uuid4()) - async def update_llm_model(self, model: model.LLMModel) -> None: - pass + await self.ap.persistence_mgr.execute_async( + sqlalchemy.insert(persistence_model.LLMModel).values( + **model_data + ) + ) + # TODO: add to runtime + + async def get_llm_model(self, model_uuid: str) -> dict | None: + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid) + ) + + model = result.first() + + if model is None: + return None + + return self.ap.persistence_mgr.serialize_model(persistence_model.LLMModel, model) + + async def update_llm_model(self, model_uuid: str, model_data: dict) -> None: + await self.ap.persistence_mgr.execute_async( + sqlalchemy.update(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid).values(**model_data) + ) async def delete_llm_model(self, model_uuid: str) -> None: - pass + await self.ap.persistence_mgr.execute_async( + sqlalchemy.delete(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid) + ) + # TODO: delete from runtime \ No newline at end of file diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 27ffe522..67b618e7 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -2,6 +2,7 @@ from __future__ import annotations import asyncio import datetime +import typing import sqlalchemy.ext.asyncio as sqlalchemy_asyncio import sqlalchemy @@ -55,3 +56,9 @@ class PersistenceManager: def get_db_engine(self) -> sqlalchemy_asyncio.AsyncEngine: return self.db.get_engine() + + def serialize_model(self, model: typing.Type[sqlalchemy.Base], data: sqlalchemy.Base) -> dict: + return { + column.name: getattr(data, column.name) if not isinstance(getattr(data, column.name), (datetime.datetime)) else getattr(data, column.name).isoformat() + for column in model.__table__.columns + } diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 3d86dfad..2951d9ab 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -12,6 +12,24 @@ from .requesters import bailianchatcmpl, chatcmpl, anthropicmsgs, moonshotchatcm FETCH_MODEL_LIST_URL = "https://api.qchatgpt.rockchin.top/api/v2/fetch/model_list" +class RuntimeLLMModel: + """运行时模型""" + + model_entity: model.LLMModel + """模型数据""" + + token_mgr: token.TokenManager + """api key管理器""" + + requester: requester.LLMAPIRequester + """请求器实例""" + + def __init__(self, model_entity: model.LLMModel, token_mgr: token.TokenManager, requester: requester.LLMAPIRequester): + self.model_entity = model_entity + self.token_mgr = token_mgr + self.requester = requester + + class ModelManager: """模型管理器""" @@ -25,7 +43,9 @@ class ModelManager: token_mgrs: dict[str, token.TokenManager] - models: list[model.LLMModel] + # ====== 4.0 ====== + + llm_models: list[RuntimeLLMModel] def __init__(self, ap: app.Application): self.ap = ap @@ -33,7 +53,7 @@ class ModelManager: self.model_list = [] self.requesters = {} self.token_mgrs = {} - self.models = [] + self.llm_models = [] async def get_model_by_name(self, name: str) -> entities.LLMModelInfo: """通过名称获取模型 From c7c7e36c862f348d5ff1d64bc53fc42be0b27551 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 22:26:02 +0800 Subject: [PATCH 005/205] chore: delete `args` field from llm requester manifests --- pkg/provider/modelmgr/requesters/anthropicmsgs.yaml | 7 ------- pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/chatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/ollamachat.yaml | 7 ------- pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/xaichatcmpl.yaml | 7 ------- pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml | 7 ------- 12 files changed, 84 deletions(-) diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml index 934db905..fe3b335c 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.anthropic.com/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml index 0107d1a6..0851b561 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://dashscope.aliyuncs.com/compatible-mode/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.yaml b/pkg/provider/modelmgr/requesters/chatcmpl.yaml index 9e623542..2e326efb 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/chatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.openai.com/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml index 2eb56be4..7563c176 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.deepseek.com" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml index 67178cd1..828f45c1 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://ai.gitee.com/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml index 2b18e92c..52a3018f 100644 --- a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "http://127.0.0.1:1234/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml index 2680cea1..df2a5979 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.moonshot.com/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/ollamachat.yaml b/pkg/provider/modelmgr/requesters/ollamachat.yaml index 9c2e83f3..0c34d938 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.yaml +++ b/pkg/provider/modelmgr/requesters/ollamachat.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "http://127.0.0.1:11434" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml index 02b08fea..4dec12ff 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.siliconflow.cn/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml index 9beee799..02842fce 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://ark.cn-beijing.volces.com/api/v3" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml index a9eee84d..16a509c1 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://api.x.ai/v1" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml index 76ab63e9..19f1a715 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml @@ -14,13 +14,6 @@ spec: type: string required: true default: "https://open.bigmodel.cn/api/paas/v4" - - name: args - label: - en_US: Args - zh_CN: 附加参数 - type: object - required: true - default: {} - name: timeout label: en_US: Timeout From 5c584ee60df8a8a7f92b20ed892d335661eb22dc Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 22:43:25 +0800 Subject: [PATCH 006/205] feat: requesters api --- .../controller/groups/provider/__init__.py | 0 .../groups/{ => provider}/models.py | 18 ++++++----- .../controller/groups/provider/requesters.py | 26 ++++++++++++++++ pkg/api/http/controller/main.py | 4 ++- pkg/discover/engine.py | 31 +++++++++++++++++++ pkg/provider/modelmgr/modelmgr.py | 28 ++++++++++++----- 6 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 pkg/api/http/controller/groups/provider/__init__.py rename pkg/api/http/controller/groups/{ => provider}/models.py (70%) create mode 100644 pkg/api/http/controller/groups/provider/requesters.py diff --git a/pkg/api/http/controller/groups/provider/__init__.py b/pkg/api/http/controller/groups/provider/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/api/http/controller/groups/models.py b/pkg/api/http/controller/groups/provider/models.py similarity index 70% rename from pkg/api/http/controller/groups/models.py rename to pkg/api/http/controller/groups/provider/models.py index d88df866..ab91ab6a 100644 --- a/pkg/api/http/controller/groups/models.py +++ b/pkg/api/http/controller/groups/provider/models.py @@ -1,8 +1,8 @@ import quart import uuid -from .. import group -from .....entity.persistence import model +from ... import group +from ......entity.persistence import model @group.group_class('models/llm', '/api/v1/provider/models/llm') @@ -22,7 +22,7 @@ class LLMModelsRouterGroup(group.RouterGroup): return self.success() - @self.route('/', methods=['GET', 'PUT', 'DELETE']) + @self.route('/', methods=['GET', 'DELETE']) async def _(model_uuid: str) -> str: if quart.request.method == 'GET': model = await self.ap.model_service.get_llm_model(model_uuid) @@ -30,13 +30,15 @@ class LLMModelsRouterGroup(group.RouterGroup): if model is None: return self.http_status(404, -1, 'model not found') - return self.success(data=model) - elif quart.request.method == 'PUT': - json_data = await quart.request.json + return self.success(data={ + 'model': model + }) + # elif quart.request.method == 'PUT': + # json_data = await quart.request.json - await self.ap.model_service.update_llm_model(model_uuid, json_data) + # await self.ap.model_service.update_llm_model(model_uuid, json_data) - return self.success() + # return self.success() elif quart.request.method == 'DELETE': await self.ap.model_service.delete_llm_model(model_uuid) diff --git a/pkg/api/http/controller/groups/provider/requesters.py b/pkg/api/http/controller/groups/provider/requesters.py new file mode 100644 index 00000000..7dd3cfea --- /dev/null +++ b/pkg/api/http/controller/groups/provider/requesters.py @@ -0,0 +1,26 @@ +import quart + +from ... import group + + +@group.group_class('provider/requesters', '/api/v1/provider/requesters') +class RequestersRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('', methods=['GET']) + async def _() -> quart.Response: + return self.success(data={ + 'requesters': self.ap.model_mgr.get_available_requesters_info() + }) + + @self.route('/', methods=['GET']) + async def _(requester_name: str) -> quart.Response: + + requester_info = self.ap.model_mgr.get_available_requester_info_by_name(requester_name) + + if requester_info is None: + return self.http_status(404, -1, 'requester not found') + + return self.success(data={ + 'requester': requester_info + }) diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index e644e7e4..9aced3cf 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -7,7 +7,9 @@ import quart import quart_cors from ....core import app, entities as core_entities -from .groups import logs, system, settings, plugins, stats, user, models + +from .groups import logs, system, settings, plugins, stats, user +from .groups.provider import models, requesters from . import group diff --git a/pkg/discover/engine.py b/pkg/discover/engine.py index 297e6515..3960661c 100644 --- a/pkg/discover/engine.py +++ b/pkg/discover/engine.py @@ -23,6 +23,16 @@ class I18nString(pydantic.BaseModel): ja_JP: typing.Optional[str] = None """日文""" + def to_dict(self) -> dict: + """转换为字典""" + dic = {} + if self.en_US is not None: + dic['en_US'] = self.en_US + if self.zh_CN is not None: + dic['zh_CN'] = self.zh_CN + if self.ja_JP is not None: + dic['ja_JP'] = self.ja_JP + return dic class Metadata(pydantic.BaseModel): """元数据""" @@ -39,6 +49,17 @@ class Metadata(pydantic.BaseModel): icon: typing.Optional[str] = None """图标""" + def __init__(self, **kwargs): + super().__init__(**kwargs) + + if self.description is None: + self.description = I18nString( + en_US='' + ) + + if self.icon is None: + self.icon = '' + class PythonExecution(pydantic.BaseModel): """Python执行""" @@ -123,6 +144,16 @@ class Component(pydantic.BaseModel): module_path = module_path.replace('/', '.').replace('\\', '.') module = importlib.import_module(module_path) return getattr(module, self.execution.python.attr) + + def to_plain_dict(self) -> dict: + """转换为平铺字典""" + return { + 'name': self.metadata.name, + 'label': self.metadata.label.to_dict(), + 'description': self.metadata.description.to_dict(), + 'icon': self.metadata.icon, + 'spec': self.spec + } class ComponentDiscoveryEngine: diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 2951d9ab..1884da4b 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -33,19 +33,19 @@ class RuntimeLLMModel: class ModelManager: """模型管理器""" - ap: app.Application + model_list: list[entities.LLMModelInfo] # deprecated - requester_components: list[engine.Component] + requesters: dict[str, requester.LLMAPIRequester] # deprecated - model_list: list[entities.LLMModelInfo] - - requesters: dict[str, requester.LLMAPIRequester] - - token_mgrs: dict[str, token.TokenManager] + token_mgrs: dict[str, token.TokenManager] # deprecated # ====== 4.0 ====== + ap: app.Application + llm_models: list[RuntimeLLMModel] + + requester_components: list[engine.Component] def __init__(self, ap: app.Application): self.ap = ap @@ -140,3 +140,17 @@ class ModelManager: except Exception as e: self.ap.logger.error(f"初始化模型 {model['name']} 失败: {type(e)} {e} ,请检查配置文件") + + def get_available_requesters_info(self) -> list[dict]: + """获取所有可用的请求器""" + return [ + component.to_plain_dict() + for component in self.requester_components + ] + + def get_available_requester_info_by_name(self, name: str) -> dict | None: + """通过名称获取请求器信息""" + for component in self.requester_components: + if component.metadata.name == name: + return component.to_plain_dict() + return None From 3124cc0fef889babf2a77a45c697b0c686b2c971 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 16 Mar 2025 23:16:06 +0800 Subject: [PATCH 007/205] feat: update requester config logic --- .../modelmgr/requesters/anthropicmsgs.py | 6 ++ .../modelmgr/requesters/bailianchatcmpl.py | 11 ++- pkg/provider/modelmgr/requesters/chatcmpl.py | 68 +++++++++++-------- .../modelmgr/requesters/deepseekchatcmpl.py | 10 ++- .../modelmgr/requesters/giteeaichatcmpl.py | 8 ++- .../modelmgr/requesters/lmstudiochatcmpl.py | 11 ++- .../modelmgr/requesters/moonshotchatcmpl.py | 10 ++- .../modelmgr/requesters/ollamachat.py | 22 +++--- .../requesters/siliconflowchatcmpl.py | 11 ++- .../modelmgr/requesters/volcarkchatcmpl.py | 11 ++- .../modelmgr/requesters/xaichatcmpl.py | 11 ++- .../modelmgr/requesters/zhipuaichatcmpl.py | 11 ++- 12 files changed, 104 insertions(+), 86 deletions(-) diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.py b/pkg/provider/modelmgr/requesters/anthropicmsgs.py index b03e536d..937f5107 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.py +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.py @@ -8,6 +8,7 @@ import base64 import anthropic import httpx +from ....core import app from .. import entities, errors, requester from .. import entities, errors @@ -22,6 +23,11 @@ class AnthropicMessages(requester.LLMAPIRequester): client: anthropic.AsyncAnthropic + default_config: dict[str, typing.Any] = { + 'base-url': 'https://api.anthropic.com/v1', + 'timeout': 120, + } + async def initialize(self): httpx_client = anthropic._base_client.AsyncHttpxClientWrapper( diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.py b/pkg/provider/modelmgr/requesters/bailianchatcmpl.py index 8f6b258c..ce718c4c 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from . import chatcmpl @@ -12,9 +13,7 @@ class BailianChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['bailian-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'https://dashscope.aliyuncs.com/compatible-mode/v1', + 'timeout': 120, + } diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.py b/pkg/provider/modelmgr/requesters/chatcmpl.py index 7bf83377..7cf255c0 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.py +++ b/pkg/provider/modelmgr/requesters/chatcmpl.py @@ -25,23 +25,20 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['openai-chat-completions'] + default_config: dict[str, typing.Any] = { + "base-url": "https://api.openai.com/v1", + "timeout": 120, + } async def initialize(self): self.client = openai.AsyncClient( api_key="", - base_url=self.requester_cfg['base-url'], - timeout=self.requester_cfg['timeout'], + base_url=self.requester_cfg["base-url"], + timeout=self.requester_cfg["timeout"], http_client=httpx.AsyncClient( - trust_env=True, - timeout=self.requester_cfg['timeout'] - ) + trust_env=True, timeout=self.requester_cfg["timeout"] + ), ) async def _req( @@ -57,8 +54,8 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): chatcmpl_message = chat_completion.choices[0].message.dict() # 确保 role 字段存在且不为 None - if 'role' not in chatcmpl_message or chatcmpl_message['role'] is None: - chatcmpl_message['role'] = 'assistant' + if "role" not in chatcmpl_message or chatcmpl_message["role"] is None: + chatcmpl_message["role"] = "assistant" message = llm_entities.Message(**chatcmpl_message) @@ -70,11 +67,14 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): req_messages: list[dict], use_model: entities.LLMModelInfo, use_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, # TODO: 所有的args都改为从此参数读取 ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() - args = self.requester_cfg['args'].copy() - args["model"] = use_model.name if use_model.model_name is None else use_model.model_name + args = self.requester_cfg["args"].copy() + args["model"] = ( + use_model.name if use_model.model_name is None else use_model.model_name + ) if use_funcs: tools = await self.ap.tool_mgr.generate_tools_for_openai(use_funcs) @@ -87,12 +87,10 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): # 检查vision for msg in messages: - if 'content' in msg and isinstance(msg["content"], list): + if "content" in msg and isinstance(msg["content"], list): for me in msg["content"]: if me["type"] == "image_base64": - me["image_url"] = { - "url": me["image_base64"] - } + me["image_url"] = {"url": me["image_base64"]} me["type"] = "image_url" del me["image_base64"] @@ -105,13 +103,14 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): message = await self._make_msg(resp) return message - + async def call( self, query: core_entities.Query, model: entities.LLMModelInfo, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: req_messages = [] # req_messages 仅用于类内,外部同步由 query.messages 进行 for m in messages: @@ -119,25 +118,34 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): content = msg_dict.get("content") if isinstance(content, list): # 检查 content 列表中是否每个部分都是文本 - if all(isinstance(part, dict) and part.get("type") == "text" for part in content): + if all( + isinstance(part, dict) and part.get("type") == "text" + for part in content + ): # 将所有文本部分合并为一个字符串 msg_dict["content"] = "\n".join(part["text"] for part in content) req_messages.append(msg_dict) try: - return await self._closure(query=query, req_messages=req_messages, use_model=model, use_funcs=funcs) + return await self._closure( + query=query, + req_messages=req_messages, + use_model=model, + use_funcs=funcs, + extra_args=extra_args, + ) except asyncio.TimeoutError: - raise errors.RequesterError('请求超时') + raise errors.RequesterError("请求超时") except openai.BadRequestError as e: - if 'context_length_exceeded' in e.message: - raise errors.RequesterError(f'上文过长,请重置会话: {e.message}') + if "context_length_exceeded" in e.message: + raise errors.RequesterError(f"上文过长,请重置会话: {e.message}") else: - raise errors.RequesterError(f'请求参数错误: {e.message}') + raise errors.RequesterError(f"请求参数错误: {e.message}") except openai.AuthenticationError as e: - raise errors.RequesterError(f'无效的 api-key: {e.message}') + raise errors.RequesterError(f"无效的 api-key: {e.message}") except openai.NotFoundError as e: - raise errors.RequesterError(f'请求路径错误: {e.message}') + raise errors.RequesterError(f"请求路径错误: {e.message}") except openai.RateLimitError as e: - raise errors.RequesterError(f'请求过于频繁或余额不足: {e.message}') + raise errors.RequesterError(f"请求过于频繁或余额不足: {e.message}") except openai.APIError as e: - raise errors.RequesterError(f'请求错误: {e.message}') + raise errors.RequesterError(f"请求错误: {e.message}") diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py index f6453a19..e82d0d81 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py @@ -1,5 +1,7 @@ from __future__ import annotations +import typing + from . import chatcmpl from .. import entities, errors, requester from ....core import entities as core_entities, app @@ -10,9 +12,10 @@ from ...tools import entities as tools_entities class DeepseekChatCompletions(chatcmpl.OpenAIChatCompletions): """Deepseek ChatCompletion API 请求器""" - def __init__(self, ap: app.Application): - self.requester_cfg = ap.provider_cfg.data['requester']['deepseek-chat-completions'] - self.ap = ap + default_config: dict[str, typing.Any] = { + 'base-url': 'https://api.deepseek.com', + 'timeout': 120, + } async def _closure( self, @@ -20,6 +23,7 @@ class DeepseekChatCompletions(chatcmpl.OpenAIChatCompletions): req_messages: list[dict], use_model: entities.LLMModelInfo, use_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py index 4beb6ba8..dec0b8d1 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py @@ -17,9 +17,10 @@ from .. import entities as modelmgr_entities class GiteeAIChatCompletions(chatcmpl.OpenAIChatCompletions): """Gitee AI ChatCompletions API 请求器""" - def __init__(self, ap: app.Application): - self.ap = ap - self.requester_cfg = ap.provider_cfg.data['requester']['gitee-ai-chat-completions'].copy() + default_config: dict[str, typing.Any] = { + 'base-url': 'https://ai.gitee.com/v1', + 'timeout': 120, + } async def _closure( self, @@ -27,6 +28,7 @@ class GiteeAIChatCompletions(chatcmpl.OpenAIChatCompletions): req_messages: list[dict], use_model: entities.LLMModelInfo, use_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() diff --git a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py index d2a9bcb7..c00be372 100644 --- a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py +++ b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from . import chatcmpl @@ -12,9 +13,7 @@ class LmStudioChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['lmstudio-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'http://127.0.0.1:1234/v1', + 'timeout': 120, + } diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py index 2e94fd04..3cbe8837 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py @@ -1,5 +1,7 @@ from __future__ import annotations +import typing + from ....core import app from . import chatcmpl @@ -12,9 +14,10 @@ from ...tools import entities as tools_entities class MoonshotChatCompletions(chatcmpl.OpenAIChatCompletions): """Moonshot ChatCompletion API 请求器""" - def __init__(self, ap: app.Application): - self.requester_cfg = ap.provider_cfg.data['requester']['moonshot-chat-completions'] - self.ap = ap + default_config: dict[str, typing.Any] = { + 'base-url': 'https://api.moonshot.cn/v1', + 'timeout': 120, + } async def _closure( self, @@ -22,6 +25,7 @@ class MoonshotChatCompletions(chatcmpl.OpenAIChatCompletions): req_messages: list[dict], use_model: entities.LLMModelInfo, use_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() diff --git a/pkg/provider/modelmgr/requesters/ollamachat.py b/pkg/provider/modelmgr/requesters/ollamachat.py index 0ac2915f..fa99cfe5 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.py +++ b/pkg/provider/modelmgr/requesters/ollamachat.py @@ -23,17 +23,16 @@ REQUESTER_NAME: str = "ollama-chat" class OllamaChatCompletions(requester.LLMAPIRequester): """Ollama平台 ChatCompletion API请求器""" client: ollama.AsyncClient - request_cfg: dict - def __init__(self, ap: app.Application): - super().__init__(ap) - self.ap = ap - self.request_cfg = self.ap.provider_cfg.data['requester'][REQUESTER_NAME] + default_config: dict[str, typing.Any] = { + 'base-url': 'http://127.0.0.1:11434', + 'timeout': 120, + } async def initialize(self): - os.environ['OLLAMA_HOST'] = self.request_cfg['base-url'] + os.environ['OLLAMA_HOST'] = self.requester_cfg['base-url'] self.client = ollama.AsyncClient( - timeout=self.request_cfg['timeout'] + timeout=self.requester_cfg['timeout'] ) async def _req(self, @@ -44,9 +43,9 @@ class OllamaChatCompletions(requester.LLMAPIRequester): ) async def _closure(self, query: core_entities.Query, req_messages: list[dict], use_model: entities.LLMModelInfo, - user_funcs: list[tools_entities.LLMFunction] = None) -> ( - llm_entities.Message): - args: Any = self.request_cfg['args'].copy() + user_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}) -> llm_entities.Message: + args: Any = self.requester_cfg['args'].copy() args["model"] = use_model.name if use_model.model_name is None else use_model.model_name messages: list[dict] = req_messages.copy() @@ -113,6 +112,7 @@ class OllamaChatCompletions(requester.LLMAPIRequester): model: entities.LLMModelInfo, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: req_messages: list = [] for m in messages: @@ -123,6 +123,6 @@ class OllamaChatCompletions(requester.LLMAPIRequester): msg_dict["content"] = "\n".join(part["text"] for part in content) req_messages.append(msg_dict) try: - return await self._closure(query, req_messages, model, funcs) + return await self._closure(query, req_messages, model, funcs, extra_args) except asyncio.TimeoutError: raise errors.RequesterError('请求超时') diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py index c763556f..a990f809 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from . import chatcmpl @@ -12,9 +13,7 @@ class SiliconFlowChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['siliconflow-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'https://api.siliconflow.cn/v1', + 'timeout': 120, + } diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py index f2a58789..fbf88826 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from . import chatcmpl @@ -12,9 +13,7 @@ class VolcArkChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['volcark-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'https://ark.cn-beijing.volces.com/api/v3', + 'timeout': 120, + } diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.py b/pkg/provider/modelmgr/requesters/xaichatcmpl.py index 217b142f..47c2939a 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from . import chatcmpl @@ -12,9 +13,7 @@ class XaiChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['xai-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'https://api.x.ai/v1', + 'timeout': 120, + } diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py index 18edd36d..1e24a5ef 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py @@ -1,5 +1,6 @@ from __future__ import annotations +import typing import openai from ....core import app @@ -12,9 +13,7 @@ class ZhipuAIChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient - requester_cfg: dict - - def __init__(self, ap: app.Application): - self.ap = ap - - self.requester_cfg = self.ap.provider_cfg.data['requester']['zhipuai-chat-completions'] + default_config: dict[str, typing.Any] = { + 'base-url': 'https://open.bigmodel.cn/api/paas/v4', + 'timeout': 120, + } From 81481c9050cbfe7042258937a386f68ffe262ef0 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 17 Mar 2025 22:03:09 +0800 Subject: [PATCH 008/205] feat: new llm initialization logic --- pkg/command/operators/model.py | 2 +- pkg/provider/modelmgr/modelmgr.py | 39 +++++++++++++++++++++++++++--- pkg/provider/modelmgr/requester.py | 12 ++++++++- pkg/provider/modelmgr/token.py | 6 ++--- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/pkg/command/operators/model.py b/pkg/command/operators/model.py index 692e2728..f46c9590 100644 --- a/pkg/command/operators/model.py +++ b/pkg/command/operators/model.py @@ -54,7 +54,7 @@ class ModelShowOperator(operator.CommandOperator): if model.model_name is not None: content += f"请求模型名称: {model.model_name}\n" content += f"请求器: {model.requester.name}\n" - content += f"密钥组: {model.token_mgr.provider}\n" + content += f"密钥组: {model.token_mgr.name}\n" content += f"支持视觉: {model.vision_supported}\n" content += f"支持工具: {model.tool_call_supported}\n" diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 1884da4b..cafaf7e9 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -1,12 +1,13 @@ from __future__ import annotations import aiohttp +import sqlalchemy from . import entities, requester from ...core import app from ...discover import engine from . import token -from ...entity.persistence import model +from ...entity.persistence import model as persistence_model from .requesters import bailianchatcmpl, chatcmpl, anthropicmsgs, moonshotchatcmpl, deepseekchatcmpl, ollamachat, giteeaichatcmpl, volcarkchatcmpl, xaichatcmpl, zhipuaichatcmpl, lmstudiochatcmpl, siliconflowchatcmpl, volcarkchatcmpl FETCH_MODEL_LIST_URL = "https://api.qchatgpt.rockchin.top/api/v2/fetch/model_list" @@ -15,7 +16,7 @@ FETCH_MODEL_LIST_URL = "https://api.qchatgpt.rockchin.top/api/v2/fetch/model_lis class RuntimeLLMModel: """运行时模型""" - model_entity: model.LLMModel + model_entity: persistence_model.LLMModel """模型数据""" token_mgr: token.TokenManager @@ -24,7 +25,7 @@ class RuntimeLLMModel: requester: requester.LLMAPIRequester """请求器实例""" - def __init__(self, model_entity: model.LLMModel, token_mgr: token.TokenManager, requester: requester.LLMAPIRequester): + def __init__(self, model_entity: persistence_model.LLMModel, token_mgr: token.TokenManager, requester: requester.LLMAPIRequester): self.model_entity = model_entity self.token_mgr = token_mgr self.requester = requester @@ -141,6 +142,38 @@ class ModelManager: except Exception as e: self.ap.logger.error(f"初始化模型 {model['name']} 失败: {type(e)} {e} ,请检查配置文件") + async def load_model_from_db(self): + """从数据库加载模型""" + self.llm_models = [] + + # forge requester class dict + requester_dict: dict[str, type[requester.LLMAPIRequester]] = {} + for component in self.requester_components: + requester_dict[component.metadata.name] = component.get_python_component_class() + + # llm models + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_model.LLMModel) + ) + + llm_models = result.all() + + # load models + for llm_model in llm_models: + assert isinstance(llm_model, persistence_model.LLMModel) + runtime_llm_model = RuntimeLLMModel( + model_entity=llm_model, + token_mgr=token.TokenManager( + name=llm_model.uuid, + tokens=llm_model.api_keys + ), + requester=requester_dict[llm_model.requester]( + ap=self.ap, + config=llm_model.requester_config + ) + ) + self.llm_models.append(runtime_llm_model) + def get_available_requesters_info(self) -> list[dict]: """获取所有可用的请求器""" return [ diff --git a/pkg/provider/modelmgr/requester.py b/pkg/provider/modelmgr/requester.py index 147a97c4..7f13c58b 100644 --- a/pkg/provider/modelmgr/requester.py +++ b/pkg/provider/modelmgr/requester.py @@ -17,8 +17,16 @@ class LLMAPIRequester(metaclass=abc.ABCMeta): ap: app.Application - def __init__(self, ap: app.Application): + default_config: dict[str, typing.Any] = {} + + requester_cfg: dict[str, typing.Any] = {} + + def __init__(self, ap: app.Application, config: dict[str, typing.Any]): self.ap = ap + self.requester_cfg = { + **self.default_config + } + self.requester_cfg.update(config) async def initialize(self): pass @@ -40,6 +48,7 @@ class LLMAPIRequester(metaclass=abc.ABCMeta): model: modelmgr_entities.LLMModelInfo, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: """调用API @@ -47,6 +56,7 @@ class LLMAPIRequester(metaclass=abc.ABCMeta): model (modelmgr_entities.LLMModelInfo): 使用的模型信息 messages (typing.List[llm_entities.Message]): 消息对象列表 funcs (typing.List[tools_entities.LLMFunction], optional): 使用的工具函数列表. Defaults to None. + extra_args (dict[str, typing.Any], optional): 额外的参数. Defaults to {}. Returns: llm_entities.Message: 返回消息对象 diff --git a/pkg/provider/modelmgr/token.py b/pkg/provider/modelmgr/token.py index f6f9436d..eeec6986 100644 --- a/pkg/provider/modelmgr/token.py +++ b/pkg/provider/modelmgr/token.py @@ -7,14 +7,14 @@ class TokenManager(): """鉴权 Token 管理器 """ - provider: str + name: str tokens: list[str] using_token_index: typing.Optional[int] = 0 - def __init__(self, provider: str, tokens: list[str]): - self.provider = provider + def __init__(self, name: str, tokens: list[str]): + self.name = name self.tokens = tokens self.using_token_index = 0 From 4275459d455c5d8af689853b85d5c243fc4529cb Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Wed, 19 Mar 2025 23:58:14 +0800 Subject: [PATCH 009/205] feat: model sync between api and manager layer --- pkg/api/http/service/model.py | 8 +- pkg/provider/modelmgr/modelmgr.py | 133 +++++++++--------------------- 2 files changed, 47 insertions(+), 94 deletions(-) diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py index a68999fd..aff1a63a 100644 --- a/pkg/api/http/service/model.py +++ b/pkg/api/http/service/model.py @@ -35,7 +35,7 @@ class ModelsService: **model_data ) ) - # TODO: add to runtime + await self.ap.model_mgr.load_model(model_data) async def get_llm_model(self, model_uuid: str) -> dict | None: result = await self.ap.persistence_mgr.execute_async( @@ -54,8 +54,12 @@ class ModelsService: sqlalchemy.update(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid).values(**model_data) ) + await self.ap.model_mgr.remove_model(model_uuid) + await self.ap.model_mgr.load_model(model_data) + async def delete_llm_model(self, model_uuid: str) -> None: await self.ap.persistence_mgr.execute_async( sqlalchemy.delete(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid) ) - # TODO: delete from runtime \ No newline at end of file + + await self.ap.model_mgr.remove_model(model_uuid) diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index cafaf7e9..1eb3d776 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -47,14 +47,17 @@ class ModelManager: llm_models: list[RuntimeLLMModel] requester_components: list[engine.Component] + + requester_dict: dict[str, type[requester.LLMAPIRequester]] # cache def __init__(self, ap: app.Application): self.ap = ap - self.requester_components = [] self.model_list = [] self.requesters = {} self.token_mgrs = {} self.llm_models = [] + self.requester_components = [] + self.requester_dict = {} async def get_model_by_name(self, name: str) -> entities.LLMModelInfo: """通过名称获取模型 @@ -65,92 +68,21 @@ class ModelManager: raise ValueError(f"无法确定模型 {name} 的信息,请在元数据中配置") async def initialize(self): - self.requester_components = self.ap.discover.get_components_by_kind('LLMAPIRequester') - # 初始化token_mgr, requester - for k, v in self.ap.provider_cfg.data['keys'].items(): - self.token_mgrs[k] = token.TokenManager(k, v) - - for component in self.requester_components: - api_cls = component.get_python_component_class() - api_inst = api_cls(self.ap) - await api_inst.initialize() - self.requesters[component.metadata.name] = api_inst - - # 尝试从api获取最新的模型信息 - try: - async with aiohttp.ClientSession() as session: - async with session.request( - method="GET", - url=FETCH_MODEL_LIST_URL, - # 参数 - params={ - "version": self.ap.ver_mgr.get_current_version() - }, - ) as resp: - model_list = (await resp.json())['data']['list'] - - for model in model_list: - - for index, local_model in enumerate(self.ap.llm_models_meta.data['list']): - if model['name'] == local_model['name']: - self.ap.llm_models_meta.data['list'][index] = model - break - else: - self.ap.llm_models_meta.data['list'].append(model) - - await self.ap.llm_models_meta.dump_config() - - except Exception as e: - self.ap.logger.debug(f'获取最新模型列表失败: {e}') - - default_model_info: entities.LLMModelInfo = None - - for model in self.ap.llm_models_meta.data['list']: - if model['name'] == 'default': - default_model_info = entities.LLMModelInfo( - name=model['name'], - model_name=None, - token_mgr=self.token_mgrs[model['token_mgr']], - requester=self.requesters[model['requester']], - tool_call_supported=model['tool_call_supported'], - vision_supported=model['vision_supported'] - ) - break - - for model in self.ap.llm_models_meta.data['list']: - - try: - - model_name = model.get('model_name', default_model_info.model_name) - token_mgr = self.token_mgrs[model['token_mgr']] if 'token_mgr' in model else default_model_info.token_mgr - req = self.requesters[model['requester']] if 'requester' in model else default_model_info.requester - tool_call_supported = model.get('tool_call_supported', default_model_info.tool_call_supported) - vision_supported = model.get('vision_supported', default_model_info.vision_supported) - - model_info = entities.LLMModelInfo( - name=model['name'], - model_name=model_name, - token_mgr=token_mgr, - requester=req, - tool_call_supported=tool_call_supported, - vision_supported=vision_supported - ) - self.model_list.append(model_info) - - except Exception as e: - self.ap.logger.error(f"初始化模型 {model['name']} 失败: {type(e)} {e} ,请检查配置文件") - - async def load_model_from_db(self): - """从数据库加载模型""" - self.llm_models = [] - # forge requester class dict requester_dict: dict[str, type[requester.LLMAPIRequester]] = {} for component in self.requester_components: requester_dict[component.metadata.name] = component.get_python_component_class() + self.requester_dict = requester_dict + + await self.load_model_from_db() + + async def load_model_from_db(self): + """从数据库加载模型""" + self.llm_models = [] + # llm models result = await self.ap.persistence_mgr.execute_async( sqlalchemy.select(persistence_model.LLMModel) @@ -160,19 +92,36 @@ class ModelManager: # load models for llm_model in llm_models: - assert isinstance(llm_model, persistence_model.LLMModel) - runtime_llm_model = RuntimeLLMModel( - model_entity=llm_model, - token_mgr=token.TokenManager( - name=llm_model.uuid, - tokens=llm_model.api_keys - ), - requester=requester_dict[llm_model.requester]( - ap=self.ap, - config=llm_model.requester_config - ) + await self.load_model(llm_model) + + async def load_model(self, model_info: persistence_model.LLMModel | sqlalchemy.Row[persistence_model.LLMModel] | dict): + """加载模型""" + + if isinstance(model_info, sqlalchemy.Row): + model_info = persistence_model.LLMModel(**model_info._mapping) + elif isinstance(model_info, dict): + model_info = persistence_model.LLMModel(**model_info) + + runtime_llm_model = RuntimeLLMModel( + model_entity=model_info, + token_mgr=token.TokenManager( + name=model_info.uuid, + tokens=model_info.api_keys, + ), + requester=self.requester_dict[model_info.requester]( + ap=self.ap, + config=model_info.requester_config ) - self.llm_models.append(runtime_llm_model) + ) + print(runtime_llm_model, runtime_llm_model.model_entity.name, "loaded") + self.llm_models.append(runtime_llm_model) + + async def remove_model(self, model_uuid: str): + """移除模型""" + for model in self.llm_models: + if model.model_entity.uuid == model_uuid: + self.llm_models.remove(model) + return def get_available_requesters_info(self) -> list[dict]: """获取所有可用的请求器""" From 349ce6908ee24bb09c2670fdd823883f4b7e0376 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 20 Mar 2025 11:54:55 +0800 Subject: [PATCH 010/205] stash --- pkg/api/http/service/model.py | 8 +++--- pkg/provider/modelmgr/modelmgr.py | 45 ++++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py index aff1a63a..7ded6cd1 100644 --- a/pkg/api/http/service/model.py +++ b/pkg/api/http/service/model.py @@ -35,7 +35,7 @@ class ModelsService: **model_data ) ) - await self.ap.model_mgr.load_model(model_data) + await self.ap.model_mgr.load_llm_model(model_data) async def get_llm_model(self, model_uuid: str) -> dict | None: result = await self.ap.persistence_mgr.execute_async( @@ -54,12 +54,12 @@ class ModelsService: sqlalchemy.update(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid).values(**model_data) ) - await self.ap.model_mgr.remove_model(model_uuid) - await self.ap.model_mgr.load_model(model_data) + await self.ap.model_mgr.remove_llm_model(model_uuid) + await self.ap.model_mgr.load_llm_model(model_data) async def delete_llm_model(self, model_uuid: str) -> None: await self.ap.persistence_mgr.execute_async( sqlalchemy.delete(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid) ) - await self.ap.model_mgr.remove_model(model_uuid) + await self.ap.model_mgr.remove_llm_model(model_uuid) diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 1eb3d776..e8329ac1 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -1,10 +1,13 @@ from __future__ import annotations -import aiohttp +import typing import sqlalchemy from . import entities, requester from ...core import app +from ...core import entities as core_entities +from .. import entities as llm_entities +from ..tools import entities as tools_entities from ...discover import engine from . import token from ...entity.persistence import model as persistence_model @@ -58,14 +61,6 @@ class ModelManager: self.llm_models = [] self.requester_components = [] self.requester_dict = {} - - async def get_model_by_name(self, name: str) -> entities.LLMModelInfo: - """通过名称获取模型 - """ - for model in self.model_list: - if model.name == name: - return model - raise ValueError(f"无法确定模型 {name} 的信息,请在元数据中配置") async def initialize(self): self.requester_components = self.ap.discover.get_components_by_kind('LLMAPIRequester') @@ -92,9 +87,9 @@ class ModelManager: # load models for llm_model in llm_models: - await self.load_model(llm_model) + await self.load_llm_model(llm_model) - async def load_model(self, model_info: persistence_model.LLMModel | sqlalchemy.Row[persistence_model.LLMModel] | dict): + async def load_llm_model(self, model_info: persistence_model.LLMModel | sqlalchemy.Row[persistence_model.LLMModel] | dict): """加载模型""" if isinstance(model_info, sqlalchemy.Row): @@ -113,10 +108,24 @@ class ModelManager: config=model_info.requester_config ) ) - print(runtime_llm_model, runtime_llm_model.model_entity.name, "loaded") self.llm_models.append(runtime_llm_model) - async def remove_model(self, model_uuid: str): + async def get_model_by_name(self, name: str) -> entities.LLMModelInfo: # deprecated + """通过名称获取模型 + """ + for model in self.model_list: + if model.name == name: + return model + raise ValueError(f"无法确定模型 {name} 的信息,请在元数据中配置") + + async def get_model_by_uuid(self, uuid: str) -> entities.LLMModelInfo: + """通过uuid获取模型""" + for model in self.llm_models: + if model.model_entity.uuid == uuid: + return model + raise ValueError(f"model {uuid} not found") + + async def remove_llm_model(self, model_uuid: str): """移除模型""" for model in self.llm_models: if model.model_entity.uuid == model_uuid: @@ -136,3 +145,13 @@ class ModelManager: if component.metadata.name == name: return component.to_plain_dict() return None + + async def invoke_llm( + self, + query: core_entities.Query, + model_uuid: str, + messages: list[llm_entities.Message], + funcs: list[tools_entities.LLMFunction] = None, + ) -> llm_entities.Message: + pass + From b85615ceceaebbe5fd20ccc66e96d7b0c63406a6 Mon Sep 17 00:00:00 2001 From: "Junyan Qin (Chin)" Date: Wed, 26 Mar 2025 00:53:36 +0800 Subject: [PATCH 011/205] chore: add pipeline config metadata (#1236) --- templates/metadata/pipeline/ai.yaml | 164 +++++++++++++++++++++++ templates/metadata/pipeline/output.yaml | 92 +++++++++++++ templates/metadata/pipeline/safety.yaml | 56 ++++++++ templates/metadata/pipeline/trigger.yaml | 128 ++++++++++++++++++ 4 files changed, 440 insertions(+) create mode 100644 templates/metadata/pipeline/ai.yaml create mode 100644 templates/metadata/pipeline/output.yaml create mode 100644 templates/metadata/pipeline/safety.yaml create mode 100644 templates/metadata/pipeline/trigger.yaml diff --git a/templates/metadata/pipeline/ai.yaml b/templates/metadata/pipeline/ai.yaml new file mode 100644 index 00000000..38d579c0 --- /dev/null +++ b/templates/metadata/pipeline/ai.yaml @@ -0,0 +1,164 @@ +name: ai +label: + en_US: AI Feature + zh_CN: AI 能力 +stages: + - name: runner + label: + en_US: Runner + zh_CN: 运行方式 + config: + - name: runner + label: + en_US: Runner + zh_CN: 运行器 + type: select + required: true + default: local-agent + options: + - name: local-agent + label: + en_US: Embedded Agent + zh_CN: 内置 Agent + - name: dify-service-api + label: + en_US: Dify Service API + zh_CN: Dify 服务 API + - name: dashscope-app-api + label: + en_US: Aliyun Dashscope App API + zh_CN: 阿里云百炼平台 API + - name: local-agent + label: + en_US: Embedded Agent + zh_CN: 内置 Agent + description: + en_US: Configure the embedded agent of the pipeline + zh_CN: 配置内置 Agent + config: + - name: model + label: + en_US: Model + zh_CN: 模型 + type: select + required: true + scope: llm-model + - name: max-round + label: + en_US: Max Round + zh_CN: 最大回合数 + type: integer + required: true + default: 10 + - name: prompt + label: + en_US: Prompt + zh_CN: 提示词 + type: array + required: true + default: [] + items: + type: string + - name: dify-service-api + label: + en_US: Dify Service API + zh_CN: Dify 服务 API + description: + en_US: Configure the Dify service API of the pipeline + zh_CN: 配置 Dify 服务 API + config: + - name: base-url + label: + en_US: Base URL + zh_CN: 基础 URL + type: string + required: true + - name: app-type + label: + en_US: App Type + zh_CN: 应用类型 + type: select + required: true + default: chat + options: + - name: chat + label: + en_US: Chat + zh_CN: 聊天(包括Chatflow) + - name: agent + label: + en_US: Agent + zh_CN: Agent + - name: workflow + label: + en_US: Workflow + zh_CN: 工作流 + - name: api-key + label: + en_US: API Key + zh_CN: API 密钥 + type: string + required: true + - name: thinking-convert + label: + en_US: CoT Convert + zh_CN: 思维链转换策略 + type: select + required: true + default: plain + options: + - name: plain + label: + en_US: Convert to ... + zh_CN: 转换成 ... + - name: original + label: + en_US: Original + zh_CN: 原始 + - name: remove + label: + en_US: Remove + zh_CN: 移除 + - name: dashscope-app-api + label: + en_US: Aliyun Dashscope App API + zh_CN: 阿里云百炼平台 API + description: + en_US: Configure the Aliyun Dashscope App API of the pipeline + zh_CN: 配置阿里云百炼平台 API + config: + - name: app-type + label: + en_US: App Type + zh_CN: 应用类型 + type: select + required: true + default: agent + options: + - name: agent + label: + en_US: Agent + zh_CN: Agent + - name: workflow + label: + en_US: Workflow + zh_CN: 工作流 + - name: api-key + label: + en_US: API Key + zh_CN: API 密钥 + type: string + required: true + - name: app-id + label: + en_US: App ID + zh_CN: 应用 ID + type: string + required: true + - name: references_quote + label: + en_US: References Quote + zh_CN: 引用文本 + type: string + required: false + default: '参考资料来自:' diff --git a/templates/metadata/pipeline/output.yaml b/templates/metadata/pipeline/output.yaml new file mode 100644 index 00000000..ca47557c --- /dev/null +++ b/templates/metadata/pipeline/output.yaml @@ -0,0 +1,92 @@ +name: output +label: + en_US: Output Processing + zh_CN: 输出处理 +stages: + - name: long-text-processing + label: + en_US: Long Text Processing + zh_CN: 长文本处理 + config: + - name: threshold + label: + en_US: Threshold + zh_CN: 阈值 + type: integer + required: true + default: 1000 + - name: strategy + label: + en_US: Strategy + zh_CN: 策略 + type: select + required: true + default: forward + options: + - name: forward + label: + en_US: Forward Message Component + zh_CN: 转发消息组件 + - name: image + label: + en_US: Convert to Image + zh_CN: 转换为图片 + - name: font-path + label: + en_US: Font Path + zh_CN: 字体路径 + type: string + required: true + default: '' + - name: force-delay + label: + en_US: Force Delay + zh_CN: 强制延迟 + config: + - name: min + label: + en_US: Min + zh_CN: 最小秒数 + type: integer + required: true + default: 0 + - name: max + label: + en_US: Max + zh_CN: 最大秒数 + type: integer + required: true + default: 0 + - name: misc + label: + en_US: Misc + zh_CN: 杂项 + config: + - name: hide-exception + label: + en_US: Hide Exception + zh_CN: 不输出异常信息给用户 + type: boolean + required: true + default: true + - name: at-sender + label: + en_US: At Sender + zh_CN: 在回复中@发送者 + type: boolean + required: true + default: true + - name: quote-origin + label: + en_US: Quote Origin + zh_CN: 引用原文 + type: boolean + required: true + default: false + - name: track-function-calls + label: + en_US: Track Function Calls + zh_CN: 跟踪函数调用 + type: boolean + required: true + default: true diff --git a/templates/metadata/pipeline/safety.yaml b/templates/metadata/pipeline/safety.yaml new file mode 100644 index 00000000..d19913af --- /dev/null +++ b/templates/metadata/pipeline/safety.yaml @@ -0,0 +1,56 @@ +name: safety +label: + en_US: Safety Control + zh_CN: 安全控制 +stages: + - name: content-filter + label: + en_US: Content Filter + zh_CN: 内容过滤 + config: + - name: scope + label: + en_US: Scope + zh_CN: 检查范围 + type: select + required: true + default: all + options: + - name: all + label: + en_US: All + zh_CN: 全部 + - name: income-msg + label: + en_US: Income Message + zh_CN: 传入消息(用户消息) + - name: output-msg + label: + en_US: Output Message + zh_CN: 传出消息(机器人消息) + - name: check-sensitive-words + label: + en_US: Check Sensitive Words + zh_CN: 检查敏感词 + type: boolean + required: true + default: false + - name: rate-limit + label: + en_US: Rate Limit + zh_CN: 速率限制 + config: + - name: window-length + label: + en_US: Window Length + zh_CN: 窗口长度(秒) + type: integer + required: true + default: 10 + - name: limitation + label: + en_US: Limitation + zh_CN: 限制次数 + type: integer + required: true + default: 60 diff --git a/templates/metadata/pipeline/trigger.yaml b/templates/metadata/pipeline/trigger.yaml new file mode 100644 index 00000000..c649469c --- /dev/null +++ b/templates/metadata/pipeline/trigger.yaml @@ -0,0 +1,128 @@ +name: trigger +label: + en_US: Trigger + zh_CN: 触发条件 +stages: + - name: group-respond-rules + label: + en_US: Group Respond Rule + zh_CN: 群响应规则 + description: + en_US: The group respond rule of the pipeline + zh_CN: 群响应规则 + config: + - name: at + label: + en_US: At + zh_CN: @ + description: + en_US: Whether to trigger when the message mentions the bot + zh_CN: 是否在消息@机器人时触发 + type: boolean + required: true + default: false + - name: prefix + label: + en_US: Prefix + zh_CN: 前缀 + description: + en_US: The prefix of the message + zh_CN: 消息前缀 + type: array + required: true + default: [] + items: + type: string + - name: regexp + label: + en_US: Regexp + zh_CN: 正则表达式 + description: + en_US: The regexp of the message + zh_CN: 消息正则表达式 + type: array + required: true + default: [] + items: + type: string + - name: random + label: + en_US: Random + zh_CN: 随机 + description: + en_US: The probability of the random response, range from 0.0 to 1.0 + zh_CN: 随机响应概率,范围为 0.0-1.0 + type: float + required: false + default: 0 + - name: access-control + label: + en_US: Access Control + zh_CN: 访问控制 + config: + - name: mode + label: + en_US: Mode + zh_CN: 模式 + description: + en_US: The mode of the access control + zh_CN: 访问控制模式 + type: select + required: true + default: blacklist + options: + - name: blacklist + label: + en_US: Blacklist + zh_CN: 黑名单 + - name: whitelist + label: + en_US: Whitelist + zh_CN: 白名单 + - name: blacklist + label: + en_US: Blacklist + zh_CN: 黑名单 + type: array + required: true + default: [] + items: + type: string + - name: whitelist + label: + en_US: Whitelist + zh_CN: 白名单 + type: array + required: true + default: [] + items: + type: string + - name: ignore-rules + label: + en_US: Ignore Rules + zh_CN: 消息忽略规则 + config: + - name: prefix + label: + en_US: Prefix + zh_CN: 前缀 + description: + en_US: The prefix of the message + zh_CN: 消息前缀 + type: array + required: true + default: [] + items: + type: string + - name: regexp + label: + en_US: Regexp + zh_CN: 正则表达式 + description: + en_US: The regexp of the message + zh_CN: 消息正则表达式 + type: array + required: true + default: [] + items: + type: string From 2c50ab025528b45a733def585e49084950f18aa4 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Wed, 26 Mar 2025 23:19:57 +0800 Subject: [PATCH 012/205] feat: pipeline model crud --- pkg/api/http/controller/groups/pipelines.py | 48 +++++++++++++++ pkg/api/http/controller/main.py | 2 +- pkg/api/http/service/pipeline.py | 65 +++++++++++++++++++++ pkg/core/app.py | 8 +++ pkg/core/bootutils/config.py | 1 + pkg/core/stages/build_app.py | 4 ++ pkg/core/stages/load_config.py | 5 ++ pkg/entity/persistence/pipeline.py | 32 ++++++++++ 8 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 pkg/api/http/controller/groups/pipelines.py create mode 100644 pkg/api/http/service/pipeline.py create mode 100644 pkg/entity/persistence/pipeline.py diff --git a/pkg/api/http/controller/groups/pipelines.py b/pkg/api/http/controller/groups/pipelines.py new file mode 100644 index 00000000..de077b66 --- /dev/null +++ b/pkg/api/http/controller/groups/pipelines.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +import quart + +from .. import group +from .....entity.persistence import pipeline + + +@group.group_class('pipelines', '/api/v1/pipelines') +class PipelinesRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + + @self.route('', methods=['GET', 'POST']) + async def _() -> str: + if quart.request.method == 'GET': + return self.success(data={ + 'pipelines': await self.ap.pipeline_service.get_pipelines() + }) + elif quart.request.method == 'POST': + json_data = await quart.request.json + + await self.ap.pipeline_service.create_pipeline(json_data) + + return self.success() + + @self.route('/_/metadata', methods=['GET']) + async def _() -> str: + return self.success(data={ + 'configs': await self.ap.pipeline_service.get_pipeline_metadata() + }) + + @self.route('/', methods=['GET', 'DELETE']) + async def _(pipeline_uuid: str) -> str: + if quart.request.method == 'GET': + pipeline = await self.ap.pipeline_service.get_pipeline(pipeline_uuid) + + if pipeline is None: + return self.http_status(404, -1, 'pipeline not found') + + return self.success(data={ + 'pipeline': pipeline + }) + elif quart.request.method == 'DELETE': + await self.ap.pipeline_service.delete_pipeline(pipeline_uuid) + + return self.success() + diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index 9aced3cf..0f110c89 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -8,7 +8,7 @@ import quart_cors from ....core import app, entities as core_entities -from .groups import logs, system, settings, plugins, stats, user +from .groups import logs, system, settings, plugins, stats, user, pipelines from .groups.provider import models, requesters from . import group diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py new file mode 100644 index 00000000..68cfb7ca --- /dev/null +++ b/pkg/api/http/service/pipeline.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import uuid +import datetime +import sqlalchemy + +from ....core import app +from ....pipeline import stagemgr +from ....entity.persistence import pipeline as persistence_pipeline + + +class PipelineService: + ap: app.Application + + def __init__(self, ap: app.Application) -> None: + self.ap = ap + + async def get_pipeline_metadata(self) -> dict: + return [ + self.ap.pipeline_config_meta_trigger.data, + self.ap.pipeline_config_meta_safety.data, + self.ap.pipeline_config_meta_ai.data, + self.ap.pipeline_config_meta_output.data + ] + + async def get_pipelines(self) -> list[dict]: + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_pipeline.LegacyPipeline) + ) + + pipelines = result.all() + return [ + self.ap.persistence_mgr.serialize_model(persistence_pipeline.LegacyPipeline, pipeline) + for pipeline in pipelines + ] + + async def get_pipeline(self, pipeline_uuid: str) -> dict | None: + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid) + ) + + pipeline = result.first() + + if pipeline is None: + return None + + return self.ap.persistence_mgr.serialize_model(persistence_pipeline.LegacyPipeline, pipeline) + + async def create_pipeline(self, pipeline_data: dict) -> None: + pipeline_data['uuid'] = str(uuid.uuid4()) + pipeline_data['for_version'] = self.ap.ver_mgr.get_current_version() + pipeline_data['stages'] = stagemgr.stage_order.copy() + + # TODO: 检查pipeline config是否完整 + + await self.ap.persistence_mgr.execute_async( + sqlalchemy.insert(persistence_pipeline.LegacyPipeline).values(**pipeline_data) + ) + # TODO: 更新到pipeline manager + + async def delete_pipeline(self, pipeline_uuid: str) -> None: + await self.ap.persistence_mgr.execute_async( + sqlalchemy.delete(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid) + ) + # TODO: 更新到pipeline manager diff --git a/pkg/core/app.py b/pkg/core/app.py index 9f359239..520d954f 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -26,6 +26,7 @@ from ..persistence import mgr as persistencemgr from ..api.http.controller import main as http_controller from ..api.http.service import user as user_service from ..api.http.service import model as model_service +from ..api.http.service import pipeline as pipeline_service from ..discover import engine as discover_engine from ..utils import logcache, ip from . import taskmgr @@ -83,6 +84,11 @@ class Application: instance_secret_meta: config_mgr.ConfigManager = None + pipeline_config_meta_trigger: config_mgr.ConfigManager = None + pipeline_config_meta_safety: config_mgr.ConfigManager = None + pipeline_config_meta_ai: config_mgr.ConfigManager = None + pipeline_config_meta_output: config_mgr.ConfigManager = None + # ========================= ctr_mgr: center_mgr.V2CenterAPI = None @@ -115,6 +121,8 @@ class Application: model_service: model_service.ModelsService = None + pipeline_service: pipeline_service.PipelineService = None + def __init__(self): pass diff --git a/pkg/core/bootutils/config.py b/pkg/core/bootutils/config.py index 940a6132..794c329a 100644 --- a/pkg/core/bootutils/config.py +++ b/pkg/core/bootutils/config.py @@ -8,3 +8,4 @@ from ...config.impls import pymodule load_python_module_config = config_mgr.load_python_module_config load_json_config = config_mgr.load_json_config +load_yaml_config = config_mgr.load_yaml_config \ No newline at end of file diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index 067044e5..5752d16d 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -19,6 +19,7 @@ from ...persistence import mgr as persistencemgr from ...api.http.controller import main as http_controller from ...api.http.service import user as user_service from ...api.http.service import model as model_service +from ...api.http.service import pipeline as pipeline_service from ...discover import engine as discover_engine from ...utils import logcache from .. import taskmgr @@ -127,5 +128,8 @@ class BuildAppStage(stage.BootingStage): model_service_inst = model_service.ModelsService(ap) ap.model_service = model_service_inst + pipeline_service_inst = pipeline_service.PipelineService(ap) + ap.pipeline_service = pipeline_service_inst + ctrl = controller.Controller(ap) ap.ctrl = ctrl diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index cc154a7c..9476240a 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -82,3 +82,8 @@ class LoadConfigStage(stage.BootingStage): 'jwt_secret': secrets.token_hex(16) }) await ap.instance_secret_meta.dump_config() + + ap.pipeline_config_meta_trigger = await config.load_yaml_config("templates/metadata/pipeline/trigger.yaml", "templates/metadata/pipeline/trigger.yaml") + ap.pipeline_config_meta_safety = await config.load_yaml_config("templates/metadata/pipeline/safety.yaml", "templates/metadata/pipeline/safety.yaml") + ap.pipeline_config_meta_ai = await config.load_yaml_config("templates/metadata/pipeline/ai.yaml", "templates/metadata/pipeline/ai.yaml") + ap.pipeline_config_meta_output = await config.load_yaml_config("templates/metadata/pipeline/output.yaml", "templates/metadata/pipeline/output.yaml") diff --git a/pkg/entity/persistence/pipeline.py b/pkg/entity/persistence/pipeline.py new file mode 100644 index 00000000..6d1b499d --- /dev/null +++ b/pkg/entity/persistence/pipeline.py @@ -0,0 +1,32 @@ +import sqlalchemy + +from .base import Base + + +class LegacyPipeline(Base): + """旧版流水线""" + __tablename__ = 'legacy_pipelines' + + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) + for_version = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + + stages = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) + config = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) + + +class PipelineRunRecord(Base): + """流水线运行记录""" + __tablename__ = 'pipeline_run_records' + + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + pipeline_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + status = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) + started_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) + finished_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False) + result = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) From 9c4ea2d09bf10a80ecab92355d3da4ad1754c499 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Wed, 26 Mar 2025 23:20:11 +0800 Subject: [PATCH 013/205] chore: typo in `trigger.yaml` --- templates/metadata/pipeline/trigger.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/metadata/pipeline/trigger.yaml b/templates/metadata/pipeline/trigger.yaml index c649469c..78759b11 100644 --- a/templates/metadata/pipeline/trigger.yaml +++ b/templates/metadata/pipeline/trigger.yaml @@ -14,7 +14,7 @@ stages: - name: at label: en_US: At - zh_CN: @ + zh_CN: '@' description: en_US: Whether to trigger when the message mentions the bot zh_CN: 是否在消息@机器人时触发 From d8c730341a49c5dbd55891ec147378e35cf1ff44 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 27 Mar 2025 00:33:54 +0800 Subject: [PATCH 014/205] perf: standardize integer in config field schema --- pkg/platform/sources/aiocqhttp.yaml | 2 +- pkg/platform/sources/gewechat.yaml | 2 +- pkg/platform/sources/lark.yaml | 2 +- pkg/platform/sources/nakuru.yaml | 4 ++-- pkg/platform/sources/officialaccount.yaml | 2 +- pkg/platform/sources/qqofficial.yaml | 2 +- pkg/platform/sources/wecom.yaml | 2 +- pkg/provider/modelmgr/requesters/anthropicmsgs.yaml | 2 +- pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/chatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/ollamachat.yaml | 2 +- pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/xaichatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/pkg/platform/sources/aiocqhttp.yaml b/pkg/platform/sources/aiocqhttp.yaml index a2c230a7..19876ffd 100644 --- a/pkg/platform/sources/aiocqhttp.yaml +++ b/pkg/platform/sources/aiocqhttp.yaml @@ -21,7 +21,7 @@ spec: label: en_US: Port zh_CN: 端口 - type: int + type: integer required: true default: 2280 - name: access-token diff --git a/pkg/platform/sources/gewechat.yaml b/pkg/platform/sources/gewechat.yaml index 01967ffc..24131a99 100644 --- a/pkg/platform/sources/gewechat.yaml +++ b/pkg/platform/sources/gewechat.yaml @@ -28,7 +28,7 @@ spec: label: en_US: Port zh_CN: 端口 - type: int + type: integer required: true default: 2286 - name: callback_url diff --git a/pkg/platform/sources/lark.yaml b/pkg/platform/sources/lark.yaml index 6170e367..3b369670 100644 --- a/pkg/platform/sources/lark.yaml +++ b/pkg/platform/sources/lark.yaml @@ -42,7 +42,7 @@ spec: label: en_US: Webhook Port zh_CN: Webhook端口 - type: int + type: integer required: true default: 2285 - name: encrypt-key diff --git a/pkg/platform/sources/nakuru.yaml b/pkg/platform/sources/nakuru.yaml index b64e191b..19bcb1ba 100644 --- a/pkg/platform/sources/nakuru.yaml +++ b/pkg/platform/sources/nakuru.yaml @@ -21,14 +21,14 @@ spec: label: en_US: HTTP Port zh_CN: HTTP端口 - type: int + type: integer required: true default: 5700 - name: ws_port label: en_US: WebSocket Port zh_CN: WebSocket端口 - type: int + type: integer required: true default: 8080 - name: token diff --git a/pkg/platform/sources/officialaccount.yaml b/pkg/platform/sources/officialaccount.yaml index dbd84a77..c379df13 100644 --- a/pkg/platform/sources/officialaccount.yaml +++ b/pkg/platform/sources/officialaccount.yaml @@ -49,7 +49,7 @@ spec: label: en_US: Port zh_CN: 监听端口 - type: int + type: integer required: true default: 2287 execution: diff --git a/pkg/platform/sources/qqofficial.yaml b/pkg/platform/sources/qqofficial.yaml index 4d7430ea..1c9a6956 100644 --- a/pkg/platform/sources/qqofficial.yaml +++ b/pkg/platform/sources/qqofficial.yaml @@ -28,7 +28,7 @@ spec: label: en_US: Port zh_CN: 监听端口 - type: int + type: integer required: true default: 2284 - name: token diff --git a/pkg/platform/sources/wecom.yaml b/pkg/platform/sources/wecom.yaml index 6b6c26eb..89fd1b57 100644 --- a/pkg/platform/sources/wecom.yaml +++ b/pkg/platform/sources/wecom.yaml @@ -21,7 +21,7 @@ spec: label: en_US: Port zh_CN: 监听端口 - type: int + type: integer required: true default: 2290 - name: corpid diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml index fe3b335c..80380857 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml index 0851b561..74d197ca 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.yaml b/pkg/provider/modelmgr/requesters/chatcmpl.yaml index 2e326efb..fe4d3cb5 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/chatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml index 7563c176..2ef91aa2 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml index 828f45c1..11f7e06e 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml index 52a3018f..959d4151 100644 --- a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml index df2a5979..56deb1df 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/ollamachat.yaml b/pkg/provider/modelmgr/requesters/ollamachat.yaml index 0c34d938..b162e5db 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.yaml +++ b/pkg/provider/modelmgr/requesters/ollamachat.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml index 4dec12ff..28d534f6 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml index 02842fce..f18c7b2c 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml index 16a509c1..ceda8c0d 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml index 19f1a715..3d112ca1 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml @@ -18,7 +18,7 @@ spec: label: en_US: Timeout zh_CN: 超时时间 - type: int + type: integer required: true default: 120 execution: From 6c1ee922def7d1384224f545760a0cf803aeffcd Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 27 Mar 2025 00:47:54 +0800 Subject: [PATCH 015/205] feat(pipeline): api for updating pipeline --- pkg/api/http/controller/groups/pipelines.py | 8 +++++++- pkg/api/http/service/pipeline.py | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/api/http/controller/groups/pipelines.py b/pkg/api/http/controller/groups/pipelines.py index de077b66..deaf1ee6 100644 --- a/pkg/api/http/controller/groups/pipelines.py +++ b/pkg/api/http/controller/groups/pipelines.py @@ -30,7 +30,7 @@ class PipelinesRouterGroup(group.RouterGroup): 'configs': await self.ap.pipeline_service.get_pipeline_metadata() }) - @self.route('/', methods=['GET', 'DELETE']) + @self.route('/', methods=['GET', 'PUT', 'DELETE']) async def _(pipeline_uuid: str) -> str: if quart.request.method == 'GET': pipeline = await self.ap.pipeline_service.get_pipeline(pipeline_uuid) @@ -41,6 +41,12 @@ class PipelinesRouterGroup(group.RouterGroup): return self.success(data={ 'pipeline': pipeline }) + elif quart.request.method == 'PUT': + json_data = await quart.request.json + + await self.ap.pipeline_service.update_pipeline(pipeline_uuid, json_data) + + return self.success() elif quart.request.method == 'DELETE': await self.ap.pipeline_service.delete_pipeline(pipeline_uuid) diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py index 68cfb7ca..2e226fb1 100644 --- a/pkg/api/http/service/pipeline.py +++ b/pkg/api/http/service/pipeline.py @@ -58,6 +58,15 @@ class PipelineService: ) # TODO: 更新到pipeline manager + async def update_pipeline(self, pipeline_uuid: str, pipeline_data: dict) -> None: + del pipeline_data['uuid'] + del pipeline_data['for_version'] + del pipeline_data['stages'] + await self.ap.persistence_mgr.execute_async( + sqlalchemy.update(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid).values(**pipeline_data) + ) + # TODO: 更新到pipeline manager + async def delete_pipeline(self, pipeline_uuid: str) -> None: await self.ap.persistence_mgr.execute_async( sqlalchemy.delete(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid) From 5be17c55d28c21cb4bf0f1cee56a4d5154ab387d Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 27 Mar 2025 01:20:00 +0800 Subject: [PATCH 016/205] feat: crud of platform/bots --- pkg/api/http/controller/groups/pipelines.py | 6 +- .../controller/groups/platform/__init__.py | 0 .../controller/groups/platform/adapters.py | 25 +++++++ .../http/controller/groups/platform/bots.py | 38 ++++++++++ .../http/controller/groups/provider/models.py | 6 +- pkg/api/http/controller/main.py | 1 + pkg/api/http/service/bot.py | 70 +++++++++++++++++++ pkg/api/http/service/model.py | 7 +- pkg/api/http/service/pipeline.py | 4 +- pkg/core/app.py | 3 + pkg/core/stages/build_app.py | 4 ++ pkg/entity/persistence/bot.py | 17 +++++ pkg/persistence/mgr.py | 2 +- pkg/platform/manager.py | 12 ++++ 14 files changed, 188 insertions(+), 7 deletions(-) create mode 100644 pkg/api/http/controller/groups/platform/__init__.py create mode 100644 pkg/api/http/controller/groups/platform/adapters.py create mode 100644 pkg/api/http/controller/groups/platform/bots.py create mode 100644 pkg/api/http/service/bot.py create mode 100644 pkg/entity/persistence/bot.py diff --git a/pkg/api/http/controller/groups/pipelines.py b/pkg/api/http/controller/groups/pipelines.py index deaf1ee6..400da593 100644 --- a/pkg/api/http/controller/groups/pipelines.py +++ b/pkg/api/http/controller/groups/pipelines.py @@ -20,9 +20,11 @@ class PipelinesRouterGroup(group.RouterGroup): elif quart.request.method == 'POST': json_data = await quart.request.json - await self.ap.pipeline_service.create_pipeline(json_data) + pipeline_uuid = await self.ap.pipeline_service.create_pipeline(json_data) - return self.success() + return self.success(data={ + 'uuid': pipeline_uuid + }) @self.route('/_/metadata', methods=['GET']) async def _() -> str: diff --git a/pkg/api/http/controller/groups/platform/__init__.py b/pkg/api/http/controller/groups/platform/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/api/http/controller/groups/platform/adapters.py b/pkg/api/http/controller/groups/platform/adapters.py new file mode 100644 index 00000000..de5a1eae --- /dev/null +++ b/pkg/api/http/controller/groups/platform/adapters.py @@ -0,0 +1,25 @@ +import quart + +from ... import group + + +@group.group_class('adapters', '/api/v1/platform/adapters') +class AdaptersRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('', methods=['GET']) + async def _() -> str: + return self.success(data={ + 'adapters': self.ap.platform_mgr.get_available_adapters_info() + }) + + @self.route('/', methods=['GET']) + async def _(adapter_name: str) -> str: + adapter_info = self.ap.platform_mgr.get_available_adapter_info_by_name(adapter_name) + + if adapter_info is None: + return self.http_status(404, -1, 'adapter not found') + + return self.success(data={ + 'adapter': adapter_info + }) diff --git a/pkg/api/http/controller/groups/platform/bots.py b/pkg/api/http/controller/groups/platform/bots.py new file mode 100644 index 00000000..fe20aa53 --- /dev/null +++ b/pkg/api/http/controller/groups/platform/bots.py @@ -0,0 +1,38 @@ +import quart + +from ... import group + + +@group.group_class('bots', '/api/v1/platform/bots') +class BotsRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('', methods=['GET', 'POST']) + async def _() -> str: + if quart.request.method == 'GET': + return self.success(data={ + 'bots': await self.ap.bot_service.get_bots() + }) + elif quart.request.method == 'POST': + json_data = await quart.request.json + bot_uuid = await self.ap.bot_service.create_bot(json_data) + return self.success(data={ + 'uuid': bot_uuid + }) + + @self.route('/', methods=['GET', 'PUT', 'DELETE']) + async def _(bot_uuid: str) -> str: + if quart.request.method == 'GET': + bot = await self.ap.bot_service.get_bot(bot_uuid) + if bot is None: + return self.http_status(404, -1, 'bot not found') + return self.success(data={ + 'bot': bot + }) + elif quart.request.method == 'PUT': + json_data = await quart.request.json + await self.ap.bot_service.update_bot(bot_uuid, json_data) + return self.success() + elif quart.request.method == 'DELETE': + await self.ap.bot_service.delete_bot(bot_uuid) + return self.success() \ No newline at end of file diff --git a/pkg/api/http/controller/groups/provider/models.py b/pkg/api/http/controller/groups/provider/models.py index ab91ab6a..81e9078b 100644 --- a/pkg/api/http/controller/groups/provider/models.py +++ b/pkg/api/http/controller/groups/provider/models.py @@ -18,9 +18,11 @@ class LLMModelsRouterGroup(group.RouterGroup): elif quart.request.method == 'POST': json_data = await quart.request.json - await self.ap.model_service.create_llm_model(json_data) + model_uuid = await self.ap.model_service.create_llm_model(json_data) - return self.success() + return self.success(data={ + 'uuid': model_uuid + }) @self.route('/', methods=['GET', 'DELETE']) async def _(model_uuid: str) -> str: diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index 0f110c89..7e973b98 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -10,6 +10,7 @@ from ....core import app, entities as core_entities from .groups import logs, system, settings, plugins, stats, user, pipelines from .groups.provider import models, requesters +from .groups.platform import bots, adapters from . import group diff --git a/pkg/api/http/service/bot.py b/pkg/api/http/service/bot.py new file mode 100644 index 00000000..b8c0a46b --- /dev/null +++ b/pkg/api/http/service/bot.py @@ -0,0 +1,70 @@ +from __future__ import annotations + +import uuid +import datetime +import sqlalchemy + +from ....core import app +from ....entity.persistence import bot as persistence_bot + + +class BotService: + """机器人服务""" + + ap: app.Application + + def __init__(self, ap: app.Application) -> None: + self.ap = ap + + async def get_bots(self) -> list[dict]: + """获取所有机器人""" + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_bot.Bot) + ) + + bots = result.all() + + return [ + self.ap.persistence_mgr.serialize_model(persistence_bot.Bot, bot) + for bot in bots + ] + + async def get_bot(self, bot_uuid: str) -> dict | None: + """获取机器人""" + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_bot.Bot).where(persistence_bot.Bot.uuid == bot_uuid) + ) + + bot = result.first() + + if bot is None: + return None + + return self.ap.persistence_mgr.serialize_model(persistence_bot.Bot, bot) + + async def create_bot(self, bot_data: dict) -> str: + """创建机器人""" + bot_data['uuid'] = str(uuid.uuid4()) + await self.ap.persistence_mgr.execute_async( + sqlalchemy.insert(persistence_bot.Bot).values(bot_data) + ) + # TODO: 加载机器人到机器人管理器 + return bot_data['uuid'] + + async def update_bot(self, bot_uuid: str, bot_data: dict) -> None: + """更新机器人""" + if 'uuid' in bot_data: + del bot_data['uuid'] + await self.ap.persistence_mgr.execute_async( + sqlalchemy.update(persistence_bot.Bot).values(bot_data).where(persistence_bot.Bot.uuid == bot_uuid) + ) + # TODO: 加载机器人到机器人管理器 + + async def delete_bot(self, bot_uuid: str) -> None: + """删除机器人""" + await self.ap.persistence_mgr.execute_async( + sqlalchemy.delete(persistence_bot.Bot).where(persistence_bot.Bot.uuid == bot_uuid) + ) + # TODO: 从机器人管理器中删除机器人 + + diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py index 7ded6cd1..e96f014a 100644 --- a/pkg/api/http/service/model.py +++ b/pkg/api/http/service/model.py @@ -26,7 +26,7 @@ class ModelsService: for model in models ] - async def create_llm_model(self, model_data: dict) -> None: + async def create_llm_model(self, model_data: dict) -> str: model_data['uuid'] = str(uuid.uuid4()) @@ -37,6 +37,8 @@ class ModelsService: ) await self.ap.model_mgr.load_llm_model(model_data) + return model_data['uuid'] + async def get_llm_model(self, model_uuid: str) -> dict | None: result = await self.ap.persistence_mgr.execute_async( sqlalchemy.select(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid) @@ -50,6 +52,9 @@ class ModelsService: return self.ap.persistence_mgr.serialize_model(persistence_model.LLMModel, model) async def update_llm_model(self, model_uuid: str, model_data: dict) -> None: + if 'uuid' in model_data: + del model_data['uuid'] + await self.ap.persistence_mgr.execute_async( sqlalchemy.update(persistence_model.LLMModel).where(persistence_model.LLMModel.uuid == model_uuid).values(**model_data) ) diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py index 2e226fb1..22f9f4a9 100644 --- a/pkg/api/http/service/pipeline.py +++ b/pkg/api/http/service/pipeline.py @@ -46,7 +46,7 @@ class PipelineService: return self.ap.persistence_mgr.serialize_model(persistence_pipeline.LegacyPipeline, pipeline) - async def create_pipeline(self, pipeline_data: dict) -> None: + async def create_pipeline(self, pipeline_data: dict) -> str: pipeline_data['uuid'] = str(uuid.uuid4()) pipeline_data['for_version'] = self.ap.ver_mgr.get_current_version() pipeline_data['stages'] = stagemgr.stage_order.copy() @@ -58,6 +58,8 @@ class PipelineService: ) # TODO: 更新到pipeline manager + return pipeline_data['uuid'] + async def update_pipeline(self, pipeline_uuid: str, pipeline_data: dict) -> None: del pipeline_data['uuid'] del pipeline_data['for_version'] diff --git a/pkg/core/app.py b/pkg/core/app.py index 520d954f..f0884d81 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -27,6 +27,7 @@ from ..api.http.controller import main as http_controller from ..api.http.service import user as user_service from ..api.http.service import model as model_service from ..api.http.service import pipeline as pipeline_service +from ..api.http.service import bot as bot_service from ..discover import engine as discover_engine from ..utils import logcache, ip from . import taskmgr @@ -123,6 +124,8 @@ class Application: pipeline_service: pipeline_service.PipelineService = None + bot_service: bot_service.BotService = None + def __init__(self): pass diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index 5752d16d..3873d719 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -20,6 +20,7 @@ from ...api.http.controller import main as http_controller from ...api.http.service import user as user_service from ...api.http.service import model as model_service from ...api.http.service import pipeline as pipeline_service +from ...api.http.service import bot as bot_service from ...discover import engine as discover_engine from ...utils import logcache from .. import taskmgr @@ -131,5 +132,8 @@ class BuildAppStage(stage.BootingStage): pipeline_service_inst = pipeline_service.PipelineService(ap) ap.pipeline_service = pipeline_service_inst + bot_service_inst = bot_service.BotService(ap) + ap.bot_service = bot_service_inst + ctrl = controller.Controller(ap) ap.ctrl = ctrl diff --git a/pkg/entity/persistence/bot.py b/pkg/entity/persistence/bot.py new file mode 100644 index 00000000..355e1208 --- /dev/null +++ b/pkg/entity/persistence/bot.py @@ -0,0 +1,17 @@ +import sqlalchemy + +from .base import Base + + +class Bot(Base): + """机器人""" + __tablename__ = 'bots' + + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + adapter = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) + adapter_config = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) + enable = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 67b618e7..2892c52b 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -8,7 +8,7 @@ import sqlalchemy.ext.asyncio as sqlalchemy_asyncio import sqlalchemy from . import database -from ..entity.persistence import user, model, base +from ..entity.persistence import base, user, model, pipeline, bot from ..core import app from .databases import sqlite diff --git a/pkg/platform/manager.py b/pkg/platform/manager.py index acdf0990..d5ee7564 100644 --- a/pkg/platform/manager.py +++ b/pkg/platform/manager.py @@ -110,6 +110,18 @@ class PlatformManager: if len(self.adapters) == 0: self.ap.logger.warning('未运行平台适配器,请根据文档配置并启用平台适配器。') + def get_available_adapters_info(self) -> list[dict]: + return [ + component.to_plain_dict() + for component in self.message_platform_adapter_components + ] + + def get_available_adapter_info_by_name(self, name: str) -> dict | None: + for component in self.message_platform_adapter_components: + if component.metadata.name == name: + return component.to_plain_dict() + return None + async def write_back_config(self, adapter_name: str, adapter_inst: msadapter.MessagePlatformAdapter, config: dict): index = -2 From 5379e4cf27b61aa43759f4a5a72c9eb2fdcebb65 Mon Sep 17 00:00:00 2001 From: "Junyan Qin (Chin)" Date: Thu, 27 Mar 2025 23:50:02 +0800 Subject: [PATCH 017/205] feat: binding bots with runtime (#1238) --- pkg/api/http/service/bot.py | 19 +++- pkg/api/http/service/model.py | 10 +- pkg/platform/manager.py | 203 ++++++++++++++++++++++------------ 3 files changed, 158 insertions(+), 74 deletions(-) diff --git a/pkg/api/http/service/bot.py b/pkg/api/http/service/bot.py index b8c0a46b..fcd81fcb 100644 --- a/pkg/api/http/service/bot.py +++ b/pkg/api/http/service/bot.py @@ -44,11 +44,16 @@ class BotService: async def create_bot(self, bot_data: dict) -> str: """创建机器人""" + # TODO: 检查配置信息格式 bot_data['uuid'] = str(uuid.uuid4()) await self.ap.persistence_mgr.execute_async( sqlalchemy.insert(persistence_bot.Bot).values(bot_data) ) - # TODO: 加载机器人到机器人管理器 + + bot = await self.get_bot(bot_data['uuid']) + + await self.ap.platform_mgr.load_bot(bot) + return bot_data['uuid'] async def update_bot(self, bot_uuid: str, bot_data: dict) -> None: @@ -58,13 +63,21 @@ class BotService: await self.ap.persistence_mgr.execute_async( sqlalchemy.update(persistence_bot.Bot).values(bot_data).where(persistence_bot.Bot.uuid == bot_uuid) ) - # TODO: 加载机器人到机器人管理器 + await self.ap.platform_mgr.remove_bot(bot_uuid) + + # select from db + bot = await self.get_bot(bot_uuid) + + runtime_bot = await self.ap.platform_mgr.load_bot(bot) + + if runtime_bot.enable: + await runtime_bot.run() async def delete_bot(self, bot_uuid: str) -> None: """删除机器人""" + await self.ap.platform_mgr.remove_bot(bot_uuid) await self.ap.persistence_mgr.execute_async( sqlalchemy.delete(persistence_bot.Bot).where(persistence_bot.Bot.uuid == bot_uuid) ) - # TODO: 从机器人管理器中删除机器人 diff --git a/pkg/api/http/service/model.py b/pkg/api/http/service/model.py index e96f014a..f6d8cde1 100644 --- a/pkg/api/http/service/model.py +++ b/pkg/api/http/service/model.py @@ -35,7 +35,10 @@ class ModelsService: **model_data ) ) - await self.ap.model_mgr.load_llm_model(model_data) + + llm_model = await self.get_llm_model(model_data['uuid']) + + await self.ap.model_mgr.load_llm_model(llm_model) return model_data['uuid'] @@ -60,7 +63,10 @@ class ModelsService: ) await self.ap.model_mgr.remove_llm_model(model_uuid) - await self.ap.model_mgr.load_llm_model(model_data) + + llm_model = await self.get_llm_model(model_uuid) + + await self.ap.model_mgr.load_llm_model(llm_model) async def delete_llm_model(self, model_uuid: str) -> None: await self.ap.persistence_mgr.execute_async( diff --git a/pkg/platform/manager.py b/pkg/platform/manager.py index d5ee7564..210ee9ad 100644 --- a/pkg/platform/manager.py +++ b/pkg/platform/manager.py @@ -6,13 +6,14 @@ import sys import logging import asyncio import traceback +import sqlalchemy from .sources import qqofficial # FriendMessage, Image, MessageChain, Plain from ..platform import adapter as msadapter -from ..core import app, entities as core_entities +from ..core import app, entities as core_entities, taskmgr from ..plugin import events from .types import message as platform_message from .types import events as platform_events @@ -20,11 +21,64 @@ from .types import entities as platform_entities from ..discover import engine +from ..entity.persistence import bot as persistence_bot + # 处理 3.4 移除了 YiriMirai 之后,插件的兼容性问题 from . import types as mirai sys.modules['mirai'] = mirai +class RuntimeBot: + """运行时机器人""" + + ap: app.Application + + bot_entity: persistence_bot.Bot + + enable: bool + + adapter: msadapter.MessagePlatformAdapter + + task_wrapper: taskmgr.TaskWrapper + + task_context: taskmgr.TaskContext + + def __init__(self, ap: app.Application, bot_entity: persistence_bot.Bot, adapter: msadapter.MessagePlatformAdapter): + self.ap = ap + self.bot_entity = bot_entity + self.enable = bot_entity.enable + self.adapter = adapter + self.task_context = taskmgr.TaskContext() + + async def run(self): + + async def exception_wrapper(): + try: + self.task_context.set_current_action('Running...') + await self.adapter.run_async() + self.task_context.set_current_action('Exited.') + except Exception as e: + if isinstance(e, asyncio.CancelledError): + self.task_context.set_current_action('Exited.') + return + self.task_context.set_current_action('Exited with error.') + self.task_context.log(f'平台适配器运行出错: {e}') + self.task_context.log(f"Traceback: {traceback.format_exc()}") + self.ap.logger.error(f'平台适配器运行出错: {e}') + self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") + + self.task_wrapper = self.ap.task_mgr.create_task( + exception_wrapper(), + kind="platform-adapter", + name=f"platform-adapter-{self.adapter.__class__.__name__}", + context=self.task_context, + scopes=[core_entities.LifecycleControlScope.APPLICATION, core_entities.LifecycleControlScope.PLATFORM] + ) + + async def shutdown(self): + await self.adapter.kill() + + # 控制QQ消息输入输出的类 class PlatformManager: @@ -33,22 +87,55 @@ class PlatformManager: message_platform_adapter_components: list[engine.Component] = [] - # modern + # ====== 4.0 ====== ap: app.Application = None + bots: list[RuntimeBot] + + adapter_components: list[engine.Component] + + adapter_dict: dict[str, type[msadapter.MessagePlatformAdapter]] + def __init__(self, ap: app.Application = None): self.ap = ap self.adapters = [] + self.bots = [] + self.adapter_components = [] + self.adapter_dict = {} async def initialize(self): - components = self.ap.discover.get_components_by_kind('MessagePlatformAdapter') + self.adapter_components = self.ap.discover.get_components_by_kind('MessagePlatformAdapter') + adapter_dict: dict[str, type[msadapter.MessagePlatformAdapter]] = {} + for component in self.adapter_components: + adapter_dict[component.metadata.name] = component.get_python_component_class() + self.adapter_dict = adapter_dict - self.message_platform_adapter_components = components + await self.load_bots_from_db() - # from .sources import nakuru, aiocqhttp, qqbotpy, qqofficial, wecom, lark, discord, gewechat, officialaccount, telegram, dingtalk + async def load_bots_from_db(self): + self.ap.logger.info('Loading bots from db...') + self.bots = [] + + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_bot.Bot) + ) + + bots = result.all() + + for bot in bots: + # load all bots here, enable or disable will be handled in runtime + await self.load_bot(bot) + + async def load_bot(self, bot_entity: persistence_bot.Bot | sqlalchemy.Row[persistence_bot.Bot] | dict) -> RuntimeBot: + """加载机器人""" + if isinstance(bot_entity, sqlalchemy.Row): + bot_entity = persistence_bot.Bot(**bot_entity._mapping) + elif isinstance(bot_entity, dict): + bot_entity = persistence_bot.Bot(**bot_entity) + async def on_friend_message(event: platform_events.FriendMessage, adapter: msadapter.MessagePlatformAdapter): await self.ap.query_pool.add_query( @@ -70,45 +157,44 @@ class PlatformManager: message_chain=event.message_chain, adapter=adapter ) - - index = 0 - for adap_cfg in self.ap.platform_cfg.data['platform-adapters']: - if adap_cfg['enable']: - self.ap.logger.info(f'初始化平台适配器 {index}: {adap_cfg["adapter"]}') - index += 1 - cfg_copy = adap_cfg.copy() - del cfg_copy['enable'] - adapter_name = cfg_copy['adapter'] - del cfg_copy['adapter'] + adapter_inst = self.adapter_dict[bot_entity.adapter]( + bot_entity.adapter_config, + self.ap + ) - found = False + adapter_inst.register_listener( + platform_events.FriendMessage, + on_friend_message + ) + adapter_inst.register_listener( + platform_events.GroupMessage, + on_group_message + ) - for adapter in self.message_platform_adapter_components: - if adapter.metadata.name == adapter_name: - found = True - adapter_cls = adapter.get_python_component_class() - - adapter_inst = adapter_cls( - cfg_copy, - self.ap - ) - self.adapters.append(adapter_inst) + runtime_bot = RuntimeBot( + ap=self.ap, + bot_entity=bot_entity, + adapter=adapter_inst + ) - adapter_inst.register_listener( - platform_events.FriendMessage, - on_friend_message - ) - adapter_inst.register_listener( - platform_events.GroupMessage, - on_group_message - ) - - if not found: - raise Exception('platform.json 中启用了未知的平台适配器: ' + adapter_name) - - if len(self.adapters) == 0: - self.ap.logger.warning('未运行平台适配器,请根据文档配置并启用平台适配器。') + self.bots.append(runtime_bot) + + return runtime_bot + + async def get_bot_by_uuid(self, bot_uuid: str) -> RuntimeBot | None: + for bot in self.bots: + if bot.bot_entity.uuid == bot_uuid: + return bot + return None + + async def remove_bot(self, bot_uuid: str): + for bot in self.bots: + if bot.bot_entity.uuid == bot_uuid: + if bot.enable: + await bot.shutdown() + self.bots.remove(bot) + return def get_available_adapters_info(self) -> list[dict]: return [ @@ -168,35 +254,14 @@ class PlatformManager: quote_origin=True if self.ap.platform_cfg.data['quote-origin'] else False ) - async def run(self): - try: - tasks = [] - for adapter in self.adapters: - async def exception_wrapper(adapter: msadapter.MessagePlatformAdapter): - try: - await adapter.run_async() - except Exception as e: - if isinstance(e, asyncio.CancelledError): - return - self.ap.logger.error('平台适配器运行出错: ' + str(e)) - self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") + async def run(self): + # This method will only be called when the application launching + for bot in self.bots: + if bot.enable: + await bot.run() - tasks.append(exception_wrapper(adapter)) - - - for task in tasks: - self.ap.task_mgr.create_task( - task, - kind="platform-adapter", - name=f"platform-adapter-{adapter.__class__.__name__}", - scopes=[core_entities.LifecycleControlScope.APPLICATION, core_entities.LifecycleControlScope.PLATFORM], - ) - - except Exception as e: - self.ap.logger.error('平台适配器运行出错: ' + str(e)) - self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") - async def shutdown(self): - for adapter in self.adapters: - await adapter.kill() + for bot in self.bots: + if bot.enable: + await bot.shutdown() self.ap.task_mgr.cancel_by_scope(core_entities.LifecycleControlScope.PLATFORM) \ No newline at end of file From 7cd03b02435f75f18f9402ed0b9430688bc67da2 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Fri, 28 Mar 2025 15:55:03 +0800 Subject: [PATCH 018/205] feat: bind pipeline with runtime manager --- pkg/api/http/service/pipeline.py | 14 ++++- pkg/core/app.py | 4 +- pkg/core/stages/build_app.py | 6 +- pkg/pipeline/pipelinemgr.py | 93 +++++++++++++++++++++++++++++++ pkg/pipeline/stage.py | 4 +- pkg/pipeline/stagemgr.py | 2 +- pkg/provider/modelmgr/modelmgr.py | 6 +- 7 files changed, 119 insertions(+), 10 deletions(-) create mode 100644 pkg/pipeline/pipelinemgr.py diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py index 22f9f4a9..7920c4c9 100644 --- a/pkg/api/http/service/pipeline.py +++ b/pkg/api/http/service/pipeline.py @@ -56,7 +56,10 @@ class PipelineService: await self.ap.persistence_mgr.execute_async( sqlalchemy.insert(persistence_pipeline.LegacyPipeline).values(**pipeline_data) ) - # TODO: 更新到pipeline manager + + pipeline = await self.get_pipeline(pipeline_data['uuid']) + + await self.ap.pipeline_mgr.load_pipeline(pipeline) return pipeline_data['uuid'] @@ -67,10 +70,15 @@ class PipelineService: await self.ap.persistence_mgr.execute_async( sqlalchemy.update(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid).values(**pipeline_data) ) - # TODO: 更新到pipeline manager + + await self.ap.pipeline_mgr.remove_pipeline(pipeline_uuid) + + pipeline = await self.get_pipeline(pipeline_uuid) + + await self.ap.pipeline_mgr.load_pipeline(pipeline) async def delete_pipeline(self, pipeline_uuid: str) -> None: await self.ap.persistence_mgr.execute_async( sqlalchemy.delete(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid) ) - # TODO: 更新到pipeline manager + await self.ap.pipeline_mgr.remove_pipeline(pipeline_uuid) diff --git a/pkg/core/app.py b/pkg/core/app.py index f0884d81..0191cc02 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -20,7 +20,7 @@ from ..audit.center import v2 as center_mgr from ..command import cmdmgr from ..plugin import manager as plugin_mgr from ..pipeline import pool -from ..pipeline import controller, stagemgr +from ..pipeline import controller, stagemgr, pipelinemgr from ..utils import version as version_mgr, proxy as proxy_mgr, announce as announce_mgr from ..persistence import mgr as persistencemgr from ..api.http.controller import main as http_controller @@ -102,6 +102,8 @@ class Application: stage_mgr: stagemgr.StageManager = None + pipeline_mgr: pipelinemgr.PipelineManager = None + ver_mgr: version_mgr.VersionManager = None ann_mgr: announce_mgr.AnnouncementManager = None diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index 3873d719..0bd0d8a5 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -6,7 +6,7 @@ from .. import stage, app from ...utils import version, proxy, announce, platform from ...audit.center import v2 as center_v2 from ...audit import identifier -from ...pipeline import pool, controller, stagemgr +from ...pipeline import pool, controller, stagemgr, pipelinemgr from ...plugin import manager as plugin_mgr from ...command import cmdmgr from ...provider.session import sessionmgr as llm_session_mgr @@ -119,6 +119,10 @@ class BuildAppStage(stage.BootingStage): await stage_mgr.initialize() ap.stage_mgr = stage_mgr + pipeline_mgr = pipelinemgr.PipelineManager(ap) + await pipeline_mgr.initialize() + ap.pipeline_mgr = pipeline_mgr + http_ctrl = http_controller.HTTPController(ap) await http_ctrl.initialize() ap.http_ctrl = http_ctrl diff --git a/pkg/pipeline/pipelinemgr.py b/pkg/pipeline/pipelinemgr.py new file mode 100644 index 00000000..a805e5cd --- /dev/null +++ b/pkg/pipeline/pipelinemgr.py @@ -0,0 +1,93 @@ +from __future__ import annotations + +import typing + +import sqlalchemy + +from ..core import app, entities +from ..entity.persistence import pipeline as persistence_pipeline +from . import stagemgr, stage + + +class RuntimePipeline: + """运行时流水线""" + + ap: app.Application + + pipeline_entity: persistence_pipeline.LegacyPipeline + """流水线实体""" + + stage_containers: list[stagemgr.StageInstContainer] + """阶段实例容器""" + + def __init__(self, ap: app.Application, pipeline_entity: persistence_pipeline.LegacyPipeline, stage_containers: list[stagemgr.StageInstContainer]): + self.ap = ap + self.pipeline_entity = pipeline_entity + self.stage_containers = stage_containers + + async def run(self): + pass + + +class PipelineManager: + """流水线管理器""" + + # ====== 4.0 ====== + + ap: app.Application + + pipelines: list[RuntimePipeline] + + stage_dict: dict[str, type[stage.PipelineStage]] + + def __init__(self, ap: app.Application): + self.ap = ap + self.pipelines = [] + + async def initialize(self): + self.stage_dict = {name: cls for name, cls in stage.preregistered_stages.items()} + + await self.load_pipelines_from_db() + + async def load_pipelines_from_db(self): + self.ap.logger.info('Loading pipelines from db...') + + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_pipeline.LegacyPipeline) + ) + + pipelines = result.all() + + # load pipelines + for pipeline in pipelines: + await self.load_pipeline(pipeline) + + async def load_pipeline(self, pipeline_entity: persistence_pipeline.LegacyPipeline | sqlalchemy.Row[persistence_pipeline.LegacyPipeline] | dict): + + if isinstance(pipeline_entity, sqlalchemy.Row): + pipeline_entity = persistence_pipeline.LegacyPipeline(**pipeline_entity._mapping) + elif isinstance(pipeline_entity, dict): + pipeline_entity = persistence_pipeline.LegacyPipeline(**pipeline_entity) + + # initialize stage containers according to pipeline_entity.stages + stage_containers = [] + for stage_name in pipeline_entity.stages: + stage_containers.append(stagemgr.StageInstContainer( + stage_name=stage_name, + stage_class=self.stage_dict[stage_name] + )) + + runtime_pipeline = RuntimePipeline(self.ap, pipeline_entity, stage_containers) + self.pipelines.append(runtime_pipeline) + + async def get_pipeline_by_uuid(self, uuid: str) -> RuntimePipeline | None: + for pipeline in self.pipelines: + if pipeline.pipeline_entity.uuid == uuid: + return pipeline + return None + + async def remove_pipeline(self, uuid: str): + for pipeline in self.pipelines: + if pipeline.pipeline_entity.uuid == uuid: + self.pipelines.remove(pipeline) + return \ No newline at end of file diff --git a/pkg/pipeline/stage.py b/pkg/pipeline/stage.py index 56c092b5..206f2bdf 100644 --- a/pkg/pipeline/stage.py +++ b/pkg/pipeline/stage.py @@ -7,13 +7,13 @@ from ..core import app, entities as core_entities from . import entities -_stage_classes: dict[str, PipelineStage] = {} +preregistered_stages: dict[str, PipelineStage] = {} def stage_class(name: str): def decorator(cls): - _stage_classes[name] = cls + preregistered_stages[name] = cls return cls return decorator diff --git a/pkg/pipeline/stagemgr.py b/pkg/pipeline/stagemgr.py index 2bd685d6..19fce2d6 100644 --- a/pkg/pipeline/stagemgr.py +++ b/pkg/pipeline/stagemgr.py @@ -58,7 +58,7 @@ class StageManager: """初始化 """ - for name, cls in stage._stage_classes.items(): + for name, cls in stage.preregistered_stages.items(): self.stage_containers.append(StageInstContainer( inst_name=name, inst=cls(self.ap) diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index e8329ac1..7db7a040 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -72,10 +72,12 @@ class ModelManager: self.requester_dict = requester_dict - await self.load_model_from_db() + await self.load_models_from_db() - async def load_model_from_db(self): + async def load_models_from_db(self): """从数据库加载模型""" + self.ap.logger.info('Loading models from db...') + self.llm_models = [] # llm models From f8127eb585da4ffb564bbdd1a1a432aa7672f186 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Fri, 28 Mar 2025 17:22:00 +0800 Subject: [PATCH 019/205] perf: model definition --- pkg/entity/persistence/bot.py | 3 ++- pkg/entity/persistence/model.py | 2 +- pkg/entity/persistence/pipeline.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/entity/persistence/bot.py b/pkg/entity/persistence/bot.py index 355e1208..77e13994 100644 --- a/pkg/entity/persistence/bot.py +++ b/pkg/entity/persistence/bot.py @@ -7,11 +7,12 @@ class Bot(Base): """机器人""" __tablename__ = 'bots' - uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True) name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) adapter = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) adapter_config = sqlalchemy.Column(sqlalchemy.JSON, nullable=False) enable = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False) + use_pipeline_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=True) created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) diff --git a/pkg/entity/persistence/model.py b/pkg/entity/persistence/model.py index a77ffd27..13700f25 100644 --- a/pkg/entity/persistence/model.py +++ b/pkg/entity/persistence/model.py @@ -8,7 +8,7 @@ class LLMModel(Base): """LLM 模型""" __tablename__ = 'llm_models' - uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True) name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) requester = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) diff --git a/pkg/entity/persistence/pipeline.py b/pkg/entity/persistence/pipeline.py index 6d1b499d..369cd57a 100644 --- a/pkg/entity/persistence/pipeline.py +++ b/pkg/entity/persistence/pipeline.py @@ -7,7 +7,7 @@ class LegacyPipeline(Base): """旧版流水线""" __tablename__ = 'legacy_pipelines' - uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True) name = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) description = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) @@ -22,7 +22,7 @@ class PipelineRunRecord(Base): """流水线运行记录""" __tablename__ = 'pipeline_run_records' - uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + uuid = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True, unique=True) pipeline_uuid = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) status = sqlalchemy.Column(sqlalchemy.String(255), nullable=False) created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) From 5ff59f1b0727ec02b2923936418a2612c5ec6a84 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Fri, 28 Mar 2025 23:42:41 +0800 Subject: [PATCH 020/205] feat: pipeline invoking --- pkg/core/entities.py | 6 ++ pkg/pipeline/controller.py | 130 ++--------------------- pkg/pipeline/pipelinemgr.py | 131 +++++++++++++++++++++++- pkg/pipeline/pool.py | 4 +- pkg/platform/manager.py | 68 ++++++------ templates/metadata/pipeline/ai.yaml | 8 +- templates/metadata/pipeline/safety.yaml | 2 +- 7 files changed, 185 insertions(+), 164 deletions(-) diff --git a/pkg/core/entities.py b/pkg/core/entities.py index 71ec995b..a34eb082 100644 --- a/pkg/core/entities.py +++ b/pkg/core/entities.py @@ -57,6 +57,12 @@ class Query(pydantic.BaseModel): message_chain: platform_message.MessageChain """消息链,platform收到的原始消息链""" + pipeline_uuid: typing.Optional[str] = None + """流水线UUID。""" + + pipeline_config: typing.Optional[dict[str, typing.Any]] = None + """流水线配置,由 Pipeline 在运行开始时设置。""" + adapter: msadapter.MessagePlatformAdapter """消息平台适配器对象,单个app中可能启用了多个消息平台适配器,此对象表明发起此query的适配器""" diff --git a/pkg/pipeline/controller.py b/pkg/pipeline/controller.py index 807bec05..5d66f49e 100644 --- a/pkg/pipeline/controller.py +++ b/pkg/pipeline/controller.py @@ -50,14 +50,19 @@ class Controller: continue if selected_query: - async def _process_query(selected_query): + + async def _process_query(selected_query: entities.Query): async with self.semaphore: # 总并发上限 - await self.process_query(selected_query) + # find pipeline + pipeline = await self.ap.pipeline_mgr.get_pipeline_by_uuid(selected_query.pipeline_uuid) + if pipeline: + await pipeline.run(selected_query) async with self.ap.query_pool: (await self.ap.sess_mgr.get_session(selected_query)).semaphore.release() # 通知其他协程,有新的请求可以处理了 self.ap.query_pool.condition.notify_all() + self.ap.task_mgr.create_task( _process_query(selected_query), kind="query", @@ -70,127 +75,6 @@ class Controller: self.ap.logger.error(f"控制器循环出错: {e}") self.ap.logger.error(f"Traceback: {traceback.format_exc()}") - async def _check_output(self, query: entities.Query, result: pipeline_entities.StageProcessResult): - """检查输出 - """ - if result.user_notice: - # 处理str类型 - - if isinstance(result.user_notice, str): - result.user_notice = platform_message.MessageChain( - platform_message.Plain(result.user_notice) - ) - elif isinstance(result.user_notice, list): - result.user_notice = platform_message.MessageChain( - *result.user_notice - ) - - await self.ap.platform_mgr.send( - query.message_event, - result.user_notice, - query.adapter - ) - if result.debug_notice: - self.ap.logger.debug(result.debug_notice) - if result.console_notice: - self.ap.logger.info(result.console_notice) - if result.error_notice: - self.ap.logger.error(result.error_notice) - - async def _execute_from_stage( - self, - stage_index: int, - query: entities.Query, - ): - """从指定阶段开始执行,实现了责任链模式和基于生成器的阶段分叉功能。 - - 如何看懂这里为什么这么写? - 去问 GPT-4: - Q1: 现在有一个责任链,其中有多个stage,query对象在其中传递,stage.process可能返回Result也有可能返回typing.AsyncGenerator[Result, None], - 如果返回的是生成器,需要挨个生成result,检查是否result中是否要求继续,如果要求继续就进行下一个stage。如果此次生成器产生的result处理完了,就继续生成下一个result, - 调用后续的stage,直到该生成器全部生成完。责任链中可能有多个stage会返回生成器 - Q2: 不是这样的,你可能理解有误。如果我们责任链上有这些Stage: - - A B C D E F G - - 如果所有的stage都返回Result,且所有Result都要求继续,那么执行顺序是: - - A B C D E F G - - 现在假设C返回的是AsyncGenerator,那么执行顺序是: - - A B C D E F G C D E F G C D E F G ... - Q3: 但是如果不止一个stage会返回生成器呢? - """ - i = stage_index - - while i < len(self.ap.stage_mgr.stage_containers): - stage_container = self.ap.stage_mgr.stage_containers[i] - - query.current_stage = stage_container # 标记到 Query 对象里 - - result = stage_container.inst.process(query, stage_container.inst_name) - - if isinstance(result, typing.Coroutine): - result = await result - - if isinstance(result, pipeline_entities.StageProcessResult): # 直接返回结果 - self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} res {result}") - await self._check_output(query, result) - - if result.result_type == pipeline_entities.ResultType.INTERRUPT: - self.ap.logger.debug(f"Stage {stage_container.inst_name} interrupted query {query}") - break - elif result.result_type == pipeline_entities.ResultType.CONTINUE: - query = result.new_query - elif isinstance(result, typing.AsyncGenerator): # 生成器 - self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} gen") - - async for sub_result in result: - self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} res {sub_result}") - await self._check_output(query, sub_result) - - if sub_result.result_type == pipeline_entities.ResultType.INTERRUPT: - self.ap.logger.debug(f"Stage {stage_container.inst_name} interrupted query {query}") - break - elif sub_result.result_type == pipeline_entities.ResultType.CONTINUE: - query = sub_result.new_query - await self._execute_from_stage(i + 1, query) - break - - i += 1 - - async def process_query(self, query: entities.Query): - """处理请求 - """ - try: - - # ======== 触发 MessageReceived 事件 ======== - event_type = events.PersonMessageReceived if query.launcher_type == entities.LauncherTypes.PERSON else events.GroupMessageReceived - - event_ctx = await self.ap.plugin_mgr.emit_event( - event=event_type( - launcher_type=query.launcher_type.value, - launcher_id=query.launcher_id, - sender_id=query.sender_id, - message_chain=query.message_chain, - query=query - ) - ) - - if event_ctx.is_prevented_default(): - return - - self.ap.logger.debug(f"Processing query {query}") - - await self._execute_from_stage(0, query) - except Exception as e: - inst_name = query.current_stage.inst_name if query.current_stage else 'unknown' - self.ap.logger.error(f"处理请求时出错 query_id={query.query_id} stage={inst_name} : {e}") - self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") - finally: - self.ap.logger.debug(f"Query {query} processed") - async def run(self): """运行控制器 """ diff --git a/pkg/pipeline/pipelinemgr.py b/pkg/pipeline/pipelinemgr.py index a805e5cd..17189a52 100644 --- a/pkg/pipeline/pipelinemgr.py +++ b/pkg/pipeline/pipelinemgr.py @@ -1,13 +1,16 @@ from __future__ import annotations import typing +import traceback import sqlalchemy from ..core import app, entities +from . import entities as pipeline_entities from ..entity.persistence import pipeline as persistence_pipeline from . import stagemgr, stage - +from ..platform.types import message as platform_message, events as platform_events +from ..plugin import events class RuntimePipeline: """运行时流水线""" @@ -25,8 +28,130 @@ class RuntimePipeline: self.pipeline_entity = pipeline_entity self.stage_containers = stage_containers - async def run(self): - pass + async def run(self, query: entities.Query): + query.pipeline_config = self.pipeline_entity.config + await self.process_query(query) + + async def _check_output(self, query: entities.Query, result: pipeline_entities.StageProcessResult): + """检查输出 + """ + if result.user_notice: + # 处理str类型 + + if isinstance(result.user_notice, str): + result.user_notice = platform_message.MessageChain( + platform_message.Plain(result.user_notice) + ) + elif isinstance(result.user_notice, list): + result.user_notice = platform_message.MessageChain( + *result.user_notice + ) + + await self.ap.platform_mgr.send( + query.message_event, + result.user_notice, + query.adapter + ) + if result.debug_notice: + self.ap.logger.debug(result.debug_notice) + if result.console_notice: + self.ap.logger.info(result.console_notice) + if result.error_notice: + self.ap.logger.error(result.error_notice) + + async def _execute_from_stage( + self, + stage_index: int, + query: entities.Query, + ): + """从指定阶段开始执行,实现了责任链模式和基于生成器的阶段分叉功能。 + + 如何看懂这里为什么这么写? + 去问 GPT-4: + Q1: 现在有一个责任链,其中有多个stage,query对象在其中传递,stage.process可能返回Result也有可能返回typing.AsyncGenerator[Result, None], + 如果返回的是生成器,需要挨个生成result,检查是否result中是否要求继续,如果要求继续就进行下一个stage。如果此次生成器产生的result处理完了,就继续生成下一个result, + 调用后续的stage,直到该生成器全部生成完。责任链中可能有多个stage会返回生成器 + Q2: 不是这样的,你可能理解有误。如果我们责任链上有这些Stage: + + A B C D E F G + + 如果所有的stage都返回Result,且所有Result都要求继续,那么执行顺序是: + + A B C D E F G + + 现在假设C返回的是AsyncGenerator,那么执行顺序是: + + A B C D E F G C D E F G C D E F G ... + Q3: 但是如果不止一个stage会返回生成器呢? + """ + i = stage_index + + while i < len(self.stage_containers): + stage_container = self.stage_containers[i] + + query.current_stage = stage_container # 标记到 Query 对象里 + + result = stage_container.inst.process(query, stage_container.inst_name) + + if isinstance(result, typing.Coroutine): + result = await result + + if isinstance(result, pipeline_entities.StageProcessResult): # 直接返回结果 + self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} res {result}") + await self._check_output(query, result) + + if result.result_type == pipeline_entities.ResultType.INTERRUPT: + self.ap.logger.debug(f"Stage {stage_container.inst_name} interrupted query {query}") + break + elif result.result_type == pipeline_entities.ResultType.CONTINUE: + query = result.new_query + elif isinstance(result, typing.AsyncGenerator): # 生成器 + self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} gen") + + async for sub_result in result: + self.ap.logger.debug(f"Stage {stage_container.inst_name} processed query {query} res {sub_result}") + await self._check_output(query, sub_result) + + if sub_result.result_type == pipeline_entities.ResultType.INTERRUPT: + self.ap.logger.debug(f"Stage {stage_container.inst_name} interrupted query {query}") + break + elif sub_result.result_type == pipeline_entities.ResultType.CONTINUE: + query = sub_result.new_query + await self._execute_from_stage(i + 1, query) + break + + i += 1 + + async def process_query(self, query: entities.Query): + """处理请求 + """ + try: + + # ======== 触发 MessageReceived 事件 ======== + event_type = events.PersonMessageReceived if query.launcher_type == entities.LauncherTypes.PERSON else events.GroupMessageReceived + + event_ctx = await self.ap.plugin_mgr.emit_event( + event=event_type( + launcher_type=query.launcher_type.value, + launcher_id=query.launcher_id, + sender_id=query.sender_id, + message_chain=query.message_chain, + query=query + ) + ) + + if event_ctx.is_prevented_default(): + return + + self.ap.logger.debug(f"Processing query {query}") + + await self._execute_from_stage(0, query) + except Exception as e: + inst_name = query.current_stage.inst_name if query.current_stage else 'unknown' + self.ap.logger.error(f"处理请求时出错 query_id={query.query_id} stage={inst_name} : {e}") + self.ap.logger.debug(f"Traceback: {traceback.format_exc()}") + finally: + self.ap.logger.debug(f"Query {query} processed") class PipelineManager: diff --git a/pkg/pipeline/pool.py b/pkg/pipeline/pool.py index e358d249..d0c86e31 100644 --- a/pkg/pipeline/pool.py +++ b/pkg/pipeline/pool.py @@ -33,7 +33,8 @@ class QueryPool: sender_id: typing.Union[int, str], message_event: platform_events.MessageEvent, message_chain: platform_message.MessageChain, - adapter: msadapter.MessagePlatformAdapter + adapter: msadapter.MessagePlatformAdapter, + pipeline_uuid: str ) -> entities.Query: async with self.condition: query = entities.Query( @@ -43,6 +44,7 @@ class QueryPool: sender_id=sender_id, message_event=message_event, message_chain=message_chain, + pipeline_uuid=pipeline_uuid, resp_messages=[], resp_message_chain=[], adapter=adapter diff --git a/pkg/platform/manager.py b/pkg/platform/manager.py index 210ee9ad..81f15655 100644 --- a/pkg/platform/manager.py +++ b/pkg/platform/manager.py @@ -50,6 +50,41 @@ class RuntimeBot: self.adapter = adapter self.task_context = taskmgr.TaskContext() + async def initialize(self): + + async def on_friend_message(event: platform_events.FriendMessage, adapter: msadapter.MessagePlatformAdapter): + + await self.ap.query_pool.add_query( + launcher_type=core_entities.LauncherTypes.PERSON, + launcher_id=event.sender.id, + sender_id=event.sender.id, + message_event=event, + message_chain=event.message_chain, + adapter=adapter, + pipeline_uuid=self.bot_entity.use_pipeline_uuid + ) + + async def on_group_message(event: platform_events.GroupMessage, adapter: msadapter.MessagePlatformAdapter): + + await self.ap.query_pool.add_query( + launcher_type=core_entities.LauncherTypes.GROUP, + launcher_id=event.group.id, + sender_id=event.sender.id, + message_event=event, + message_chain=event.message_chain, + adapter=adapter, + pipeline_uuid=self.bot_entity.use_pipeline_uuid + ) + + self.adapter.register_listener( + platform_events.FriendMessage, + on_friend_message + ) + self.adapter.register_listener( + platform_events.GroupMessage, + on_group_message + ) + async def run(self): async def exception_wrapper(): @@ -135,49 +170,20 @@ class PlatformManager: bot_entity = persistence_bot.Bot(**bot_entity._mapping) elif isinstance(bot_entity, dict): bot_entity = persistence_bot.Bot(**bot_entity) - - async def on_friend_message(event: platform_events.FriendMessage, adapter: msadapter.MessagePlatformAdapter): - - await self.ap.query_pool.add_query( - launcher_type=core_entities.LauncherTypes.PERSON, - launcher_id=event.sender.id, - sender_id=event.sender.id, - message_event=event, - message_chain=event.message_chain, - adapter=adapter - ) - - async def on_group_message(event: platform_events.GroupMessage, adapter: msadapter.MessagePlatformAdapter): - - await self.ap.query_pool.add_query( - launcher_type=core_entities.LauncherTypes.GROUP, - launcher_id=event.group.id, - sender_id=event.sender.id, - message_event=event, - message_chain=event.message_chain, - adapter=adapter - ) adapter_inst = self.adapter_dict[bot_entity.adapter]( bot_entity.adapter_config, self.ap ) - adapter_inst.register_listener( - platform_events.FriendMessage, - on_friend_message - ) - adapter_inst.register_listener( - platform_events.GroupMessage, - on_group_message - ) - runtime_bot = RuntimeBot( ap=self.ap, bot_entity=bot_entity, adapter=adapter_inst ) + await runtime_bot.initialize() + self.bots.append(runtime_bot) return runtime_bot diff --git a/templates/metadata/pipeline/ai.yaml b/templates/metadata/pipeline/ai.yaml index 38d579c0..74566a31 100644 --- a/templates/metadata/pipeline/ai.yaml +++ b/templates/metadata/pipeline/ai.yaml @@ -42,7 +42,7 @@ stages: zh_CN: 模型 type: select required: true - scope: llm-model + scope: /provider/models/llm - name: max-round label: en_US: Max Round @@ -54,11 +54,9 @@ stages: label: en_US: Prompt zh_CN: 提示词 - type: array + type: string required: true - default: [] - items: - type: string + default: "You are a helpful assistant." - name: dify-service-api label: en_US: Dify Service API diff --git a/templates/metadata/pipeline/safety.yaml b/templates/metadata/pipeline/safety.yaml index d19913af..09f8025b 100644 --- a/templates/metadata/pipeline/safety.yaml +++ b/templates/metadata/pipeline/safety.yaml @@ -46,7 +46,7 @@ stages: zh_CN: 窗口长度(秒) type: integer required: true - default: 10 + default: 60 - name: limitation label: en_US: Limitation From d01eadc70f1f64b50dcb686dc02edc85b59aa9b8 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 29 Mar 2025 00:37:17 +0800 Subject: [PATCH 021/205] fix: typo in param --- pkg/pipeline/pipelinemgr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/pipeline/pipelinemgr.py b/pkg/pipeline/pipelinemgr.py index 17189a52..9f41ba2d 100644 --- a/pkg/pipeline/pipelinemgr.py +++ b/pkg/pipeline/pipelinemgr.py @@ -198,8 +198,8 @@ class PipelineManager: stage_containers = [] for stage_name in pipeline_entity.stages: stage_containers.append(stagemgr.StageInstContainer( - stage_name=stage_name, - stage_class=self.stage_dict[stage_name] + inst_name=stage_name, + inst=self.stage_dict[stage_name](self.ap) )) runtime_pipeline = RuntimePipeline(self.ap, pipeline_entity, stage_containers) From 9f15ab50009df2a87ea87122f52d9fbc8b6c1b1c Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 29 Mar 2025 17:50:45 +0800 Subject: [PATCH 022/205] feat: preliminarily implement pipeline invoking --- pkg/api/http/service/pipeline.py | 19 +++- pkg/core/app.py | 13 +-- pkg/core/entities.py | 16 ++- pkg/core/stages/build_app.py | 16 +-- pkg/core/taskmgr.py | 7 ++ pkg/pipeline/bansess/bansess.py | 4 +- pkg/pipeline/cntfilter/cntfilter.py | 4 +- pkg/pipeline/controller.py | 10 +- pkg/pipeline/longtext/longtext.py | 12 +- pkg/pipeline/longtext/strategies/image.py | 16 ++- pkg/pipeline/msgtrun/msgtrun.py | 4 +- pkg/pipeline/pipelinemgr.py | 54 +++++++-- pkg/pipeline/pool.py | 4 +- pkg/pipeline/preproc/preproc.py | 15 +-- pkg/pipeline/process/handlers/chat.py | 21 ++-- pkg/pipeline/process/process.py | 4 +- pkg/pipeline/ratelimit/ratelimit.py | 4 +- pkg/pipeline/respback/respback.py | 26 +++-- pkg/pipeline/resprule/resprule.py | 4 +- pkg/pipeline/stage.py | 2 +- pkg/pipeline/stagemgr.py | 71 ------------ pkg/pipeline/wrapper/wrapper.py | 6 +- pkg/platform/manager.py | 74 +++++------- pkg/platform/sources/aiocqhttp.py | 2 + pkg/plugin/context.py | 8 +- pkg/provider/modelmgr/modelmgr.py | 34 ++---- pkg/provider/modelmgr/requester.py | 37 +++--- .../modelmgr/requesters/anthropicmsgs.py | 15 +-- .../modelmgr/requesters/anthropicmsgs.yaml | 2 +- .../modelmgr/requesters/bailianchatcmpl.py | 2 +- .../modelmgr/requesters/bailianchatcmpl.yaml | 2 +- pkg/provider/modelmgr/requesters/chatcmpl.py | 16 ++- .../modelmgr/requesters/chatcmpl.yaml | 2 +- .../modelmgr/requesters/deepseekchatcmpl.py | 8 +- .../modelmgr/requesters/deepseekchatcmpl.yaml | 2 +- .../modelmgr/requesters/giteeaichatcmpl.py | 8 +- .../modelmgr/requesters/giteeaichatcmpl.yaml | 2 +- .../modelmgr/requesters/lmstudiochatcmpl.py | 2 +- .../modelmgr/requesters/lmstudiochatcmpl.yaml | 2 +- .../modelmgr/requesters/moonshotchatcmpl.py | 8 +- .../modelmgr/requesters/moonshotchatcmpl.yaml | 2 +- .../modelmgr/requesters/ollamachat.py | 107 ++++++++++-------- .../modelmgr/requesters/ollamachat.yaml | 2 +- .../requesters/siliconflowchatcmpl.py | 2 +- .../requesters/siliconflowchatcmpl.yaml | 2 +- .../modelmgr/requesters/volcarkchatcmpl.py | 2 +- .../modelmgr/requesters/volcarkchatcmpl.yaml | 2 +- .../modelmgr/requesters/xaichatcmpl.py | 2 +- .../modelmgr/requesters/xaichatcmpl.yaml | 2 +- .../modelmgr/requesters/zhipuaichatcmpl.py | 2 +- .../modelmgr/requesters/zhipuaichatcmpl.yaml | 2 +- pkg/provider/runner.py | 8 +- pkg/provider/runnermgr.py | 30 ----- pkg/provider/runners/dashscopeapi.py | 26 ++--- pkg/provider/runners/difysvapi.py | 44 ++++--- pkg/provider/runners/localagent.py | 6 +- pkg/provider/session/sessionmgr.py | 6 +- 57 files changed, 384 insertions(+), 421 deletions(-) delete mode 100644 pkg/pipeline/stagemgr.py delete mode 100644 pkg/provider/runnermgr.py diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py index 7920c4c9..f1bcaa75 100644 --- a/pkg/api/http/service/pipeline.py +++ b/pkg/api/http/service/pipeline.py @@ -5,10 +5,25 @@ import datetime import sqlalchemy from ....core import app -from ....pipeline import stagemgr from ....entity.persistence import pipeline as persistence_pipeline +default_stage_order = [ + "GroupRespondRuleCheckStage", # 群响应规则检查 + "BanSessionCheckStage", # 封禁会话检查 + "PreContentFilterStage", # 内容过滤前置阶段 + "PreProcessor", # 预处理器 + "ConversationMessageTruncator", # 会话消息截断器 + "RequireRateLimitOccupancy", # 请求速率限制占用 + "MessageProcessor", # 处理器 + "ReleaseRateLimitOccupancy", # 释放速率限制占用 + "PostContentFilterStage", # 内容过滤后置阶段 + "ResponseWrapper", # 响应包装器 + "LongTextProcessStage", # 长文本处理 + "SendResponseBackStage", # 发送响应 +] + + class PipelineService: ap: app.Application @@ -49,7 +64,7 @@ class PipelineService: async def create_pipeline(self, pipeline_data: dict) -> str: pipeline_data['uuid'] = str(uuid.uuid4()) pipeline_data['for_version'] = self.ap.ver_mgr.get_current_version() - pipeline_data['stages'] = stagemgr.stage_order.copy() + pipeline_data['stages'] = default_stage_order.copy() # TODO: 检查pipeline config是否完整 diff --git a/pkg/core/app.py b/pkg/core/app.py index 0191cc02..126b165a 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -13,14 +13,13 @@ from ..provider.session import sessionmgr as llm_session_mgr from ..provider.modelmgr 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 ..provider import runnermgr from ..config import manager as config_mgr from ..config import settings as settings_mgr from ..audit.center import v2 as center_mgr from ..command import cmdmgr from ..plugin import manager as plugin_mgr from ..pipeline import pool -from ..pipeline import controller, stagemgr, pipelinemgr +from ..pipeline import controller, pipelinemgr from ..utils import version as version_mgr, proxy as proxy_mgr, announce as announce_mgr from ..persistence import mgr as persistencemgr from ..api.http.controller import main as http_controller @@ -53,12 +52,12 @@ class Application: model_mgr: llm_model_mgr.ModelManager = None + # TODO 移动到 pipeline 里 prompt_mgr: llm_prompt_mgr.PromptManager = None + # TODO 移动到 pipeline 里 tool_mgr: llm_tool_mgr.ToolManager = None - runner_mgr: runnermgr.RunnerManager = None - settings_mgr: settings_mgr.SettingsManager = None # ======= 配置管理器 ======= @@ -100,8 +99,6 @@ class Application: ctrl: controller.Controller = None - stage_mgr: stagemgr.StageManager = None - pipeline_mgr: pipelinemgr.PipelineManager = None ver_mgr: version_mgr.VersionManager = None @@ -239,9 +236,5 @@ class Application: llm_tool_mgr_inst = llm_tool_mgr.ToolManager(self) await llm_tool_mgr_inst.initialize() self.tool_mgr = llm_tool_mgr_inst - - runner_mgr_inst = runnermgr.RunnerManager(self) - await runner_mgr_inst.initialize() - self.runner_mgr = runner_mgr_inst case _: pass \ No newline at end of file diff --git a/pkg/core/entities.py b/pkg/core/entities.py index a34eb082..d8768494 100644 --- a/pkg/core/entities.py +++ b/pkg/core/entities.py @@ -8,7 +8,7 @@ import asyncio import pydantic.v1 as pydantic from ..provider import entities as llm_entities -from ..provider.modelmgr import entities +from ..provider.modelmgr import entities, modelmgr, requester from ..provider.sysprompt import entities as sysprompt_entities from ..provider.tools import entities as tools_entities from ..platform import adapter as msadapter @@ -57,6 +57,9 @@ class Query(pydantic.BaseModel): message_chain: platform_message.MessageChain """消息链,platform收到的原始消息链""" + bot_uuid: typing.Optional[str] = None + """机器人UUID。""" + pipeline_uuid: typing.Optional[str] = None """流水线UUID。""" @@ -81,8 +84,8 @@ class Query(pydantic.BaseModel): variables: typing.Optional[dict[str, typing.Any]] = None """变量,由前置处理器阶段设置。在prompt中嵌入或由 Runner 传递到 LLMOps 平台。""" - use_model: typing.Optional[entities.LLMModelInfo] = None - """使用的模型,由前置处理器阶段设置""" + use_llm_model: typing.Optional[requester.RuntimeLLMModel] = None + """使用的对话模型,由前置处理器阶段设置""" use_funcs: typing.Optional[list[tools_entities.LLMFunction]] = None """使用的函数,由前置处理器阶段设置""" @@ -94,7 +97,7 @@ class Query(pydantic.BaseModel): """回复消息链,从resp_messages包装而得""" # ======= 内部保留 ======= - current_stage: "pkg.pipeline.stagemgr.StageInstContainer" = None + current_stage: "pkg.pipeline.pipelinemgr.StageInstContainer" = None """当前所处阶段""" class Config: @@ -132,13 +135,16 @@ class Conversation(pydantic.BaseModel): update_time: typing.Optional[datetime.datetime] = pydantic.Field(default_factory=datetime.datetime.now) - use_model: entities.LLMModelInfo + use_llm_model: requester.RuntimeLLMModel use_funcs: typing.Optional[list[tools_entities.LLMFunction]] uuid: typing.Optional[str] = None """该对话的 uuid,在创建时不会自动生成。而是当使用 Dify API 等由外部管理对话信息的服务时,用于绑定外部的会话。具体如何使用,取决于 Runner。""" + class Config: + arbitrary_types_allowed = True + class Session(pydantic.BaseModel): """会话,一个 Session 对应一个 {launcher_type.value}_{launcher_id}""" diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index 0bd0d8a5..fcd930a3 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -6,14 +6,13 @@ from .. import stage, app from ...utils import version, proxy, announce, platform from ...audit.center import v2 as center_v2 from ...audit import identifier -from ...pipeline import pool, controller, stagemgr, pipelinemgr +from ...pipeline import pool, controller, pipelinemgr from ...plugin import manager as plugin_mgr from ...command import cmdmgr from ...provider.session import sessionmgr as llm_session_mgr from ...provider.modelmgr 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 ...provider import runnermgr from ...platform import manager as im_mgr from ...persistence import mgr as persistencemgr from ...api.http.controller import main as http_controller @@ -61,10 +60,7 @@ class BuildAppStage(stage.BootingStage): }, 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'] - ]), + "msg_source": str([]), }, ) ap.ctr_mgr = center_v2_api @@ -107,18 +103,10 @@ class BuildAppStage(stage.BootingStage): await llm_tool_mgr_inst.initialize() ap.tool_mgr = llm_tool_mgr_inst - runner_mgr_inst = runnermgr.RunnerManager(ap) - await runner_mgr_inst.initialize() - ap.runner_mgr = runner_mgr_inst - im_mgr_inst = im_mgr.PlatformManager(ap=ap) await im_mgr_inst.initialize() ap.platform_mgr = im_mgr_inst - stage_mgr = stagemgr.StageManager(ap) - await stage_mgr.initialize() - ap.stage_mgr = stage_mgr - pipeline_mgr = pipelinemgr.PipelineManager(ap) await pipeline_mgr.initialize() ap.pipeline_mgr = pipeline_mgr diff --git a/pkg/core/taskmgr.py b/pkg/core/taskmgr.py index 2c029c03..d5887019 100644 --- a/pkg/core/taskmgr.py +++ b/pkg/core/taskmgr.py @@ -233,3 +233,10 @@ class AsyncTaskManager: if not wrapper.task.done() and scope in wrapper.scopes: wrapper.task.cancel() + + def cancel_task(self, task_id: int): + for wrapper in self.tasks: + if wrapper.id == task_id: + if not wrapper.task.done(): + wrapper.task.cancel() + return diff --git a/pkg/pipeline/bansess/bansess.py b/pkg/pipeline/bansess/bansess.py index 9c041385..1ca42397 100644 --- a/pkg/pipeline/bansess/bansess.py +++ b/pkg/pipeline/bansess/bansess.py @@ -1,7 +1,7 @@ from __future__ import annotations import re -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr @@ -13,7 +13,7 @@ class BanSessionCheckStage(stage.PipelineStage): 仅检查query中群号或个人号是否在访问控制列表中。 """ - async def initialize(self): + async def initialize(self, pipeline_config: dict): pass async def process( diff --git a/pkg/pipeline/cntfilter/cntfilter.py b/pkg/pipeline/cntfilter/cntfilter.py index f7376b61..6a0c3776 100644 --- a/pkg/pipeline/cntfilter/cntfilter.py +++ b/pkg/pipeline/cntfilter/cntfilter.py @@ -2,7 +2,7 @@ from __future__ import annotations from ...core import app -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr from . import filter as filter_model, entities as filter_entities @@ -35,7 +35,7 @@ class ContentFilterStage(stage.PipelineStage): self.filter_chain = [] super().__init__(ap) - async def initialize(self): + async def initialize(self, pipeline_config: dict): filters_required = [ "content-ignore", diff --git a/pkg/pipeline/controller.py b/pkg/pipeline/controller.py index 5d66f49e..64d4e8f4 100644 --- a/pkg/pipeline/controller.py +++ b/pkg/pipeline/controller.py @@ -54,9 +54,13 @@ class Controller: async def _process_query(selected_query: entities.Query): async with self.semaphore: # 总并发上限 # find pipeline - pipeline = await self.ap.pipeline_mgr.get_pipeline_by_uuid(selected_query.pipeline_uuid) - if pipeline: - await pipeline.run(selected_query) + # Here firstly find the bot, then find the pipeline, in case the bot adapter's config is not the latest one. + # Like aiocqhttp, once a client is connected, even the adapter was updated and restarted, the existing client connection will not be affected. + bot = await self.ap.platform_mgr.get_bot_by_uuid(selected_query.bot_uuid) + if bot: + pipeline = await self.ap.pipeline_mgr.get_pipeline_by_uuid(bot.bot_entity.use_pipeline_uuid) + if pipeline: + await pipeline.run(selected_query) async with self.ap.query_pool: (await self.ap.sess_mgr.get_session(selected_query)).semaphore.release() diff --git a/pkg/pipeline/longtext/longtext.py b/pkg/pipeline/longtext/longtext.py index ecb745d0..ac03ad42 100644 --- a/pkg/pipeline/longtext/longtext.py +++ b/pkg/pipeline/longtext/longtext.py @@ -7,7 +7,7 @@ from PIL import Image, ImageDraw, ImageFont from ...core import app from . import strategy from .strategies import image, forward -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr from ...platform.types import message as platform_message @@ -23,8 +23,8 @@ class LongTextProcessStage(stage.PipelineStage): strategy_impl: strategy.LongTextStrategy - async def initialize(self): - config = self.ap.platform_cfg.data['long-text-process'] + async def initialize(self, pipeline_config: dict): + config = pipeline_config['output']['long-text-processing'] if config['strategy'] == 'image': use_font = config['font-path'] try: @@ -42,12 +42,12 @@ class LongTextProcessStage(stage.PipelineStage): else: self.ap.logger.warn("未找到字体文件,且无法使用系统自带字体,更换为转发消息组件以发送长消息,您可以在配置文件中调整相关设置。") - self.ap.platform_cfg.data['long-text-process']['strategy'] = "forward" + pipeline_config['output']['long-text-processing']['strategy'] = "forward" except: traceback.print_exc() self.ap.logger.error("加载字体文件失败({}),更换为转发消息组件以发送长消息,您可以在配置文件中调整相关设置。".format(use_font)) - self.ap.platform_cfg.data['long-text-process']['strategy'] = "forward" + pipeline_config['output']['long-text-processing']['strategy'] = "forward" for strategy_cls in strategy.preregistered_strategies: if strategy_cls.name == config['strategy']: @@ -69,7 +69,7 @@ class LongTextProcessStage(stage.PipelineStage): if contains_non_plain: self.ap.logger.debug("消息中包含非 Plain 组件,跳过长消息处理。") - elif len(str(query.resp_message_chain[-1])) > self.ap.platform_cfg.data['long-text-process']['threshold']: + elif len(str(query.resp_message_chain[-1])) > query.pipeline_config['output']['long-text-processing']['threshold']: query.resp_message_chain[-1] = platform_message.MessageChain(await self.strategy_impl.process(str(query.resp_message_chain[-1]), query)) return entities.StageProcessResult( diff --git a/pkg/pipeline/longtext/strategies/image.py b/pkg/pipeline/longtext/strategies/image.py index b9675074..b30d3a81 100644 --- a/pkg/pipeline/longtext/strategies/image.py +++ b/pkg/pipeline/longtext/strategies/image.py @@ -8,6 +8,7 @@ import re from PIL import Image, ImageDraw, ImageFont +import functools from ....platform.types import message as platform_message from .. import strategy as strategy_model @@ -17,15 +18,18 @@ from ....core import entities as core_entities @strategy_model.strategy_class("image") class Text2ImageStrategy(strategy_model.LongTextStrategy): - text_render_font: ImageFont.FreeTypeFont - async def initialize(self): - self.text_render_font = ImageFont.truetype(self.ap.platform_cfg.data['long-text-process']['font-path'], 32, encoding="utf-8") + pass + + @functools.lru_cache(maxsize=16) + def get_font(self, query: core_entities.Query): + return ImageFont.truetype(query.pipeline_config['output']['long-text-processing']['font-path'], 32, encoding="utf-8") async def process(self, message: str, query: core_entities.Query) -> list[platform_message.MessageComponent]: img_path = self.text_to_image( text_str=message, - save_as='temp/{}.png'.format(int(time.time())) + save_as='temp/{}.png'.format(int(time.time())), + query=query ) compressed_path, size = self.compress_image( @@ -127,7 +131,7 @@ class Text2ImageStrategy(strategy_model.LongTextStrategy): return outfile, self.get_size(outfile) - def text_to_image(self, text_str: str, save_as="temp.png", width=800): + def text_to_image(self, text_str: str, save_as="temp.png", width=800, query: core_entities.Query = None): text_str = text_str.replace("\t", " ") @@ -142,7 +146,7 @@ class Text2ImageStrategy(strategy_model.LongTextStrategy): self.ap.logger.debug("lines: {}, text_width: {}".format(lines, text_width)) for line in lines: # 如果长了就分割 - line_width = self.text_render_font.getlength(line) + line_width = self.get_font(query).getlength(line) self.ap.logger.debug("line_width: {}".format(line_width)) if line_width < text_width: final_lines.append(line) diff --git a/pkg/pipeline/msgtrun/msgtrun.py b/pkg/pipeline/msgtrun/msgtrun.py index e56c551f..a1116eb4 100644 --- a/pkg/pipeline/msgtrun/msgtrun.py +++ b/pkg/pipeline/msgtrun/msgtrun.py @@ -1,6 +1,6 @@ from __future__ import annotations -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from . import truncator from .truncators import round @@ -14,7 +14,7 @@ class ConversationMessageTruncator(stage.PipelineStage): """ trun: truncator.Truncator - async def initialize(self): + async def initialize(self, pipeline_config: dict): use_method = self.ap.pipeline_cfg.data['msg-truncate']['method'] for trun in truncator.preregistered_truncators: diff --git a/pkg/pipeline/pipelinemgr.py b/pkg/pipeline/pipelinemgr.py index 9f41ba2d..b7eaaab4 100644 --- a/pkg/pipeline/pipelinemgr.py +++ b/pkg/pipeline/pipelinemgr.py @@ -8,10 +8,35 @@ import sqlalchemy from ..core import app, entities from . import entities as pipeline_entities from ..entity.persistence import pipeline as persistence_pipeline -from . import stagemgr, stage +from . import stage from ..platform.types import message as platform_message, events as platform_events from ..plugin import events +from .resprule import resprule +from .bansess import bansess +from .cntfilter import cntfilter +from .process import process +from .longtext import longtext +from .respback import respback +from .wrapper import wrapper +from .preproc import preproc +from .ratelimit import ratelimit +from .msgtrun import msgtrun + + +class StageInstContainer(): + """阶段实例容器 + """ + + inst_name: str + + inst: stage.PipelineStage + + def __init__(self, inst_name: str, inst: stage.PipelineStage): + self.inst_name = inst_name + self.inst = inst + + class RuntimePipeline: """运行时流水线""" @@ -20,10 +45,10 @@ class RuntimePipeline: pipeline_entity: persistence_pipeline.LegacyPipeline """流水线实体""" - stage_containers: list[stagemgr.StageInstContainer] + stage_containers: list[StageInstContainer] """阶段实例容器""" - def __init__(self, ap: app.Application, pipeline_entity: persistence_pipeline.LegacyPipeline, stage_containers: list[stagemgr.StageInstContainer]): + def __init__(self, ap: app.Application, pipeline_entity: persistence_pipeline.LegacyPipeline, stage_containers: list[StageInstContainer]): self.ap = ap self.pipeline_entity = pipeline_entity self.stage_containers = stage_containers @@ -47,10 +72,18 @@ class RuntimePipeline: *result.user_notice ) - await self.ap.platform_mgr.send( - query.message_event, - result.user_notice, - query.adapter + if query.pipeline_config['output']['misc']['at-sender'] and isinstance(query.message_event, platform_events.GroupMessage): + result.user_notice.insert( + 0, + platform_message.At( + query.message_event.sender.id + ) + ) + + await query.adapter.reply_message( + message_source=query.message_event, + message=result.user_notice, + quote_origin=query.pipeline_config['output']['misc']['quote-origin'] ) if result.debug_notice: self.ap.logger.debug(result.debug_notice) @@ -195,12 +228,15 @@ class PipelineManager: pipeline_entity = persistence_pipeline.LegacyPipeline(**pipeline_entity) # initialize stage containers according to pipeline_entity.stages - stage_containers = [] + stage_containers: list[StageInstContainer] = [] for stage_name in pipeline_entity.stages: - stage_containers.append(stagemgr.StageInstContainer( + stage_containers.append(StageInstContainer( inst_name=stage_name, inst=self.stage_dict[stage_name](self.ap) )) + + for stage_container in stage_containers: + await stage_container.inst.initialize(pipeline_entity.config) runtime_pipeline = RuntimePipeline(self.ap, pipeline_entity, stage_containers) self.pipelines.append(runtime_pipeline) diff --git a/pkg/pipeline/pool.py b/pkg/pipeline/pool.py index d0c86e31..df4d0741 100644 --- a/pkg/pipeline/pool.py +++ b/pkg/pipeline/pool.py @@ -28,23 +28,23 @@ class QueryPool: async def add_query( self, + bot_uuid: str, launcher_type: entities.LauncherTypes, launcher_id: typing.Union[int, str], sender_id: typing.Union[int, str], message_event: platform_events.MessageEvent, message_chain: platform_message.MessageChain, adapter: msadapter.MessagePlatformAdapter, - pipeline_uuid: str ) -> entities.Query: async with self.condition: query = entities.Query( + bot_uuid=bot_uuid, query_id=self.query_id_counter, launcher_type=launcher_type, launcher_id=launcher_id, sender_id=sender_id, message_event=message_event, message_chain=message_chain, - pipeline_uuid=pipeline_uuid, resp_messages=[], resp_message_chain=[], adapter=adapter diff --git a/pkg/pipeline/preproc/preproc.py b/pkg/pipeline/preproc/preproc.py index 299aea5e..9958466a 100644 --- a/pkg/pipeline/preproc/preproc.py +++ b/pkg/pipeline/preproc/preproc.py @@ -2,7 +2,7 @@ from __future__ import annotations import datetime -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...provider import entities as llm_entities from ...plugin import events @@ -33,16 +33,16 @@ class PreProcessor(stage.PipelineStage): """ session = await self.ap.sess_mgr.get_session(query) - conversation = await self.ap.sess_mgr.get_conversation(session) + conversation = await self.ap.sess_mgr.get_conversation(query, session) # 设置query query.session = session query.prompt = conversation.prompt.copy() query.messages = conversation.messages.copy() - query.use_model = conversation.use_model + query.use_llm_model = conversation.use_llm_model - query.use_funcs = conversation.use_funcs if query.use_model.tool_call_supported else None + query.use_funcs = conversation.use_funcs if query.use_llm_model.model_entity.abilities.__contains__('tool_call') else None query.variables = { "session_id": f"{query.session.launcher_type.value}_{query.session.launcher_id}", @@ -50,8 +50,9 @@ class PreProcessor(stage.PipelineStage): "msg_create_time": int(query.message_event.time) if query.message_event.time else int(datetime.datetime.now().timestamp()), } - # 检查vision是否启用,没启用就删除所有图片 - if not self.ap.provider_cfg.data['enable-vision'] or (self.ap.provider_cfg.data['runner'] == 'local-agent' and not query.use_model.vision_supported): + # Check if this model supports vision, if not, remove all images + # TODO this checking should be performed in runner, and in this stage, the image should be reserved + if query.pipeline_config['ai']['runner']['runner'] == 'local-agent' and not query.use_llm_model.model_entity.abilities.__contains__('vision'): for msg in query.messages: if isinstance(msg.content, list): for me in msg.content: @@ -69,7 +70,7 @@ class PreProcessor(stage.PipelineStage): ) plain_text += me.text elif isinstance(me, platform_message.Image): - if self.ap.provider_cfg.data['enable-vision'] and (self.ap.provider_cfg.data['runner'] != 'local-agent' or query.use_model.vision_supported): + if query.pipeline_config['ai']['runner']['runner'] != 'local-agent' or query.use_llm_model.model_entity.abilities.__contains__('vision'): if me.base64 is not None: content_list.append( llm_entities.ContentElement.from_image_base64(me.base64) diff --git a/pkg/pipeline/process/handlers/chat.py b/pkg/pipeline/process/handlers/chat.py index 83bb3335..9d231dda 100644 --- a/pkg/pipeline/process/handlers/chat.py +++ b/pkg/pipeline/process/handlers/chat.py @@ -9,7 +9,9 @@ import json from .. import handler from ... import entities from ....core import entities as core_entities -from ....provider import entities as llm_entities, runnermgr +from ....provider import entities as llm_entities +from ....provider import runner as runner_module +from ....provider.runners import localagent, difysvapi, dashscopeapi from ....plugin import events from ....platform.types import message as platform_message @@ -56,12 +58,6 @@ class ChatMessageHandler(handler.MessageHandler): ) else: - if not self.ap.provider_cfg.data['enable-chat']: - yield entities.StageProcessResult( - result_type=entities.ResultType.INTERRUPT, - new_query=query, - ) - if event_ctx.event.alter is not None: # if isinstance(event_ctx.event, str): # 现在暂时不考虑多模态alter query.user_message.content = event_ctx.event.alter @@ -72,7 +68,12 @@ class ChatMessageHandler(handler.MessageHandler): try: - runner = self.ap.runner_mgr.get_runner() + for r in runner_module.preregistered_runners: + if r.name == query.pipeline_config["ai"]["runner"]["runner"]: + runner = r(self.ap, query.pipeline_config) + break + else: + raise ValueError(f"未找到请求运行器: {query.pipeline_config['ai']['runner']['runner']}") async for result in runner.run(query): query.resp_messages.append(result) @@ -93,10 +94,12 @@ class ChatMessageHandler(handler.MessageHandler): self.ap.logger.error(f'对话({query.query_id})请求失败: {type(e).__name__} {str(e)}') + hide_exception_info = query.pipeline_config['output']['misc']['hide-exception'] + yield entities.StageProcessResult( result_type=entities.ResultType.INTERRUPT, new_query=query, - user_notice='请求失败' if self.ap.platform_cfg.data['hide-exception-info'] else f'{e}', + user_notice='请求失败' if hide_exception_info else f'{e}', error_notice=f'{e}', debug_notice=traceback.format_exc() ) diff --git a/pkg/pipeline/process/process.py b/pkg/pipeline/process/process.py index 362ece01..ea4d7e7f 100644 --- a/pkg/pipeline/process/process.py +++ b/pkg/pipeline/process/process.py @@ -4,7 +4,7 @@ from ...core import app, entities as core_entities from . import handler from .handlers import chat, command from .. import entities -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr @@ -23,7 +23,7 @@ class Processor(stage.PipelineStage): chat_handler: handler.MessageHandler - async def initialize(self): + async def initialize(self, pipeline_config: dict): self.cmd_handler = command.CommandHandler(self.ap) self.chat_handler = chat.ChatMessageHandler(self.ap) diff --git a/pkg/pipeline/ratelimit/ratelimit.py b/pkg/pipeline/ratelimit/ratelimit.py index cd39b85c..01bde395 100644 --- a/pkg/pipeline/ratelimit/ratelimit.py +++ b/pkg/pipeline/ratelimit/ratelimit.py @@ -2,7 +2,7 @@ from __future__ import annotations import typing -from .. import entities, stagemgr, stage +from .. import entities, stage from . import algo from .algos import fixedwin from ...core import entities as core_entities @@ -18,7 +18,7 @@ class RateLimit(stage.PipelineStage): algo: algo.ReteLimitAlgo - async def initialize(self): + async def initialize(self, pipeline_config: dict): algo_name = self.ap.pipeline_cfg.data['rate-limit']['algo'] diff --git a/pkg/pipeline/respback/respback.py b/pkg/pipeline/respback/respback.py index 08b335d5..8c074d89 100644 --- a/pkg/pipeline/respback/respback.py +++ b/pkg/pipeline/respback/respback.py @@ -5,8 +5,10 @@ import asyncio from ...core import app +from ...platform.types import events as platform_events +from ...platform.types import message as platform_message -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr @@ -19,8 +21,8 @@ class SendResponseBackStage(stage.PipelineStage): async def process(self, query: core_entities.Query, stage_inst_name: str) -> entities.StageProcessResult: """处理 """ - - random_range = (self.ap.platform_cfg.data['force-delay']['min'], self.ap.platform_cfg.data['force-delay']['max']) + + random_range = (query.pipeline_config['output']['force-delay']['min'], query.pipeline_config['output']['force-delay']['max']) random_delay = random.uniform(*random_range) @@ -31,10 +33,20 @@ class SendResponseBackStage(stage.PipelineStage): await asyncio.sleep(random_delay) - await self.ap.platform_mgr.send( - query.message_event, - query.resp_message_chain[-1], - adapter=query.adapter + if query.pipeline_config['output']['misc']['at-sender'] and isinstance(query.message_event, platform_events.GroupMessage): + query.resp_message_chain[-1].insert( + 0, + platform_message.At( + query.message_event.sender.id + ) + ) + + quote_origin = query.pipeline_config['output']['misc']['quote-origin'] + + await query.adapter.reply_message( + message_source=query.message_event, + message=query.resp_message_chain[-1], + quote_origin=quote_origin ) return entities.StageProcessResult( diff --git a/pkg/pipeline/resprule/resprule.py b/pkg/pipeline/resprule/resprule.py index 77858f0d..7e4b8f99 100644 --- a/pkg/pipeline/resprule/resprule.py +++ b/pkg/pipeline/resprule/resprule.py @@ -5,7 +5,7 @@ from ...core import app from . import entities as rule_entities, rule from .rules import atbot, prefix, regexp, random -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr @@ -20,7 +20,7 @@ class GroupRespondRuleCheckStage(stage.PipelineStage): rule_matchers: list[rule.GroupRespondRule] """检查器实例""" - async def initialize(self): + async def initialize(self, pipeline_config: dict): """初始化检查器 """ diff --git a/pkg/pipeline/stage.py b/pkg/pipeline/stage.py index 206f2bdf..859286d9 100644 --- a/pkg/pipeline/stage.py +++ b/pkg/pipeline/stage.py @@ -28,7 +28,7 @@ class PipelineStage(metaclass=abc.ABCMeta): def __init__(self, ap: app.Application): self.ap = ap - async def initialize(self): + async def initialize(self, pipeline_config: dict): """初始化 """ pass diff --git a/pkg/pipeline/stagemgr.py b/pkg/pipeline/stagemgr.py deleted file mode 100644 index 19fce2d6..00000000 --- a/pkg/pipeline/stagemgr.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -from ..core import app -from . import stage -from .resprule import resprule -from .bansess import bansess -from .cntfilter import cntfilter -from .process import process -from .longtext import longtext -from .respback import respback -from .wrapper import wrapper -from .preproc import preproc -from .ratelimit import ratelimit -from .msgtrun import msgtrun - - -# 请求处理阶段顺序 -stage_order = [ - "GroupRespondRuleCheckStage", # 群响应规则检查 - "BanSessionCheckStage", # 封禁会话检查 - "PreContentFilterStage", # 内容过滤前置阶段 - "PreProcessor", # 预处理器 - "ConversationMessageTruncator", # 会话消息截断器 - "RequireRateLimitOccupancy", # 请求速率限制占用 - "MessageProcessor", # 处理器 - "ReleaseRateLimitOccupancy", # 释放速率限制占用 - "PostContentFilterStage", # 内容过滤后置阶段 - "ResponseWrapper", # 响应包装器 - "LongTextProcessStage", # 长文本处理 - "SendResponseBackStage", # 发送响应 -] - - -class StageInstContainer(): - """阶段实例容器 - """ - - inst_name: str - - inst: stage.PipelineStage - - def __init__(self, inst_name: str, inst: stage.PipelineStage): - self.inst_name = inst_name - self.inst = inst - - -class StageManager: - ap: app.Application - - stage_containers: list[StageInstContainer] - - def __init__(self, ap: app.Application): - self.ap = ap - - self.stage_containers = [] - - async def initialize(self): - """初始化 - """ - - for name, cls in stage.preregistered_stages.items(): - self.stage_containers.append(StageInstContainer( - inst_name=name, - inst=cls(self.ap) - )) - - for stage_containers in self.stage_containers: - await stage_containers.inst.initialize() - - # 按照 stage_order 排序 - self.stage_containers.sort(key=lambda x: stage_order.index(x.inst_name)) diff --git a/pkg/pipeline/wrapper/wrapper.py b/pkg/pipeline/wrapper/wrapper.py index a06e4a80..6b12ca65 100644 --- a/pkg/pipeline/wrapper/wrapper.py +++ b/pkg/pipeline/wrapper/wrapper.py @@ -5,7 +5,7 @@ import typing from ...core import app, entities as core_entities from .. import entities -from .. import stage, entities, stagemgr +from .. import stage, entities from ...core import entities as core_entities from ...config import manager as cfg_mgr from ...plugin import events @@ -22,7 +22,7 @@ class ResponseWrapper(stage.PipelineStage): - resp_message_chain """ - async def initialize(self): + async def initialize(self, pipeline_config: dict): pass async def process( @@ -110,7 +110,7 @@ class ResponseWrapper(stage.PipelineStage): query.resp_message_chain.append(platform_message.MessageChain([platform_message.Plain(reply_text)])) - if self.ap.platform_cfg.data['track-function-calls']: + if query.pipeline_config['output']['misc']['track-function-calls']: event_ctx = await self.ap.plugin_mgr.emit_event( event=events.NormalMessageResponded( diff --git a/pkg/platform/manager.py b/pkg/platform/manager.py index 81f15655..360f7588 100644 --- a/pkg/platform/manager.py +++ b/pkg/platform/manager.py @@ -55,25 +55,25 @@ class RuntimeBot: async def on_friend_message(event: platform_events.FriendMessage, adapter: msadapter.MessagePlatformAdapter): await self.ap.query_pool.add_query( + bot_uuid=self.bot_entity.uuid, launcher_type=core_entities.LauncherTypes.PERSON, launcher_id=event.sender.id, sender_id=event.sender.id, message_event=event, message_chain=event.message_chain, adapter=adapter, - pipeline_uuid=self.bot_entity.use_pipeline_uuid ) async def on_group_message(event: platform_events.GroupMessage, adapter: msadapter.MessagePlatformAdapter): await self.ap.query_pool.add_query( + bot_uuid=self.bot_entity.uuid, launcher_type=core_entities.LauncherTypes.GROUP, launcher_id=event.group.id, sender_id=event.sender.id, message_event=event, message_chain=event.message_chain, adapter=adapter, - pipeline_uuid=self.bot_entity.use_pipeline_uuid ) self.adapter.register_listener( @@ -113,14 +113,16 @@ class RuntimeBot: async def shutdown(self): await self.adapter.kill() + self.ap.task_mgr.cancel_task(self.task_wrapper.id) + # 控制QQ消息输入输出的类 class PlatformManager: # adapter: msadapter.MessageSourceAdapter = None - adapters: list[msadapter.MessagePlatformAdapter] = [] + adapters: list[msadapter.MessagePlatformAdapter] = [] # deprecated - message_platform_adapter_components: list[engine.Component] = [] + message_platform_adapter_components: list[engine.Component] = [] # deprecated # ====== 4.0 ====== ap: app.Application = None @@ -215,50 +217,36 @@ class PlatformManager: return None async def write_back_config(self, adapter_name: str, adapter_inst: msadapter.MessagePlatformAdapter, config: dict): - index = -2 + # index = -2 - for i, adapter in enumerate(self.adapters): - if adapter == adapter_inst: - index = i - break + # for i, adapter in enumerate(self.adapters): + # if adapter == adapter_inst: + # index = i + # break - if index == -2: - raise Exception('平台适配器未找到') + # if index == -2: + # raise Exception('平台适配器未找到') - # 只修改启用的适配器 - real_index = -1 + # # 只修改启用的适配器 + # real_index = -1 - for i, adapter in enumerate(self.ap.platform_cfg.data['platform-adapters']): - if adapter['enable']: - index -= 1 - if index == -1: - real_index = i - break + # for i, adapter in enumerate(self.ap.platform_cfg.data['platform-adapters']): + # if adapter['enable']: + # index -= 1 + # if index == -1: + # real_index = i + # break - new_cfg = { - 'adapter': adapter_name, - 'enable': True, - **config - } - self.ap.platform_cfg.data['platform-adapters'][real_index] = new_cfg - await self.ap.platform_cfg.dump_config() + # new_cfg = { + # 'adapter': adapter_name, + # 'enable': True, + # **config + # } + # self.ap.platform_cfg.data['platform-adapters'][real_index] = new_cfg + # await self.ap.platform_cfg.dump_config() - async def send(self, event: platform_events.MessageEvent, msg: platform_message.MessageChain, adapter: msadapter.MessagePlatformAdapter): - - if self.ap.platform_cfg.data['at-sender'] and isinstance(event, platform_events.GroupMessage): - - msg.insert( - 0, - platform_message.At( - event.sender.id - ) - ) - - await adapter.reply_message( - event, - msg, - quote_origin=True if self.ap.platform_cfg.data['quote-origin'] else False - ) + # TODO implement this + pass async def run(self): # This method will only be called when the application launching @@ -270,4 +258,4 @@ class PlatformManager: for bot in self.bots: if bot.enable: await bot.shutdown() - self.ap.task_mgr.cancel_by_scope(core_entities.LifecycleControlScope.PLATFORM) \ No newline at end of file + self.ap.task_mgr.cancel_by_scope(core_entities.LifecycleControlScope.PLATFORM) diff --git a/pkg/platform/sources/aiocqhttp.py b/pkg/platform/sources/aiocqhttp.py index af14372a..9149e427 100644 --- a/pkg/platform/sources/aiocqhttp.py +++ b/pkg/platform/sources/aiocqhttp.py @@ -238,4 +238,6 @@ class AiocqhttpAdapter(adapter.MessagePlatformAdapter): await self.bot._server_app.run_task(**self.config) async def kill(self) -> bool: + # Current issue: existing connection will not be closed + # self.should_shutdown = True return False diff --git a/pkg/plugin/context.py b/pkg/plugin/context.py index 76a49bf4..7a9be2a1 100644 --- a/pkg/plugin/context.py +++ b/pkg/plugin/context.py @@ -222,10 +222,10 @@ class EventContext: Args: message_chain (platform.types.MessageChain): 源平台的消息链,若用户使用的不是源平台适配器,程序也能自动转换为目标平台消息链 """ - await self.host.ap.platform_mgr.send( - event=self.event.query.message_event, - msg=message_chain, - adapter=self.event.query.adapter, + # TODO 添加 at_sender 和 quote_origin 参数 + await self.event.query.adapter.reply_message( + message_source=self.event.query.message_event, + message=message_chain ) async def send_message( diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 7db7a040..41e97f3e 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -2,6 +2,7 @@ from __future__ import annotations import typing import sqlalchemy +import pydantic.v1 as pydantic from . import entities, requester from ...core import app @@ -16,23 +17,6 @@ from .requesters import bailianchatcmpl, chatcmpl, anthropicmsgs, moonshotchatcm FETCH_MODEL_LIST_URL = "https://api.qchatgpt.rockchin.top/api/v2/fetch/model_list" -class RuntimeLLMModel: - """运行时模型""" - - model_entity: persistence_model.LLMModel - """模型数据""" - - token_mgr: token.TokenManager - """api key管理器""" - - requester: requester.LLMAPIRequester - """请求器实例""" - - def __init__(self, model_entity: persistence_model.LLMModel, token_mgr: token.TokenManager, requester: requester.LLMAPIRequester): - self.model_entity = model_entity - self.token_mgr = token_mgr - self.requester = requester - class ModelManager: """模型管理器""" @@ -47,7 +31,7 @@ class ModelManager: ap: app.Application - llm_models: list[RuntimeLLMModel] + llm_models: list[requester.RuntimeLLMModel] requester_components: list[engine.Component] @@ -99,16 +83,20 @@ class ModelManager: elif isinstance(model_info, dict): model_info = persistence_model.LLMModel(**model_info) - runtime_llm_model = RuntimeLLMModel( + requester_inst = self.requester_dict[model_info.requester]( + ap=self.ap, + config=model_info.requester_config + ) + + await requester_inst.initialize() + + runtime_llm_model = requester.RuntimeLLMModel( model_entity=model_info, token_mgr=token.TokenManager( name=model_info.uuid, tokens=model_info.api_keys, ), - requester=self.requester_dict[model_info.requester]( - ap=self.ap, - config=model_info.requester_config - ) + requester=requester_inst ) self.llm_models.append(runtime_llm_model) diff --git a/pkg/provider/modelmgr/requester.py b/pkg/provider/modelmgr/requester.py index 7f13c58b..5ea8d23f 100644 --- a/pkg/provider/modelmgr/requester.py +++ b/pkg/provider/modelmgr/requester.py @@ -6,8 +6,27 @@ import typing from ...core import app from ...core import entities as core_entities from .. import entities as llm_entities -from . import entities as modelmgr_entities from ..tools import entities as tools_entities +from ...entity.persistence import model as persistence_model +from . import token + + +class RuntimeLLMModel: + """运行时模型""" + + model_entity: persistence_model.LLMModel + """模型数据""" + + token_mgr: token.TokenManager + """api key管理器""" + + requester: LLMAPIRequester + """请求器实例""" + + def __init__(self, model_entity: persistence_model.LLMModel, token_mgr: token.TokenManager, requester: LLMAPIRequester): + self.model_entity = model_entity + self.token_mgr = token_mgr + self.requester = requester class LLMAPIRequester(metaclass=abc.ABCMeta): @@ -31,21 +50,11 @@ class LLMAPIRequester(metaclass=abc.ABCMeta): async def initialize(self): pass - async def preprocess( - self, - query: core_entities.Query, - ): - """预处理 - - 在这里处理特定API对Query对象的兼容性问题。 - """ - pass - @abc.abstractmethod - async def call( + async def invoke_llm( self, query: core_entities.Query, - model: modelmgr_entities.LLMModelInfo, + model: RuntimeLLMModel, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, @@ -53,7 +62,7 @@ class LLMAPIRequester(metaclass=abc.ABCMeta): """调用API Args: - model (modelmgr_entities.LLMModelInfo): 使用的模型信息 + model (RuntimeLLMModel): 使用的模型信息 messages (typing.List[llm_entities.Message]): 消息对象列表 funcs (typing.List[tools_entities.LLMFunction], optional): 使用的工具函数列表. Defaults to None. extra_args (dict[str, typing.Any], optional): 额外的参数. Defaults to {}. diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.py b/pkg/provider/modelmgr/requesters/anthropicmsgs.py index 937f5107..7edc4405 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.py +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.py @@ -24,16 +24,16 @@ class AnthropicMessages(requester.LLMAPIRequester): client: anthropic.AsyncAnthropic default_config: dict[str, typing.Any] = { - 'base-url': 'https://api.anthropic.com/v1', + 'base_url': 'https://api.anthropic.com/v1', 'timeout': 120, } async def initialize(self): httpx_client = anthropic._base_client.AsyncHttpxClientWrapper( - base_url=self.ap.provider_cfg.data['requester']['anthropic-messages']['base-url'], + base_url=self.requester_cfg['base_url'], # cast to a valid type because mypy doesn't understand our type narrowing - timeout=typing.cast(httpx.Timeout, self.ap.provider_cfg.data['requester']['anthropic-messages']['timeout']), + timeout=typing.cast(httpx.Timeout, self.requester_cfg['timeout']), limits=anthropic._constants.DEFAULT_CONNECTION_LIMITS, follow_redirects=True, trust_env=True, @@ -44,17 +44,18 @@ class AnthropicMessages(requester.LLMAPIRequester): http_client=httpx_client, ) - async def call( + async def invoke_llm( self, query: core_entities.Query, - model: entities.LLMModelInfo, + model: requester.RuntimeLLMModel, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = model.token_mgr.get_token() - args = self.ap.provider_cfg.data['requester']['anthropic-messages']['args'].copy() - args["model"] = model.name if model.model_name is None else model.model_name + args = extra_args.copy() + args["model"] = model.model_entity.name # 处理消息 diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml index 80380857..6d1a53cf 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: Anthropic spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.py b/pkg/provider/modelmgr/requesters/bailianchatcmpl.py index ce718c4c..e20e3376 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.py @@ -14,6 +14,6 @@ class BailianChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'https://dashscope.aliyuncs.com/compatible-mode/v1', + 'base_url': 'https://dashscope.aliyuncs.com/compatible-mode/v1', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml index 74d197ca..136e903f 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 阿里云百炼 spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.py b/pkg/provider/modelmgr/requesters/chatcmpl.py index 7cf255c0..d1d9767f 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.py +++ b/pkg/provider/modelmgr/requesters/chatcmpl.py @@ -26,7 +26,7 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - "base-url": "https://api.openai.com/v1", + "base_url": "https://api.openai.com/v1", "timeout": 120, } @@ -34,7 +34,7 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): self.client = openai.AsyncClient( api_key="", - base_url=self.requester_cfg["base-url"], + base_url=self.requester_cfg["base_url"], timeout=self.requester_cfg["timeout"], http_client=httpx.AsyncClient( trust_env=True, timeout=self.requester_cfg["timeout"] @@ -65,16 +65,14 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): self, query: core_entities.Query, req_messages: list[dict], - use_model: entities.LLMModelInfo, + use_model: requester.RuntimeLLMModel, use_funcs: list[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, # TODO: 所有的args都改为从此参数读取 ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() - args = self.requester_cfg["args"].copy() - args["model"] = ( - use_model.name if use_model.model_name is None else use_model.model_name - ) + args = extra_args.copy() + args["model"] = use_model.model_entity.name if use_funcs: tools = await self.ap.tool_mgr.generate_tools_for_openai(use_funcs) @@ -104,10 +102,10 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): return message - async def call( + async def invoke_llm( self, query: core_entities.Query, - model: entities.LLMModelInfo, + model: requester.RuntimeLLMModel, messages: typing.List[llm_entities.Message], funcs: typing.List[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.yaml b/pkg/provider/modelmgr/requesters/chatcmpl.yaml index fe4d3cb5..a67e23d1 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/chatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: OpenAI spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py index e82d0d81..ee17ac05 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.py @@ -13,7 +13,7 @@ class DeepseekChatCompletions(chatcmpl.OpenAIChatCompletions): """Deepseek ChatCompletion API 请求器""" default_config: dict[str, typing.Any] = { - 'base-url': 'https://api.deepseek.com', + 'base_url': 'https://api.deepseek.com', 'timeout': 120, } @@ -21,14 +21,14 @@ class DeepseekChatCompletions(chatcmpl.OpenAIChatCompletions): self, query: core_entities.Query, req_messages: list[dict], - use_model: entities.LLMModelInfo, + use_model: requester.RuntimeLLMModel, use_funcs: list[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() - args = self.requester_cfg['args'].copy() - args["model"] = use_model.name if use_model.model_name is None else use_model.model_name + args = extra_args.copy() + args["model"] = use_model.model_entity.name if use_funcs: tools = await self.ap.tool_mgr.generate_tools_for_openai(use_funcs) diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml index 2ef91aa2..9890e21e 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 深度求索 spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py index dec0b8d1..35052682 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.py @@ -18,7 +18,7 @@ class GiteeAIChatCompletions(chatcmpl.OpenAIChatCompletions): """Gitee AI ChatCompletions API 请求器""" default_config: dict[str, typing.Any] = { - 'base-url': 'https://ai.gitee.com/v1', + 'base_url': 'https://ai.gitee.com/v1', 'timeout': 120, } @@ -26,14 +26,14 @@ class GiteeAIChatCompletions(chatcmpl.OpenAIChatCompletions): self, query: core_entities.Query, req_messages: list[dict], - use_model: entities.LLMModelInfo, + use_model: requester.RuntimeLLMModel, use_funcs: list[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() - args = self.requester_cfg['args'].copy() - args["model"] = use_model.name if use_model.model_name is None else use_model.model_name + args = extra_args.copy() + args["model"] = use_model.model_entity.name if use_funcs: tools = await self.ap.tool_mgr.generate_tools_for_openai(use_funcs) diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml index 11f7e06e..3e4efd61 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: Gitee AI spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py index c00be372..6be76051 100644 --- a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py +++ b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.py @@ -14,6 +14,6 @@ class LmStudioChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'http://127.0.0.1:1234/v1', + 'base_url': 'http://127.0.0.1:1234/v1', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml index 959d4151..219e5839 100644 --- a/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/lmstudiochatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: LM Studio spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py index 3cbe8837..1ef7d9c9 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.py @@ -15,7 +15,7 @@ class MoonshotChatCompletions(chatcmpl.OpenAIChatCompletions): """Moonshot ChatCompletion API 请求器""" default_config: dict[str, typing.Any] = { - 'base-url': 'https://api.moonshot.cn/v1', + 'base_url': 'https://api.moonshot.cn/v1', 'timeout': 120, } @@ -23,14 +23,14 @@ class MoonshotChatCompletions(chatcmpl.OpenAIChatCompletions): self, query: core_entities.Query, req_messages: list[dict], - use_model: entities.LLMModelInfo, + use_model: requester.RuntimeLLMModel, use_funcs: list[tools_entities.LLMFunction] = None, extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() - args = self.requester_cfg['args'].copy() - args["model"] = use_model.name if use_model.model_name is None else use_model.model_name + args = extra_args.copy() + args["model"] = use_model.model_entity.name if use_funcs: tools = await self.ap.tool_mgr.generate_tools_for_openai(use_funcs) diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml index 56deb1df..7290784f 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 月之暗面 spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/ollamachat.py b/pkg/provider/modelmgr/requesters/ollamachat.py index fa99cfe5..ee331036 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.py +++ b/pkg/provider/modelmgr/requesters/ollamachat.py @@ -22,35 +22,38 @@ REQUESTER_NAME: str = "ollama-chat" class OllamaChatCompletions(requester.LLMAPIRequester): """Ollama平台 ChatCompletion API请求器""" + client: ollama.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'http://127.0.0.1:11434', - 'timeout': 120, + "base_url": "http://127.0.0.1:11434", + "timeout": 120, } async def initialize(self): - os.environ['OLLAMA_HOST'] = self.requester_cfg['base-url'] - self.client = ollama.AsyncClient( - timeout=self.requester_cfg['timeout'] - ) + os.environ["OLLAMA_HOST"] = self.requester_cfg["base_url"] + self.client = ollama.AsyncClient(timeout=self.requester_cfg["timeout"]) - async def _req(self, - args: dict, - ) -> Union[Mapping[str, Any], AsyncIterator[Mapping[str, Any]]]: - return await self.client.chat( - **args - ) + async def _req( + self, + args: dict, + ) -> Union[Mapping[str, Any], AsyncIterator[Mapping[str, Any]]]: + return await self.client.chat(**args) - async def _closure(self, query: core_entities.Query, req_messages: list[dict], use_model: entities.LLMModelInfo, - user_funcs: list[tools_entities.LLMFunction] = None, - extra_args: dict[str, typing.Any] = {}) -> llm_entities.Message: - args: Any = self.requester_cfg['args'].copy() - args["model"] = use_model.name if use_model.model_name is None else use_model.model_name + async def _closure( + self, + query: core_entities.Query, + req_messages: list[dict], + use_model: requester.RuntimeLLMModel, + user_funcs: list[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, + ) -> llm_entities.Message: + args = extra_args.copy() + args["model"] = use_model.model_entity.name messages: list[dict] = req_messages.copy() for msg in messages: - if 'content' in msg and isinstance(msg["content"], list): + if "content" in msg and isinstance(msg["content"], list): text_content: list = [] image_urls: list = [] for me in msg["content"]: @@ -58,12 +61,16 @@ class OllamaChatCompletions(requester.LLMAPIRequester): text_content.append(me["text"]) elif me["type"] == "image_base64": image_urls.append(me["image_base64"]) - + msg["content"] = "\n".join(text_content) - msg["images"] = [url.split(',')[1] for url in image_urls] - if 'tool_calls' in msg: # LangBot 内部以 str 存储 tool_calls 的参数,这里需要转换为 dict - for tool_call in msg['tool_calls']: - tool_call['function']['arguments'] = json.loads(tool_call['function']['arguments']) + msg["images"] = [url.split(",")[1] for url in image_urls] + if ( + "tool_calls" in msg + ): # LangBot 内部以 str 存储 tool_calls 的参数,这里需要转换为 dict + for tool_call in msg["tool_calls"]: + tool_call["function"]["arguments"] = json.loads( + tool_call["function"]["arguments"] + ) args["messages"] = messages args["tools"] = [] @@ -77,8 +84,8 @@ class OllamaChatCompletions(requester.LLMAPIRequester): return message async def _make_msg( - self, - chat_completions: ollama.ChatResponse) -> llm_entities.Message: + self, chat_completions: ollama.ChatResponse + ) -> llm_entities.Message: message: ollama.Message = chat_completions.message if message is None: raise ValueError("chat_completions must contain a 'message' field") @@ -86,43 +93,51 @@ class OllamaChatCompletions(requester.LLMAPIRequester): ret_msg: llm_entities.Message = None if message.content is not None: - ret_msg = llm_entities.Message( - role="assistant", - content=message.content - ) + ret_msg = llm_entities.Message(role="assistant", content=message.content) if message.tool_calls is not None and len(message.tool_calls) > 0: tool_calls: list[llm_entities.ToolCall] = [] for tool_call in message.tool_calls: - tool_calls.append(llm_entities.ToolCall( - id=uuid.uuid4().hex, - type="function", - function=llm_entities.FunctionCall( - name=tool_call.function.name, - arguments=json.dumps(tool_call.function.arguments) + tool_calls.append( + llm_entities.ToolCall( + id=uuid.uuid4().hex, + type="function", + function=llm_entities.FunctionCall( + name=tool_call.function.name, + arguments=json.dumps(tool_call.function.arguments), + ), ) - )) + ) ret_msg.tool_calls = tool_calls return ret_msg - async def call( - self, - query: core_entities.Query, - model: entities.LLMModelInfo, - messages: typing.List[llm_entities.Message], - funcs: typing.List[tools_entities.LLMFunction] = None, - extra_args: dict[str, typing.Any] = {}, + async def invoke_llm( + self, + query: core_entities.Query, + model: requester.RuntimeLLMModel, + messages: typing.List[llm_entities.Message], + funcs: typing.List[tools_entities.LLMFunction] = None, + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: req_messages: list = [] for m in messages: msg_dict: dict = m.dict(exclude_none=True) content: Any = msg_dict.get("content") if isinstance(content, list): - if all(isinstance(part, dict) and part.get('type') == 'text' for part in content): + if all( + isinstance(part, dict) and part.get("type") == "text" + for part in content + ): msg_dict["content"] = "\n".join(part["text"] for part in content) req_messages.append(msg_dict) try: - return await self._closure(query, req_messages, model, funcs, extra_args) + return await self._closure( + query=query, + req_messages=req_messages, + use_model=model, + use_funcs=funcs, + extra_args=extra_args, + ) except asyncio.TimeoutError: - raise errors.RequesterError('请求超时') + raise errors.RequesterError("请求超时") diff --git a/pkg/provider/modelmgr/requesters/ollamachat.yaml b/pkg/provider/modelmgr/requesters/ollamachat.yaml index b162e5db..ba915aeb 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.yaml +++ b/pkg/provider/modelmgr/requesters/ollamachat.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: Ollama spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py index a990f809..dd5b9a14 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.py @@ -14,6 +14,6 @@ class SiliconFlowChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'https://api.siliconflow.cn/v1', + 'base_url': 'https://api.siliconflow.cn/v1', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml index 28d534f6..c938b21c 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 硅基流动 spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py index fbf88826..9b5505e1 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.py @@ -14,6 +14,6 @@ class VolcArkChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'https://ark.cn-beijing.volces.com/api/v3', + 'base_url': 'https://ark.cn-beijing.volces.com/api/v3', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml index f18c7b2c..56347bc5 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 火山方舟 spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.py b/pkg/provider/modelmgr/requesters/xaichatcmpl.py index 47c2939a..e08af875 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.py @@ -14,6 +14,6 @@ class XaiChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'https://api.x.ai/v1', + 'base_url': 'https://api.x.ai/v1', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml index ceda8c0d..604b88c6 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: xAI spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py index 1e24a5ef..7bbca164 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.py @@ -14,6 +14,6 @@ class ZhipuAIChatCompletions(chatcmpl.OpenAIChatCompletions): client: openai.AsyncClient default_config: dict[str, typing.Any] = { - 'base-url': 'https://open.bigmodel.cn/api/paas/v4', + 'base_url': 'https://open.bigmodel.cn/api/paas/v4', 'timeout': 120, } diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml index 3d112ca1..20b8b496 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml @@ -7,7 +7,7 @@ metadata: zh_CN: 智谱 AI spec: config: - - name: base-url + - name: base_url label: en_US: Base URL zh_CN: 基础 URL diff --git a/pkg/provider/runner.py b/pkg/provider/runner.py index 5a5cf6ef..1762e546 100644 --- a/pkg/provider/runner.py +++ b/pkg/provider/runner.py @@ -27,11 +27,11 @@ class RequestRunner(abc.ABC): ap: app.Application - def __init__(self, ap: app.Application): - self.ap = ap + pipeline_config: dict - async def initialize(self): - pass + def __init__(self, ap: app.Application, pipeline_config: dict): + self.ap = ap + self.pipeline_config = pipeline_config @abc.abstractmethod async def run(self, query: core_entities.Query) -> typing.AsyncGenerator[llm_entities.Message, None]: diff --git a/pkg/provider/runnermgr.py b/pkg/provider/runnermgr.py deleted file mode 100644 index 52e1d8d2..00000000 --- a/pkg/provider/runnermgr.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from . import runner -from ..core import app - -from .runners import localagent -from .runners import difysvapi -from .runners import dashscopeapi - -class RunnerManager: - - ap: app.Application - - using_runner: runner.RequestRunner - - def __init__(self, ap: app.Application): - self.ap = ap - - async def initialize(self): - - for r in runner.preregistered_runners: - if r.name == self.ap.provider_cfg.data['runner']: - self.using_runner = r(self.ap) - await self.using_runner.initialize() - break - else: - raise ValueError(f"未找到请求运行器: {self.ap.provider_cfg.data['runner']}") - - def get_runner(self) -> runner.RequestRunner: - return self.using_runner diff --git a/pkg/provider/runners/dashscopeapi.py b/pkg/provider/runners/dashscopeapi.py index 0bb09822..d5e6a83d 100644 --- a/pkg/provider/runners/dashscopeapi.py +++ b/pkg/provider/runners/dashscopeapi.py @@ -8,7 +8,7 @@ import re import dashscope from .. import runner -from ...core import entities as core_entities +from ...core import app, entities as core_entities from .. import entities as llm_entities from ...utils import image @@ -29,12 +29,14 @@ class DashScopeAPIRunner(runner.RequestRunner): app_id: str # 应用ID api_key: str # API Key references_quote: str # 引用资料提示(当展示回答来源功能开启时,这个变量会作为引用资料名前的提示,可在provider.json中配置) - biz_params: dict = {} # 工作流应用参数(仅在工作流应用中生效) - async def initialize(self): + def __init__(self, ap: app.Application, pipeline_config: dict): """初始化""" + self.ap = ap + self.pipeline_config = pipeline_config + valid_app_types = ["agent", "workflow"] - self.app_type = self.ap.provider_cfg.data["dashscope-app-api"]["app-type"] + self.app_type = self.pipeline_config["ai"]["dashscope-app-api"]["app-type"] #检查配置文件中使用的应用类型是否支持 if (self.app_type not in valid_app_types): raise DashscopeAPIError( @@ -42,10 +44,9 @@ class DashScopeAPIRunner(runner.RequestRunner): ) #初始化Dashscope 参数配置 - self.app_id = self.ap.provider_cfg.data["dashscope-app-api"][self.app_type]["app-id"] - self.api_key = self.ap.provider_cfg.data["dashscope-app-api"]["api-key"] - self.references_quote = self.ap.provider_cfg.data["dashscope-app-api"][self.app_type]["references_quote"] - self.biz_params = self.ap.provider_cfg.data["dashscope-app-api"]["workflow"]["biz_params"] + self.app_id = self.pipeline_config["ai"]["dashscope-app-api"]["app-id"] + self.api_key = self.pipeline_config["ai"]["dashscope-app-api"]["api-key"] + self.references_quote = self.pipeline_config["ai"]["dashscope-app-api"]["references_quote"] def _replace_references(self, text, references_dict): """阿里云百炼平台的自定义应用支持资料引用,此函数可以将引用标签替换为参考资料""" @@ -169,7 +170,6 @@ class DashScopeAPIRunner(runner.RequestRunner): plain_text, image_ids = await self._preprocess_user_message(query) biz_params = {} - biz_params.update(self.biz_params) biz_params.update(query.variables) #发送对话请求 @@ -220,21 +220,19 @@ class DashScopeAPIRunner(runner.RequestRunner): content=pending_content, ) - - async def run( self, query: core_entities.Query ) -> typing.AsyncGenerator[llm_entities.Message, None]: """运行""" - if self.ap.provider_cfg.data["dashscope-app-api"]["app-type"] == "agent": + if self.app_type == "agent": async for msg in self._agent_messages(query): yield msg - elif self.ap.provider_cfg.data["dashscope-app-api"]["app-type"] == "workflow": + elif self.app_type == "workflow": async for msg in self._workflow_messages(query): yield msg else: raise DashscopeAPIError( - f"不支持的 Dashscope 应用类型: {self.ap.provider_cfg.data['dashscope-app-api']['app-type']}" + f"不支持的 Dashscope 应用类型: {self.app_type}" ) diff --git a/pkg/provider/runners/difysvapi.py b/pkg/provider/runners/difysvapi.py index 81ceddee..f48cbd57 100644 --- a/pkg/provider/runners/difysvapi.py +++ b/pkg/provider/runners/difysvapi.py @@ -10,7 +10,7 @@ import datetime import aiohttp from .. import runner -from ...core import entities as core_entities +from ...core import app, entities as core_entities from .. import entities as llm_entities from ...utils import image @@ -23,24 +23,24 @@ class DifyServiceAPIRunner(runner.RequestRunner): dify_client: client.AsyncDifyServiceClient - async def initialize(self): - """初始化""" + def __init__(self, ap: app.Application, pipeline_config: dict): + self.ap = ap + self.pipeline_config = pipeline_config + valid_app_types = ["chat", "agent", "workflow"] if ( - self.ap.provider_cfg.data["dify-service-api"]["app-type"] + self.pipeline_config["ai"]["dify-service-api"]["app-type"] not in valid_app_types ): raise errors.DifyAPIError( - f"不支持的 Dify 应用类型: {self.ap.provider_cfg.data['dify-service-api']['app-type']}" + f"不支持的 Dify 应用类型: {self.pipeline_config['ai']['dify-service-api']['app-type']}" ) - api_key = self.ap.provider_cfg.data["dify-service-api"][ - self.ap.provider_cfg.data["dify-service-api"]["app-type"] - ]["api-key"] + api_key = self.pipeline_config["ai"]["dify-service-api"]["api-key"] self.dify_client = client.AsyncDifyServiceClient( api_key=api_key, - base_url=self.ap.provider_cfg.data["dify-service-api"]["base-url"], + base_url=self.pipeline_config["ai"]["dify-service-api"]["base-url"], ) def _try_convert_thinking(self, resp_text: str) -> str: @@ -48,13 +48,13 @@ class DifyServiceAPIRunner(runner.RequestRunner): if not resp_text.startswith("
Thinking... "): return resp_text - if self.ap.provider_cfg.data["dify-service-api"]["options"]["convert-thinking-tips"] == "original": + if self.pipeline_config["ai"]["dify-service-api"]["thinking-convert"] == "original": return resp_text - if self.ap.provider_cfg.data["dify-service-api"]["options"]["convert-thinking-tips"] == "remove": + if self.pipeline_config["ai"]["dify-service-api"]["thinking-convert"] == "remove": return re.sub(r'
Thinking... .*?
', '', resp_text, flags=re.DOTALL) - if self.ap.provider_cfg.data["dify-service-api"]["options"]["convert-thinking-tips"] == "plain": + if self.pipeline_config["ai"]["dify-service-api"]["thinking-convert"] == "plain": pattern = r'
Thinking... (.*?)
' thinking_text = re.search(pattern, resp_text, flags=re.DOTALL) content_text = re.sub(pattern, '', resp_text, flags=re.DOTALL) @@ -121,7 +121,7 @@ class DifyServiceAPIRunner(runner.RequestRunner): user=f"{query.session.launcher_type.value}_{query.session.launcher_id}", conversation_id=cov_id, files=files, - timeout=self.ap.provider_cfg.data["dify-service-api"]["chat"]["timeout"], + timeout=self.pipeline_config["ai"]["dify-service-api"]["timeout"], ): self.ap.logger.debug("dify-chat-chunk: " + str(chunk)) @@ -177,7 +177,7 @@ class DifyServiceAPIRunner(runner.RequestRunner): response_mode="streaming", conversation_id=cov_id, files=files, - timeout=self.ap.provider_cfg.data["dify-service-api"]["chat"]["timeout"], + timeout=self.pipeline_config["ai"]["dify-service-api"]["timeout"], ): self.ap.logger.debug("dify-agent-chunk: " + str(chunk)) @@ -264,7 +264,7 @@ class DifyServiceAPIRunner(runner.RequestRunner): inputs=inputs, user=f"{query.session.launcher_type.value}_{query.session.launcher_id}", files=files, - timeout=self.ap.provider_cfg.data["dify-service-api"]["workflow"]["timeout"], + timeout=self.pipeline_config["ai"]["dify-service-api"]["timeout"], ): self.ap.logger.debug("dify-workflow-chunk: " + str(chunk)) if chunk["event"] in ignored_events: @@ -301,11 +301,7 @@ class DifyServiceAPIRunner(runner.RequestRunner): msg = llm_entities.Message( role="assistant", - content=chunk["data"]["outputs"][ - self.ap.provider_cfg.data["dify-service-api"]["workflow"][ - "output-key" - ] - ], + content=chunk["data"]["outputs"]["summary"], ) yield msg @@ -314,16 +310,16 @@ class DifyServiceAPIRunner(runner.RequestRunner): self, query: core_entities.Query ) -> typing.AsyncGenerator[llm_entities.Message, None]: """运行请求""" - if self.ap.provider_cfg.data["dify-service-api"]["app-type"] == "chat": + if self.pipeline_config["ai"]["dify-service-api"]["app-type"] == "chat": async for msg in self._chat_messages(query): yield msg - elif self.ap.provider_cfg.data["dify-service-api"]["app-type"] == "agent": + elif self.pipeline_config["ai"]["dify-service-api"]["app-type"] == "agent": async for msg in self._agent_chat_messages(query): yield msg - elif self.ap.provider_cfg.data["dify-service-api"]["app-type"] == "workflow": + elif self.pipeline_config["ai"]["dify-service-api"]["app-type"] == "workflow": async for msg in self._workflow_messages(query): yield msg else: raise errors.DifyAPIError( - f"不支持的 Dify 应用类型: {self.ap.provider_cfg.data['dify-service-api']['app-type']}" + f"不支持的 Dify 应用类型: {self.pipeline_config['ai']['dify-service-api']['app-type']}" ) diff --git a/pkg/provider/runners/localagent.py b/pkg/provider/runners/localagent.py index f05c82e3..68bb2b4f 100644 --- a/pkg/provider/runners/localagent.py +++ b/pkg/provider/runners/localagent.py @@ -16,14 +16,12 @@ class LocalAgentRunner(runner.RequestRunner): async def run(self, query: core_entities.Query) -> typing.AsyncGenerator[llm_entities.Message, None]: """运行请求 """ - await query.use_model.requester.preprocess(query) - pending_tool_calls = [] req_messages = query.prompt.messages.copy() + query.messages.copy() + [query.user_message] # 首次请求 - msg = await query.use_model.requester.call(query, query.use_model, req_messages, query.use_funcs) + msg = await query.use_llm_model.requester.invoke_llm(query, query.use_llm_model, req_messages, query.use_funcs) yield msg @@ -61,7 +59,7 @@ class LocalAgentRunner(runner.RequestRunner): req_messages.append(err_msg) # 处理完所有调用,再次请求 - msg = await query.use_model.requester.call(query, query.use_model, req_messages, query.use_funcs) + msg = await query.use_llm_model.requester.invoke_llm(query, query.use_llm_model, req_messages, query.use_funcs) yield msg diff --git a/pkg/provider/session/sessionmgr.py b/pkg/provider/session/sessionmgr.py index 00523472..83691e4c 100644 --- a/pkg/provider/session/sessionmgr.py +++ b/pkg/provider/session/sessionmgr.py @@ -41,7 +41,7 @@ class SessionManager: self.session_list.append(session) return session - async def get_conversation(self, session: core_entities.Session) -> core_entities.Conversation: + async def get_conversation(self, query: core_entities.Query, session: core_entities.Session) -> core_entities.Conversation: """获取对话或创建对话""" if not session.conversations: @@ -51,7 +51,9 @@ class SessionManager: conversation = core_entities.Conversation( prompt=await self.ap.prompt_mgr.get_prompt(session.use_prompt_name), messages=[], - use_model=await self.ap.model_mgr.get_model_by_name(self.ap.provider_cfg.data['model']), + use_llm_model=await self.ap.model_mgr.get_model_by_uuid( + query.pipeline_config['ai']['local-agent']['model'] + ), use_funcs=await self.ap.tool_mgr.get_all_functions( plugin_enabled=True, ), From 4e7b9aaf5908a09660fcc588a498d5adf7722ebb Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Wed, 2 Apr 2025 11:54:01 +0800 Subject: [PATCH 023/205] chore: use model_dump in chatcmpl instead of `dict()` --- pkg/provider/modelmgr/requesters/chatcmpl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.py b/pkg/provider/modelmgr/requesters/chatcmpl.py index d1d9767f..b59ab42d 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.py +++ b/pkg/provider/modelmgr/requesters/chatcmpl.py @@ -51,7 +51,7 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): self, chat_completion: chat_completion.ChatCompletion, ) -> llm_entities.Message: - chatcmpl_message = chat_completion.choices[0].message.dict() + chatcmpl_message = chat_completion.choices[0].message.model_dump() # 确保 role 字段存在且不为 None if "role" not in chatcmpl_message or chatcmpl_message["role"] is None: From 913e43d84c102847fb351aaae25ea5472ac0e2b2 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 3 Apr 2025 12:50:18 +0800 Subject: [PATCH 024/205] feat: make prompt object type array in pipeline config --- pkg/platform/sources/qqbotpy.yaml | 4 +++- templates/metadata/pipeline/ai.yaml | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pkg/platform/sources/qqbotpy.yaml b/pkg/platform/sources/qqbotpy.yaml index 79653194..a7913042 100644 --- a/pkg/platform/sources/qqbotpy.yaml +++ b/pkg/platform/sources/qqbotpy.yaml @@ -28,9 +28,11 @@ spec: label: en_US: Intents zh_CN: 权限 - type: array[string] + type: array required: true default: [] + items: + type: string execution: python: path: ./qqbotpy.py diff --git a/templates/metadata/pipeline/ai.yaml b/templates/metadata/pipeline/ai.yaml index 74566a31..8b7959f6 100644 --- a/templates/metadata/pipeline/ai.yaml +++ b/templates/metadata/pipeline/ai.yaml @@ -54,9 +54,16 @@ stages: label: en_US: Prompt zh_CN: 提示词 - type: string + type: array required: true - default: "You are a helpful assistant." + items: + type: object + properties: + role: + type: string + default: user + content: + type: string - name: dify-service-api label: en_US: Dify Service API From fb18278bdcf0c43aedaa519c93c8a8dbad6e5c16 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 3 Apr 2025 17:06:01 +0800 Subject: [PATCH 025/205] refactor: move prompt mgm to pipeline --- pkg/api/http/service/pipeline.py | 9 ++-- pkg/command/cmdmgr.py | 2 +- pkg/command/operators/default.py | 62 ---------------------- pkg/core/app.py | 8 --- pkg/core/entities.py | 5 +- pkg/core/stages/build_app.py | 5 -- pkg/pipeline/preproc/preproc.py | 2 +- pkg/provider/entities.py | 12 +++++ pkg/provider/session/sessionmgr.py | 16 +++++- pkg/provider/sysprompt/__init__.py | 0 pkg/provider/sysprompt/entities.py | 16 ------ pkg/provider/sysprompt/loader.py | 46 ---------------- pkg/provider/sysprompt/loaders/__init__.py | 0 pkg/provider/sysprompt/loaders/scenario.py | 39 -------------- pkg/provider/sysprompt/loaders/single.py | 43 --------------- pkg/provider/sysprompt/sysprompt.py | 56 ------------------- 16 files changed, 36 insertions(+), 285 deletions(-) delete mode 100644 pkg/command/operators/default.py delete mode 100644 pkg/provider/sysprompt/__init__.py delete mode 100644 pkg/provider/sysprompt/entities.py delete mode 100644 pkg/provider/sysprompt/loader.py delete mode 100644 pkg/provider/sysprompt/loaders/__init__.py delete mode 100644 pkg/provider/sysprompt/loaders/scenario.py delete mode 100644 pkg/provider/sysprompt/loaders/single.py delete mode 100644 pkg/provider/sysprompt/sysprompt.py diff --git a/pkg/api/http/service/pipeline.py b/pkg/api/http/service/pipeline.py index f1bcaa75..72b7daf7 100644 --- a/pkg/api/http/service/pipeline.py +++ b/pkg/api/http/service/pipeline.py @@ -79,9 +79,12 @@ class PipelineService: return pipeline_data['uuid'] async def update_pipeline(self, pipeline_uuid: str, pipeline_data: dict) -> None: - del pipeline_data['uuid'] - del pipeline_data['for_version'] - del pipeline_data['stages'] + if 'uuid' in pipeline_data: + del pipeline_data['uuid'] + if 'for_version' in pipeline_data: + del pipeline_data['for_version'] + if 'stages' in pipeline_data: + del pipeline_data['stages'] await self.ap.persistence_mgr.execute_async( sqlalchemy.update(persistence_pipeline.LegacyPipeline).where(persistence_pipeline.LegacyPipeline.uuid == pipeline_uuid).values(**pipeline_data) ) diff --git a/pkg/command/cmdmgr.py b/pkg/command/cmdmgr.py index 8d442fdb..ea4e1a9b 100644 --- a/pkg/command/cmdmgr.py +++ b/pkg/command/cmdmgr.py @@ -8,7 +8,7 @@ from . import entities, operator, errors from ..config import manager as cfg_mgr # 引入所有算子以便注册 -from .operators import func, plugin, default, reset, list as list_cmd, last, next, delc, resend, prompt, cmd, help, version, update, ollama, model +from .operators import func, plugin, reset, list as list_cmd, last, next, delc, resend, prompt, cmd, help, version, update, ollama, model class CommandManager: diff --git a/pkg/command/operators/default.py b/pkg/command/operators/default.py deleted file mode 100644 index ee46c7d0..00000000 --- a/pkg/command/operators/default.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -import typing -import traceback - -from .. import operator, entities, cmdmgr, errors - - -@operator.operator_class( - name="default", - help="操作情景预设", - usage='!default\n!default set <指定情景预设为默认>' -) -class DefaultOperator(operator.CommandOperator): - - async def execute( - self, - context: entities.ExecuteContext - ) -> typing.AsyncGenerator[entities.CommandReturn, None]: - - reply_str = "当前所有情景预设: \n\n" - - for prompt in self.ap.prompt_mgr.get_all_prompts(): - - content = "" - for msg in prompt.messages: - content += f" {msg.readable_str()}\n" - - reply_str += f"名称: {prompt.name}\n内容: \n{content}\n\n" - - reply_str += f"当前会话使用的是: {context.session.use_prompt_name}" - - yield entities.CommandReturn(text=reply_str.strip()) - - -@operator.operator_class( - name="set", - help="设置当前会话默认情景预设", - parent_class=DefaultOperator -) -class DefaultSetOperator(operator.CommandOperator): - - async def execute( - self, - context: entities.ExecuteContext - ) -> typing.AsyncGenerator[entities.CommandReturn, None]: - - if len(context.crt_params) == 0: - yield entities.CommandReturn(error=errors.ParamNotEnoughError('请提供情景预设名称')) - else: - prompt_name = context.crt_params[0] - - try: - prompt = await self.ap.prompt_mgr.get_prompt_by_prefix(prompt_name) - if prompt is None: - yield entities.CommandReturn(error=errors.CommandError("设置当前会话默认情景预设失败: 未找到情景预设 {}".format(prompt_name))) - else: - context.session.use_prompt_name = prompt.name - yield entities.CommandReturn(text=f"已设置当前会话默认情景预设为 {prompt_name}, !reset 后生效") - except Exception as e: - traceback.print_exc() - yield entities.CommandReturn(error=errors.CommandError("设置当前会话默认情景预设失败: "+str(e))) diff --git a/pkg/core/app.py b/pkg/core/app.py index 126b165a..bfea617b 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -11,7 +11,6 @@ import os from ..platform import manager as im_mgr from ..provider.session import sessionmgr as llm_session_mgr from ..provider.modelmgr 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 ..config import manager as config_mgr from ..config import settings as settings_mgr @@ -52,9 +51,6 @@ class Application: model_mgr: llm_model_mgr.ModelManager = None - # TODO 移动到 pipeline 里 - prompt_mgr: llm_prompt_mgr.PromptManager = None - # TODO 移动到 pipeline 里 tool_mgr: llm_tool_mgr.ToolManager = None @@ -229,10 +225,6 @@ class Application: await llm_session_mgr_inst.initialize() self.sess_mgr = llm_session_mgr_inst - llm_prompt_mgr_inst = llm_prompt_mgr.PromptManager(self) - await llm_prompt_mgr_inst.initialize() - self.prompt_mgr = llm_prompt_mgr_inst - llm_tool_mgr_inst = llm_tool_mgr.ToolManager(self) await llm_tool_mgr_inst.initialize() self.tool_mgr = llm_tool_mgr_inst diff --git a/pkg/core/entities.py b/pkg/core/entities.py index d8768494..1753495b 100644 --- a/pkg/core/entities.py +++ b/pkg/core/entities.py @@ -9,7 +9,6 @@ import pydantic.v1 as pydantic from ..provider import entities as llm_entities from ..provider.modelmgr import entities, modelmgr, requester -from ..provider.sysprompt import entities as sysprompt_entities from ..provider.tools import entities as tools_entities from ..platform import adapter as msadapter from ..platform.types import message as platform_message @@ -75,7 +74,7 @@ class Query(pydantic.BaseModel): messages: typing.Optional[list[llm_entities.Message]] = [] """历史消息列表,由前置处理器阶段设置""" - prompt: typing.Optional[sysprompt_entities.Prompt] = None + prompt: typing.Optional[llm_entities.Prompt] = None """情景预设内容,由前置处理器阶段设置""" user_message: typing.Optional[llm_entities.Message] = None @@ -127,7 +126,7 @@ class Query(pydantic.BaseModel): class Conversation(pydantic.BaseModel): """对话,包含于 Session 中,一个 Session 可以有多个历史 Conversation,但只有一个当前使用的 Conversation""" - prompt: sysprompt_entities.Prompt + prompt: llm_entities.Prompt messages: list[llm_entities.Message] diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index fcd930a3..fc049d9c 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -11,7 +11,6 @@ from ...plugin import manager as plugin_mgr from ...command import cmdmgr from ...provider.session import sessionmgr as llm_session_mgr from ...provider.modelmgr 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 from ...persistence import mgr as persistencemgr @@ -95,10 +94,6 @@ class BuildAppStage(stage.BootingStage): 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 diff --git a/pkg/pipeline/preproc/preproc.py b/pkg/pipeline/preproc/preproc.py index 9958466a..8cf51463 100644 --- a/pkg/pipeline/preproc/preproc.py +++ b/pkg/pipeline/preproc/preproc.py @@ -33,7 +33,7 @@ class PreProcessor(stage.PipelineStage): """ session = await self.ap.sess_mgr.get_session(query) - conversation = await self.ap.sess_mgr.get_conversation(query, session) + conversation = await self.ap.sess_mgr.get_conversation(query, session, query.pipeline_config) # 设置query query.session = session diff --git a/pkg/provider/entities.py b/pkg/provider/entities.py index dce55fd5..0fb75f80 100644 --- a/pkg/provider/entities.py +++ b/pkg/provider/entities.py @@ -4,6 +4,8 @@ import typing import enum import pydantic.v1 as pydantic +from pkg.provider import entities + from ..platform.types import message as platform_message @@ -124,3 +126,13 @@ class Message(pydantic.BaseModel): mc.insert(0, platform_message.Plain(prefix_text)) return platform_message.MessageChain(mc) + + +class Prompt(pydantic.BaseModel): + """供AI使用的Prompt""" + + name: str + """名称""" + + messages: list[entities.Message] + """消息列表""" diff --git a/pkg/provider/session/sessionmgr.py b/pkg/provider/session/sessionmgr.py index 83691e4c..93b1146e 100644 --- a/pkg/provider/session/sessionmgr.py +++ b/pkg/provider/session/sessionmgr.py @@ -4,6 +4,7 @@ import asyncio from ...core import app, entities as core_entities from ...plugin import context as plugin_context +from ...provider import entities as provider_entities class SessionManager: @@ -41,15 +42,26 @@ class SessionManager: self.session_list.append(session) return session - async def get_conversation(self, query: core_entities.Query, session: core_entities.Session) -> core_entities.Conversation: + async def get_conversation(self, query: core_entities.Query, session: core_entities.Session, pipeline_config: dict) -> core_entities.Conversation: """获取对话或创建对话""" if not session.conversations: session.conversations = [] + # set prompt + prompt_messages = [] + + for prompt_message in pipeline_config['ai']['local-agent']['prompt']: + prompt_messages.append(provider_entities.Message(**prompt_message)) + + prompt = provider_entities.Prompt( + name="default", + messages=prompt_messages, + ) + if session.using_conversation is None: conversation = core_entities.Conversation( - prompt=await self.ap.prompt_mgr.get_prompt(session.use_prompt_name), + prompt=prompt, messages=[], use_llm_model=await self.ap.model_mgr.get_model_by_uuid( query.pipeline_config['ai']['local-agent']['model'] diff --git a/pkg/provider/sysprompt/__init__.py b/pkg/provider/sysprompt/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pkg/provider/sysprompt/entities.py b/pkg/provider/sysprompt/entities.py deleted file mode 100644 index 5442e809..00000000 --- a/pkg/provider/sysprompt/entities.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -import typing -import pydantic.v1 as pydantic - -from ...provider import entities - - -class Prompt(pydantic.BaseModel): - """供AI使用的Prompt""" - - name: str - """名称""" - - messages: list[entities.Message] - """消息列表""" diff --git a/pkg/provider/sysprompt/loader.py b/pkg/provider/sysprompt/loader.py deleted file mode 100644 index 855728e2..00000000 --- a/pkg/provider/sysprompt/loader.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations -import abc -import typing - -from ...core import app -from . import entities - - -preregistered_loaders: list[typing.Type[PromptLoader]] = [] - -def loader_class(name: str): - - def decorator(cls: typing.Type[PromptLoader]) -> typing.Type[PromptLoader]: - cls.name = name - preregistered_loaders.append(cls) - return cls - - return decorator - - -class PromptLoader(metaclass=abc.ABCMeta): - """Prompt加载器抽象类 - """ - name: str - - ap: app.Application - - prompts: list[entities.Prompt] - - def __init__(self, ap: app.Application): - self.ap = ap - self.prompts = [] - - async def initialize(self): - pass - - @abc.abstractmethod - async def load(self): - """加载Prompt,存放到prompts列表中 - """ - raise NotImplementedError - - def get_prompts(self) -> list[entities.Prompt]: - """获取Prompt列表 - """ - return self.prompts diff --git a/pkg/provider/sysprompt/loaders/__init__.py b/pkg/provider/sysprompt/loaders/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pkg/provider/sysprompt/loaders/scenario.py b/pkg/provider/sysprompt/loaders/scenario.py deleted file mode 100644 index f907a51c..00000000 --- a/pkg/provider/sysprompt/loaders/scenario.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -import json -import os - -from .. import loader -from .. import entities -from ....provider import entities as llm_entities - - -@loader.loader_class("full-scenario") -class ScenarioPromptLoader(loader.PromptLoader): - """加载scenario目录下的json""" - - async def load(self): - """加载Prompt - """ - for file in os.listdir("data/scenario"): - with open("data/scenario/{}".format(file), "r", encoding="utf-8") as f: - file_str = f.read() - file_name = file.split(".")[0] - file_json = json.loads(file_str) - messages = [] - for msg in file_json["prompt"]: - role = 'system' - if "role" in msg: - role = msg['role'] - messages.append( - llm_entities.Message( - role=role, - content=msg['content'], - ) - ) - prompt = entities.Prompt( - name=file_name, - messages=messages - ) - self.prompts.append(prompt) - \ No newline at end of file diff --git a/pkg/provider/sysprompt/loaders/single.py b/pkg/provider/sysprompt/loaders/single.py deleted file mode 100644 index 3ac9c262..00000000 --- a/pkg/provider/sysprompt/loaders/single.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations -import os - -from .. import loader -from .. import entities -from ....provider import entities as llm_entities - - -@loader.loader_class("normal") -class SingleSystemPromptLoader(loader.PromptLoader): - """配置文件中的单条system prompt的prompt加载器 - """ - - async def load(self): - """加载Prompt - """ - - for name, cnt in self.ap.provider_cfg.data['prompt'].items(): - prompt = entities.Prompt( - name=name, - messages=[ - llm_entities.Message( - role='system', - content=cnt - ) - ] - ) - self.prompts.append(prompt) - - for file in os.listdir("data/prompts"): - with open("data/prompts/{}".format(file), "r", encoding="utf-8") as f: - file_str = f.read() - file_name = file.split(".")[0] - prompt = entities.Prompt( - name=file_name, - messages=[ - llm_entities.Message( - role='system', - content=file_str - ) - ] - ) - self.prompts.append(prompt) diff --git a/pkg/provider/sysprompt/sysprompt.py b/pkg/provider/sysprompt/sysprompt.py deleted file mode 100644 index c7695f5a..00000000 --- a/pkg/provider/sysprompt/sysprompt.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from ...core import app -from . import loader -from .loaders import single, scenario - - -class PromptManager: - """Prompt管理器 - """ - - ap: app.Application - - loader_inst: loader.PromptLoader - - default_prompt: str = 'default' - - def __init__(self, ap: app.Application): - self.ap = ap - - async def initialize(self): - - mode_name = self.ap.provider_cfg.data['prompt-mode'] - - loader_class = None - - for loader_cls in loader.preregistered_loaders: - if loader_cls.name == mode_name: - loader_class = loader_cls - break - else: - raise ValueError(f'未知的 Prompt 加载器: {mode_name}') - - self.loader_inst: loader.PromptLoader = loader_class(self.ap) - - await self.loader_inst.initialize() - await self.loader_inst.load() - - def get_all_prompts(self) -> list[loader.entities.Prompt]: - """获取所有Prompt - """ - return self.loader_inst.get_prompts() - - async def get_prompt(self, name: str) -> loader.entities.Prompt: - """获取Prompt - """ - for prompt in self.get_all_prompts(): - if prompt.name == name: - return prompt - - async def get_prompt_by_prefix(self, prefix: str) -> loader.entities.Prompt: - """通过前缀获取Prompt - """ - for prompt in self.get_all_prompts(): - if prompt.name.startswith(prefix): - return prompt From 472d472bc1f30102d64b7839e10fb3a5acef9f11 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 3 Apr 2025 17:19:27 +0800 Subject: [PATCH 026/205] perf: param for get_conversation --- pkg/pipeline/preproc/preproc.py | 2 +- pkg/provider/session/sessionmgr.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/pipeline/preproc/preproc.py b/pkg/pipeline/preproc/preproc.py index 8cf51463..42bb5b4c 100644 --- a/pkg/pipeline/preproc/preproc.py +++ b/pkg/pipeline/preproc/preproc.py @@ -33,7 +33,7 @@ class PreProcessor(stage.PipelineStage): """ session = await self.ap.sess_mgr.get_session(query) - conversation = await self.ap.sess_mgr.get_conversation(query, session, query.pipeline_config) + conversation = await self.ap.sess_mgr.get_conversation(query, session, query.pipeline_config['ai']['local-agent']['prompt']) # 设置query query.session = session diff --git a/pkg/provider/session/sessionmgr.py b/pkg/provider/session/sessionmgr.py index 93b1146e..5143f2bb 100644 --- a/pkg/provider/session/sessionmgr.py +++ b/pkg/provider/session/sessionmgr.py @@ -42,7 +42,7 @@ class SessionManager: self.session_list.append(session) return session - async def get_conversation(self, query: core_entities.Query, session: core_entities.Session, pipeline_config: dict) -> core_entities.Conversation: + async def get_conversation(self, query: core_entities.Query, session: core_entities.Session, prompt_config: list[dict]) -> core_entities.Conversation: """获取对话或创建对话""" if not session.conversations: @@ -51,7 +51,7 @@ class SessionManager: # set prompt prompt_messages = [] - for prompt_message in pipeline_config['ai']['local-agent']['prompt']: + for prompt_message in prompt_config: prompt_messages.append(provider_entities.Message(**prompt_message)) prompt = provider_entities.Prompt( From 7f66efcdd5a85a88d86b40d06b0b0334677755d3 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 3 Apr 2025 17:57:51 +0800 Subject: [PATCH 027/205] refactor: switch pipeline_cfg related fields to new pipeline config --- pkg/pipeline/bansess/bansess.py | 4 ++-- pkg/pipeline/cntfilter/cntfilter.py | 15 +++++++------- pkg/pipeline/cntfilter/filter.py | 4 ++-- .../cntfilter/filters/baiduexamine.py | 3 ++- pkg/pipeline/cntfilter/filters/banwords.py | 4 ++-- pkg/pipeline/cntfilter/filters/cntignore.py | 11 +++++----- pkg/pipeline/msgtrun/msgtrun.py | 2 +- pkg/pipeline/msgtrun/truncators/round.py | 2 +- pkg/pipeline/ratelimit/algo.py | 6 +++--- pkg/pipeline/ratelimit/algos/fixedwin.py | 20 ++++++++++--------- pkg/pipeline/ratelimit/ratelimit.py | 4 +++- pkg/pipeline/resprule/resprule.py | 9 +++++---- templates/metadata/pipeline/safety.yaml | 16 +++++++++++++++ 13 files changed, 62 insertions(+), 38 deletions(-) diff --git a/pkg/pipeline/bansess/bansess.py b/pkg/pipeline/bansess/bansess.py index 1ca42397..38fb9794 100644 --- a/pkg/pipeline/bansess/bansess.py +++ b/pkg/pipeline/bansess/bansess.py @@ -24,9 +24,9 @@ class BanSessionCheckStage(stage.PipelineStage): found = False - mode = self.ap.pipeline_cfg.data['access-control']['mode'] + mode = query.pipeline_config['trigger']['access-control']['mode'] - sess_list = self.ap.pipeline_cfg.data['access-control'][mode] + sess_list = query.pipeline_config['trigger']['access-control'][mode] if (query.launcher_type.value == 'group' and 'group_*' in sess_list) \ or (query.launcher_type.value == 'person' and 'person_*' in sess_list): diff --git a/pkg/pipeline/cntfilter/cntfilter.py b/pkg/pipeline/cntfilter/cntfilter.py index 6a0c3776..dbf7c52e 100644 --- a/pkg/pipeline/cntfilter/cntfilter.py +++ b/pkg/pipeline/cntfilter/cntfilter.py @@ -41,11 +41,12 @@ class ContentFilterStage(stage.PipelineStage): "content-ignore", ] - if self.ap.pipeline_cfg.data['check-sensitive-words']: + if pipeline_config['safety']['content-filter']['check-sensitive-words']: filters_required.append("ban-word-filter") - if self.ap.pipeline_cfg.data['baidu-cloud-examine']['enable']: - filters_required.append("baidu-cloud-examine") + # TODO revert it + # if self.ap.pipeline_cfg.data['baidu-cloud-examine']['enable']: + # filters_required.append("baidu-cloud-examine") for filter in filter_model.preregistered_filters: if filter.name in filters_required: @@ -65,7 +66,7 @@ class ContentFilterStage(stage.PipelineStage): 只要有一个不通过就不放行,只放行 PASS 的消息 """ - if not self.ap.pipeline_cfg.data['income-msg-check']: + if query.pipeline_config['safety']['content-filter']['scope'] == 'output-msg': return entities.StageProcessResult( result_type=entities.ResultType.CONTINUE, new_query=query @@ -73,7 +74,7 @@ class ContentFilterStage(stage.PipelineStage): else: for filter in self.filter_chain: if filter_entities.EnableStage.PRE in filter.enable_stages: - result = await filter.process(message) + result = await filter.process(query, message) if result.level in [ filter_entities.ResultLevel.BLOCK, @@ -105,7 +106,7 @@ class ContentFilterStage(stage.PipelineStage): """请求llm后处理响应 只要是 PASS 或者 MASKED 的就通过此 filter,将其 replacement 设置为message,进入下一个 filter """ - if message is None: + if query.pipeline_config['safety']['content-filter']['scope'] == 'income-msg': return entities.StageProcessResult( result_type=entities.ResultType.CONTINUE, new_query=query @@ -114,7 +115,7 @@ class ContentFilterStage(stage.PipelineStage): message = message.strip() for filter in self.filter_chain: if filter_entities.EnableStage.POST in filter.enable_stages: - result = await filter.process(message) + result = await filter.process(query, message) if result.level == filter_entities.ResultLevel.BLOCK: return entities.StageProcessResult( diff --git a/pkg/pipeline/cntfilter/filter.py b/pkg/pipeline/cntfilter/filter.py index 8eceb877..970e11f1 100644 --- a/pkg/pipeline/cntfilter/filter.py +++ b/pkg/pipeline/cntfilter/filter.py @@ -3,7 +3,7 @@ from __future__ import annotations import abc import typing -from ...core import app +from ...core import app, entities as core_entities from . import entities from ...provider import entities as llm_entities @@ -64,7 +64,7 @@ class ContentFilter(metaclass=abc.ABCMeta): pass @abc.abstractmethod - async def process(self, message: str=None, image_url=None) -> entities.FilterResult: + async def process(self, query: core_entities.Query, message: str=None, image_url=None) -> entities.FilterResult: """处理消息 分为前后阶段,具体取决于 enable_stages 的值。 diff --git a/pkg/pipeline/cntfilter/filters/baiduexamine.py b/pkg/pipeline/cntfilter/filters/baiduexamine.py index 8c5b77cd..800f0099 100644 --- a/pkg/pipeline/cntfilter/filters/baiduexamine.py +++ b/pkg/pipeline/cntfilter/filters/baiduexamine.py @@ -4,6 +4,7 @@ import aiohttp from .. import entities from .. import filter as filter_model +from ....core import entities as core_entities BAIDU_EXAMINE_URL = "https://aip.baidubce.com/rest/2.0/solution/v1/text_censor/v2/user_defined?access_token={}" @@ -26,7 +27,7 @@ class BaiduCloudExamine(filter_model.ContentFilter): ) as resp: return (await resp.json())['access_token'] - async def process(self, message: str) -> entities.FilterResult: + async def process(self, query: core_entities.Query, message: str) -> entities.FilterResult: async with aiohttp.ClientSession() as session: async with session.post( diff --git a/pkg/pipeline/cntfilter/filters/banwords.py b/pkg/pipeline/cntfilter/filters/banwords.py index 1430c2ed..cd3d412c 100644 --- a/pkg/pipeline/cntfilter/filters/banwords.py +++ b/pkg/pipeline/cntfilter/filters/banwords.py @@ -3,7 +3,7 @@ import re from .. import filter as filter_model from .. import entities -from ....config import manager as cfg_mgr +from ....core import entities as core_entities @filter_model.filter_class("ban-word-filter") @@ -13,7 +13,7 @@ class BanWordFilter(filter_model.ContentFilter): async def initialize(self): pass - async def process(self, message: str) -> entities.FilterResult: + async def process(self, query: core_entities.Query, message: str) -> entities.FilterResult: found = False for word in self.ap.sensitive_meta.data['words']: diff --git a/pkg/pipeline/cntfilter/filters/cntignore.py b/pkg/pipeline/cntfilter/filters/cntignore.py index 781f6397..381d5c51 100644 --- a/pkg/pipeline/cntfilter/filters/cntignore.py +++ b/pkg/pipeline/cntfilter/filters/cntignore.py @@ -3,6 +3,7 @@ import re from .. import entities from .. import filter as filter_model +from ....core import entities as core_entities @filter_model.filter_class("content-ignore") @@ -15,9 +16,9 @@ class ContentIgnore(filter_model.ContentFilter): entities.EnableStage.PRE, ] - async def process(self, message: str) -> entities.FilterResult: - if 'prefix' in self.ap.pipeline_cfg.data['ignore-rules']: - for rule in self.ap.pipeline_cfg.data['ignore-rules']['prefix']: + async def process(self, query: core_entities.Query, message: str) -> entities.FilterResult: + if 'prefix' in query.pipeline_config['trigger']['ignore-rules']: + for rule in query.pipeline_config['trigger']['ignore-rules']['prefix']: if message.startswith(rule): return entities.FilterResult( level=entities.ResultLevel.BLOCK, @@ -26,8 +27,8 @@ class ContentIgnore(filter_model.ContentFilter): console_notice='根据 ignore_rules 中的 prefix 规则,忽略消息' ) - if 'regexp' in self.ap.pipeline_cfg.data['ignore-rules']: - for rule in self.ap.pipeline_cfg.data['ignore-rules']['regexp']: + if 'regexp' in query.pipeline_config['trigger']['ignore-rules']: + for rule in query.pipeline_config['trigger']['ignore-rules']['regexp']: if re.search(rule, message): return entities.FilterResult( level=entities.ResultLevel.BLOCK, diff --git a/pkg/pipeline/msgtrun/msgtrun.py b/pkg/pipeline/msgtrun/msgtrun.py index a1116eb4..b3fb593a 100644 --- a/pkg/pipeline/msgtrun/msgtrun.py +++ b/pkg/pipeline/msgtrun/msgtrun.py @@ -15,7 +15,7 @@ class ConversationMessageTruncator(stage.PipelineStage): trun: truncator.Truncator async def initialize(self, pipeline_config: dict): - use_method = self.ap.pipeline_cfg.data['msg-truncate']['method'] + use_method = "round" for trun in truncator.preregistered_truncators: if trun.name == use_method: diff --git a/pkg/pipeline/msgtrun/truncators/round.py b/pkg/pipeline/msgtrun/truncators/round.py index 646f2856..46fce5f3 100644 --- a/pkg/pipeline/msgtrun/truncators/round.py +++ b/pkg/pipeline/msgtrun/truncators/round.py @@ -12,7 +12,7 @@ class RoundTruncator(truncator.Truncator): async def truncate(self, query: core_entities.Query) -> core_entities.Query: """截断 """ - max_round = self.ap.pipeline_cfg.data['msg-truncate']['round']['max-round'] + max_round = query.pipeline_config['ai']['local-agent']['max-round'] temp_messages = [] diff --git a/pkg/pipeline/ratelimit/algo.py b/pkg/pipeline/ratelimit/algo.py index 9b418dd2..d9baa801 100644 --- a/pkg/pipeline/ratelimit/algo.py +++ b/pkg/pipeline/ratelimit/algo.py @@ -2,7 +2,7 @@ from __future__ import annotations import abc import typing -from ...core import app +from ...core import app, entities as core_entities preregistered_algos: list[typing.Type[ReteLimitAlgo]] = [] @@ -31,7 +31,7 @@ class ReteLimitAlgo(metaclass=abc.ABCMeta): pass @abc.abstractmethod - async def require_access(self, launcher_type: str, launcher_id: typing.Union[int, str]) -> bool: + async def require_access(self, query: core_entities.Query, launcher_type: str, launcher_id: typing.Union[int, str]) -> bool: """进入处理流程 这个方法对等待是友好的,意味着算法可以实现在这里等待一段时间以控制速率。 @@ -46,7 +46,7 @@ class ReteLimitAlgo(metaclass=abc.ABCMeta): raise NotImplementedError @abc.abstractmethod - async def release_access(self, launcher_type: str, launcher_id: typing.Union[int, str]): + async def release_access(self, query: core_entities.Query, launcher_type: str, launcher_id: typing.Union[int, str]): """退出处理流程 Args: diff --git a/pkg/pipeline/ratelimit/algos/fixedwin.py b/pkg/pipeline/ratelimit/algos/fixedwin.py index 3cc1ab94..f17e93b8 100644 --- a/pkg/pipeline/ratelimit/algos/fixedwin.py +++ b/pkg/pipeline/ratelimit/algos/fixedwin.py @@ -3,6 +3,7 @@ import asyncio import time import typing from .. import algo +from ....core import entities as core_entities # 固定窗口算法 class SessionContainer: @@ -30,7 +31,7 @@ class FixedWindowAlgo(algo.ReteLimitAlgo): self.containers_lock = asyncio.Lock() self.containers = {} - async def require_access(self, launcher_type: str, launcher_id: typing.Union[int, str]) -> bool: + async def require_access(self, query: core_entities.Query, launcher_type: str, launcher_id: typing.Union[int, str]) -> bool: # 加锁,找容器 container: SessionContainer = None @@ -47,12 +48,13 @@ class FixedWindowAlgo(algo.ReteLimitAlgo): async with container.wait_lock: # 获取窗口大小和限制 - window_size = self.ap.pipeline_cfg.data['rate-limit']['fixwin']['default']['window-size'] - limitation = self.ap.pipeline_cfg.data['rate-limit']['fixwin']['default']['limit'] + window_size = query.pipeline_config['safety']['rate-limit']['window-length'] + limitation = query.pipeline_config['safety']['rate-limit']['limitation'] - if session_name in self.ap.pipeline_cfg.data['rate-limit']['fixwin']: - window_size = self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name]['window-size'] - limitation = self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name]['limit'] + # TODO revert it + # if session_name in self.ap.pipeline_cfg.data['rate-limit']['fixwin']: + # window_size = self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name]['window-size'] + # limitation = self.ap.pipeline_cfg.data['rate-limit']['fixwin'][session_name]['limit'] # 获取当前时间戳 now = int(time.time()) @@ -65,9 +67,9 @@ class FixedWindowAlgo(algo.ReteLimitAlgo): # 如果访问次数超过了限制 if count >= limitation: - if self.ap.pipeline_cfg.data['rate-limit']['strategy'] == 'drop': + if query.pipeline_config['safety']['rate-limit']['strategy'] == 'drop': return False - elif self.ap.pipeline_cfg.data['rate-limit']['strategy'] == 'wait': + elif query.pipeline_config['safety']['rate-limit']['strategy'] == 'wait': # 等待下一窗口 await asyncio.sleep(window_size - time.time() % window_size) @@ -84,5 +86,5 @@ class FixedWindowAlgo(algo.ReteLimitAlgo): # 返回True return True - async def release_access(self, launcher_type: str, launcher_id: typing.Union[int, str]): + async def release_access(self, query: core_entities.Query, launcher_type: str, launcher_id: typing.Union[int, str]): pass diff --git a/pkg/pipeline/ratelimit/ratelimit.py b/pkg/pipeline/ratelimit/ratelimit.py index 01bde395..c74db978 100644 --- a/pkg/pipeline/ratelimit/ratelimit.py +++ b/pkg/pipeline/ratelimit/ratelimit.py @@ -20,7 +20,7 @@ class RateLimit(stage.PipelineStage): async def initialize(self, pipeline_config: dict): - algo_name = self.ap.pipeline_cfg.data['rate-limit']['algo'] + algo_name = 'fixwin' algo_class = None @@ -46,6 +46,7 @@ class RateLimit(stage.PipelineStage): """ if stage_inst_name == "RequireRateLimitOccupancy": if await self.algo.require_access( + query, query.launcher_type.value, query.launcher_id, ): @@ -62,6 +63,7 @@ class RateLimit(stage.PipelineStage): ) elif stage_inst_name == "ReleaseRateLimitOccupancy": await self.algo.release_access( + query, query.launcher_type.value, query.launcher_id, ) diff --git a/pkg/pipeline/resprule/resprule.py b/pkg/pipeline/resprule/resprule.py index 7e4b8f99..08ba49e8 100644 --- a/pkg/pipeline/resprule/resprule.py +++ b/pkg/pipeline/resprule/resprule.py @@ -39,12 +39,13 @@ class GroupRespondRuleCheckStage(stage.PipelineStage): new_query=query ) - rules = self.ap.pipeline_cfg.data['respond-rules'] + rules = query.pipeline_config['trigger']['group-respond-rules'] - use_rule = rules['default'] + use_rule = rules - if str(query.launcher_id) in rules: - use_rule = rules[str(query.launcher_id)] + # TODO revert it + # if str(query.launcher_id) in rules: + # use_rule = rules[str(query.launcher_id)] for rule_matcher in self.rule_matchers: # 任意一个匹配就放行 res = await rule_matcher.match(str(query.message_chain), query.message_chain, use_rule, query) diff --git a/templates/metadata/pipeline/safety.yaml b/templates/metadata/pipeline/safety.yaml index 09f8025b..ba59e067 100644 --- a/templates/metadata/pipeline/safety.yaml +++ b/templates/metadata/pipeline/safety.yaml @@ -54,3 +54,19 @@ stages: type: integer required: true default: 60 + - name: strategy + label: + en_US: Strategy + zh_CN: 策略 + type: select + required: true + default: drop + options: + - name: drop + label: + en_US: Drop + zh_CN: 丢弃 + - name: wait + label: + en_US: Wait + zh_CN: 等待 \ No newline at end of file From 534709446689c895ed8e692067cf35d5d8ca0921 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Thu, 3 Apr 2025 18:20:00 +0800 Subject: [PATCH 028/205] chore: remove `llm-models` and prompt related files --- pkg/core/app.py | 2 - pkg/core/bootutils/files.py | 3 - pkg/core/stages/load_config.py | 3 - templates/metadata/llm-models.json | 237 ----------------------------- templates/scenario-template.json | 12 -- 5 files changed, 257 deletions(-) delete mode 100644 templates/metadata/llm-models.json delete mode 100644 templates/scenario-template.json diff --git a/pkg/core/app.py b/pkg/core/app.py index bfea617b..e543cd27 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -215,8 +215,6 @@ class Application: await self.tool_mgr.shutdown() - latest_llm_model_config = await config.load_json_config("data/metadata/llm-models.json", "templates/metadata/llm-models.json") - self.llm_models_meta = latest_llm_model_config llm_model_mgr_inst = llm_model_mgr.ModelManager(self) await llm_model_mgr_inst.initialize() self.model_mgr = llm_model_mgr_inst diff --git a/pkg/core/bootutils/files.py b/pkg/core/bootutils/files.py index f52f7b09..c1d077d7 100644 --- a/pkg/core/bootutils/files.py +++ b/pkg/core/bootutils/files.py @@ -13,15 +13,12 @@ required_files = { "data/config/platform.json": "templates/platform.json", "data/config/provider.json": "templates/provider.json", "data/config/system.json": "templates/system.json", - "data/scenario/default.json": "templates/scenario-template.json", } required_paths = [ "temp", "data", "data/metadata", - "data/prompts", - "data/scenario", "data/logs", "data/config", "data/labels", diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index 9476240a..e7a7cb05 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -75,9 +75,6 @@ class LoadConfigStage(stage.BootingStage): ap.adapter_qq_botpy_meta = await config.load_json_config("data/metadata/adapter-qq-botpy.json", "templates/metadata/adapter-qq-botpy.json") await ap.adapter_qq_botpy_meta.dump_config() - ap.llm_models_meta = await config.load_json_config("data/metadata/llm-models.json", "templates/metadata/llm-models.json") - await ap.llm_models_meta.dump_config() - ap.instance_secret_meta = await config.load_json_config("data/metadata/instance-secret.json", template_data={ 'jwt_secret': secrets.token_hex(16) }) diff --git a/templates/metadata/llm-models.json b/templates/metadata/llm-models.json deleted file mode 100644 index a12c7687..00000000 --- a/templates/metadata/llm-models.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "list": [ - { - "name": "default", - "requester": "openai-chat-completions", - "token_mgr": "openai", - "tool_call_supported": false, - "vision_supported": false - }, - { - "name": "gpt-4o", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4o-2024-11-20", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4o-2024-08-06", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4o-2024-05-13", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "chatgpt-4o-latest", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4o-mini", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "o1-preview", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "o1-mini", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4-turbo", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-4", - "tool_call_supported": true, - "vision_supported": true - }, - { - "name": "gpt-3.5-turbo", - "tool_call_supported": true, - "vision_supported": false - }, - { - "model_name": "SparkDesk", - "name": "OneAPI/SparkDesk" - }, - { - "model_name": "gemini-pro", - "name": "OneAPI/gemini-pro" - }, - { - "name": "claude-3-opus-latest", - "requester": "anthropic-messages", - "token_mgr": "anthropic", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "claude-3-5-sonnet-latest", - "requester": "anthropic-messages", - "token_mgr": "anthropic", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "claude-3-5-haiku-latest", - "requester": "anthropic-messages", - "token_mgr": "anthropic", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "claude-3-7-sonnet-latest", - "requester": "anthropic-messages", - "token_mgr": "anthropic", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "moonshot-v1-8k", - "requester": "moonshot-chat-completions", - "token_mgr": "moonshot", - "tool_call_supported": true - }, - { - "name": "moonshot-v1-32k", - "requester": "moonshot-chat-completions", - "token_mgr": "moonshot", - "tool_call_supported": true - }, - { - "name": "moonshot-v1-128k", - "requester": "moonshot-chat-completions", - "token_mgr": "moonshot", - "tool_call_supported": true - }, - { - "name": "deepseek-chat", - "requester": "deepseek-chat-completions", - "token_mgr": "deepseek" - }, - { - "name": "deepseek-coder", - "requester": "deepseek-chat-completions", - "token_mgr": "deepseek" - }, - { - "name": "deepseek-reasoner", - "requester": "deepseek-chat-completions", - "token_mgr": "deepseek" - }, - { - "name": "grok-2-latest", - "requester": "xai-chat-completions", - "token_mgr": "xai" - }, - { - "name": "grok-2", - "requester": "xai-chat-completions", - "token_mgr": "xai" - }, - { - "name": "grok-2-vision-1212", - "requester": "xai-chat-completions", - "token_mgr": "xai", - "vision_supported": true - }, - { - "name": "grok-2-1212", - "requester": "xai-chat-completions", - "token_mgr": "xai" - }, - { - "name": "grok-vision-beta", - "requester": "xai-chat-completions", - "token_mgr": "xai", - "vision_supported": true - }, - { - "name": "grok-beta", - "requester": "xai-chat-completions", - "token_mgr": "xai" - }, - { - "name": "glm-4-plus", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-0520", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-air", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-airx", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-long", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-flashx", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4-flash", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "tool_call_supported": true - }, - { - "name": "glm-4v-plus", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "glm-4v", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "glm-4v-flash", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "vision_supported": true, - "tool_call_supported": true - }, - { - "name": "glm-zero-preview", - "requester": "zhipuai-chat-completions", - "token_mgr": "zhipuai", - "vision_supported": true, - "tool_call_supported": true - } - ] -} \ No newline at end of file diff --git a/templates/scenario-template.json b/templates/scenario-template.json deleted file mode 100644 index d9b7267a..00000000 --- a/templates/scenario-template.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "prompt": [ - { - "role": "system", - "content": "You are a helpful assistant. 如果我需要帮助,你要说“输入!help获得帮助”" - }, - { - "role": "assistant", - "content": "好的,我是一个能干的AI助手。 如果你需要帮助,我会说“输入!help获得帮助”" - } - ] -} \ No newline at end of file From 2e1fb21ff9b14d6eede4e0602490ea062db330b7 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Wed, 9 Apr 2025 21:35:59 +0800 Subject: [PATCH 029/205] perf: minor perf --- pkg/command/operators/plugin.py | 2 -- pkg/provider/modelmgr/requesters/chatcmpl.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/pkg/command/operators/plugin.py b/pkg/command/operators/plugin.py index e50d0ba2..c36fbbc3 100644 --- a/pkg/command/operators/plugin.py +++ b/pkg/command/operators/plugin.py @@ -28,8 +28,6 @@ class PluginOperator(operator.CommandOperator): plugin.plugin_description, plugin.plugin_version, plugin.plugin_author) - # TODO 从元数据调远程地址 - idx += 1 yield entities.CommandReturn(text=reply_str) diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.py b/pkg/provider/modelmgr/requesters/chatcmpl.py index b59ab42d..c54d466f 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.py +++ b/pkg/provider/modelmgr/requesters/chatcmpl.py @@ -67,7 +67,7 @@ class OpenAIChatCompletions(requester.LLMAPIRequester): req_messages: list[dict], use_model: requester.RuntimeLLMModel, use_funcs: list[tools_entities.LLMFunction] = None, - extra_args: dict[str, typing.Any] = {}, # TODO: 所有的args都改为从此参数读取 + extra_args: dict[str, typing.Any] = {}, ) -> llm_entities.Message: self.client.api_key = use_model.token_mgr.get_token() From 11342e75de10366994b66cad21f31aadde1a53dd Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 15:37:15 +0800 Subject: [PATCH 030/205] feat: discovering plugins by manifests --- components.yaml | 4 ++ pkg/discover/engine.py | 67 ++++++++++++++++---- pkg/plugin/context.py | 25 +++++--- pkg/plugin/installers/github.py | 4 +- pkg/plugin/loaders/classic.py | 27 ++++---- pkg/plugin/loaders/manifest.py | 95 ++++++++++++++++++++++++++++ pkg/plugin/manager.py | 41 +++++++----- pkg/plugin/setting.py | 2 +- pkg/provider/tools/loaders/plugin.py | 10 +-- 9 files changed, 215 insertions(+), 60 deletions(-) create mode 100644 pkg/plugin/loaders/manifest.py diff --git a/components.yaml b/components.yaml index f4e2b7bc..fc2084c6 100644 --- a/components.yaml +++ b/components.yaml @@ -17,3 +17,7 @@ spec: LLMAPIRequester: fromDirs: - path: pkg/provider/modelmgr/requesters/ + Plugin: + fromDirs: + - path: plugins/ + maxDepth: 2 diff --git a/pkg/discover/engine.py b/pkg/discover/engine.py index 3960661c..51990a3c 100644 --- a/pkg/discover/engine.py +++ b/pkg/discover/engine.py @@ -34,6 +34,7 @@ class I18nString(pydantic.BaseModel): dic['ja_JP'] = self.ja_JP return dic + class Metadata(pydantic.BaseModel): """元数据""" @@ -46,9 +47,18 @@ class Metadata(pydantic.BaseModel): description: typing.Optional[I18nString] = None """描述""" + version: typing.Optional[str] = None + """版本""" + icon: typing.Optional[str] = None """图标""" + author: typing.Optional[str] = None + """作者""" + + repository: typing.Optional[str] = None + """仓库""" + def __init__(self, **kwargs): super().__init__(**kwargs) @@ -96,6 +106,9 @@ class Component(pydantic.BaseModel): rel_path: str """组件清单相对main.py的路径""" + rel_dir: str + """组件清单相对main.py的目录""" + _metadata: Metadata """组件元数据""" @@ -109,12 +122,18 @@ class Component(pydantic.BaseModel): super().__init__( owner=owner, manifest=manifest, - rel_path=rel_path + rel_path=rel_path, + rel_dir=os.path.dirname(rel_path) ) self._metadata = Metadata(**manifest['metadata']) self._spec = manifest['spec'] self._execution = Execution(**manifest['execution']) if 'execution' in manifest else None + @classmethod + def is_component_manifest(cls, manifest: typing.Dict[str, typing.Any]) -> bool: + """判断是否为组件清单""" + return 'apiVersion' in manifest and 'kind' in manifest and 'metadata' in manifest and 'spec' in manifest + @property def kind(self) -> str: """组件类型""" @@ -132,13 +151,12 @@ class Component(pydantic.BaseModel): @property def execution(self) -> Execution: - """组件执行""" + """组件可执行文件信息""" return self._execution def get_python_component_class(self) -> typing.Type[typing.Any]: """获取Python组件类""" - parent_path = os.path.dirname(self.rel_path) - module_path = os.path.join(parent_path, self.execution.python.path) + module_path = os.path.join(self.rel_dir, self.execution.python.path) if module_path.endswith('.py'): module_path = module_path[:-3] module_path = module_path.replace('/', '.').replace('\\', '.') @@ -168,10 +186,12 @@ class ComponentDiscoveryEngine: def __init__(self, ap: app.Application): self.ap = ap - def load_component_manifest(self, path: str, owner: str = 'builtin', no_save: bool = False) -> Component: + def load_component_manifest(self, path: str, owner: str = 'builtin', no_save: bool = False) -> Component | None: """加载组件清单""" with open(path, 'r', encoding='utf-8') as f: manifest = yaml.safe_load(f) + if not Component.is_component_manifest(manifest): + return None comp = Component( owner=owner, manifest=manifest, @@ -183,12 +203,22 @@ class ComponentDiscoveryEngine: self.components[comp.kind].append(comp) return comp - def load_component_manifests_in_dir(self, path: str, owner: str = 'builtin', no_save: bool = False) -> typing.List[Component]: + def load_component_manifests_in_dir(self, path: str, owner: str = 'builtin', no_save: bool = False, max_depth: int = 1) -> typing.List[Component]: """加载目录中的组件清单""" components: typing.List[Component] = [] - for file in os.listdir(path): - if file.endswith('.yaml') or file.endswith('.yml'): - components.append(self.load_component_manifest(os.path.join(path, file), owner, no_save)) + + def recursive_load_component_manifests_in_dir(path: str, depth: int = 1): + if depth > max_depth: + return + for file in os.listdir(path): + if (not os.path.isdir(os.path.join(path, file))) and (file.endswith('.yaml') or file.endswith('.yml')): + comp = self.load_component_manifest(os.path.join(path, file), owner, no_save) + if comp is not None: + components.append(comp) + elif os.path.isdir(os.path.join(path, file)): + recursive_load_component_manifests_in_dir(os.path.join(path, file), depth + 1) + + recursive_load_component_manifests_in_dir(path) return components def load_blueprint_comp_group(self, group: dict, owner: str = 'builtin', no_save: bool = False) -> typing.List[Component]: @@ -196,17 +226,21 @@ class ComponentDiscoveryEngine: components: typing.List[Component] = [] if 'fromFiles' in group: for file in group['fromFiles']: - components.append(self.load_component_manifest(file, owner, no_save)) + comp = self.load_component_manifest(file, owner, no_save) + if comp is not None: + components.append(comp) if 'fromDirs' in group: for dir in group['fromDirs']: path = dir['path'] - # depth = dir['depth'] - components.extend(self.load_component_manifests_in_dir(path, owner, no_save)) + max_depth = dir['maxDepth'] if 'maxDepth' in dir else 1 + components.extend(self.load_component_manifests_in_dir(path, owner, no_save, max_depth)) return components def discover_blueprint(self, blueprint_manifest_path: str, owner: str = 'builtin'): """发现蓝图""" blueprint_manifest = self.load_component_manifest(blueprint_manifest_path, owner, no_save=True) + if blueprint_manifest is None: + raise ValueError(f'Invalid blueprint manifest: {blueprint_manifest_path}') assert blueprint_manifest.kind == 'Blueprint', '`Kind` must be `Blueprint`' components: typing.Dict[str, typing.List[Component]] = {} @@ -223,9 +257,16 @@ class ComponentDiscoveryEngine: return blueprint_manifest, components - def get_components_by_kind(self, kind: str) -> typing.List[Component]: """获取指定类型的组件""" if kind not in self.components: raise ValueError(f'No components found for kind: {kind}') return self.components[kind] + + def find_components(self, kind: str, component_list: typing.List[Component]) -> typing.List[Component]: + """查找组件""" + result: typing.List[Component] = [] + for component in component_list: + if component.kind == kind: + result.append(component) + return result diff --git a/pkg/plugin/context.py b/pkg/plugin/context.py index 7a9be2a1..16fe414d 100644 --- a/pkg/plugin/context.py +++ b/pkg/plugin/context.py @@ -8,6 +8,7 @@ import enum from . import events from ..provider.tools import entities as tools_entities from ..core import app +from ..discover import engine as discover_engine from ..platform.types import message as platform_message from ..platform import adapter as platform_adapter @@ -308,7 +309,10 @@ class RuntimeContainer(pydantic.BaseModel): plugin_name: str """插件名称""" - plugin_description: str + plugin_label: discover_engine.I18nString + """插件标签""" + + plugin_description: discover_engine.I18nString """插件描述""" plugin_version: str @@ -317,7 +321,7 @@ class RuntimeContainer(pydantic.BaseModel): plugin_author: str """插件作者""" - plugin_source: str + plugin_repository: str """插件源码地址""" main_file: str @@ -343,7 +347,7 @@ class RuntimeContainer(pydantic.BaseModel): ]] = {} """事件处理器""" - content_functions: list[tools_entities.LLMFunction] = [] + tools: list[tools_entities.LLMFunction] = [] """内容函数""" status: RuntimeContainerStatus = RuntimeContainerStatus.MOUNTED @@ -355,10 +359,10 @@ class RuntimeContainer(pydantic.BaseModel): def to_setting_dict(self): return { 'name': self.plugin_name, - 'description': self.plugin_description, + 'description': self.plugin_description.to_dict(), 'version': self.plugin_version, 'author': self.plugin_author, - 'source': self.plugin_source, + 'source': self.plugin_repository, 'main_file': self.main_file, 'pkg_path': self.pkg_path, 'priority': self.priority, @@ -369,17 +373,18 @@ class RuntimeContainer(pydantic.BaseModel): self, setting: dict ): - self.plugin_source = setting['source'] + self.plugin_repository = setting['source'] self.priority = setting['priority'] self.enabled = setting['enabled'] def model_dump(self, *args, **kwargs): return { 'name': self.plugin_name, - 'description': self.plugin_description, + 'label': self.plugin_label.to_dict(), + 'description': self.plugin_description.to_dict(), 'version': self.plugin_version, 'author': self.plugin_author, - 'source': self.plugin_source, + 'repository': self.plugin_repository, 'main_file': self.main_file, 'pkg_path': self.pkg_path, 'enabled': self.enabled, @@ -388,7 +393,7 @@ class RuntimeContainer(pydantic.BaseModel): event_name.__name__: handler.__name__ for event_name, handler in self.event_handlers.items() }, - 'content_functions': [ + 'tools': [ { 'name': function.name, 'human_desc': function.human_desc, @@ -396,7 +401,7 @@ class RuntimeContainer(pydantic.BaseModel): 'parameters': function.parameters, 'func': function.func.__name__, } - for function in self.content_functions + for function in self.tools ], 'status': self.status.value, } diff --git a/pkg/plugin/installers/github.py b/pkg/plugin/installers/github.py index 039ff196..77ee7490 100644 --- a/pkg/plugin/installers/github.py +++ b/pkg/plugin/installers/github.py @@ -129,8 +129,8 @@ class GitHubRepoInstaller(installer.PluginInstaller): if plugin_container is None: raise errors.PluginInstallerError('插件不存在或未成功加载') else: - if plugin_container.plugin_source: - plugin_source = plugin_container.plugin_source + if plugin_container.plugin_repository: + plugin_source = plugin_container.plugin_repository task_context.trace("转交安装任务.", "update-plugin") await self.install_plugin(plugin_source, task_context) else: diff --git a/pkg/plugin/loaders/classic.py b/pkg/plugin/loaders/classic.py index b3710c9e..23a107d4 100644 --- a/pkg/plugin/loaders/classic.py +++ b/pkg/plugin/loaders/classic.py @@ -9,7 +9,7 @@ from .. import loader, events, context, models from ...core import entities as core_entities from ...provider.tools import entities as tools_entities from ...utils import funcschema - +from ...discover import engine as discover_engine class PluginLoader(loader.PluginLoader): """加载 plugins/ 目录下的插件""" @@ -31,13 +31,6 @@ class PluginLoader(loader.PluginLoader): async def initialize(self): """初始化""" - setattr(models, 'register', self.register) - setattr(models, 'on', self.on) - setattr(models, 'func', self.func) - - setattr(context, 'register', self.register) - setattr(context, 'handler', self.handler) - setattr(context, 'llm_func', self.llm_func) def register( self, @@ -49,14 +42,15 @@ class PluginLoader(loader.PluginLoader): self.ap.logger.debug(f'注册插件 {name} {version} by {author}') container = context.RuntimeContainer( plugin_name=name, - plugin_description=description, + plugin_label=discover_engine.I18nString(en_US=name, zh_CN=name), + plugin_description=discover_engine.I18nString(en_US=description, zh_CN=description), plugin_version=version, plugin_author=author, - plugin_source='', + plugin_repository='', pkg_path=self._current_pkg_path, main_file=self._current_module_path, event_handlers={}, - content_functions=[], + tools=[], ) self._current_container = container @@ -126,7 +120,7 @@ class PluginLoader(loader.PluginLoader): func=handler, ) - self._current_container.content_functions.append(llm_function) + self._current_container.tools.append(llm_function) return func @@ -165,7 +159,7 @@ class PluginLoader(loader.PluginLoader): func=func, ) - self._current_container.content_functions.append(llm_function) + self._current_container.tools.append(llm_function) return func @@ -205,4 +199,11 @@ class PluginLoader(loader.PluginLoader): async def load_plugins(self): """加载插件 """ + setattr(models, 'register', self.register) + setattr(models, 'on', self.on) + setattr(models, 'func', self.func) + + setattr(context, 'register', self.register) + setattr(context, 'handler', self.handler) + setattr(context, 'llm_func', self.llm_func) await self._walk_plugin_path(__import__("plugins", fromlist=[""])) diff --git a/pkg/plugin/loaders/manifest.py b/pkg/plugin/loaders/manifest.py new file mode 100644 index 00000000..2f7b83f2 --- /dev/null +++ b/pkg/plugin/loaders/manifest.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import typing +import abc +import os +import traceback + +from ...core import app +from .. import context, events, models +from .. import loader +from ...utils import funcschema +from ...provider.tools import entities as tools_entities + + +class PluginManifestLoader(loader.PluginLoader): + """通过插件清单发现插件""" + + _current_container: context.RuntimeContainer = None + + def __init__(self, ap: app.Application): + super().__init__(ap) + + def handler( + self, + event: typing.Type[events.BaseEventModel] + ) -> typing.Callable[[typing.Callable], typing.Callable]: + """注册事件处理器""" + self.ap.logger.debug(f'注册事件处理器 {event.__name__}') + def wrapper(func: typing.Callable) -> typing.Callable: + + self._current_container.event_handlers[event] = func + + return func + + return wrapper + + def llm_func( + self, + name: str=None, + ) -> typing.Callable: + """注册内容函数""" + self.ap.logger.debug(f'注册内容函数 {name}') + def wrapper(func: typing.Callable) -> typing.Callable: + + function_schema = funcschema.get_func_schema(func) + function_name = self._current_container.plugin_name + '-' + (func.__name__ if name is None else name) + + llm_function = tools_entities.LLMFunction( + name=function_name, + human_desc='', + description=function_schema['description'], + parameters=function_schema['parameters'], + func=func, + ) + + self._current_container.tools.append(llm_function) + + return func + + return wrapper + + async def load_plugins(self): + """加载插件""" + setattr(context, 'handler', self.handler) + setattr(context, 'llm_func', self.llm_func) + + plugin_manifests = self.ap.discover.get_components_by_kind('Plugin') + + for plugin_manifest in plugin_manifests: + try: + current_plugin_container = context.RuntimeContainer( + plugin_name=plugin_manifest.metadata.name, + plugin_label=plugin_manifest.metadata.label, + plugin_description=plugin_manifest.metadata.description, + plugin_version=plugin_manifest.metadata.version, + plugin_author=plugin_manifest.metadata.author, + plugin_repository=plugin_manifest.metadata.repository, + main_file=os.path.join(plugin_manifest.rel_dir, plugin_manifest.execution.python.path), + pkg_path=plugin_manifest.rel_dir, + event_handlers={}, + tools=[], + ) + + self._current_container = current_plugin_container + + # extract the plugin class + # this step will load the plugin module, + # so the event handlers and tools will be registered + plugin_class = plugin_manifest.get_python_component_class() + current_plugin_container.plugin_class = plugin_class + + self.plugins.append(current_plugin_container) + except Exception as e: + self.ap.logger.error(f'加载插件 {plugin_manifest.metadata.name} 时发生错误') + traceback.print_exc() diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index 2b8e887d..cdae7b19 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -5,7 +5,7 @@ import traceback from ..core import app, taskmgr from . import context, loader, events, installer, setting, models -from .loaders import classic +from .loaders import classic, manifest from .installers import github @@ -14,7 +14,7 @@ class PluginManager: ap: app.Application - loader: loader.PluginLoader + loaders: list[loader.PluginLoader] installer: installer.PluginInstaller @@ -22,6 +22,8 @@ class PluginManager: api_host: context.APIHost + plugin_containers: list[context.RuntimeContainer] + def plugins( self, enabled: bool=None, @@ -29,7 +31,7 @@ class PluginManager: ) -> list[context.RuntimeContainer]: """获取插件列表 """ - plugins = self.loader.plugins + plugins = self.plugin_containers if enabled is not None: plugins = [plugin for plugin in plugins if plugin.enabled == enabled] @@ -41,13 +43,18 @@ class PluginManager: def __init__(self, ap: app.Application): self.ap = ap - self.loader = classic.PluginLoader(ap) + self.loaders = [ + classic.PluginLoader(ap), + manifest.PluginManifestLoader(ap), + ] self.installer = github.GitHubRepoInstaller(ap) self.setting = setting.SettingManager(ap) self.api_host = context.APIHost(ap) + self.plugin_containers = [] async def initialize(self): - await self.loader.initialize() + for loader in self.loaders: + await loader.initialize() await self.installer.initialize() await self.setting.initialize() await self.api_host.initialize() @@ -55,14 +62,16 @@ class PluginManager: setattr(models, 'require_ver', self.api_host.require_ver) async def load_plugins(self): - await self.loader.load_plugins() + for loader in self.loaders: + await loader.load_plugins() + self.plugin_containers.extend(loader.plugins) - await self.setting.sync_setting(self.loader.plugins) + await self.setting.sync_setting(self.plugin_containers) # 按优先级倒序 - self.loader.plugins.sort(key=lambda x: x.priority, reverse=True) + self.plugin_containers.sort(key=lambda x: x.priority, reverse=True) - self.ap.logger.debug(f'优先级排序后的插件列表 {self.loader.plugins}') + self.ap.logger.debug(f'优先级排序后的插件列表 {self.plugin_containers}') async def initialize_plugin(self, plugin: context.RuntimeContainer): self.ap.logger.debug(f'初始化插件 {plugin.plugin_name}') @@ -147,7 +156,7 @@ class PluginManager: await self.ap.ctr_mgr.plugin.post_remove_record( { "name": plugin_name, - "remote": plugin_container.plugin_source, + "remote": plugin_container.plugin_repository, "author": plugin_container.plugin_author, "version": plugin_container.plugin_version } @@ -171,7 +180,7 @@ class PluginManager: await self.ap.ctr_mgr.plugin.post_update_record( plugin={ "name": plugin_name, - "remote": plugin_container.plugin_source, + "remote": plugin_container.plugin_repository, "author": plugin_container.plugin_author, "version": plugin_container.plugin_version }, @@ -238,7 +247,7 @@ class PluginManager: plugins_info: list[dict] = [ { 'name': plugin.plugin_name, - 'remote': plugin.plugin_source, + 'remote': plugin.plugin_repository, 'version': plugin.plugin_version, 'author': plugin.plugin_author } for plugin in emitted_plugins @@ -266,7 +275,7 @@ class PluginManager: plugin.enabled = new_status - await self.setting.dump_container_setting(self.loader.plugins) + await self.setting.dump_container_setting(self.plugin_containers) break @@ -280,11 +289,11 @@ class PluginManager: plugin_name = plugin.get('name') plugin_priority = plugin.get('priority') - for plugin in self.loader.plugins: + for plugin in self.plugin_containers: if plugin.plugin_name == plugin_name: plugin.priority = plugin_priority break - self.loader.plugins.sort(key=lambda x: x.priority, reverse=True) + self.plugin_containers.sort(key=lambda x: x.priority, reverse=True) - await self.setting.dump_container_setting(self.loader.plugins) + await self.setting.dump_container_setting(self.plugin_containers) diff --git a/pkg/plugin/setting.py b/pkg/plugin/setting.py index bd50603f..b5c5c06f 100644 --- a/pkg/plugin/setting.py +++ b/pkg/plugin/setting.py @@ -36,7 +36,7 @@ class SettingManager: if plugin_container.pkg_path == value['pkg_path']: matched = True - plugin_container.plugin_source = value['source'] + plugin_container.plugin_repository = value['source'] break if not matched: diff --git a/pkg/provider/tools/loaders/plugin.py b/pkg/provider/tools/loaders/plugin.py index 08211334..5b964556 100644 --- a/pkg/provider/tools/loaders/plugin.py +++ b/pkg/provider/tools/loaders/plugin.py @@ -23,7 +23,7 @@ class PluginToolLoader(loader.ToolLoader): for plugin in self.ap.plugin_mgr.plugins( enabled=enabled, status=plugin_context.RuntimeContainerStatus.INITIALIZED ): - all_functions.extend(plugin.content_functions) + all_functions.extend(plugin.tools) return all_functions @@ -32,7 +32,7 @@ class PluginToolLoader(loader.ToolLoader): for plugin in self.ap.plugin_mgr.plugins( enabled=True, status=plugin_context.RuntimeContainerStatus.INITIALIZED ): - for function in plugin.content_functions: + for function in plugin.tools: if function.name == name: return True return False @@ -44,7 +44,7 @@ class PluginToolLoader(loader.ToolLoader): for plugin in self.ap.plugin_mgr.plugins( enabled=True, status=plugin_context.RuntimeContainerStatus.INITIALIZED ): - for function in plugin.content_functions: + for function in plugin.tools: if function.name == name: return function, plugin.plugin_inst return None, None @@ -70,7 +70,7 @@ class PluginToolLoader(loader.ToolLoader): plugin = None for p in self.ap.plugin_mgr.plugins(): - if function in p.content_functions: + if function in p.tools: plugin = p break @@ -79,7 +79,7 @@ class PluginToolLoader(loader.ToolLoader): await self.ap.ctr_mgr.usage.post_function_record( plugin={ "name": plugin.plugin_name, - "remote": plugin.plugin_source, + "remote": plugin.plugin_repository, "version": plugin.plugin_version, "author": plugin.plugin_author, }, From ebd091a9e0f66d3107f79f18176a45f5c4afaaaf Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 20:21:43 +0800 Subject: [PATCH 031/205] refactor: move plugin setting to db --- pkg/api/http/controller/groups/plugins.py | 32 ++++--- pkg/entity/persistence/plugin.py | 16 ++++ pkg/persistence/mgr.py | 2 +- pkg/plugin/context.py | 7 ++ pkg/plugin/installers/github.py | 8 +- pkg/plugin/loaders/classic.py | 8 +- pkg/plugin/loaders/manifest.py | 3 + pkg/plugin/manager.py | 78 +++++++++++++++-- pkg/plugin/setting.py | 101 ---------------------- pkg/utils/version.py | 2 +- 10 files changed, 130 insertions(+), 127 deletions(-) create mode 100644 pkg/entity/persistence/plugin.py delete mode 100644 pkg/plugin/setting.py diff --git a/pkg/api/http/controller/groups/plugins.py b/pkg/api/http/controller/groups/plugins.py index 00951550..3873872a 100644 --- a/pkg/api/http/controller/groups/plugins.py +++ b/pkg/api/http/controller/groups/plugins.py @@ -44,20 +44,28 @@ class PluginsRouterGroup(group.RouterGroup): 'task_id': wrapper.id }) - @self.route('//', methods=['DELETE'], auth_type=group.AuthType.USER_TOKEN) + @self.route('//', methods=['GET', 'DELETE'], auth_type=group.AuthType.USER_TOKEN) async def _(author: str, plugin_name: str) -> str: - ctx = taskmgr.TaskContext.new() - wrapper = self.ap.task_mgr.create_user_task( - self.ap.plugin_mgr.uninstall_plugin(plugin_name, task_context=ctx), - kind="plugin-operation", - name=f'plugin-remove-{plugin_name}', - label=f'删除插件 {plugin_name}', - context=ctx - ) + if quart.request.method == 'GET': + plugin = self.ap.plugin_mgr.get_plugin(author, plugin_name) + if plugin is None: + return self.http_status(404, -1, 'plugin not found') + return self.success(data={ + 'plugin': plugin.model_dump() + }) + elif quart.request.method == 'DELETE': + ctx = taskmgr.TaskContext.new() + wrapper = self.ap.task_mgr.create_user_task( + self.ap.plugin_mgr.uninstall_plugin(plugin_name, task_context=ctx), + kind="plugin-operation", + name=f'plugin-remove-{plugin_name}', + label=f'删除插件 {plugin_name}', + context=ctx + ) - return self.success(data={ - 'task_id': wrapper.id - }) + return self.success(data={ + 'task_id': wrapper.id + }) @self.route('/reorder', methods=['PUT'], auth_type=group.AuthType.USER_TOKEN) async def _() -> str: diff --git a/pkg/entity/persistence/plugin.py b/pkg/entity/persistence/plugin.py new file mode 100644 index 00000000..b1e2cac4 --- /dev/null +++ b/pkg/entity/persistence/plugin.py @@ -0,0 +1,16 @@ +import sqlalchemy + +from .base import Base + + +class PluginSetting(Base): + """插件配置""" + __tablename__ = 'plugin_settings' + + plugin_author = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + plugin_name = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + enabled = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=True) + priority = sqlalchemy.Column(sqlalchemy.Integer, nullable=False, default=0) + config = sqlalchemy.Column(sqlalchemy.JSON, nullable=False, default=dict) + created_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now()) + updated_at = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now()) diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 2892c52b..56809e6b 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -8,7 +8,7 @@ import sqlalchemy.ext.asyncio as sqlalchemy_asyncio import sqlalchemy from . import database -from ..entity.persistence import base, user, model, pipeline, bot +from ..entity.persistence import base, user, model, pipeline, bot, plugin from ..core import app from .databases import sqlite diff --git a/pkg/plugin/context.py b/pkg/plugin/context.py index 16fe414d..63d390f8 100644 --- a/pkg/plugin/context.py +++ b/pkg/plugin/context.py @@ -339,6 +339,12 @@ class RuntimeContainer(pydantic.BaseModel): priority: typing.Optional[int] = 0 """优先级""" + config_schema: typing.Optional[list[dict]] = [] + """插件配置模板""" + + plugin_config: typing.Optional[dict] = {} + """插件配置""" + plugin_inst: typing.Optional[BasePlugin] = None """插件实例""" @@ -389,6 +395,7 @@ class RuntimeContainer(pydantic.BaseModel): 'pkg_path': self.pkg_path, 'enabled': self.enabled, 'priority': self.priority, + "config_schema": self.config_schema, 'event_handlers': { event_name.__name__: handler.__name__ for event_name, handler in self.event_handlers.items() diff --git a/pkg/plugin/installers/github.py b/pkg/plugin/installers/github.py index 77ee7490..ff36cb5b 100644 --- a/pkg/plugin/installers/github.py +++ b/pkg/plugin/installers/github.py @@ -99,9 +99,11 @@ class GitHubRepoInstaller(installer.PluginInstaller): task_context.trace("安装插件依赖...", "install-plugin") await self.install_requirements("plugins/" + repo_label) task_context.trace("完成.", "install-plugin") - await self.ap.plugin_mgr.setting.record_installed_plugin_source( - "plugins/" + repo_label + '/', plugin_source - ) + + # Caution: in the v4.0, plugin without manifest will not be able to be updated + # await self.ap.plugin_mgr.setting.record_installed_plugin_source( + # "plugins/" + repo_label + '/', plugin_source + # ) async def uninstall_plugin( self, diff --git a/pkg/plugin/loaders/classic.py b/pkg/plugin/loaders/classic.py index 23a107d4..3cbcdbf2 100644 --- a/pkg/plugin/loaders/classic.py +++ b/pkg/plugin/loaders/classic.py @@ -133,7 +133,10 @@ class PluginLoader(loader.PluginLoader): """注册事件处理器""" self.ap.logger.debug(f'注册事件处理器 {event.__name__}') def wrapper(func: typing.Callable) -> typing.Callable: - + + if self._current_container is None: # None indicates this plugin is registered through manifest, so ignore it here + return func + self._current_container.event_handlers[event] = func return func @@ -148,6 +151,9 @@ class PluginLoader(loader.PluginLoader): self.ap.logger.debug(f'注册内容函数 {name}') def wrapper(func: typing.Callable) -> typing.Callable: + if self._current_container is None: # None indicates this plugin is registered through manifest, so ignore it here + return func + function_schema = funcschema.get_func_schema(func) function_name = self._current_container.plugin_name + '-' + (func.__name__ if name is None else name) diff --git a/pkg/plugin/loaders/manifest.py b/pkg/plugin/loaders/manifest.py index 2f7b83f2..5fd4eea8 100644 --- a/pkg/plugin/loaders/manifest.py +++ b/pkg/plugin/loaders/manifest.py @@ -68,6 +68,8 @@ class PluginManifestLoader(loader.PluginLoader): for plugin_manifest in plugin_manifests: try: + config_schema = plugin_manifest.spec['config'] if 'config' in plugin_manifest.spec else [] + current_plugin_container = context.RuntimeContainer( plugin_name=plugin_manifest.metadata.name, plugin_label=plugin_manifest.metadata.label, @@ -77,6 +79,7 @@ class PluginManifestLoader(loader.PluginLoader): plugin_repository=plugin_manifest.metadata.repository, main_file=os.path.join(plugin_manifest.rel_dir, plugin_manifest.execution.python.path), pkg_path=plugin_manifest.rel_dir, + config_schema=config_schema, event_handlers={}, tools=[], ) diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index cdae7b19..8258e40c 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -3,10 +3,13 @@ from __future__ import annotations import typing import traceback +import sqlalchemy + from ..core import app, taskmgr -from . import context, loader, events, installer, setting, models +from . import context, loader, events, installer, models from .loaders import classic, manifest from .installers import github +from ..entity.persistence import plugin as persistence_plugin class PluginManager: @@ -18,8 +21,6 @@ class PluginManager: installer: installer.PluginInstaller - setting: setting.SettingManager - api_host: context.APIHost plugin_containers: list[context.RuntimeContainer] @@ -40,6 +41,18 @@ class PluginManager: plugins = [plugin for plugin in plugins if plugin.status == status] return plugins + + def get_plugin( + self, + author: str, + plugin_name: str, + ) -> context.RuntimeContainer: + """通过作者和插件名获取插件 + """ + for plugin in self.plugins(): + if plugin.plugin_author == author and plugin.plugin_name == plugin_name: + return plugin + return None def __init__(self, ap: app.Application): self.ap = ap @@ -48,7 +61,6 @@ class PluginManager: manifest.PluginManifestLoader(ap), ] self.installer = github.GitHubRepoInstaller(ap) - self.setting = setting.SettingManager(ap) self.api_host = context.APIHost(ap) self.plugin_containers = [] @@ -56,23 +68,73 @@ class PluginManager: for loader in self.loaders: await loader.initialize() await self.installer.initialize() - await self.setting.initialize() await self.api_host.initialize() setattr(models, 'require_ver', self.api_host.require_ver) async def load_plugins(self): + self.ap.logger.info('Loading all plugins...') + for loader in self.loaders: await loader.load_plugins() self.plugin_containers.extend(loader.plugins) - await self.setting.sync_setting(self.plugin_containers) + await self.load_plugin_settings(self.plugin_containers) # 按优先级倒序 self.plugin_containers.sort(key=lambda x: x.priority, reverse=True) self.ap.logger.debug(f'优先级排序后的插件列表 {self.plugin_containers}') + async def load_plugin_settings( + self, + plugin_containers: list[context.RuntimeContainer] + ): + for plugin_container in plugin_containers: + result = await self.ap.persistence_mgr.execute_async( + sqlalchemy.select(persistence_plugin.PluginSetting) \ + .where(persistence_plugin.PluginSetting.plugin_author == plugin_container.plugin_author) + .where(persistence_plugin.PluginSetting.plugin_name == plugin_container.plugin_name) + ) + + setting = result.first() + + if setting is None: + + new_setting_data = { + 'plugin_author': plugin_container.plugin_author, + 'plugin_name': plugin_container.plugin_name, + 'enabled': plugin_container.enabled, + 'priority': plugin_container.priority, + 'config': plugin_container.plugin_config, + } + + await self.ap.persistence_mgr.execute_async( + sqlalchemy.insert(persistence_plugin.PluginSetting).values(**new_setting_data) + ) + continue + else: + plugin_container.enabled = setting.enabled + plugin_container.priority = setting.priority + plugin_container.plugin_config = setting.config + + async def dump_plugin_container_setting( + self, + plugin_container: context.RuntimeContainer + ): + """保存单个插件容器的设置到数据库 + """ + await self.ap.persistence_mgr.execute_async( + sqlalchemy.update(persistence_plugin.PluginSetting) + .where(persistence_plugin.PluginSetting.plugin_author == plugin_container.plugin_author) + .where(persistence_plugin.PluginSetting.plugin_name == plugin_container.plugin_name) + .values( + enabled=plugin_container.enabled, + priority=plugin_container.priority, + config=plugin_container.plugin_config + ) + ) + async def initialize_plugin(self, plugin: context.RuntimeContainer): self.ap.logger.debug(f'初始化插件 {plugin.plugin_name}') plugin.plugin_inst = plugin.plugin_class(self.api_host) @@ -275,7 +337,7 @@ class PluginManager: plugin.enabled = new_status - await self.setting.dump_container_setting(self.plugin_containers) + await self.dump_plugin_container_setting(self.plugin_containers) break @@ -296,4 +358,4 @@ class PluginManager: self.plugin_containers.sort(key=lambda x: x.priority, reverse=True) - await self.setting.dump_container_setting(self.plugin_containers) + await self.dump_plugin_container_setting(self.plugin_containers) diff --git a/pkg/plugin/setting.py b/pkg/plugin/setting.py deleted file mode 100644 index b5c5c06f..00000000 --- a/pkg/plugin/setting.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -from ..core import app -from ..config import manager as cfg_mgr -from . import context - - -class SettingManager: - """插件设置管理器""" - - ap: app.Application - - settings: cfg_mgr.ConfigManager - - def __init__(self, ap: app.Application): - self.ap = ap - - async def initialize(self): - self.settings = self.ap.plugin_setting_meta - - async def sync_setting( - self, - plugin_containers: list[context.RuntimeContainer], - ): - """同步设置 - """ - - not_matched_source_record = [] - - for value in self.settings.data['plugins']: - - if 'name' not in value: # 只有远程地址的,应用到pkg_path相同的插件容器上 - matched = False - - for plugin_container in plugin_containers: - if plugin_container.pkg_path == value['pkg_path']: - matched = True - - plugin_container.plugin_repository = value['source'] - break - - if not matched: - not_matched_source_record.append(value) - else: # 正常的插件设置 - for plugin_container in plugin_containers: - if plugin_container.plugin_name == value['name']: - plugin_container.set_from_setting_dict(value) - break - - self.settings.data = { - 'plugins': [ - p.to_setting_dict() - for p in plugin_containers - ] - } - - self.settings.data['plugins'].extend(not_matched_source_record) - - await self.settings.dump_config() - - async def dump_container_setting( - self, - plugin_containers: list[context.RuntimeContainer] - ): - """保存插件容器设置 - """ - - for plugin in plugin_containers: - for ps in self.settings.data['plugins']: - if ps['name'] == plugin.plugin_name: - plugin_dict = plugin.to_setting_dict() - - for key in plugin_dict: - ps[key] = plugin_dict[key] - - break - - await self.settings.dump_config() - - async def record_installed_plugin_source( - self, - pkg_path: str, - source: str - ): - found = False - - for value in self.settings.data['plugins']: - if value['pkg_path'] == pkg_path: - value['source'] = source - found = True - break - - if not found: - - self.settings.data['plugins'].append( - { - 'pkg_path': pkg_path, - 'source': source - } - ) - await self.settings.dump_config() \ No newline at end of file diff --git a/pkg/utils/version.py b/pkg/utils/version.py index 5e5741c6..9a206171 100644 --- a/pkg/utils/version.py +++ b/pkg/utils/version.py @@ -219,7 +219,7 @@ class VersionManager: try: if await self.ap.ver_mgr.is_new_version_available(): - return "有新版本可用,请使用管理员账号发送 !update 命令更新", logging.INFO + return "有新版本可用,根据文档更新:https://docs.langbot.app/deploy/update.html", logging.INFO except Exception as e: return f"检查版本更新时出错: {e}", logging.WARNING From fc23fc7aedeee55f5e582430dd258fe0421cd8ea Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 21:19:20 +0800 Subject: [PATCH 032/205] feat: applying plugin config to plugin instance --- pkg/api/http/controller/groups/plugins.py | 16 ++++++++++++++++ pkg/plugin/context.py | 4 ++++ pkg/plugin/manager.py | 8 ++++++++ 3 files changed, 28 insertions(+) diff --git a/pkg/api/http/controller/groups/plugins.py b/pkg/api/http/controller/groups/plugins.py index 3873872a..330231c2 100644 --- a/pkg/api/http/controller/groups/plugins.py +++ b/pkg/api/http/controller/groups/plugins.py @@ -66,6 +66,22 @@ class PluginsRouterGroup(group.RouterGroup): return self.success(data={ 'task_id': wrapper.id }) + + @self.route('///config', methods=['GET', 'PUT'], auth_type=group.AuthType.USER_TOKEN) + async def _(author: str, plugin_name: str) -> quart.Response: + plugin = self.ap.plugin_mgr.get_plugin(author, plugin_name) + if plugin is None: + return self.http_status(404, -1, 'plugin not found') + if quart.request.method == 'GET': + return self.success(data={ + 'config': plugin.plugin_config + }) + elif quart.request.method == 'PUT': + data = await quart.request.json + + await self.ap.plugin_mgr.set_plugin_config(plugin, data) + + return self.success(data={}) @self.route('/reorder', methods=['PUT'], auth_type=group.AuthType.USER_TOKEN) async def _() -> str: diff --git a/pkg/plugin/context.py b/pkg/plugin/context.py index 63d390f8..3ff1ffc7 100644 --- a/pkg/plugin/context.py +++ b/pkg/plugin/context.py @@ -87,9 +87,13 @@ class BasePlugin(metaclass=abc.ABCMeta): ap: app.Application """应用程序对象""" + config: dict + """插件配置""" + def __init__(self, host: APIHost): """初始化阶段被调用""" self.host = host + self.config = {} async def initialize(self): """初始化阶段被调用""" diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index 8258e40c..042fb909 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -138,6 +138,7 @@ class PluginManager: async def initialize_plugin(self, plugin: context.RuntimeContainer): self.ap.logger.debug(f'初始化插件 {plugin.plugin_name}') plugin.plugin_inst = plugin.plugin_class(self.api_host) + plugin.plugin_inst.config = plugin.plugin_config plugin.plugin_inst.ap = self.ap plugin.plugin_inst.host = self.api_host await plugin.plugin_inst.initialize() @@ -359,3 +360,10 @@ class PluginManager: self.plugin_containers.sort(key=lambda x: x.priority, reverse=True) await self.dump_plugin_container_setting(self.plugin_containers) + + async def set_plugin_config(self, plugin_container: context.RuntimeContainer, new_config: dict): + plugin_container.plugin_config = new_config + + plugin_container.plugin_inst.config = new_config + + await self.dump_plugin_container_setting(plugin_container) From e5bcb1d179fb6c44311c12f4ec4ee44d04bc1f88 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 21:20:43 +0800 Subject: [PATCH 033/205] chore: delete legacy plugin settings file --- pkg/core/app.py | 2 -- pkg/core/bootutils/files.py | 1 - pkg/core/stages/load_config.py | 3 --- templates/plugin-settings.json | 3 --- 4 files changed, 9 deletions(-) delete mode 100644 templates/plugin-settings.json diff --git a/pkg/core/app.py b/pkg/core/app.py index e543cd27..fc01d9f3 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -74,8 +74,6 @@ class Application: adapter_qq_botpy_meta: config_mgr.ConfigManager = None - plugin_setting_meta: config_mgr.ConfigManager = None - llm_models_meta: config_mgr.ConfigManager = None instance_secret_meta: config_mgr.ConfigManager = None diff --git a/pkg/core/bootutils/files.py b/pkg/core/bootutils/files.py index c1d077d7..dbaad8ea 100644 --- a/pkg/core/bootutils/files.py +++ b/pkg/core/bootutils/files.py @@ -7,7 +7,6 @@ import sys required_files = { "plugins/__init__.py": "templates/__init__.py", - "plugins/plugins.json": "templates/plugin-settings.json", "data/config/command.json": "templates/command.json", "data/config/pipeline.json": "templates/pipeline.json", "data/config/platform.json": "templates/platform.json", diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index e7a7cb05..a1767654 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -66,9 +66,6 @@ class LoadConfigStage(stage.BootingStage): doc_link="https://docs.langbot.app/config/function/system.html" ) - ap.plugin_setting_meta = await config.load_json_config("plugins/plugins.json", "templates/plugin-settings.json") - await ap.plugin_setting_meta.dump_config() - ap.sensitive_meta = await config.load_json_config("data/metadata/sensitive-words.json", "templates/metadata/sensitive-words.json") await ap.sensitive_meta.dump_config() diff --git a/templates/plugin-settings.json b/templates/plugin-settings.json deleted file mode 100644 index 1d807ed1..00000000 --- a/templates/plugin-settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": [] -} \ No newline at end of file From 80cf5c738f3fa741fe7c35957ab279dcdda816ed Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 21:26:53 +0800 Subject: [PATCH 034/205] chore: todo comment for component extensions --- pkg/plugin/loaders/manifest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/plugin/loaders/manifest.py b/pkg/plugin/loaders/manifest.py index 5fd4eea8..101fdb3a 100644 --- a/pkg/plugin/loaders/manifest.py +++ b/pkg/plugin/loaders/manifest.py @@ -92,6 +92,8 @@ class PluginManifestLoader(loader.PluginLoader): plugin_class = plugin_manifest.get_python_component_class() current_plugin_container.plugin_class = plugin_class + # TODO load component extensions + self.plugins.append(current_plugin_container) except Exception as e: self.ap.logger.error(f'加载插件 {plugin_manifest.metadata.name} 时发生错误') From b64e1c609f3d33df8293c2f09a0f94f348b3ed62 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 22:19:18 +0800 Subject: [PATCH 035/205] refactor: remove adapter-qq-botpy.json metadata --- pkg/core/app.py | 2 -- pkg/core/stages/load_config.py | 3 -- pkg/platform/sources/qqbotpy.py | 45 ++++++------------------ templates/metadata/adapter-qq-botpy.json | 6 ---- 4 files changed, 11 insertions(+), 45 deletions(-) delete mode 100644 templates/metadata/adapter-qq-botpy.json diff --git a/pkg/core/app.py b/pkg/core/app.py index fc01d9f3..43d124a4 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -72,8 +72,6 @@ class Application: sensitive_meta: config_mgr.ConfigManager = None - adapter_qq_botpy_meta: config_mgr.ConfigManager = None - llm_models_meta: config_mgr.ConfigManager = None instance_secret_meta: config_mgr.ConfigManager = None diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index a1767654..dc4e5edb 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -69,9 +69,6 @@ class LoadConfigStage(stage.BootingStage): ap.sensitive_meta = await config.load_json_config("data/metadata/sensitive-words.json", "templates/metadata/sensitive-words.json") await ap.sensitive_meta.dump_config() - ap.adapter_qq_botpy_meta = await config.load_json_config("data/metadata/adapter-qq-botpy.json", "templates/metadata/adapter-qq-botpy.json") - await ap.adapter_qq_botpy_meta.dump_config() - ap.instance_secret_meta = await config.load_json_config("data/metadata/instance-secret.json", template_data={ 'jwt_secret': secrets.token_hex(16) }) diff --git a/pkg/platform/sources/qqbotpy.py b/pkg/platform/sources/qqbotpy.py index 9f407b7f..716da80f 100644 --- a/pkg/platform/sources/qqbotpy.py +++ b/pkg/platform/sources/qqbotpy.py @@ -237,12 +237,8 @@ class OfficialMessageConverter(adapter_model.MessageConverter): class OfficialEventConverter(adapter_model.EventConverter): """事件转换器""" - member_openid_mapping: OpenIDMapping[str, int] - group_openid_mapping: OpenIDMapping[str, int] - - def __init__(self, member_openid_mapping: OpenIDMapping[str, int], group_openid_mapping: OpenIDMapping[str, int]): - self.member_openid_mapping = member_openid_mapping - self.group_openid_mapping = group_openid_mapping + def __init__(self): + pass def yiri2target(self, event: typing.Type[platform_events.Event]): if event == platform_events.GroupMessage: @@ -313,16 +309,16 @@ class OfficialEventConverter(adapter_model.EventConverter): ) elif type(event) == botpy_message.GroupMessage: # 群聊,转群聊事件 - replacing_member_id = self.member_openid_mapping.save_openid(event.author.member_openid) + author_member_id = event.author.member_openid return OfficialGroupMessage( sender=platform_entities.GroupMember( - id=replacing_member_id, - member_name=replacing_member_id, + id=author_member_id, + member_name=author_member_id, permission="MEMBER", group=platform_entities.Group( - id=self.group_openid_mapping.save_openid(event.group_openid), - name=replacing_member_id, + id=event.group_openid, + name=author_member_id, permission=platform_entities.Permission.Member, ), special_title="", @@ -341,7 +337,7 @@ class OfficialEventConverter(adapter_model.EventConverter): ) elif type(event) == botpy_message.C2CMessage: # 私聊,转私聊事件 - user_id_alter = self.member_openid_mapping.save_openid(event.author.user_openid) # 实测这里的user_openid与group的member_openid是一样的 + user_id_alter = event.author.user_openid return OfficialFriendMessage( sender=platform_entities.Friend( @@ -382,9 +378,6 @@ class OfficialAdapter(adapter_model.MessagePlatformAdapter): metadata: cfg_mgr.ConfigManager = None - member_openid_mapping: OpenIDMapping[str, int] = None - group_openid_mapping: OpenIDMapping[str, int] = None - group_msg_seq = None c2c_msg_seq = None @@ -478,9 +471,7 @@ class OfficialAdapter(adapter_model.MessagePlatformAdapter): if "file_image" in args: # 暂不支持发送文件图片 continue - args["group_openid"] = self.group_openid_mapping.getkey( - message_source.sender.group.id - ) + args["group_openid"] = message_source.sender.group.id if "image" in args: uploadMedia = await self.bot.api.post_group_file( @@ -503,9 +494,7 @@ class OfficialAdapter(adapter_model.MessagePlatformAdapter): elif type(message_source) == OfficialFriendMessage: if "file_image" in args: continue - args["openid"] = self.member_openid_mapping.getkey( - message_source.sender.id - ) + args["openid"] = message_source.sender.id if "image" in args: uploadMedia = await self.bot.api.post_c2c_file( @@ -569,20 +558,8 @@ class OfficialAdapter(adapter_model.MessagePlatformAdapter): self.metadata = self.ap.adapter_qq_botpy_meta - self.member_openid_mapping = OpenIDMapping( - map=self.metadata.data["mapping"]["members"], - dump_func=self.metadata.dump_config_sync, - ) - - self.group_openid_mapping = OpenIDMapping( - map=self.metadata.data["mapping"]["groups"], - dump_func=self.metadata.dump_config_sync, - ) - self.message_converter = OfficialMessageConverter() - self.event_converter = OfficialEventConverter( - self.member_openid_mapping, self.group_openid_mapping - ) + self.event_converter = OfficialEventConverter() self.cfg['ret_coro'] = True diff --git a/templates/metadata/adapter-qq-botpy.json b/templates/metadata/adapter-qq-botpy.json deleted file mode 100644 index 765f12c9..00000000 --- a/templates/metadata/adapter-qq-botpy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "mapping": { - "groups": {}, - "members": {} - } -} \ No newline at end of file From 633d3b5af2fae3c21d3d1793d34594c8e6d1b02f Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sat, 12 Apr 2025 22:31:37 +0800 Subject: [PATCH 036/205] refactor: remove legacy config schemas --- pkg/core/stages/load_config.py | 6 - pkg/utils/schema.py | 14 - templates/schema/command.json | 39 --- templates/schema/pipeline.json | 326 ------------------ templates/schema/platform.json | 568 ------------------------------ templates/schema/provider.json | 606 --------------------------------- templates/schema/system.json | 126 ------- 7 files changed, 1685 deletions(-) delete mode 100644 pkg/utils/schema.py delete mode 100644 templates/schema/command.json delete mode 100644 templates/schema/pipeline.json delete mode 100644 templates/schema/platform.json delete mode 100644 templates/schema/provider.json delete mode 100644 templates/schema/system.json diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index dc4e5edb..e602a7ba 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -5,7 +5,6 @@ import secrets from .. import stage, app from ..bootutils import config from ...config import settings as settings_mgr -from ...utils import schema @stage.stage_class("LoadConfigStage") @@ -30,7 +29,6 @@ class LoadConfigStage(stage.BootingStage): name="command.json", description="命令配置", manager=ap.command_cfg, - schema=schema.CONFIG_COMMAND_SCHEMA, doc_link="https://docs.langbot.app/config/function/command.html" ) @@ -38,7 +36,6 @@ class LoadConfigStage(stage.BootingStage): name="pipeline.json", description="消息处理流水线配置", manager=ap.pipeline_cfg, - schema=schema.CONFIG_PIPELINE_SCHEMA, doc_link="https://docs.langbot.app/config/function/pipeline.html" ) @@ -46,7 +43,6 @@ class LoadConfigStage(stage.BootingStage): name="platform.json", description="消息平台配置", manager=ap.platform_cfg, - schema=schema.CONFIG_PLATFORM_SCHEMA, doc_link="https://docs.langbot.app/config/function/platform.html" ) @@ -54,7 +50,6 @@ class LoadConfigStage(stage.BootingStage): name="provider.json", description="大模型能力配置", manager=ap.provider_cfg, - schema=schema.CONFIG_PROVIDER_SCHEMA, doc_link="https://docs.langbot.app/config/function/provider.html" ) @@ -62,7 +57,6 @@ class LoadConfigStage(stage.BootingStage): name="system.json", description="系统配置", manager=ap.system_cfg, - schema=schema.CONFIG_SYSTEM_SCHEMA, doc_link="https://docs.langbot.app/config/function/system.html" ) diff --git a/pkg/utils/schema.py b/pkg/utils/schema.py deleted file mode 100644 index 378cdf5b..00000000 --- a/pkg/utils/schema.py +++ /dev/null @@ -1,14 +0,0 @@ -import os -import json - - -def load_schema(schema_path: str) -> dict: - with open(schema_path, 'r', encoding='utf-8') as f: - return json.load(f) - - -CONFIG_SYSTEM_SCHEMA = load_schema("templates/schema/system.json") -CONFIG_PIPELINE_SCHEMA = load_schema("templates/schema/pipeline.json") -CONFIG_COMMAND_SCHEMA = load_schema("templates/schema/command.json") -CONFIG_PLATFORM_SCHEMA = load_schema("templates/schema/platform.json") -CONFIG_PROVIDER_SCHEMA = load_schema("templates/schema/provider.json") diff --git a/templates/schema/command.json b/templates/schema/command.json deleted file mode 100644 index 1cfc2541..00000000 --- a/templates/schema/command.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "object", - "layout": "expansion-panels", - "properties": { - "command-prefix": { - "type": "array", - "title": "命令前缀", - "description": "以数组形式设置,程序将前缀符合设置的消息视为命令(群内需要符合群响应规则)", - "items": { - "type": "string" - }, - "default": [ - "!", - "!" - ] - }, - "privilege": { - "type": "object", - "title": "权限管理", - "description": "设置每个命令的权限配置。普通用户权限级别为 1,管理员(system.json中设置的)权限级别为 2;在这里设置每个命令的最低权限级别,若设置为1,则用户和管理员均可用,若为2,则仅管理员可用;设置子命令时,以点号间隔,如\"plugin.on\"", - "properties": { - "placeholder": { - "type": "integer", - "minimum": 1, - "maximum": 2, - "const": 1 - } - }, - "patternProperties": { - "^[a-zA-Z0-9_.]+$": { - "type": "integer", - "minimum": 1, - "maximum": 2 - } - }, - "default": {} - } - } -} \ No newline at end of file diff --git a/templates/schema/pipeline.json b/templates/schema/pipeline.json deleted file mode 100644 index 787c9e71..00000000 --- a/templates/schema/pipeline.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "type": "object", - "layout": "expansion-panels", - "properties": { - "access-control": { - "type": "object", - "title": "访问控制", - "properties": { - "mode": { - "type": "string", - "title": "访问控制模式", - "description": "访问控制模式,支持黑名单和白名单", - "enum": [ - "blacklist", - "whitelist" - ], - "default": "blacklist" - }, - "blacklist": { - "type": "array", - "title": "黑名单", - "description": "黑名单中的会话将无法使用机器人,仅在访问控制模式为黑名单时有效。格式:{type}_{id},示例:group_12345678 或 person_12341234", - "items": { - "type": "string", - "format": "regex", - "pattern": "^(person|group)_.*$" - }, - "default": [] - }, - "whitelist": { - "type": "array", - "title": "白名单", - "description": "仅白名单中的会话可以使用机器人,仅在访问控制模式为白名单时有效。格式:{type}_{id},示例:group_12345678 或 person_12341234", - "items": { - "type": "string", - "format": "regex", - "pattern": "^(person|group)_.*$" - }, - "default": [] - } - }, - "required": [ - "mode" - ] - }, - "respond-rules": { - "type": "object", - "title": "群消息响应规则", - "description": "仅处理 访问控制 允许的会话的消息。所有未指定的群使用 默认响应规则,若需指定特定的群的规则,请输入 群号 并添加,并设置响应规则", - "properties": { - "default": { - "type": "object", - "title": "默认响应规则", - "properties": { - "at": { - "type": "boolean", - "title": "是否响应 @ 消息", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "prefix": { - "type": "array", - "title": "响应前缀", - "description": "带有指定前缀的消息即使没有 at 机器人也会被响应,发送给 AI 时会删除前缀", - "items": { - "type": "string" - }, - "default": [] - }, - "regexp": { - "type": "array", - "title": "响应正则表达式", - "description": "正则表达式教程:https://www.runoob.com/regexp/regexp-syntax.html", - "items": { - "type": "string", - "format": "regex" - }, - "default": [] - }, - "random": { - "type": "number", - "title": "随机响应概率", - "description": "数值范围是0.0-1.0,对应概率0%-100%,为1.0时所有消息都响应", - "minimum": 0, - "maximum": 1, - "step": 0.01, - "layout": { - "comp": "slider", - "props": { - "color": "primary" - } - } - } - } - } - }, - "patternProperties": { - "^.*$": { - "type": "object", - "properties": { - "at": { - "type": "boolean", - "title": "是否响应 @ 消息", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "prefix": { - "type": "array", - "title": "响应前缀", - "description": "带有指定前缀的消息即使没有 at 机器人也会被响应,发送给 AI 时会删除前缀", - "items": { - "type": "string" - }, - "default": [] - }, - "regexp": { - "type": "array", - "title": "响应正则表达式", - "description": "正则表达式教程:https://www.runoob.com/regexp/regexp-syntax.html", - "items": { - "type": "string", - "format": "regex" - }, - "default": [] - }, - "random": { - "type": "number", - "title": "随机响应概率", - "description": "数值范围是0.0-1.0,对应概率0%-100%,为1.0时所有消息都响应", - "minimum": 0, - "maximum": 1, - "step": 0.01, - "layout": { - "comp": "slider", - "props": { - "color": "primary" - } - } - } - } - } - } - }, - "income-msg-check": { - "type": "boolean", - "title": "检查传入消息内容", - "description": "是否对传入的消息(用户消息)进行检查,需配合审核策略使用(AI 响应内容一定会通过检查策略)", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "ignore-rules": { - "type": "object", - "title": "传入消息忽略规则", - "description": "符合规则的传入消息将被忽略,仅传入消息检查被启用时生效", - "properties": { - "prefix": { - "type": "array", - "title": "忽略前缀", - "description": "具有指定前缀的消息将被忽略", - "items": { - "type": "string" - }, - "default": [] - }, - "regexp": { - "type": "array", - "title": "忽略正则表达式", - "description": "正则表达式教程:https://www.runoob.com/regexp/regexp-syntax.html", - "items": { - "type": "string", - "format": "regex" - }, - "default": [] - } - } - }, - "check-sensitive-words": { - "type": "boolean", - "title": "本地敏感词检查", - "description": "是否启用本地敏感词检查", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "baidu-cloud-examine": { - "type": "object", - "title": "百度云内容审核配置", - "description": "百度云内容审核配置,前往:https://cloud.baidu.com/doc/ANTIPORN/index.html 获取 API Key 和 API Secret", - "properties": { - "enable": { - "type": "boolean", - "title": "是否启用", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "api-key": { - "type": "string", - "title": "API Key", - "default": "" - }, - "api-secret": { - "type": "string", - "title": "API Secret", - "default": "" - } - } - }, - "rate-limit": { - "type": "object", - "title": "请求限速规则", - "properties": { - "strategy": { - "type": "string", - "title": "限速策略", - "description": "会话中的请求速率超过限制时的处理策略,drop为丢弃新请求,wait为等待请求速率降到限制以下", - "enum": [ - "drop", - "wait" - ], - "default": "drop" - }, - "algo": { - "type": "string", - "title": "限速算法", - "description": "目前仅支持 fixwin(固定窗口),支持插件扩展", - "enum": [ - "fixwin" - ], - "default": "fixwin" - }, - "fixwin": { - "type": "object", - "title": "固定窗口限速策略配置", - "description": "所有会话使用默认限速策略,若需指定特定会话的限速策略,请输入 会话名称(格式为 {type}_{id},示例:group_123456 或 person_123456) 并添加,以设置特定会话的限速参数", - "properties": { - "default": { - "type": "object", - "title": "默认限速策略", - "properties": { - "window-size": { - "type": "integer", - "title": "窗口大小(秒)", - "minimum": 1, - "default": 60 - }, - "limit": { - "type": "integer", - "title": "窗口期间允许的最大消息数", - "minimum": 1, - "default": 60 - } - } - } - }, - "patternProperties": { - "^(person|group).*$": { - "type": "object", - "title": "会话限速", - "properties": { - "window-size": { - "type": "integer", - "title": "窗口大小(秒)", - "minimum": 1, - "default": 60 - }, - "limit": { - "type": "integer", - "title": "窗口期间允许的最大消息数", - "minimum": 1, - "default": 60 - } - } - } - } - } - } - }, - "msg-truncate": { - "type": "object", - "title": "对话历史记录截断", - "description": "将在发送消息给模型之前对当前会话的历史消息进行截断,以限制传给模型的消息长度", - "properties": { - "method": { - "type": "string", - "title": "截断方法", - "description": "目前仅支持 round(按回合截断),支持插件扩展", - "enum": [ - "round" - ], - "default": "round" - }, - "round": { - "type": "object", - "title": "轮次截断策略配置", - "properties": { - "max-round": { - "type": "integer", - "title": "最大保留前文回合数", - "minimum": 1, - "default": 10 - } - } - } - } - } - } -} \ No newline at end of file diff --git a/templates/schema/platform.json b/templates/schema/platform.json deleted file mode 100644 index 4bc6f111..00000000 --- a/templates/schema/platform.json +++ /dev/null @@ -1,568 +0,0 @@ -{ - "type": "object", - "layout": "expansion-panels", - "properties": { - "platform-adapters": { - "type": "array", - "title": "消息平台适配器", - "default": {}, - "items": { - "type": "object", - "oneOf": [ - { - "title": "Nakuru 适配器", - "description": "用于接入 go-cqhttp", - "properties": { - "adapter": { - "type": "string", - "const": "nakuru" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "host": { - "type": "string", - "default": "127.0.0.1" - }, - "ws_port": { - "type": "integer", - "default": 8080 - }, - "http_port": { - "type": "integer", - "default": 5700 - }, - "token": { - "type": "string", - "default": "" - } - } - }, - { - "title": "aiocqhttp 适配器", - "description": "用于接入 Lagrange 等兼容 OneBot v11 协议的机器人框架(仅支持反向ws)", - "properties": { - "adapter": { - "type": "string", - "const": "aiocqhttp" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "host": { - "type": "string", - "default": "0.0.0.0", - "description": "监听的 IP 地址,一般就保持 0.0.0.0 就可以了。使用 aiocqhttp 时,LangBot 作为服务端被动等待框架连接,请在 Lagrange 等框架中设置被动 ws 地址或者反向 ws 地址(具体视框架而定)为 LangBot 监听的地址,且路径为/ws,例如:ws://127.0.0.1:2280/ws" - }, - "port": { - "type": "integer", - "default": 2290, - "description": "设置监听的端口,默认2280,需在 Lagrange 等框架中设置为与此处一致的端口" - }, - "access-token": { - "type": "string", - "default": "", - "description": "设置访问密钥,与 Lagrange 等框架中设置的保持一致" - } - } - }, - { - "title": "qq-botpy 适配器(WebSocket)", - "description": "用于接入 QQ 官方机器人 API", - "properties": { - "adapter": { - "type": "string", - "const": "qq-botpy" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "appid": { - "type": "string", - "default": "", - "description": "申请到的QQ官方机器人的appid" - }, - "secret": { - "type": "string", - "default": "", - "description": "申请到的QQ官方机器人的secret" - }, - "intents": { - "type": "array", - "description": "控制监听的事件类型,需要填写才能接收到对应消息,目前支持的事件类型有:public_guild_messages(QQ 频道消息)、direct_message(QQ 频道私聊消息)、public_messages(QQ 群 和 列表私聊消息)", - "default": [ - "public_guild_messages", - "direct_message", - "public_messages" - ] - } - } - }, - { - "title": "QQ 官方适配器(WebHook)", - "description": "用于接入 QQ 官方机器人 API", - "properties": { - "adapter": { - "type": "string", - "const": "qqofficial" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "appid": { - "type": "string", - "default": "", - "description": "申请到的QQ官方机器人的appid" - }, - "secret": { - "type": "string", - "default": "", - "description": "申请到的QQ官方机器人的secret" - }, - "port": { - "type": "integer", - "default": 2284, - "description": "监听的端口" - }, - "token": { - "type": "string", - "default": "", - "description": "申请到的QQ官方机器人的token" - } - } - }, - { - "title": "企业微信适配器", - "description": "用于接入企业微信", - "properties": { - "adapter": { - "type": "string", - "const": "wecom" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "host": { - "type": "string", - "default": "0.0.0.0", - "description": "监听的IP地址" - }, - "port": { - "type": "integer", - "default": 2290, - "description": "监听的端口" - }, - "corpid": { - "type": "string", - "default": "", - "description": "企业微信的corpid" - }, - "secret": { - "type": "string", - "default": "", - "description": "企业微信的secret" - }, - "token": { - "type": "string", - "default": "", - "description": "企业微信的token" - }, - "EncodingAESKey": { - "type": "string", - "default": "", - "description": "企业微信的EncodingAESKey" - }, - "contacts_secret": { - "type": "string", - "default": "", - "description": "企业微信的contacts_secret" - } - } - }, - { - "title": "飞书适配器", - "description": "用于接入飞书", - "properties": { - "adapter": { - "type": "string", - "const": "lark" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "app_id": { - "type": "string", - "default": "", - "description": "飞书的app_id" - }, - "app_secret": { - "type": "string", - "default": "", - "description": "飞书的app_secret" - }, - "bot_name": { - "type": "string", - "default": "", - "description": "飞书的bot_name" - }, - "enable-webhook": { - "type": "boolean", - "default": false, - "description": "是否启用webhook模式" - }, - "port": { - "type": "integer", - "description": "设置监听的端口,开启callback event时需要设置", - "default": 2285 - }, - "encrypt-key": { - "type": "string", - "default": "", - "description": "设置加密密钥" - } - } - }, - { - "title": "Discord 适配器", - "description": "用于接入 Discord", - "properties": { - "adapter": { - "type": "string", - "const": "discord" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "client_id": { - "type": "string", - "default": "", - "description": "Discord 的 client_id" - }, - "token": { - "type": "string", - "default": "", - "description": "Discord 的 token" - } - } - }, - { - "title": "gewechat 适配器", - "description": "用于接入个人微信", - "properties": { - "adapter": { - "type": "string", - "const": "gewechat" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "gewechat_url": { - "type": "string", - "default": "", - "description": "gewechat 的 url" - }, - "gewechat_file_url": { - "type": "string", - "default": "", - "description": "gewechat 文件下载URL" - }, - "port": { - "type": "integer", - "default": 2286, - "description": "gewechat 的端口" - }, - "callback_url": { - "type": "string", - "default": "", - "description": "回调地址(LangBot主机相对于gewechat服务器的地址)" - }, - "app_id": { - "type": "string", - "default": "", - "description": "gewechat 的 app_id" - }, - "token": { - "type": "string", - "default": "", - "description": "gewechat 的 token" - } - } - }, - { - "title": "微信公众号适配器", - "description": "用于接入微信公众号", - "properties": { - "adapter": { - "type": "string", - "const": "officialaccount" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器" - }, - "token": { - "type": "string", - "default": "", - "description": "微信公众号的token" - }, - "EncodingAESKey": { - "type": "string", - "default": "", - "description": "微信公众号的EncodingAESKey" - }, - "AppID": { - "type": "string", - "default": "", - "description": "微信公众号的AppID" - }, - "AppSecret": { - "type": "string", - "default": "", - "description": "微信公众号的AppSecret" - }, - "Mode": { - "type": "string", - "default": "drop", - "description": "对于超过15s的响应的处理模式", - "enum": ["drop", "passive"] - }, - "LoadingMessage": { - "type": "string", - "default": "AI正在思考中,请发送任意内容获取回复。", - "description": "当使用被动模式时,显示给用户的提示信息" - }, - "host": { - "type": "string", - "default": "0.0.0.0", - "description": "监听的IP地址" - }, - "port": { - "type": "integer", - "default": 2287, - "description": "监听的端口" - } - } - }, - { - "title": "钉钉适配器", - "description": "用于接入钉钉", - "properties": { - "adapter": { - "type": "string", - "const": "dingtalk" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "client_id": { - "type": "string", - "default": "", - "description": "钉钉的client_id" - }, - "client_secret": { - "type": "string", - "default": "", - "description": "钉钉的client_secret" - }, - "robot_code": { - "type": "string", - "default": "", - "description": "钉钉的robot_code" - }, - "robot_name": { - "type": "string", - "default": "", - "description": "钉钉的robot_name" - } - } - }, - { - "title": "Telegram 适配器", - "description": "用于接入 Telegram", - "properties": { - "adapter": { - "type": "string", - "const": "telegram" - }, - "enable": { - "type": "boolean", - "default": false, - "description": "是否启用此适配器" - }, - "token": { - "type": "string", - "default": "", - "description": "Telegram 的 token" - } - } - } - ] - } - }, - "track-function-calls": { - "type": "boolean", - "default": true, - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - }, - "title": "跟踪内容函数调用", - "description": "开启之后,在对话中调用的内容函数记录也会发给用户,关闭后(false)仅会发给用户最终结果" - }, - "quote-origin": { - "type": "boolean", - "default": false, - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - }, - "title": "引用原消息", - "description": "在群内回复时是否引用原消息" - }, - "at-sender": { - "type": "boolean", - "default": false, - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - }, - "title": "是否 at 原用户", - "description": "在群内回复时是否@发送者" - }, - "force-delay": { - "type": "object", - "default": { - "min": 0, - "max": 0 - }, - "title": "强制消息延迟范围", - "description": "在将响应内容发回给用户前的强制消息随机延迟时间范围,以防风控,单位是秒", - "properties": { - "min": { - "type": "integer", - "default": 0, - "description": "最小值,单位是秒" - }, - "max": { - "type": "integer", - "default": 0, - "description": "最大值,单位是秒" - } - } - }, - "long-text-process": { - "type": "object", - "title": "长消息处理策略", - "properties": { - "threshold": { - "type": "integer", - "default": 256, - "title": "长消息处理阈值", - "description": "当消息长度超过此阈值时,将启用长消息处理策略" - }, - "strategy": { - "type": "string", - "default": "forward", - "title": "长消息处理策略", - "description": "长消息处理策略,目前支持forward(转发消息组件)和image(文字转图片)。aiocqhttp 和 qq-botpy 不支持 forward 策略" - }, - "font-path": { - "type": "string", - "description": "image的渲染字体。未设置时,如果在windows下,会尝试寻找系统的微软雅黑字体,若找不到,则转为forward策略。未设置时,若不是windows系统,则直接转为forward策略", - "default": "" - } - } - }, - "hide-exception-info": { - "type": "boolean", - "default": true, - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - }, - "title": "向用户隐藏AI接口的异常信息", - "description": "是否向用户隐藏AI的异常信息,如果为true,当请求AI接口出现异常时,会返回一个错误的提示给用户。而把报错详情输出在控制台。" - } - } -} \ No newline at end of file diff --git a/templates/schema/provider.json b/templates/schema/provider.json deleted file mode 100644 index def2cc12..00000000 --- a/templates/schema/provider.json +++ /dev/null @@ -1,606 +0,0 @@ -{ - "type": "object", - "layout": "expansion-panels", - "properties": { - "enable-chat": { - "type": "boolean", - "default": true, - "title": "启用聊天功能", - "description": "是否启用 AI 聊天功能" - }, - "enable-vision": { - "type": "boolean", - "default": true, - "title": "启用视觉功能", - "description": "是否开启AI视觉功能。需要使用的模型同时支持视觉功能,详情见元数据板块" - }, - "keys": { - "type": "object", - "title": "模型接口密钥", - "description": "以字典的形式设置若干个密钥组,每个密钥组的键为密钥组名称,值为密钥列表。模型与密钥组的对应关系,请查看元数据板块", - "properties": { - "openai": { - "type": "array", - "title": "OpenAI API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "anthropic": { - "type": "array", - "title": "Anthropic API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "moonshot": { - "type": "array", - "title": "Moonshot API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "deepseek": { - "type": "array", - "title": "DeepSeek API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "gitee": { - "type": "array", - "title": "Gitee AI API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "xai": { - "type": "array", - "title": "xAI API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "zhipuai": { - "type": "array", - "title": "智谱AI API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "siliconflow": { - "type": "array", - "title": "SiliconFlow API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "bailian": { - "type": "array", - "title": "阿里云百炼大模型平台 API 密钥", - "items": { - "type": "string" - }, - "default": [] - }, - "volcark": { - "type": "array", - "title": "火山引擎大模型平台 API 密钥", - "items": { - "type": "string" - }, - "default": [] - } - } - }, - "requester": { - "type": "object", - "title": "大模型请求器", - "description": "以字典的形式设置若干个请求器,每个请求器的键为请求器名称,值为请求器配置。模型与请求器的对应关系,请查看元数据板块。实现请求器的方式,请查看插件编写教程", - "properties": { - "openai-chat-completions": { - "type": "object", - "title": "OpenAI API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "anthropic-messages": { - "type": "object", - "title": "Anthropic API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "moonshot-chat-completions": { - "type": "object", - "title": "Moonshot API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "deepseek-chat-completions": { - "type": "object", - "title": "DeepSeek API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "ollama-chat": { - "type": "object", - "title": "Ollama API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 600 - } - } - }, - "gitee-ai-chat-completions": { - "type": "object", - "title": "Gitee AI API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "xai-chat-completions": { - "type": "object", - "title": "xAI API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "zhipuai-chat-completions": { - "type": "object", - "title": "智谱AI API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "default": 120 - } - } - }, - "lmstudio-chat-completions": { - "type": "object", - "title": "LMStudio API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "siliconflow-chat-completions": { - "type": "object", - "title": "SiliconFlow API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "bailian-chat-completions": { - "type": "object", - "title": "阿里云百炼大模型平台 API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - }, - "volcark-chat-completions": { - "type": "object", - "title": "火山方舟大模型平台 API 请求配置", - "description": "仅可编辑 URL 和 超时时间,额外请求参数不支持可视化编辑,请到编辑器编辑", - "properties": { - "base-url": { - "type": "string", - "title": "API URL" - }, - "args": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间", - "default": 120 - } - } - } - } - }, - "model": { - "type": "string", - "title": "所使用的模型名称", - "description": "设置要使用的模型名称。通常来说直接填写模型名称即可,但如果要使用原生接口不是 ChatCompletion 但以 ChatCompletion 接口格式接入的模型,请在模型名称前方加一个 OneAPI/ 前缀以进行区分。 简单来说可以认为是:现阶段非 OpenAI 的模型接入都需要在模型名称前方加一个 OneAPI/ 前缀。\n\n例如:\n\n1. 通过 OneAPI 等中转服务接入了 OpenAI 的 gpt-4 模型,由于 gpt-4 也是使用 ChatCompletion 接口格式进行请求,则可以直接填入 gpt-4;\n2. 通过 OneAPI 等中转服务接入了 Google 的 gemini-pro 模型,由于 gemini-pro 原生接口格式并非 ChatCompletion,因此需要填入 OneAPI/gemini-pro。\n具体支持的模型列表和各个模型对应的请求器和密钥组,请查看元数据板块 llm-models.json " - }, - "prompt-mode": { - "type": "string", - "title": "情景预设(人格)模式", - "description": "值为normal(单预设模式)和full-scenario(完整历史对话模式);normal模式时,使用下方设置的情景预设,也支持读取data/prompts目录下的文件内容作为单个 System Prompt,文件名即为prompt的名称;full-scenario模式时,读取 data/scenario/ 下的完整历史对话作为情景预设", - "enum": ["normal", "full-scenario"], - "default": "normal" - }, - "prompt": { - "type": "object", - "title": "情景预设(人格)", - "description": "设置情景预设(人格)。值为空字符串时,将不使用情景预设(人格)。normal模式时,使用下方设置的情景预设,也支持读取data/prompts目录下的文件内容作为单个 System Prompt,文件名即为prompt的名称;full-scenario模式时,读取 data/scenario/ 下的完整历史对话作为情景预设", - "properties": { - "default": { - "type": "string", - "title": "默认情景预设", - "description": "设置默认情景预设。值为空字符串时,将不使用情景预设(人格)", - "default": "" - } - }, - "patternProperties": { - "^.*$": { - "type": "string", - "title": "情景预设", - "description": "设置情景预设。值为空字符串时,将不使用情景预设(人格)", - "default": "" - } - }, - "required": ["default"] - }, - "runner": { - "type": "string", - "title": "请求运行器", - "description": "设置请求运行器。值为local-agent时,使用内置默认运行器;支持插件扩展", - "default": "local-agent" - }, - "dify-service-api": { - "type": "object", - "title": "Dify Service API 配置", - "properties": { - "base-url": { - "type": "string", - "title": "API URL", - "description": "Dify Service API 的 基础URL,可以在 Dify 应用 API 页面查看", - "default": "https://api.dify.ai/v1" - }, - "app-type": { - "type": "string", - "title": "应用类型", - "description": "支持 chat 和 workflow,chat:聊天助手(含高级编排)和 Agent;workflow:工作流;请填写下方对应的应用类型 API 参数", - "enum": ["chat", "workflow", "agent"], - "default": "chat" - }, - "options": { - "type": "object", - "title": "Dify Service API 配置选项", - "properties": { - "convert-thinking-tips": { - "type": "string", - "title": "转换思考提示", - "description": "设置转换思考提示。值为 original 时,不转换思考提示;值为 plain 时,将思考提示转换为类似 DeepSeek 官方的...格式;值为 remove 时,删除思考提示", - "enum": ["original", "plain", "remove"], - "default": "plain" - } - } - }, - - "chat": { - "type": "object", - "title": "聊天助手 API 参数", - "properties": { - "api-key": { - "type": "string", - "title": "API 密钥" - }, - "timeout": { - "type": "number", - "title":"API 请求超时时间" - } - } - }, - "agent": { - "type": "object", - "title": "Agent API 参数", - "properties": { - "api-key": { - "type": "string", - "title": "API 密钥" - }, - "timeout": { - "type": "number", - "title":"API 请求超时时间" - } - } - }, - "workflow": { - "type": "object", - "title": "工作流 API 参数", - "properties": { - "api-key": { - "type": "string", - "title": "API 密钥" - }, - "output-key": { - "type": "string", - "title": "工作流输出键", - "description": "设置工作流输出键,用于从 Dify Workflow 结束节点返回的 JSON 数据中提取输出内容", - "default": "summary" - }, - "timeout": { - "type": "number", - "title": "API 请求超时时间" - } - } - } - } - }, - "dashscope-app-api": { - "type": "object", - "title": "阿里百炼平台自建应用 API 配置", - "properties": { - "app-type": { - "type": "string", - "title": "应用类型", - "description": "支持 workflow 和 agent,workflow:智能体编排;agent:普通智能体;请填写下方对应的应用类型 API 参数", - "enum": ["workflow", "agent"], - "default": "agent" - }, - "api-key": { - "type": "string", - "title": "API 密钥" - }, - "agent": { - "type": "object", - "title": "Agent API 参数", - "properties": { - "app-id": { - "type": "string", - "title": "应用 ID" - }, - "references_quote": { - "type": "string", - "title": "参考资料引用", - "description": "设置参考资料引用,用于从 Dashscope App API 结束节点返回的 JSON 数据中提取引用内容", - "default": "参考资料来自:" - } - } - }, - "workflow": { - "type": "object", - "title": "工作流 API 参数", - "properties": { - "app-id": { - "type": "string", - "title": "应用 ID" - }, - "references_quote": { - "type": "string", - "title": "参考资料引用", - "default": "参考资料来自:" - }, - "biz_params": { - "type": "object", - "title": "传入参数", - "default": {} - } - } - } - } - }, - "mcp": { - "type": "object", - "title": "MCP 配置", - "properties": { - "servers": { - "type": "array", - "title": "MCP 服务器配置", - "default": [], - "items": { - "type": "object", - "oneOf": [ - { - "title": "Stdio 模式服务器", - "properties": { - "mode": { - "type": "string", - "title": "模式", - "const": "stdio" - }, - "enable": { - "type": "boolean", - "title": "启用" - }, - "name": { - "type": "string", - "title": "名称" - }, - "command": { - "type": "string", - "title": "启动命令" - }, - "args": { - "type": "array", - "title": "启动参数", - "items": { - "type": "string" - }, - "default": [] - }, - "env": { - "type": "object", - "default": {} - } - } - }, - { - "title": "SSE 模式服务器", - "properties": { - "mode": { - "type": "string", - "title": "模式", - "const": "sse" - }, - "enable": { - "type": "boolean", - "title": "启用" - }, - "name": { - "type": "string", - "title": "名称" - }, - "url": { - "type": "string", - "title": "URL" - }, - "headers": { - "type": "object", - "default": {} - }, - "timeout": { - "type": "number", - "title": "请求超时时间", - "default": 10 - } - } - } - ] - } - } - } - } - } -} \ No newline at end of file diff --git a/templates/schema/system.json b/templates/schema/system.json deleted file mode 100644 index 85f46e71..00000000 --- a/templates/schema/system.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "type": "object", - "layout": "expansion-panels", - "properties": { - "admin-sessions": { - "type": "array", - "title": "管理员会话", - "description": "设置管理员会话,格式为 {type}_{id},type 为 \"group\" 或 \"person\",如:group_123456 或 person_123456", - "items": { - "type": "string", - "format": "regex", - "pattern": "^(person|group)_.*$" - }, - "default": [] - }, - "network-proxies": { - "type": "object", - "title": "网络代理", - "description": "正向代理,http和https都要填,例如:http://127.0.0.1:7890 https://127.0.0.1:7890 。不使用代理请留空。正向代理也可以用环境变量设置:http_proxy 和 https_proxy", - "properties": { - "http": { - "type": "string" - }, - "https": { - "type": "string" - } - } - }, - "report-usage": { - "type": "boolean", - "title": "上报遥测数据", - "description": "遥测数据用于统计和分析项目使用情况,不包含任何隐私信息,不建议禁用", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - } - }, - "logging-level": { - "type": "string", - "title": "日志等级", - "description": "目前无效,启用调试模式请设置环境变量:export DEBUG=true" - }, - "session-concurrency": { - "type": "object", - "title": "会话消息处理并发数", - "description": "粒度是单个会话,所有会话使用默认并发数,若需指定特定会话的并发数,请输入 会话名称(格式为 {type}_{id},示例:group_123456 或 person_123456) 并添加,以设置特定会话的并发数", - "properties": { - "default": { - "type": "integer" - } - }, - "patternProperties": { - "^(person|group)_.*$": { - "type": "integer" - } - } - }, - "pipeline-concurrency": { - "type": "integer", - "title": "流水线消息处理并发数", - "description": "粒度是整个程序,目前使用 FCFS 算法调度各个请求" - }, - "qcg-center-url": { - "type": "string", - "title": "遥测服务器地址", - "description": "运行期间推送遥测数据的目标地址,默认为官方地址,若您自己部署了 https://github.com/RockChinQ/qcg-center,可以改为你的地址。" - }, - "help-message": { - "type": "string", - "title": "帮助消息", - "description": "用户发送 !help 命令时的输出", - "layout": "textarea" - }, - "http-api": { - "type": "object", - "title": "HTTP 接口", - "properties": { - "enable": { - "type": "boolean", - "layout": { - "comp": "switch", - "props": { - "color": "primary" - } - }, - "title": "是否启用" - }, - "host": { - "type": "string" - }, - "port": { - "type": "integer" - }, - "jwt-expire": { - "type": "integer", - "title": "JWT 过期时间", - "description": "单位:秒" - } - } - }, - "persistence": { - "type": "object", - "title": "持久化设置", - "properties": { - "sqlite": { - "type": "object", - "title": "sqlite", - "properties": { - "path": { - "type": "string" - } - } - }, - "use": { - "type": "string", - "title": "所使用的数据库", - "enum": [ - "sqlite" - ] - } - } - } - } -} \ No newline at end of file From 854effc43eb0f75aaea58ed1980bfd7bdd66f6f6 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 13 Apr 2025 18:31:52 +0800 Subject: [PATCH 037/205] chore: no longer run config migrations when config files are not exist --- pkg/core/stages/load_config.py | 47 ++++++++-------------------------- pkg/core/stages/migrate.py | 10 ++++++++ 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index e602a7ba..97919901 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -1,6 +1,7 @@ from __future__ import annotations import secrets +import os from .. import stage, app from ..bootutils import config @@ -19,46 +20,20 @@ class LoadConfigStage(stage.BootingStage): ap.settings_mgr = settings_mgr.SettingsManager(ap) await ap.settings_mgr.initialize() - ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json", completion=False) - ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json", completion=False) - ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json", completion=False) - ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json", completion=False) - ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json", completion=False) + if os.path.exists("data/config/command.json"): + ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json", completion=False) - ap.settings_mgr.register_manager( - name="command.json", - description="命令配置", - manager=ap.command_cfg, - doc_link="https://docs.langbot.app/config/function/command.html" - ) + if os.path.exists("data/config/pipeline.json"): + ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json", completion=False) - ap.settings_mgr.register_manager( - name="pipeline.json", - description="消息处理流水线配置", - manager=ap.pipeline_cfg, - doc_link="https://docs.langbot.app/config/function/pipeline.html" - ) + if os.path.exists("data/config/platform.json"): + ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json", completion=False) - ap.settings_mgr.register_manager( - name="platform.json", - description="消息平台配置", - manager=ap.platform_cfg, - doc_link="https://docs.langbot.app/config/function/platform.html" - ) + if os.path.exists("data/config/provider.json"): + ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json", completion=False) - ap.settings_mgr.register_manager( - name="provider.json", - description="大模型能力配置", - manager=ap.provider_cfg, - doc_link="https://docs.langbot.app/config/function/provider.html" - ) - - ap.settings_mgr.register_manager( - name="system.json", - description="系统配置", - manager=ap.system_cfg, - doc_link="https://docs.langbot.app/config/function/system.html" - ) + if os.path.exists("data/config/system.json"): + ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json", completion=False) ap.sensitive_meta = await config.load_json_config("data/metadata/sensitive-words.json", "templates/metadata/sensitive-words.json") await ap.sensitive_meta.dump_config() diff --git a/pkg/core/stages/migrate.py b/pkg/core/stages/migrate.py index fe0dc464..e902431a 100644 --- a/pkg/core/stages/migrate.py +++ b/pkg/core/stages/migrate.py @@ -1,6 +1,7 @@ from __future__ import annotations import importlib +import os from .. import stage, app from .. import migration @@ -24,6 +25,15 @@ class MigrationStage(stage.BootingStage): """启动 """ + if any([ + ap.command_cfg is None, + ap.pipeline_cfg is None, + ap.platform_cfg is None, + ap.provider_cfg is None, + ap.system_cfg is None, + ]): # only run migration when version is 3.x + return + migrations = migration.preregistered_migrations # 按照迁移号排序 From edc7f81486c26fa0b9ff3249b6e790ffc09e5eb6 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 13 Apr 2025 20:50:13 +0800 Subject: [PATCH 038/205] feat: database migration --- pkg/entity/persistence/metadata.py | 19 +++++++ pkg/persistence/mgr.py | 54 +++++++++++++++++-- pkg/persistence/migration.py | 38 +++++++++++++ pkg/persistence/migrations/__init__.py | 0 .../migrations/dbm001_migrate_v3_config.py | 13 +++++ pkg/utils/constants.py | 5 +- 6 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 pkg/entity/persistence/metadata.py create mode 100644 pkg/persistence/migration.py create mode 100644 pkg/persistence/migrations/__init__.py create mode 100644 pkg/persistence/migrations/dbm001_migrate_v3_config.py diff --git a/pkg/entity/persistence/metadata.py b/pkg/entity/persistence/metadata.py new file mode 100644 index 00000000..e1ebaefd --- /dev/null +++ b/pkg/entity/persistence/metadata.py @@ -0,0 +1,19 @@ +import sqlalchemy + +from .base import Base + + +initial_metadata = [ + { + 'key': 'database_version', + 'value': '0', + }, +] + + +class Metadata(Base): + """数据库元数据""" + __tablename__ = 'metadata' + + key = sqlalchemy.Column(sqlalchemy.String(255), primary_key=True) + value = sqlalchemy.Column(sqlalchemy.String(255)) diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index 56809e6b..dec273db 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -7,10 +7,12 @@ import typing import sqlalchemy.ext.asyncio as sqlalchemy_asyncio import sqlalchemy -from . import database -from ..entity.persistence import base, user, model, pipeline, bot, plugin +from . import database, migration +from ..entity.persistence import base, user, model, pipeline, bot, plugin, metadata from ..core import app from .databases import sqlite +from ..utils import constants +from .migrations import dbm001_migrate_v3_config class PersistenceManager: @@ -36,14 +38,56 @@ class PersistenceManager: await self.create_tables() async def create_tables(self): - # TODO: 对扩展友好 - - # 日志 + + # create tables async with self.get_db_engine().connect() as conn: await conn.run_sync(self.meta.create_all) await conn.commit() + # write initial metadata + for item in metadata.initial_metadata: + # check if the item exists + result = await self.execute_async( + sqlalchemy.select(metadata.Metadata).where(metadata.Metadata.key == item['key']) + ) + row = result.first() + if row is None: + await self.execute_async( + sqlalchemy.insert(metadata.Metadata).values(item) + ) + + # run migrations + database_version = await self.execute_async( + sqlalchemy.select(metadata.Metadata).where(metadata.Metadata.key == 'database_version') + ) + + database_version = int(database_version.fetchone()[1]) + required_database_version = constants.required_database_version + + if database_version < required_database_version: + migrations = migration.preregistered_db_migrations + migrations.sort(key=lambda x: x.number) + + last_migration_number = database_version + + for migration_cls in migrations: + migration_instance = migration_cls(self.ap) + + if migration_instance.number > database_version and migration_instance.number <= required_database_version: + await migration_instance.upgrade() + await self.execute_async( + sqlalchemy.update(metadata.Metadata).where(metadata.Metadata.key == 'database_version').values( + { + 'value': str(migration_instance.number) + } + ) + ) + last_migration_number = migration_instance.number + self.ap.logger.info(f'Migration {migration_instance.number} completed.') + + self.ap.logger.info(f'Successfully upgraded database to version {last_migration_number}.') + async def execute_async( self, *args, diff --git a/pkg/persistence/migration.py b/pkg/persistence/migration.py new file mode 100644 index 00000000..81a3aac3 --- /dev/null +++ b/pkg/persistence/migration.py @@ -0,0 +1,38 @@ +from __future__ import annotations + +import typing +import abc + +from ..core import app + + +preregistered_db_migrations: list[typing.Type[DBMigration]] = [] + +def migration_class(number: int): + """迁移类装饰器""" + + def wrapper(cls: typing.Type[DBMigration]) -> typing.Type[DBMigration]: + cls.number = number + preregistered_db_migrations.append(cls) + return cls + return wrapper + + +class DBMigration(abc.ABC): + """数据库迁移""" + + number: int + """迁移号""" + + def __init__(self, ap: app.Application): + self.ap = ap + + @abc.abstractmethod + async def upgrade(self): + """升级""" + pass + + @abc.abstractmethod + async def downgrade(self): + """降级""" + pass diff --git a/pkg/persistence/migrations/__init__.py b/pkg/persistence/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pkg/persistence/migrations/dbm001_migrate_v3_config.py b/pkg/persistence/migrations/dbm001_migrate_v3_config.py new file mode 100644 index 00000000..afed5eea --- /dev/null +++ b/pkg/persistence/migrations/dbm001_migrate_v3_config.py @@ -0,0 +1,13 @@ +from .. import migration + +# TODO fill this +# @migration.migration_class(1) +# class DBMigrationV3(migration.DBMigration): +# """数据库迁移""" + +# async def upgrade(self): +# """升级""" +# pass + +# async def downgrade(self): +# """降级""" \ No newline at end of file diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py index 14b2b74c..f37f2151 100644 --- a/pkg/utils/constants.py +++ b/pkg/utils/constants.py @@ -1,4 +1,7 @@ -semantic_version = "v3.4.11" +semantic_version = "v4.0.0" + +required_database_version = 1 +"""标记本版本所需要的数据库结构版本,用于判断数据库迁移""" debug_mode = False From c8f331675c36bde57450286319e12db64829c1d4 Mon Sep 17 00:00:00 2001 From: "Junyan Qin (Chin)" Date: Sun, 13 Apr 2025 21:58:36 +0800 Subject: [PATCH 039/205] refactor: remove legacy config files (#1294) --- pkg/api/http/controller/groups/settings.py | 62 ------------------ pkg/api/http/controller/main.py | 8 +-- pkg/api/http/service/user.py | 6 +- pkg/audit/center/groups/main.py | 2 +- pkg/audit/center/groups/plugin.py | 2 +- pkg/audit/center/groups/usage.py | 2 +- pkg/command/cmdmgr.py | 6 +- pkg/command/operators/help.py | 2 +- pkg/config/settings.py | 75 ---------------------- pkg/core/app.py | 21 +++--- pkg/core/boot.py | 3 +- pkg/core/bootutils/files.py | 7 +- pkg/core/stages/build_app.py | 6 +- pkg/core/stages/genkeys.py | 20 ++++++ pkg/core/stages/load_config.py | 30 +++++---- pkg/persistence/databases/sqlite.py | 2 +- pkg/pipeline/controller.py | 2 +- pkg/pipeline/process/handlers/command.py | 2 +- pkg/pipeline/process/process.py | 2 +- pkg/platform/{manager.py => botmgr.py} | 2 +- pkg/provider/session/sessionmgr.py | 5 +- pkg/provider/tools/loaders/mcp.py | 2 +- pkg/utils/proxy.py | 8 +-- templates/config.yaml | 24 +++++++ templates/{ => legacy}/command.json | 0 templates/{ => legacy}/pipeline.json | 0 templates/{ => legacy}/platform.json | 0 templates/{ => legacy}/provider.json | 0 templates/{ => legacy}/system.json | 0 29 files changed, 100 insertions(+), 201 deletions(-) delete mode 100644 pkg/api/http/controller/groups/settings.py delete mode 100644 pkg/config/settings.py create mode 100644 pkg/core/stages/genkeys.py rename pkg/platform/{manager.py => botmgr.py} (99%) create mode 100644 templates/config.yaml rename templates/{ => legacy}/command.json (100%) rename templates/{ => legacy}/pipeline.json (100%) rename templates/{ => legacy}/platform.json (100%) rename templates/{ => legacy}/provider.json (100%) rename templates/{ => legacy}/system.json (100%) diff --git a/pkg/api/http/controller/groups/settings.py b/pkg/api/http/controller/groups/settings.py deleted file mode 100644 index 835d86ad..00000000 --- a/pkg/api/http/controller/groups/settings.py +++ /dev/null @@ -1,62 +0,0 @@ -import quart - -from .....core import app -from .. import group - - -@group.group_class('settings', '/api/v1/settings') -class SettingsRouterGroup(group.RouterGroup): - - async def initialize(self) -> None: - - @self.route('', methods=['GET'], auth_type=group.AuthType.USER_TOKEN) - async def _() -> str: - return self.success( - data={ - "managers": [ - { - "name": m.name, - "description": m.description, - } - for m in self.ap.settings_mgr.get_manager_list() - ] - } - ) - - @self.route('/', methods=['GET'], auth_type=group.AuthType.USER_TOKEN) - async def _(manager_name: str) -> str: - - manager = self.ap.settings_mgr.get_manager(manager_name) - - if manager is None: - return self.fail(1, '配置管理器不存在') - - return self.success( - data={ - "manager": { - "name": manager.name, - "description": manager.description, - "schema": manager.schema, - "file": manager.file.config_file_name, - "data": manager.data, - "doc_link": manager.doc_link - } - } - ) - - @self.route('//data', methods=['PUT'], auth_type=group.AuthType.USER_TOKEN) - async def _(manager_name: str) -> str: - data = await quart.request.json - manager = self.ap.settings_mgr.get_manager(manager_name) - - if manager is None: - return self.fail(code=1, msg='配置管理器不存在') - - # manager.data = data['data'] - for k, v in data['data'].items(): - manager.data[k] = v - - await manager.dump_config() - return self.success(data={ - "data": manager.data - }) diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index 7e973b98..79838d7a 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -8,7 +8,7 @@ import quart_cors from ....core import app, entities as core_entities -from .groups import logs, system, settings, plugins, stats, user, pipelines +from .groups import logs, system, plugins, stats, user, pipelines from .groups.provider import models, requesters from .groups.platform import bots, adapters from . import group @@ -29,7 +29,7 @@ class HTTPController: await self.register_routes() async def run(self) -> None: - if self.ap.system_cfg.data["http-api"]["enable"]: + if True: async def shutdown_trigger_placeholder(): while True: @@ -45,8 +45,8 @@ class HTTPController: self.ap.task_mgr.create_task( exception_handler( - host=self.ap.system_cfg.data["http-api"]["host"], - port=self.ap.system_cfg.data["http-api"]["port"], + host='0.0.0.0', + port=self.ap.instance_config.data['api']['port'], shutdown_trigger=shutdown_trigger_placeholder, ), name="http-api-quart", diff --git a/pkg/api/http/service/user.py b/pkg/api/http/service/user.py index b09eef3c..4b31f1c0 100644 --- a/pkg/api/http/service/user.py +++ b/pkg/api/http/service/user.py @@ -56,8 +56,8 @@ class UserService: return await self.generate_jwt_token(user_email) async def generate_jwt_token(self, user_email: str) -> str: - jwt_secret = self.ap.instance_secret_meta.data['jwt_secret'] - jwt_expire = self.ap.system_cfg.data['http-api']['jwt-expire'] + jwt_secret = self.ap.instance_config.data['system']['jwt']['secret'] + jwt_expire = self.ap.instance_config.data['system']['jwt']['expire'] payload = { 'user': user_email, @@ -68,6 +68,6 @@ class UserService: return jwt.encode(payload, jwt_secret, algorithm='HS256') async def verify_jwt_token(self, token: str) -> str: - jwt_secret = self.ap.instance_secret_meta.data['jwt_secret'] + jwt_secret = self.ap.instance_config.data['system']['jwt']['secret'] return jwt.decode(token, jwt_secret, algorithms=['HS256'])['user'] diff --git a/pkg/audit/center/groups/main.py b/pkg/audit/center/groups/main.py index 3a31a65b..854437a1 100644 --- a/pkg/audit/center/groups/main.py +++ b/pkg/audit/center/groups/main.py @@ -12,7 +12,7 @@ class V2MainDataAPI(apigroup.APIGroup): super().__init__(prefix+"/main", ap) async def do(self, *args, **kwargs): - if not self.ap.system_cfg.data['report-usage']: + if not self.ap.instance_config.data['telemetry']['report']: return None return await super().do(*args, **kwargs) diff --git a/pkg/audit/center/groups/plugin.py b/pkg/audit/center/groups/plugin.py index 627b116c..d6ed0b02 100644 --- a/pkg/audit/center/groups/plugin.py +++ b/pkg/audit/center/groups/plugin.py @@ -12,7 +12,7 @@ class V2PluginDataAPI(apigroup.APIGroup): super().__init__(prefix+"/plugin", ap) async def do(self, *args, **kwargs): - if not self.ap.system_cfg.data['report-usage']: + if not self.ap.instance_config.data['telemetry']['report']: return None return await super().do(*args, **kwargs) diff --git a/pkg/audit/center/groups/usage.py b/pkg/audit/center/groups/usage.py index 8a8bdf04..79bc56f5 100644 --- a/pkg/audit/center/groups/usage.py +++ b/pkg/audit/center/groups/usage.py @@ -12,7 +12,7 @@ class V2UsageDataAPI(apigroup.APIGroup): super().__init__(prefix+"/usage", ap) async def do(self, *args, **kwargs): - if not self.ap.system_cfg.data['report-usage']: + if not self.ap.instance_config.data['telemetry']['report']: return None return await super().do(*args, **kwargs) diff --git a/pkg/command/cmdmgr.py b/pkg/command/cmdmgr.py index ea4e1a9b..3275b6fc 100644 --- a/pkg/command/cmdmgr.py +++ b/pkg/command/cmdmgr.py @@ -40,8 +40,8 @@ class CommandManager: # 应用命令权限配置 for cls in operator.preregistered_operators: - if cls.path in self.ap.command_cfg.data['privilege']: - cls.lowest_privilege = self.ap.command_cfg.data['privilege'][cls.path] + if cls.path in self.ap.instance_config.data['command']['privilege']: + cls.lowest_privilege = self.ap.instance_config.data['command']['privilege'][cls.path] # 实例化所有类 self.cmd_list = [cls(self.ap) for cls in operator.preregistered_operators] @@ -108,7 +108,7 @@ class CommandManager: privilege = 1 - if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.system_cfg.data['admin-sessions']: + if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']: privilege = 2 ctx = entities.ExecuteContext( diff --git a/pkg/command/operators/help.py b/pkg/command/operators/help.py index 570e103c..d8b42137 100644 --- a/pkg/command/operators/help.py +++ b/pkg/command/operators/help.py @@ -16,7 +16,7 @@ class HelpOperator(operator.CommandOperator): self, context: entities.ExecuteContext ) -> typing.AsyncGenerator[entities.CommandReturn, None]: - help = self.ap.system_cfg.data['help-message'] + help = 'LangBot - 大语言模型原生即时通信机器人平台\n链接:https://langbot.app' help += '\n发送命令 !cmd 可查看命令列表' diff --git a/pkg/config/settings.py b/pkg/config/settings.py deleted file mode 100644 index 1f21e926..00000000 --- a/pkg/config/settings.py +++ /dev/null @@ -1,75 +0,0 @@ -from __future__ import annotations - -from . import manager as config_manager -from ..core import app - - -class SettingsManager: - """设置管理器 - 保存、管理多个配置文件管理器 - """ - - ap: app.Application - - managers: list[config_manager.ConfigManager] = [] - """配置文件管理器列表""" - - def __init__(self, ap: app.Application) -> None: - self.ap = ap - self.managers = [] - - async def initialize(self) -> None: - pass - - def register_manager( - self, - name: str, - description: str, - manager: config_manager.ConfigManager, - schema: dict=None, - doc_link: str=None, - ) -> None: - """注册配置管理器 - - Args: - name (str): 配置管理器名 - description (str): 配置管理器描述 - manager (ConfigManager): 配置管理器 - schema (dict): 配置文件 schema,符合 JSON Schema Draft 7 规范 - """ - - for m in self.managers: - if m.name == name: - raise ValueError(f'配置管理器名 {name} 已存在') - - manager.name = name - manager.description = description - manager.schema = schema - manager.doc_link = doc_link - self.managers.append(manager) - - def get_manager(self, name: str) -> config_manager.ConfigManager | None: - """获取配置管理器 - - Args: - name (str): 配置管理器名 - - Returns: - ConfigManager: 配置管理器 - """ - - for m in self.managers: - if m.name == name: - return m - - return None - - def get_manager_list(self) -> list[config_manager.ConfigManager]: - """获取配置管理器列表 - - Returns: - list[ConfigManager]: 配置管理器列表 - """ - - return self.managers - diff --git a/pkg/core/app.py b/pkg/core/app.py index 43d124a4..e8409741 100644 --- a/pkg/core/app.py +++ b/pkg/core/app.py @@ -8,12 +8,11 @@ import enum import sys import os -from ..platform import manager as im_mgr +from ..platform import botmgr as im_mgr from ..provider.session import sessionmgr as llm_session_mgr from ..provider.modelmgr import modelmgr as llm_model_mgr from ..provider.tools import toolmgr as llm_tool_mgr from ..config import manager as config_mgr -from ..config import settings as settings_mgr from ..audit.center import v2 as center_mgr from ..command import cmdmgr from ..plugin import manager as plugin_mgr @@ -54,26 +53,24 @@ class Application: # TODO 移动到 pipeline 里 tool_mgr: llm_tool_mgr.ToolManager = None - settings_mgr: settings_mgr.SettingsManager = None - # ======= 配置管理器 ======= - command_cfg: config_mgr.ConfigManager = None + command_cfg: config_mgr.ConfigManager = None # deprecated - pipeline_cfg: config_mgr.ConfigManager = None + pipeline_cfg: config_mgr.ConfigManager = None # deprecated - platform_cfg: config_mgr.ConfigManager = None + platform_cfg: config_mgr.ConfigManager = None # deprecated - provider_cfg: config_mgr.ConfigManager = None + provider_cfg: config_mgr.ConfigManager = None # deprecated - system_cfg: config_mgr.ConfigManager = None + system_cfg: config_mgr.ConfigManager = None # deprecated + + instance_config: config_mgr.ConfigManager = None # ======= 元数据配置管理器 ======= sensitive_meta: config_mgr.ConfigManager = None - llm_models_meta: config_mgr.ConfigManager = None - instance_secret_meta: config_mgr.ConfigManager = None pipeline_config_meta_trigger: config_mgr.ConfigManager = None @@ -156,7 +153,7 @@ class Application: public_ip = await ip.get_myip() - port = self.system_cfg.data['http-api']['port'] + port = self.instance_config.data['api']['port'] tips = f""" ======================================= diff --git a/pkg/core/boot.py b/pkg/core/boot.py index e6a0e3eb..307fa95c 100644 --- a/pkg/core/boot.py +++ b/pkg/core/boot.py @@ -10,12 +10,13 @@ from . import stage from ..utils import constants # 引入启动阶段实现以便注册 -from .stages import load_config, setup_logger, build_app, migrate, show_notes +from .stages import load_config, setup_logger, build_app, migrate, show_notes, genkeys stage_order = [ "LoadConfigStage", "MigrationStage", + "GenKeysStage", "SetupLoggerStage", "BuildAppStage", "ShowNotesStage" diff --git a/pkg/core/bootutils/files.py b/pkg/core/bootutils/files.py index dbaad8ea..9a2dff71 100644 --- a/pkg/core/bootutils/files.py +++ b/pkg/core/bootutils/files.py @@ -7,11 +7,7 @@ import sys required_files = { "plugins/__init__.py": "templates/__init__.py", - "data/config/command.json": "templates/command.json", - "data/config/pipeline.json": "templates/pipeline.json", - "data/config/platform.json": "templates/platform.json", - "data/config/provider.json": "templates/provider.json", - "data/config/system.json": "templates/system.json", + "data/config.yaml": "templates/config.yaml", } required_paths = [ @@ -19,7 +15,6 @@ required_paths = [ "data", "data/metadata", "data/logs", - "data/config", "data/labels", "plugins" ] diff --git a/pkg/core/stages/build_app.py b/pkg/core/stages/build_app.py index fc049d9c..7d62e9c9 100644 --- a/pkg/core/stages/build_app.py +++ b/pkg/core/stages/build_app.py @@ -12,7 +12,7 @@ from ...command import cmdmgr from ...provider.session import sessionmgr as llm_session_mgr from ...provider.modelmgr import modelmgr as llm_model_mgr from ...provider.tools import toolmgr as llm_tool_mgr -from ...platform import manager as im_mgr +from ...platform import botmgr as im_mgr from ...persistence import mgr as persistencemgr from ...api.http.controller import main as http_controller from ...api.http.service import user as user_service @@ -50,7 +50,7 @@ class BuildAppStage(stage.BootingStage): center_v2_api = center_v2.V2CenterAPI( ap, - backend_url=ap.system_cfg.data["qcg-center-url"], + backend_url=ap.instance_config.data['telemetry']['url'], basic_info={ "host_id": identifier.identifier["host_id"], "instance_id": identifier.identifier["instance_id"], @@ -58,7 +58,7 @@ class BuildAppStage(stage.BootingStage): "platform": platform.get_platform(), }, runtime_info={ - "admin_id": "{}".format(ap.system_cfg.data["admin-sessions"]), + "admin_id": "{}".format(ap.instance_config.data["admins"]), "msg_source": str([]), }, ) diff --git a/pkg/core/stages/genkeys.py b/pkg/core/stages/genkeys.py new file mode 100644 index 00000000..843f1532 --- /dev/null +++ b/pkg/core/stages/genkeys.py @@ -0,0 +1,20 @@ +from __future__ import annotations + +import secrets +import os + +from .. import stage, app + + +@stage.stage_class("GenKeysStage") +class GenKeysStage(stage.BootingStage): + """生成密钥阶段 + """ + + async def run(self, ap: app.Application): + """启动 + """ + + if not ap.instance_config.data['system']['jwt']['secret']: + ap.instance_config.data['system']['jwt']['secret'] = secrets.token_hex(16) + await ap.instance_config.dump_config() diff --git a/pkg/core/stages/load_config.py b/pkg/core/stages/load_config.py index 97919901..edfe5915 100644 --- a/pkg/core/stages/load_config.py +++ b/pkg/core/stages/load_config.py @@ -5,7 +5,6 @@ import os from .. import stage, app from ..bootutils import config -from ...config import settings as settings_mgr @stage.stage_class("LoadConfigStage") @@ -16,33 +15,36 @@ class LoadConfigStage(stage.BootingStage): async def run(self, ap: app.Application): """启动 """ - - ap.settings_mgr = settings_mgr.SettingsManager(ap) - await ap.settings_mgr.initialize() + # ======= deprecated ======= if os.path.exists("data/config/command.json"): - ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json", completion=False) + ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/legacy/command.json", completion=False) if os.path.exists("data/config/pipeline.json"): - ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json", completion=False) + ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/legacy/pipeline.json", completion=False) if os.path.exists("data/config/platform.json"): - ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json", completion=False) + ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/legacy/platform.json", completion=False) if os.path.exists("data/config/provider.json"): - ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json", completion=False) + ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/legacy/provider.json", completion=False) if os.path.exists("data/config/system.json"): - ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json", completion=False) + ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/legacy/system.json", completion=False) + + if os.path.exists("data/metadata/instance-secret.json"): + ap.instance_secret_meta = await config.load_json_config("data/metadata/instance-secret.json", template_data={ + 'jwt_secret': secrets.token_hex(16) + }) + await ap.instance_secret_meta.dump_config() + # ======= deprecated ======= + + ap.instance_config = await config.load_yaml_config("data/config.yaml", "templates/config.yaml", completion=False) + await ap.instance_config.dump_config() ap.sensitive_meta = await config.load_json_config("data/metadata/sensitive-words.json", "templates/metadata/sensitive-words.json") await ap.sensitive_meta.dump_config() - ap.instance_secret_meta = await config.load_json_config("data/metadata/instance-secret.json", template_data={ - 'jwt_secret': secrets.token_hex(16) - }) - await ap.instance_secret_meta.dump_config() - ap.pipeline_config_meta_trigger = await config.load_yaml_config("templates/metadata/pipeline/trigger.yaml", "templates/metadata/pipeline/trigger.yaml") ap.pipeline_config_meta_safety = await config.load_yaml_config("templates/metadata/pipeline/safety.yaml", "templates/metadata/pipeline/safety.yaml") ap.pipeline_config_meta_ai = await config.load_yaml_config("templates/metadata/pipeline/ai.yaml", "templates/metadata/pipeline/ai.yaml") diff --git a/pkg/persistence/databases/sqlite.py b/pkg/persistence/databases/sqlite.py index 14f89092..5a815378 100644 --- a/pkg/persistence/databases/sqlite.py +++ b/pkg/persistence/databases/sqlite.py @@ -10,4 +10,4 @@ class SQLiteDatabaseManager(database.BaseDatabaseManager): """SQLite 数据库管理类""" async def initialize(self) -> None: - self.engine = sqlalchemy_asyncio.create_async_engine(f"sqlite+aiosqlite:///{self.ap.system_cfg.data['persistence']['sqlite']['path']}") + self.engine = sqlalchemy_asyncio.create_async_engine(f"sqlite+aiosqlite:///{self.ap.instance_config.data['persistence']['sqlite']['path']}") diff --git a/pkg/pipeline/controller.py b/pkg/pipeline/controller.py index 64d4e8f4..a7cf2153 100644 --- a/pkg/pipeline/controller.py +++ b/pkg/pipeline/controller.py @@ -20,7 +20,7 @@ class Controller: def __init__(self, ap: app.Application): self.ap = ap - self.semaphore = asyncio.Semaphore(self.ap.system_cfg.data['pipeline-concurrency']) + self.semaphore = asyncio.Semaphore(self.ap.instance_config.data['concurrency']['pipeline']) async def consumer(self): """事件处理循环 diff --git a/pkg/pipeline/process/handlers/command.py b/pkg/pipeline/process/handlers/command.py index cec64a45..b0316e1f 100644 --- a/pkg/pipeline/process/handlers/command.py +++ b/pkg/pipeline/process/handlers/command.py @@ -23,7 +23,7 @@ class CommandHandler(handler.MessageHandler): privilege = 1 - if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.system_cfg.data['admin-sessions']: + if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.instance_config.data['admins']: privilege = 2 spt = command_text.split(' ') diff --git a/pkg/pipeline/process/process.py b/pkg/pipeline/process/process.py index ea4d7e7f..11f43d3c 100644 --- a/pkg/pipeline/process/process.py +++ b/pkg/pipeline/process/process.py @@ -42,7 +42,7 @@ class Processor(stage.PipelineStage): self.ap.logger.info(f"处理 {query.launcher_type.value}_{query.launcher_id} 的请求({query.query_id}): {message_text}") async def generator(): - cmd_prefix = self.ap.command_cfg.data['command-prefix'] + cmd_prefix = self.ap.instance_config.data['command']['prefix'] if any(message_text.startswith(prefix) for prefix in cmd_prefix): async for result in self.cmd_handler.handle(query): diff --git a/pkg/platform/manager.py b/pkg/platform/botmgr.py similarity index 99% rename from pkg/platform/manager.py rename to pkg/platform/botmgr.py index 360f7588..8461461f 100644 --- a/pkg/platform/manager.py +++ b/pkg/platform/botmgr.py @@ -11,7 +11,7 @@ import sqlalchemy from .sources import qqofficial # FriendMessage, Image, MessageChain, Plain -from ..platform import adapter as msadapter +from . import adapter as msadapter from ..core import app, entities as core_entities, taskmgr from ..plugin import events diff --git a/pkg/provider/session/sessionmgr.py b/pkg/provider/session/sessionmgr.py index 5143f2bb..eef723da 100644 --- a/pkg/provider/session/sessionmgr.py +++ b/pkg/provider/session/sessionmgr.py @@ -29,10 +29,7 @@ class SessionManager: if query.launcher_type == session.launcher_type and query.launcher_id == session.launcher_id: return session - session_concurrency = self.ap.system_cfg.data['session-concurrency']['default'] - - if f'{query.launcher_type.value}_{query.launcher_id}' in self.ap.system_cfg.data['session-concurrency']: - session_concurrency = self.ap.system_cfg.data['session-concurrency'][f'{query.launcher_type.value}_{query.launcher_id}'] + session_concurrency = self.ap.instance_config.data['concurrency']['session'] session = core_entities.Session( launcher_type=query.launcher_type, diff --git a/pkg/provider/tools/loaders/mcp.py b/pkg/provider/tools/loaders/mcp.py index a475f9b7..6813ea37 100644 --- a/pkg/provider/tools/loaders/mcp.py +++ b/pkg/provider/tools/loaders/mcp.py @@ -108,7 +108,7 @@ class RuntimeMCPSession: """关闭工具""" await self.session._exit_stack.aclose() -@loader.loader_class("mcp") +# @loader.loader_class("mcp") class MCPLoader(loader.ToolLoader): """MCP 工具加载器。 diff --git a/pkg/utils/proxy.py b/pkg/utils/proxy.py index db03ad93..838814dd 100644 --- a/pkg/utils/proxy.py +++ b/pkg/utils/proxy.py @@ -25,10 +25,10 @@ class ProxyManager: "https://": os.getenv("HTTPS_PROXY") or os.getenv("https_proxy"), } - if 'http' in self.ap.system_cfg.data['network-proxies'] and self.ap.system_cfg.data['network-proxies']['http']: - self.forward_proxies['http://'] = self.ap.system_cfg.data['network-proxies']['http'] - if 'https' in self.ap.system_cfg.data['network-proxies'] and self.ap.system_cfg.data['network-proxies']['https']: - self.forward_proxies['https://'] = self.ap.system_cfg.data['network-proxies']['https'] + if 'http' in self.ap.instance_config.data['proxy'] and self.ap.instance_config.data['proxy']['http']: + self.forward_proxies['http://'] = self.ap.instance_config.data['proxy']['http'] + if 'https' in self.ap.instance_config.data['proxy'] and self.ap.instance_config.data['proxy']['https']: + self.forward_proxies['https://'] = self.ap.instance_config.data['proxy']['https'] # 设置到环境变量 os.environ['HTTP_PROXY'] = self.forward_proxies['http://'] or '' diff --git a/templates/config.yaml b/templates/config.yaml new file mode 100644 index 00000000..7f2d625e --- /dev/null +++ b/templates/config.yaml @@ -0,0 +1,24 @@ +admins: [] +api: + port: 5300 +command: + prefix: + - '!' + - ! + privilege: {} +concurrency: + pipeline: 20 + session: 1 +persistence: + sqlite: + path: data/langbot.db +proxy: + http: '' + https: '' +system: + jwt: + expire: 604800 + secret: bab3ba329e1fd7be096ac2c82f9b66f4 +telemetry: + report: true + url: https://api.qchatgpt.rockchin.top/api/v2 diff --git a/templates/command.json b/templates/legacy/command.json similarity index 100% rename from templates/command.json rename to templates/legacy/command.json diff --git a/templates/pipeline.json b/templates/legacy/pipeline.json similarity index 100% rename from templates/pipeline.json rename to templates/legacy/pipeline.json diff --git a/templates/platform.json b/templates/legacy/platform.json similarity index 100% rename from templates/platform.json rename to templates/legacy/platform.json diff --git a/templates/provider.json b/templates/legacy/provider.json similarity index 100% rename from templates/provider.json rename to templates/legacy/provider.json diff --git a/templates/system.json b/templates/legacy/system.json similarity index 100% rename from templates/system.json rename to templates/legacy/system.json From d012c1e33dbed32522da26ad7a04e7809dc5a937 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 13 Apr 2025 22:51:21 +0800 Subject: [PATCH 040/205] perf: ensure plugin deps on startup (#858) --- main.py | 3 +++ pkg/core/bootutils/deps.py | 12 ++++++++++++ pkg/persistence/mgr.py | 2 ++ pkg/plugin/loaders/classic.py | 3 +++ pkg/plugin/manager.py | 1 + pkg/utils/pkgmgr.py | 11 +++-------- 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index c297c2a4..5c86b7ca 100644 --- a/main.py +++ b/main.py @@ -35,6 +35,9 @@ async def main_entry(loop: asyncio.AbstractEventLoop): await deps.install_deps(missing_deps) print("已自动安装缺失的依赖包,请重启程序。") sys.exit(0) + + # check plugin deps + await deps.precheck_plugin_deps() # 检查pydantic版本,如果没有 pydantic.v1,则把 pydantic 映射为 v1 import pydantic.version diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index 47b87d35..84c9e4d1 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -1,4 +1,6 @@ import pip +import os +from ...utils import pkgmgr # 检查依赖,防止用户未安装 # 左边为引入名称,右边为依赖名称 @@ -55,3 +57,13 @@ async def install_deps(deps: list[str]): for dep in deps: pip.main(["install", required_deps[dep]]) + +async def precheck_plugin_deps(): + print('Prechecking plugin dependencies...') + + for dir in os.listdir("plugins"): + subdir = os.path.join("plugins", dir) + if not os.path.isdir(subdir): + continue + if 'requirements.txt' in os.listdir(subdir): + pkgmgr.install_requirements(os.path.join(subdir, 'requirements.txt'), extra_params=['-q', '-q', '-q']) \ No newline at end of file diff --git a/pkg/persistence/mgr.py b/pkg/persistence/mgr.py index dec273db..dcf19f5a 100644 --- a/pkg/persistence/mgr.py +++ b/pkg/persistence/mgr.py @@ -30,6 +30,8 @@ class PersistenceManager: self.meta = base.Base.metadata async def initialize(self): + + self.ap.logger.info("Initializing database...") for manager in database.preregistered_managers: self.db = manager(self.ap) diff --git a/pkg/plugin/loaders/classic.py b/pkg/plugin/loaders/classic.py index 3cbcdbf2..ae503ba3 100644 --- a/pkg/plugin/loaders/classic.py +++ b/pkg/plugin/loaders/classic.py @@ -3,6 +3,7 @@ from __future__ import annotations import typing import pkgutil import importlib +import os import traceback from .. import loader, events, context, models @@ -10,6 +11,8 @@ from ...core import entities as core_entities from ...provider.tools import entities as tools_entities from ...utils import funcschema from ...discover import engine as discover_engine +from ...utils import pkgmgr + class PluginLoader(loader.PluginLoader): """加载 plugins/ 目录下的插件""" diff --git a/pkg/plugin/manager.py b/pkg/plugin/manager.py index 042fb909..2ecd01c2 100644 --- a/pkg/plugin/manager.py +++ b/pkg/plugin/manager.py @@ -4,6 +4,7 @@ import typing import traceback import sqlalchemy +import logging from ..core import app, taskmgr from . import context, loader, events, installer, models diff --git a/pkg/utils/pkgmgr.py b/pkg/utils/pkgmgr.py index 9c0f8b72..4f3186b6 100644 --- a/pkg/utils/pkgmgr.py +++ b/pkg/utils/pkgmgr.py @@ -1,24 +1,19 @@ from pip._internal import main as pipmain -# from . import log - def install(package): pipmain(['install', package]) - # log.reset_logging() + def install_upgrade(package): pipmain(['install', '--upgrade', package, "-i", "https://pypi.tuna.tsinghua.edu.cn/simple", "--trusted-host", "pypi.tuna.tsinghua.edu.cn"]) - # log.reset_logging() def run_pip(params: list): pipmain(params) - # log.reset_logging() -def install_requirements(file): +def install_requirements(file, extra_params: list = []): pipmain(['install', '-r', file, "-i", "https://pypi.tuna.tsinghua.edu.cn/simple", - "--trusted-host", "pypi.tuna.tsinghua.edu.cn"]) - # log.reset_logging() + "--trusted-host", "pypi.tuna.tsinghua.edu.cn"] + extra_params) From 9e9825a12595d211d044e3f7685ae57c0cddf643 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 13 Apr 2025 22:52:34 +0800 Subject: [PATCH 041/205] perf: print on startup --- pkg/core/bootutils/deps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index 84c9e4d1..ea671d67 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -59,7 +59,7 @@ async def install_deps(deps: list[str]): pip.main(["install", required_deps[dep]]) async def precheck_plugin_deps(): - print('Prechecking plugin dependencies...') + print('[Startup] Prechecking plugin dependencies...') for dir in os.listdir("plugins"): subdir = os.path.join("plugins", dir) From 2fdb53efc9570873f190bde27df5b4b64dfc9773 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 14 Apr 2025 13:52:47 +0800 Subject: [PATCH 042/205] fix: `/user/check-token` api not work --- pkg/api/http/controller/groups/user.py | 12 ++++++++---- pkg/core/bootutils/deps.py | 2 +- pkg/discover/engine.py | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/pkg/api/http/controller/groups/user.py b/pkg/api/http/controller/groups/user.py index adf7d87c..3cd08240 100644 --- a/pkg/api/http/controller/groups/user.py +++ b/pkg/api/http/controller/groups/user.py @@ -1,5 +1,5 @@ import quart -import sqlalchemy +import jwt import argon2 from .. import group @@ -42,6 +42,10 @@ class UserRouterGroup(group.RouterGroup): 'token': token }) - @self.route('/check-token', methods=['GET']) - async def _() -> str: - return self.success() + @self.route('/check-token', methods=['GET'], auth_type=group.AuthType.USER_TOKEN) + async def _(user_email: str) -> str: + token = await self.ap.user_service.generate_jwt_token(user_email) + + return self.success(data={ + 'token': token + }) diff --git a/pkg/core/bootutils/deps.py b/pkg/core/bootutils/deps.py index ea671d67..4443079c 100644 --- a/pkg/core/bootutils/deps.py +++ b/pkg/core/bootutils/deps.py @@ -66,4 +66,4 @@ async def precheck_plugin_deps(): if not os.path.isdir(subdir): continue if 'requirements.txt' in os.listdir(subdir): - pkgmgr.install_requirements(os.path.join(subdir, 'requirements.txt'), extra_params=['-q', '-q', '-q']) \ No newline at end of file + pkgmgr.install_requirements(os.path.join(subdir, 'requirements.txt'), extra_params=['-q', '-q', '-q']) diff --git a/pkg/discover/engine.py b/pkg/discover/engine.py index 51990a3c..2b83ef72 100644 --- a/pkg/discover/engine.py +++ b/pkg/discover/engine.py @@ -260,7 +260,7 @@ class ComponentDiscoveryEngine: def get_components_by_kind(self, kind: str) -> typing.List[Component]: """获取指定类型的组件""" if kind not in self.components: - raise ValueError(f'No components found for kind: {kind}') + return [] return self.components[kind] def find_components(self, kind: str, component_list: typing.List[Component]) -> typing.List[Component]: From 69435c04cc98bb0ccb98854d3185d0d038ab5f8c Mon Sep 17 00:00:00 2001 From: "Junyan Qin (Chin)" Date: Mon, 14 Apr 2025 23:32:32 +0800 Subject: [PATCH 043/205] feat: add logo for requesters (#1300) --- .../controller/groups/provider/requesters.py | 14 ++++++++++++++ pkg/discover/engine.py | 7 ++++++- pkg/provider/modelmgr/modelmgr.py | 7 +++++++ pkg/provider/modelmgr/requesters/anthropic.svg | 4 ++++ .../modelmgr/requesters/anthropicmsgs.yaml | 1 + pkg/provider/modelmgr/requesters/bailian.png | Bin 0 -> 2835 bytes .../modelmgr/requesters/bailianchatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/chatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/deepseek.svg | 3 +++ .../modelmgr/requesters/deepseekchatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/giteeai.svg | 3 +++ .../modelmgr/requesters/giteeaichatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/lmstudio.webp | Bin 0 -> 547896 bytes .../modelmgr/requesters/lmstudiochatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/moonshot.png | Bin 0 -> 7419 bytes .../modelmgr/requesters/moonshotchatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/ollama.svg | 15 +++++++++++++++ .../modelmgr/requesters/ollamachat.yaml | 1 + pkg/provider/modelmgr/requesters/openai.svg | 4 ++++ .../modelmgr/requesters/siliconflow.svg | 1 + .../requesters/siliconflowchatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/volcark.svg | 8 ++++++++ .../modelmgr/requesters/volcarkchatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/xai.svg | 1 + .../modelmgr/requesters/xaichatcmpl.yaml | 1 + pkg/provider/modelmgr/requesters/zhipuai.svg | 8 ++++++++ .../modelmgr/requesters/zhipuaichatcmpl.yaml | 1 + 27 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 pkg/provider/modelmgr/requesters/anthropic.svg create mode 100644 pkg/provider/modelmgr/requesters/bailian.png create mode 100644 pkg/provider/modelmgr/requesters/deepseek.svg create mode 100644 pkg/provider/modelmgr/requesters/giteeai.svg create mode 100644 pkg/provider/modelmgr/requesters/lmstudio.webp create mode 100644 pkg/provider/modelmgr/requesters/moonshot.png create mode 100644 pkg/provider/modelmgr/requesters/ollama.svg create mode 100644 pkg/provider/modelmgr/requesters/openai.svg create mode 100644 pkg/provider/modelmgr/requesters/siliconflow.svg create mode 100644 pkg/provider/modelmgr/requesters/volcark.svg create mode 100644 pkg/provider/modelmgr/requesters/xai.svg create mode 100644 pkg/provider/modelmgr/requesters/zhipuai.svg diff --git a/pkg/api/http/controller/groups/provider/requesters.py b/pkg/api/http/controller/groups/provider/requesters.py index 7dd3cfea..18939d32 100644 --- a/pkg/api/http/controller/groups/provider/requesters.py +++ b/pkg/api/http/controller/groups/provider/requesters.py @@ -24,3 +24,17 @@ class RequestersRouterGroup(group.RouterGroup): return self.success(data={ 'requester': requester_info }) + + @self.route('//icon', methods=['GET']) + async def _(requester_name: str) -> quart.Response: + requester_manifest = self.ap.model_mgr.get_available_requester_manifest_by_name(requester_name) + + if requester_manifest is None: + return self.http_status(404, -1, 'requester not found') + + icon_path = requester_manifest.icon_rel_path + + if icon_path is None: + return self.http_status(404, -1, 'icon not found') + + return await quart.send_file(icon_path) diff --git a/pkg/discover/engine.py b/pkg/discover/engine.py index 2b83ef72..e79a97ad 100644 --- a/pkg/discover/engine.py +++ b/pkg/discover/engine.py @@ -4,7 +4,7 @@ import typing import importlib import os import inspect - +import mimetypes import yaml import pydantic @@ -154,6 +154,11 @@ class Component(pydantic.BaseModel): """组件可执行文件信息""" return self._execution + @property + def icon_rel_path(self) -> str: + """图标相对路径""" + return os.path.join(self.rel_dir, self.metadata.icon) if self.metadata.icon is not None and self.metadata.icon.strip() != '' else None + def get_python_component_class(self) -> typing.Type[typing.Any]: """获取Python组件类""" module_path = os.path.join(self.rel_dir, self.execution.python.path) diff --git a/pkg/provider/modelmgr/modelmgr.py b/pkg/provider/modelmgr/modelmgr.py index 41e97f3e..244d5753 100644 --- a/pkg/provider/modelmgr/modelmgr.py +++ b/pkg/provider/modelmgr/modelmgr.py @@ -135,6 +135,13 @@ class ModelManager: if component.metadata.name == name: return component.to_plain_dict() return None + + def get_available_requester_manifest_by_name(self, name: str) -> engine.Component | None: + """通过名称获取请求器清单""" + for component in self.requester_components: + if component.metadata.name == name: + return component + return None async def invoke_llm( self, diff --git a/pkg/provider/modelmgr/requesters/anthropic.svg b/pkg/provider/modelmgr/requesters/anthropic.svg new file mode 100644 index 00000000..d852f044 --- /dev/null +++ b/pkg/provider/modelmgr/requesters/anthropic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml index 6d1a53cf..07aca1fe 100644 --- a/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml +++ b/pkg/provider/modelmgr/requesters/anthropicmsgs.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Anthropic zh_CN: Anthropic + icon: anthropic.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/bailian.png b/pkg/provider/modelmgr/requesters/bailian.png new file mode 100644 index 0000000000000000000000000000000000000000..c1aff40ee092ae1758ad72d592081cc6b99c5b54 GIT binary patch literal 2835 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 literal 0 HcmV?d00001 diff --git a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml index 136e903f..f288df53 100644 --- a/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/bailianchatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Aliyun Bailian zh_CN: 阿里云百炼 + icon: bailian.png spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/chatcmpl.yaml b/pkg/provider/modelmgr/requesters/chatcmpl.yaml index a67e23d1..bbf31e9a 100644 --- a/pkg/provider/modelmgr/requesters/chatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/chatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: OpenAI zh_CN: OpenAI + icon: openai.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/deepseek.svg b/pkg/provider/modelmgr/requesters/deepseek.svg new file mode 100644 index 00000000..aa854a75 --- /dev/null +++ b/pkg/provider/modelmgr/requesters/deepseek.svg @@ -0,0 +1,3 @@ + + + diff --git a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml index 9890e21e..48095697 100644 --- a/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/deepseekchatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: DeepSeek zh_CN: 深度求索 + icon: deepseek.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/giteeai.svg b/pkg/provider/modelmgr/requesters/giteeai.svg new file mode 100644 index 00000000..1f51187f --- /dev/null +++ b/pkg/provider/modelmgr/requesters/giteeai.svg @@ -0,0 +1,3 @@ + + + diff --git a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml index 3e4efd61..22d48501 100644 --- a/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/giteeaichatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Gitee AI zh_CN: Gitee AI + icon: giteeai.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/lmstudio.webp b/pkg/provider/modelmgr/requesters/lmstudio.webp new file mode 100644 index 0000000000000000000000000000000000000000..66bc816397b6532ff1963981dde4ace69fa23f86 GIT binary patch literal 547896 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 z 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≺NN zn_hVhWoe7UAC#xa5-VlSVH)GVklk$2Rel;VWS*?I+J9nrHVh9Yk)@m7lHGkc#&z`Q1CWTmWz$g| z+WNu-&drvxWzOAbnvB(kG&O#iL%PiYNV>_rWF!ML}JCm7v%<09xVn`^EmCoX*J zRDUl6RJ9jjMz<{sCXF>{qNMtDhM(9qE8{;8`^h$b+r-uZ)uAFoywlw@(cK82s5cS8 zkjzh;j}G2U)4t#RJYlaT_zUOeu!GF?ICG1%%zNBW%#k&%$2FJ0Hx4i`gE9dYe7_#D z@dxObzd${K8-Zy3K!zjb9Ib zV(xkPFI2OzT*~(f+|y~5aPJH7E%__AK>vDx1PhlWa7S%pL34(Eh<=0l59}|l>p!9m z?Y1@sOJ0?{Y|0ol3eaoZcxIr7_xN(24Fq!B`wWir?pxz=6XB0Hf*`X8CfDWP!b}0k?Z&zY% zsoG-`)4>`5F^GDi-aub4(tl=m!K_ZVi1^gj$lH`Fd9xEPRCchztmE5z`CyonY4S0X zB-C5EVsgc)tlGL}8fa~J?LMy4z2VSueKQO{ihQNP8%oE}wWa|;ChK&5;3YY+B3POx zy#7Rli;rU{tsSRe7sh?IS1v1pra+A^Sm#VM@Wi4d6T9oNlO$__XyLlXcy1`r=v7w_ z0aa?@pFe6EW^7=4*P9i&I)_M~?dSH7-vojx>THO?mp~5|3P+t9Jv|-TsWA@N+LpgI z)`fJuECV3PS=D9iud$3`3X!KeP}jidgaMG!2fl5?6r}!tc=VGI$)fJ{?w~nN36}Su zuQEQv39*GNnYI;!U3+UOCmizCmcSU%8}^IP$G8#*)FIIZ&%(aQ{;1#tOqZX$bMs!i zxIGj%&K(tqWB#@DT`r4;CNylRNEe@PoS3Z0w_<%3*oR+&MLpzo1lDhQsv6~P;wX

&bS{QlI=Bnp{q;&%a_huhbHq|2``sX`US!uFv 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

OBiUvwa~2hVmBrY5*R^wTGTmvN^$!=~$b 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�P?X-nbtxAQ3 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

H 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�u4>aV2EIi7yi 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 W|6f6TT3Q{U04U49m8+653H?93{_?s2 literal 0 HcmV?d00001 diff --git a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml index 7290784f..7e50130e 100644 --- a/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/moonshotchatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Moonshot zh_CN: 月之暗面 + icon: moonshot.png spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/ollama.svg b/pkg/provider/modelmgr/requesters/ollama.svg new file mode 100644 index 00000000..f8482a96 --- /dev/null +++ b/pkg/provider/modelmgr/requesters/ollama.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/pkg/provider/modelmgr/requesters/ollamachat.yaml b/pkg/provider/modelmgr/requesters/ollamachat.yaml index ba915aeb..c62cb1ea 100644 --- a/pkg/provider/modelmgr/requesters/ollamachat.yaml +++ b/pkg/provider/modelmgr/requesters/ollamachat.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Ollama zh_CN: Ollama + icon: ollama.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/openai.svg b/pkg/provider/modelmgr/requesters/openai.svg new file mode 100644 index 00000000..70686f9b --- /dev/null +++ b/pkg/provider/modelmgr/requesters/openai.svg @@ -0,0 +1,4 @@ + + + + diff --git a/pkg/provider/modelmgr/requesters/siliconflow.svg b/pkg/provider/modelmgr/requesters/siliconflow.svg new file mode 100644 index 00000000..ad6b384f --- /dev/null +++ b/pkg/provider/modelmgr/requesters/siliconflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml index c938b21c..c8dfe770 100644 --- a/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/siliconflowchatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: SiliconFlow zh_CN: 硅基流动 + icon: siliconflow.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/volcark.svg b/pkg/provider/modelmgr/requesters/volcark.svg new file mode 100644 index 00000000..e6454a89 --- /dev/null +++ b/pkg/provider/modelmgr/requesters/volcark.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml index 56347bc5..bc639b86 100644 --- a/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/volcarkchatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: Volc Engine Ark zh_CN: 火山方舟 + icon: volcark.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/xai.svg b/pkg/provider/modelmgr/requesters/xai.svg new file mode 100644 index 00000000..f8b745cb --- /dev/null +++ b/pkg/provider/modelmgr/requesters/xai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml index 604b88c6..99588dab 100644 --- a/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/xaichatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: xAI zh_CN: xAI + icon: xai.svg spec: config: - name: base_url diff --git a/pkg/provider/modelmgr/requesters/zhipuai.svg b/pkg/provider/modelmgr/requesters/zhipuai.svg new file mode 100644 index 00000000..016f97dd --- /dev/null +++ b/pkg/provider/modelmgr/requesters/zhipuai.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml index 20b8b496..68bc3fe3 100644 --- a/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml +++ b/pkg/provider/modelmgr/requesters/zhipuaichatcmpl.yaml @@ -5,6 +5,7 @@ metadata: label: en_US: ZhipuAI zh_CN: 智谱 AI + icon: zhipuai.svg spec: config: - name: base_url From e5c0e41336d94028c38fe798020ad19214d4b5d7 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Mon, 14 Apr 2025 23:45:00 +0800 Subject: [PATCH 044/205] fix(botmgr): ref errors --- .../controller/groups/platform/adapters.py | 15 +++++++++++++++ pkg/api/http/controller/groups/system.py | 2 +- pkg/platform/botmgr.py | 19 +++++++++++-------- pkg/plugin/context.py | 2 +- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/pkg/api/http/controller/groups/platform/adapters.py b/pkg/api/http/controller/groups/platform/adapters.py index de5a1eae..fa8b2d9c 100644 --- a/pkg/api/http/controller/groups/platform/adapters.py +++ b/pkg/api/http/controller/groups/platform/adapters.py @@ -23,3 +23,18 @@ class AdaptersRouterGroup(group.RouterGroup): return self.success(data={ 'adapter': adapter_info }) + + @self.route('//icon', methods=['GET']) + async def _(adapter_name: str) -> quart.Response: + + adapter_manifest = self.ap.platform_mgr.get_available_adapter_manifest_by_name(adapter_name) + + if adapter_manifest is None: + return self.http_status(404, -1, 'adapter not found') + + icon_path = adapter_manifest.icon_rel_path + + if icon_path is None: + return self.http_status(404, -1, 'icon not found') + + return await quart.send_file(icon_path) \ No newline at end of file diff --git a/pkg/api/http/controller/groups/system.py b/pkg/api/http/controller/groups/system.py index 71d0d8df..04ace284 100644 --- a/pkg/api/http/controller/groups/system.py +++ b/pkg/api/http/controller/groups/system.py @@ -16,7 +16,7 @@ class SystemRouterGroup(group.RouterGroup): data={ "version": constants.semantic_version, "debug": constants.debug_mode, - "enabled_platform_count": len(self.ap.platform_mgr.adapters) + "enabled_platform_count": len(self.ap.platform_mgr.get_running_adapters()) } ) diff --git a/pkg/platform/botmgr.py b/pkg/platform/botmgr.py index 8461461f..6073243d 100644 --- a/pkg/platform/botmgr.py +++ b/pkg/platform/botmgr.py @@ -118,11 +118,6 @@ class RuntimeBot: # 控制QQ消息输入输出的类 class PlatformManager: - - # adapter: msadapter.MessageSourceAdapter = None - adapters: list[msadapter.MessagePlatformAdapter] = [] # deprecated - - message_platform_adapter_components: list[engine.Component] = [] # deprecated # ====== 4.0 ====== ap: app.Application = None @@ -136,7 +131,6 @@ class PlatformManager: def __init__(self, ap: app.Application = None): self.ap = ap - self.adapters = [] self.bots = [] self.adapter_components = [] self.adapter_dict = {} @@ -151,6 +145,9 @@ class PlatformManager: await self.load_bots_from_db() + def get_running_adapters(self) -> list[msadapter.MessagePlatformAdapter]: + return [bot.adapter for bot in self.bots if bot.enable] + async def load_bots_from_db(self): self.ap.logger.info('Loading bots from db...') @@ -207,14 +204,20 @@ class PlatformManager: def get_available_adapters_info(self) -> list[dict]: return [ component.to_plain_dict() - for component in self.message_platform_adapter_components + for component in self.adapter_components ] def get_available_adapter_info_by_name(self, name: str) -> dict | None: - for component in self.message_platform_adapter_components: + for component in self.adapter_components: if component.metadata.name == name: return component.to_plain_dict() return None + + def get_available_adapter_manifest_by_name(self, name: str) -> engine.Component | None: + for component in self.adapter_components: + if component.metadata.name == name: + return component + return None async def write_back_config(self, adapter_name: str, adapter_inst: msadapter.MessagePlatformAdapter, config: dict): # index = -2 diff --git a/pkg/plugin/context.py b/pkg/plugin/context.py index 3ff1ffc7..1672b1ae 100644 --- a/pkg/plugin/context.py +++ b/pkg/plugin/context.py @@ -127,7 +127,7 @@ class APIHost: Returns: list[platform.adapter.MessageSourceAdapter]: 已启用的消息平台适配器列表 """ - return self.ap.platform_mgr.adapters + return self.ap.platform_mgr.get_running_adapters() async def send_active_message( self, From 694ba4e32d6170db785cb2ee8b92033ef0a7eea4 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Tue, 15 Apr 2025 12:55:35 +0800 Subject: [PATCH 045/205] chore: simplify config.yaml --- templates/config.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/templates/config.yaml b/templates/config.yaml index 7f2d625e..0037cf06 100644 --- a/templates/config.yaml +++ b/templates/config.yaml @@ -9,16 +9,13 @@ command: concurrency: pipeline: 20 session: 1 -persistence: - sqlite: - path: data/langbot.db proxy: http: '' https: '' system: jwt: expire: 604800 - secret: bab3ba329e1fd7be096ac2c82f9b66f4 + secret: '' telemetry: report: true url: https://api.qchatgpt.rockchin.top/api/v2 From 7801db0331c9dce3c04c81f81114716c2a1b317d Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Tue, 15 Apr 2025 12:55:51 +0800 Subject: [PATCH 046/205] chore: simplify config.yaml --- pkg/persistence/databases/sqlite.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/persistence/databases/sqlite.py b/pkg/persistence/databases/sqlite.py index 5a815378..0bc3db32 100644 --- a/pkg/persistence/databases/sqlite.py +++ b/pkg/persistence/databases/sqlite.py @@ -10,4 +10,5 @@ class SQLiteDatabaseManager(database.BaseDatabaseManager): """SQLite 数据库管理类""" async def initialize(self) -> None: - self.engine = sqlalchemy_asyncio.create_async_engine(f"sqlite+aiosqlite:///{self.ap.instance_config.data['persistence']['sqlite']['path']}") + sqlite_path = 'data/langbot.db' + self.engine = sqlalchemy_asyncio.create_async_engine(f"sqlite+aiosqlite:///{sqlite_path}") From 5abe9b8a167df432faf3ab989fdb4b5b6368d92c Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Tue, 15 Apr 2025 14:39:08 +0800 Subject: [PATCH 047/205] feat: add logo for all adapters --- pkg/platform/sources/aiocqhttp.yaml | 1 + pkg/platform/sources/dingtalk.svg | 7 +++++++ pkg/platform/sources/dingtalk.yaml | 1 + pkg/platform/sources/discord.svg | 7 +++++++ pkg/platform/sources/discord.yaml | 1 + pkg/platform/sources/gewechat.png | Bin 0 -> 25318 bytes pkg/platform/sources/gewechat.yaml | 1 + pkg/platform/sources/lark.svg | 1 + pkg/platform/sources/lark.yaml | 1 + pkg/platform/sources/nakuru.png | Bin 0 -> 280258 bytes pkg/platform/sources/nakuru.yaml | 1 + pkg/platform/sources/officialaccount.png | Bin 0 -> 1963 bytes pkg/platform/sources/officialaccount.yaml | 1 + pkg/platform/sources/onebot.png | Bin 0 -> 89102 bytes pkg/platform/sources/qqbotpy.svg | 1 + pkg/platform/sources/qqbotpy.yaml | 1 + pkg/platform/sources/qqofficial.svg | 1 + pkg/platform/sources/qqofficial.yaml | 1 + pkg/platform/sources/telegram.svg | 1 + pkg/platform/sources/telegram.yaml | 1 + pkg/platform/sources/wecom.png | Bin 0 -> 262939 bytes pkg/platform/sources/wecom.yaml | 1 + 22 files changed, 29 insertions(+) create mode 100644 pkg/platform/sources/dingtalk.svg create mode 100644 pkg/platform/sources/discord.svg create mode 100644 pkg/platform/sources/gewechat.png create mode 100644 pkg/platform/sources/lark.svg create mode 100644 pkg/platform/sources/nakuru.png create mode 100644 pkg/platform/sources/officialaccount.png create mode 100644 pkg/platform/sources/onebot.png create mode 100644 pkg/platform/sources/qqbotpy.svg create mode 100644 pkg/platform/sources/qqofficial.svg create mode 100644 pkg/platform/sources/telegram.svg create mode 100644 pkg/platform/sources/wecom.png diff --git a/pkg/platform/sources/aiocqhttp.yaml b/pkg/platform/sources/aiocqhttp.yaml index 19876ffd..dfb0103e 100644 --- a/pkg/platform/sources/aiocqhttp.yaml +++ b/pkg/platform/sources/aiocqhttp.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: OneBot v11 Adapter zh_CN: OneBot v11 适配器 + icon: onebot.png spec: config: - name: host diff --git a/pkg/platform/sources/dingtalk.svg b/pkg/platform/sources/dingtalk.svg new file mode 100644 index 00000000..b60653b7 --- /dev/null +++ b/pkg/platform/sources/dingtalk.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/pkg/platform/sources/dingtalk.yaml b/pkg/platform/sources/dingtalk.yaml index b4c1c692..9e270d6b 100644 --- a/pkg/platform/sources/dingtalk.yaml +++ b/pkg/platform/sources/dingtalk.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: DingTalk Adapter zh_CN: 钉钉适配器 + icon: dingtalk.svg spec: config: - name: client_id diff --git a/pkg/platform/sources/discord.svg b/pkg/platform/sources/discord.svg new file mode 100644 index 00000000..177a0591 --- /dev/null +++ b/pkg/platform/sources/discord.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/pkg/platform/sources/discord.yaml b/pkg/platform/sources/discord.yaml index fd523057..d756fed2 100644 --- a/pkg/platform/sources/discord.yaml +++ b/pkg/platform/sources/discord.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: Discord Adapter zh_CN: Discord 适配器 + icon: discord.svg spec: config: - name: client_id diff --git a/pkg/platform/sources/gewechat.png b/pkg/platform/sources/gewechat.png new file mode 100644 index 0000000000000000000000000000000000000000..32b2fa3237f1951881ce80dac3f7e77737bb4aaa GIT binary patch literal 25318 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 bzwMd+G@Z&y^t1*3U$N^H&djh9;}ZK{%Xbt{ literal 0 HcmV?d00001 diff --git a/pkg/platform/sources/gewechat.yaml b/pkg/platform/sources/gewechat.yaml index 24131a99..26ab9f14 100644 --- a/pkg/platform/sources/gewechat.yaml +++ b/pkg/platform/sources/gewechat.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: GeWeChat Adapter zh_CN: GeWeChat 适配器 + icon: gewechat.png spec: config: - name: gewechat_url diff --git a/pkg/platform/sources/lark.svg b/pkg/platform/sources/lark.svg new file mode 100644 index 00000000..bf3c202a --- /dev/null +++ b/pkg/platform/sources/lark.svg @@ -0,0 +1 @@ + diff --git a/pkg/platform/sources/lark.yaml b/pkg/platform/sources/lark.yaml index 3b369670..8e039988 100644 --- a/pkg/platform/sources/lark.yaml +++ b/pkg/platform/sources/lark.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: Lark Adapter zh_CN: 飞书适配器 + icon: lark.svg spec: config: - name: app_id diff --git a/pkg/platform/sources/nakuru.png b/pkg/platform/sources/nakuru.png new file mode 100644 index 0000000000000000000000000000000000000000..0101afc430e2bcecb7192a7df742facc22616b6a GIT binary patch literal 280258 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

y$>Gi@Cf!u^iuKmSlK&`Ao!!VT4lNl}QM3jSyy? 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 NGt@V`QK9P|`#)d$%_0B* literal 0 HcmV?d00001 diff --git a/pkg/platform/sources/nakuru.yaml b/pkg/platform/sources/nakuru.yaml index 19bcb1ba..cea371d1 100644 --- a/pkg/platform/sources/nakuru.yaml +++ b/pkg/platform/sources/nakuru.yaml @@ -8,6 +8,7 @@ metadata: description: en_US: Nakuru Adapter zh_CN: Nakuru 适配器(go-cqhttp) + icon: nakuru.png spec: config: - name: host diff --git a/pkg/platform/sources/officialaccount.png b/pkg/platform/sources/officialaccount.png new file mode 100644 index 0000000000000000000000000000000000000000..24746e1d698c549e4c9782cd733fcc1dc89391e2 GIT binary patch literal 1963 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%0D9k($#ok9SbZ8JRQgp2(YA&v{82vm;(npIM$``$ zh86?#FhkLULfV$RwLAl#j>|2>Fneih8W5<QpF=Zhf4b%(#>;r9F_jb+3 zjhT*5jqQbUkB^*FC24R)lG=rF$C#|N8l#3T@{<9HaLMx?4wC z0efrd{E2&^wO9KuBo4D-oFIl4=ifPzFr^>-(-++gDx{I%hn--loXzMT!okzQWWsMX zD`|TqhY}HQ^6V9vycT$8r2C2BTa7>e z|Dox+j(-@t)JcZ)Tj#A^s}A&ZKKo2Xiis;vrS56+tyU3 z$euj}ZF;FFu2gh=kP}k01^IfIk6a5YS~1FEI5S(+7d^vn{qzHn84C|F!065k0v z1!#vFpE6v~yF8w3^9Q6TvkR)y@@?|g|E=yvo>(`YbqW0+!WGv@_AJ#usdfgxDh`v& zK9}z-aGfje?-)J0{>*aZ4E4!9f3B;=%NDB^vp0CdxJbpUvbU(CWKm<@Q%K9>c*%z;WgdlN*+1so7#n6c@(jmtO6b=GVB|bv|t7;UHu#5b(cDh zKdfTo1g8_loU+&c{%QOcx=%_W*a4F!uVXXX&PzLKLm`Lbt+%H0N{6NZ)O^})Q?mS4 z{I==256xBqJ1Pq&21?l9IBi}BGk_u~Hs0jYHEP96tNgaI6dSa0b=W?beg$P$0V8L4JIHaDoUkV-mnv5CEf zYv;layB*cIH@9EL;)Y&BDn?v9sV>UTB%Vb6gbW$YusQ;npP2N)|MY2$3Wx1myY>8e zv!SdOMUn#6SjA|<3iP36fm(lD?AKY$z~l0i&0Je!ys6-FRvY}ai*|wdP&;^eEm|Q~ zUP54w3bew%^uH*v0B)-Ay8}J>Mh%}8TgtyheDvw8bX}ncIwZTno#C3urwA1H1iju0 z4%vtlZ2SMHr8z_Ue zAaMTvw1d#gpOs+t{W5ni!p@6ZWV@~FqDSXmy9hb?cp(NZExN138waD!8Hx_*@8)(A zf7TaeZut?!c-(fV5lfbSk~i;>K0oJZrfi4gSNgmWe}VjteibPUSHn>x&saM~LeX_; zBq5YN?<&U|P5yeya_6Co-%981?Pa$yK54hj>;6(N!vV#monBr#4><68`ixgj@H>a9 z_CBX^*H+g)>gcfI0loN2vR!z*0yQo|j%jR|3B<6RdD}-lrQNegDai5zu%9u>H<+O4 z&-xI=FUC#z?6msME5>U6Im1*JyonGx^r-8s&szi?C_7rc7b7bwD@(Ws|zA-C&( zqyCeN&+VqpI|bN*&zIfGIP(aU-XYg<6y2{0hhzCFA5oxG!Lg#*x#ZWVqQT?P03h2U zg4oJ--0fUFF6ymNtX<3^{mO6HM3VnSshmEcqJL55V2%Xw)?)Cl`!!uMac(ga;)@%E;p3nHs7$)vnlt4@n(fSF!%R=kEy?ZZidm|zk z5aMthef|B6<13H1%vQ($=yaTeeQ0oVmDhUuESN?ozExE0 z$HM0x-n{Jq6DG{His{oOyA)k!%YF!Qt54iHP%m_3 ziK{V9cQDbe%vm5rx8&dn`GJOtM2zXu$!Tbo&Jgl;*$I^QJwKg=Lu`r@sKu8$2Cc?j zeW)nHryIW2KiyjxelPdiM%n2%-<)^s_Vn$$Hh!rohM3`C$5XmNN0!DUW#I5GJnpwi zM;xwNm1G?@BLS!wG;Xo?CrHfy2<@+)IgUO0m+s&$kk2+GnlTU_1H${g4>UpJ3#W&o z$3%qQ6$L%T@?_N%t-d&l+?m`>C-;!9ME(Ty#4k@A(|GIf+}~8f+=9|MYsvID^_XTm zYCp_fAkI8{8rEgp*WEK-zUzE^M9rfM5t_E!(m7llkE=I~ie*k->z;|Qm#}C@uF=a0 zQ@7ZAQN+C8*`HwEaQY|w{+&%2iYl$(s z!i(HGdND2J2gDc1MT}Cha<4Y-_kT`ox^AEA*UB`%)jbv`XLiku*TQbUH1%R%@mW+~ z1xnh$RZ$=lK{puS^3V2{*~KraBjqo>L90?AMYYpV=$}cPjW&QK1jFlz@=O8E>k zY|QQ!6xiR3tI==+A;GZpm*=OoTtysfF4&2(^k_X`S13>gtVyl6za2$HMfSAt5cD9V zNtv<6zTma-aumoa+h2o zKp<<2zE@P9dSS(?bVG6rLw%(qmT_vnNK$`7MdboIu3w({`t16zdk!FqeRvMS7b-z& zblFw(!<%@yPt)lswLgzky0u`fJ~4c;v&3L-z3m2r<)DQkrXoF*Iq%H4E7tPUUmyi) zp(Njh{q`uSr0Hkk`VTMB5|E8JP_(X2j}}UCXfKjjc%(C;Htq*8B~V|lU#(!BiijT< z6-(ttpsY&2U(J@fj{6{~Z-(eNuS|Wc0!;IjNi#Z7G42k^6QVDEQ1UxPpU znvr8oibO#sk8-9|!(hsD8zZ;=nUhxb>OOMI%5nW^M=2`}gm3EmxDNZQf3J%xPEbjF z4b|uJ&+7BT1^XO`c5(+N6dh<$2dM7P({AbMk8xo`>?V*7T8FUMWzB2F+4Q= zXQEf^60f@1cD^h=Y)gx8Wu^g(I}n)qclbQG%1;M;JUB0&f8i1P9hA?w7m+_+&YU8j zVN1c>x{vf!6?h$4m`}p>1UybaGI1BqIqw!i9nhyy`#5k;KOl`^rtmaZfRo4vtsJ>a ze55004^+>4pyq>y#a5R2K8dEh3h)%(vJB)2YbO&=&x@1BMP;r9*&epPN!*GAn?mgF zf{Jn1bDpRQ;M#0|@4Gt!6L!S1!pP%~Usa`vH<#r&Q>ZSf3R6qj_Q@)WI%m{+PDrQVF(gDi!IJrX? zt(T-N5Z1BXSh?L?Zd>B6AlvP}&^c=oYsjueUJ$|cNlS3%7t>IX%Z|8dQuGUuo00Wx z^KnUjidh;ix+!Xoidere_9-wSrCiFF)Q?w_9#@T$4ET;#KX8_wN4+vAa}AYezEQ+{ zYRN}3V(-=5uOPInJ=&Fd;Jtmh%iO}XYgcZpYal%FyW}><w2R?_FL;C z#HMQt!$U`D>XU?~@67V~d51i%-5v~@xH~*U17fEiC^KDPN1HaB@(?GNy$*JleB7j1{N$82l_)pnkFtQ4%oQXr#IcSHV zKzpE&K2i5`hx;g%>){S3+(qb!Yyxh2D7WsAwV9Um0@@i#92>x@?(+K}9@~$0<-B|C zS6}%K$C48aBM@`^2%KD0XF>|Hfq{jgZ5!Uph0xV`A-8Tuq)C50g9nYUn(wax2!KIv zCHtQq@P2d9fK-Eiryq22^_Ms1YDd=6yTvGWN7M4~K0RE5>f3Z=Mb5n6DpzrG0)&_J z-U-g_$mIoVj|I>k{4>@^6;)8BgXjoaB5bJwrL59@HbqjTlxFlEG7rgZx5^^Rb*|_= zWZYM9J_qiLyza2#)+&%?`elf}6rHwRDsgRUL<4m811$Xp&b6T-8cL*rp5(PJ85M9T zkmF^D`QzQ$dir6hNWP?4DXXO_Q(F9QP~n70=?`FEU;X3pG$*83h}`CMvPl}GBPyZ`asBp=pGwGvqB_ah!u&rpIi9BaEulKhIzP& zvEIZA_G_pG9CaQI4N9-6*AuvCKaumjRew1a;N^EMzR215G7UwY(V(0C>{3)| z{#Hz4v7Y_~84On~y>DdTNdpl}=wXv8YB9UHm?=dP`jUxS@m?YQA#HP<9FrJ^j|;QR(6bO529|o; zrM`27dQ2QSDfkTdp2IBeL>yQR<UZNRyQiAzFQYLP?S*daopO-X<9+k< zNHErod!12#tjGPB&z#fBqYk$1hfE^h`dUjklc3o@xjsKMhYI3QwgtuLN=_1ic&CF? zQ{f@<=OHWpBHcZFk{an!<*9B%XL_#XPhIbT#X_g)( zGZWl-V3js6sO);&b&kwNj<>PzQ>y#Gc!1^)WEFVI(H{QX@a zFEl@>>}1tDt;5yqmQ_?PTJf-yCIxaVKio0acjPPTd6KBal^65Eo*oPc-}g44-8qnT z8^?lDI;HMk(4_P?*Lyj3k@15zyz>+ivt2+RTV8J- zY8Kb(+#Nj0sRiTCEF{A$^A>Ar<2r)bP{3>)eOiqC264a^1#dC^D+)WFL7slyicEj zaX7rN3nak52c%X9S}*963@h<{w7)og*LfyVtH@8O(dwoKhjJI)r|tPtRbDD!ZuWh@ zJG2z-+hweBX7|(JR9N{Jk^f6ixW}+W<{m_ISmI3U|Lo*Rk$%4ZH{26qEuD3CcL>CN zIl?3l;KhK>5q^!%*$vw4L&hL`yO-33ICGW;BNCE-V>mRK3-`$TkwvP+;YZPVgpk;{ zRY5V^KL=M4j3JxI9}M=x9nE2_PYnkGeg{+kF1)FijS!QU-u$$=7EJ7}%FPUY@4uM6 zGFP+q=6eVq>p5_CNdhtVc}C?Jz1ZX{rqOm9A7+%RiP4a%ZetWLb7~Ogr?QD5>$Q(( z$PN2x>KjBTaj2K@;5p5Z)uL0cu1LGri#GD5Q@9OtOmG$T7%>$ioPH<4*f=d@VYtD0 zsynxQo9zkCZJf2EWe>J4Ab*aa?7cYJ;zUo%XtPHQb8cJbP>8w|hpAfq52Dd|x32hf zUAn2k&7~;g3cgMgCK;bmw>6;uwKhTiu$tBEEu$XnEKO5dGd!v2bGG!erOerwq!Dgx zP7aq_4KA+$&k*UY^Y=&9(+4f?s>0!zL803f*7Ox1s4vqr>Kd~}45>*$IaJ~C zuJre;;*)CUN7ve#My&ptL@>rsbWPt`e`0f(0&ey~>)Xk;(`RXWPCWTa9e921ZwFYJ zuCj8UqAI#JmQK9si9LUhqIY@K1TU_LHAZGd`%T2Kqu1BrpgEDu86`>fwiJ2>t?e{k^k$E>H)BYy5j z1k_VG0{011Y%Vy1j^@wMn_5tW8yyw1%2pTuUhe8pxW8mlRQip5yB-HECh7j$FMLQS zlkwpaX+#29%PA_7W8&br4=95vz{KQ{k=!ZL{!&Y$JBDY+Aq45#7OSOKnLYAO%rJ*Z zX5{SkD#Y)>2qNB;8)IPh-koEA7ffL8pT`PzTdaO>y~K1g(X_&EBlgD#xN}r7CQUR~ z$hni<+Bvywg*WTsKU0GnJ;x_KoUYgmrT?n!C!% zGqs-?R@LY4WwA8<#!$luy(L4!TkUiF4Zl7;%z94SuSt1&G|PT_Zt*D(Qz=pmEIMWTrD`IlJ2a@MIUCCH+{hz>mN)%;xcS{isCdR`D^Z0FS} zg{53)Y2d#27SExyJy7M9m@v^gCb~o2IMlyjg|CFYq(yqFA$DpM^2#ItDZCFIxjE3& z2hUY8?+l^Z@TowMZdUBWU>k5YZS z&J5x23_SM1SCqOi^yaA~4LbJxc5YwmF2!8qf;-VfsLH><6_o;I?!w8rGUr+@bE?hp z^U^1@;fZH=(Uqnnwsek-h#ajkXsKY|>DRX57?6Lokdud_au}QQK@}3Oj}cA#6T3PdqZs_r$(h$ZG0& zy#dW_JBZI}4wJtSk}7W}$;P>D>WS}X#BjB9o6A+5?R@g-wWUm#&c?(M)`eG)TXrFb ze&vy*NrHD1?V(oS>ePsNPLf;bFg$16ml(tr>sW{tcPS7=c#meBiMH`4V8wz|7&00l z`k~P7a?zO>HQac{!Lpl6aH$QO!5#*&eKgrgH3L#i;WB{vsw9szu2iN29JD$ni+l3- zz)Wm{O0gfVlG?>;D#m1f}ca`fD!Uf2Ufl&MR+g zIw80h)8$gMwz#r#VvNyKLj0WG+-W1cSze|P4oRnRFS8PO^3w_#h2yzW@c|q(QbEtrpX=!bLyW}EBq3#c=IxSvjNAEm-ZG&*k!j1uR$PunMuyE zB5!LzNhYHK6lKz)VT+N%dJ(7SFAHM1mMtYL^(a-8+@ulHY`>mpclLKpC~(>yogYi& zr{>p4x;BP6t?7XqQ^S8eCR;1;Sn8R<2Q3-`?NxSb-C0D#I7KF;zqaRf471Fg=+KSD z{E)0Xkx{^YdpRSENUaec`rYP>AviN8CdSm(HtpS^Fb-9m)TBek5X0gZy+PwfPs50Z zs$&&_TdU_YwE~}~AGvZSB{P;NRnNZy$E_X+UGMCsczSx)SRK;Ub$Lj&(Y&2P6qMmK z3_Fd7(qqj;Qt_+CK@5oraOUNPfn%*VG(?)|=X^jmoetvS^B1$8ii?R$MV^ykL6*Xr zVknv?4X?xuB!gE+&N+lfg6X+ zo|W6a`Qh$2nK%T5^`Ebkz;kO3Vyqg6Yzfj2Y%?S#+O0;uPyThWjo;)0w{b?uM){{e zix1@n1hRMqAR@=>gZyRKZVpo>786s5Qijv(ChdA%RBOT8!=`_yM&viWJdE+mX6O@@ znv;g!1pdt@RF-@97VuzLT@K&kNd{EzS?}BzPYjbd^H0P@%?80wypf(XBcP!G(b*tc zEm7u5r4QKUqwBYl_<}e{iM@HV14>TKtY`s8ireb@@u^()_83AcJuH8>+$wpDTf{9U zOol)r{7|^jIQ;_-z#Tq5)1LCe^F2FnBj<`Ez5a*tqRwTa;i)9yu|?F1H^=Ce;x_z| z2$-QX>}eG+7m2I{!e232L}99qFZIU??CNL&!in5Nyh9DGg3g?IbZM~8M&9B1J_7>- z`3EXDGhP9kDghImZJTrFbh-p0&a}@1cJob;I&$TK0@q@sF+5Y4zkelHE6|6DmDTns zvEEDgzv6$ER=4?nELV*dL#V|gj`q@srBx+I!9L-4q#|5%oId_(DNZTi+Mmydk0kC^ zfM)3n3n77CYLcmuH}xkH^NSWknOWrcC-is}L=Syj{xXbH!qgK_Ecd`-u&bp3==kTO z-f&IdN+S8aU@SQY*7v};XbeKuzi25YkGVcSxCc7r&zzCou|_Psp0`f!g><*^g@y7b z?~9_^wrg>IhH=NgOJPWGr63Y1aN-@CLU>n>&YLq`8OiOD;<3c8nop^+i82*U*H#iA z#rmKR!i+dtIbe-VO#Zf1fRNXT2@$_{4>_k$O*X&*P=4>h7>HkM(OqMxsI3u*2ca^*MQnFtrYN|K+Kbo(DQCEp^wYW4x1;$nFY`o;<`Zsk#f4LZiytQ$PqjJbB(7YgAqMty0-1oxn3(FamC zr1|!rGA+XD`;g@k!?f3p5gWuES{kci9L0kY>pTWYxzm@GQ!yj1a@$tP5;v+Z{WuQM zzx!=$Y@CMU2JUWb1U(D|sayS~Y)n#aWf!JW*26&T?G~hLO;UHZU%=^>2>}l;ZSyY) z8}6OBE3g+Ty5<_^RH72jI4p)>?4C_Hn_SLYpz!m$;ZhpS|@-V^>lVZf0v{EEipAQtJ3ib$uwf_O;CUe#;0c3r!O- z*ViXOLule9tTEF$w%-@4(-uUmp85zt4$)U)jW zPGZD0C~=XFv@`*;XW2rQ9TFqg_yY=qXvn@15plg}Be5F~SE&V490@BvE9|Chm8?^BAKNsC%D5ZZXgP zQ;r`Uez1=Yuo!B}Yo6=QQGj{$M7MA!3#nB@T(=*+=$7h;5L`6tP9z=UOk}dbNG;S{ z&D*?tWq_hi1D9pza6{<7>&y+sN-E3N5DeD|k!Gst9^=g9 zt1qz`l|VK~>V&K&feNRWg_Pv#IC(LaHXG&@L&^Ry%0PGS2ncNNLl>&lzr8pnIwu4s zsPv>Hg2LgUmzT4$)%^`QXhHAQDJxUC1Vfk8Nb~Nk>OEpVOIzF8`gkgWmc~=ye7uD) zltSWzS(#G}*OT9)pK%hJ6LS6{Kty7L=oaiGF9 zW7BB^W%U>Qc1{Jigyf})>ni_yD5(SjDO$`YM!cfHm;x}u&*SLOsiRu(IH3$_)Z5k5 z-EB4SXTNJ>wzZj84VEzOacesTskpgto6y@f3Wf0ul;8{3+XUViEP2^hf`@;0rDXL%evo4B}?>)__pks?OiaL-=BU?o;+2FxRER4!C%B z*I{I24XdC1Q043``yfYd4AiAK)_;$eh&bF_nx1E2BC z^O{ZO;S>5JE{MoG%i3GIMF%q@ehU?$aNhYQn8;y6U8ob?2<(wjP{ld~sQdt-3- zg!~>J8KDin3OEb>^_4%Lr4R0Ht<&STJ!!@a6CxpHW9e%#uKBJK&cXI{{>}`v3M%Ki z_|Jnu<4kAz(Y-Zt*bSeo)7I8Wwq;Is5C&bSobH0ee9((I?FV2kh z>xt&rWb1~9T$9@k!<8m=Vv)n0QTmoT#nYDezl*K<_XTK+;T$a)NTSVX^=B3{Nf724 z2(RZAgE}W)-KG@}|6Ptvotj8+P5K+b>zT_{v(7b-v;8r^iGx!TuSd zq2FWBx(ULoX*M1%o8e;wL(|XEI=f=^J9!A$eNGi_g0*EhizBdxCP_;FJ1^|sI8 z+ig^L-Ic57>ZwqI;FFb}ic$}(h;T{>RzLxg0oi%pN>gIGghV79Qcpg~xIj95)P!D$ zRd2L;w1gpk={e$dmyvu|Y0WJTQI{Hj83a=8&tN)ge{itmk@>w_Wr(geC*p#HZ>{zo zLb?xW*<%RzmutSzldgxEkms0~EpPdm#wgn)OB|l2EJQycPD{VN^9S;ZI#Q%9q%<`( zTb4x6KK)jw_jl0>Ln0W~b9=%}j;~1HBjz-JEL%Na0--oT=62f>Nq3Nez|SuS2HNlE zIl#p1!HbAXV2`F%SaUJCTgJV{^3S)wl&#pxq>Gs6EIj|&8wys zmj2vJ_nRn(eI;R*7v~*TOXY;8Y{a`|Vm)ws$M>&!cO{EL2s{vJ);g#9BYtQ3^Dpd& zAawc0kvf0L7MA8)Z({0__QPcxe{GBVFfg_OzS0iq3STLS?XkYnBGWqLx+aKyn$h-H zz2^dBKX?}k8=j>95k*&pM-!eTzQ66F#I1kv;lA z3Jg*`hd4^+5-RW4rTsgm13=UpaUaImHpM2&aRxTQM^i-B$;Q6*#F#>8OFuUei3fLX z$HynbJaV2%!jfj~)1hK)i1$yxlZO3Zc|f2{iNn7hyf~j^kj?Q==Gr69gvrpg**yR+ zd|%VD4H?yuq`rWil_VPBRIUa6>@T<;Lv5>^5o%02_=l9t7G1ZnDlG8><-vAS?<>0Q z2Q2pUfYgS@Xv62#M1oo z7rPswi22J{-A3vZZU%OOE(aP%WiDaiQahLIjtS>R?I2ewmHN{OX53wO+r4Y5ixIrP zfHHbeMC*U9bZ=wGJaqZNneLp2Ed#M!tZ4%2imonR?4Fb8NTXwTkZ~L8KY7!!4Eg5W zOrvzu(%vVE{`JJi9F$Ll}vFYcEau z#pp+)hQET20zDQ0)P5>c4sWdNhJS}Qo%g`Yvcbl1=aId|h;?wgJTh+Rq+y0^++2vR z;}vH2cQmF2xw(mbq=kL>Cn`z1@cp?$ZunZ}OTW>zk(urFtHS3-pcZf3L`XV9YUKX5 zUS`tu=in(bgE^w+CySlyrQQ{V1N!_Lt*ndCzrlwhDAESmvHeDIo%q0xu_o;idjGw6 zU9aw(zG2n6K9$PFyEjy<`47TZ2&_X{YJG-acsbRZV^gv)q9W+=-?dBBXHx5 zo3WxXVoOxE-%jV#hfK3;FWR7exT?Z|3xQ*ak86PkGkTzrW!#<+R!~^jM^PkFDXiag zQ!Miy5o&4T;^LZ$A@IG7pX-Uq#OZCXKj@=8$GdG}+!SL)5%LhgQUYK>NeF#Q?Y2io zoM3P{N|+V@df*s0--$sctiI|99o)XYQ7pS%tb3Qhxui9=FHMjha(;vcQ}Hk0zcrUR zVu^$D|E=IKS6uT)CF79UKi*%qp^>icyNI5yU}!1B=IzN_D21lHDCi5EwwL>=ey*09 z>lmIQ>%ZZkMd&FU8YO&};m7N%n*zsUXTqv%s@1fh2h*u0pI|H7V7}t%*HZAhj=%RF zwFbJ7dB;A0K<@^byem=;ZE?oD(7Z zFeuy|kO-=kT$_ z&XXCn=s9;2JyHuiI37)(UKEQ=7-qGGV0T45`ESH8mfsc~Y9L)LweDhl1h{!?{%o&|mf$Uj=)0#KO*upZs6 zFqOTF{QTJBOa1rv_VHZOXF!HJ^M~|Or#qQ+XNY`Qwc-R4H@PDFJZ+e|#BmawG3m6z zJ4psVHlNefDL@eFL&LErIXU^t+|Pq^lE&Cba*yC1axxLFk&aH!vBtCi?-*v(M3*>zBu~9N^MDCp=1&+c z7|#BFL-kDX1OL+*@K7;5r*Vkt+6Kt2axODO5)8ZGm-${e^cVX7D^yCb08r~-mvw$| z?qi2NB6<>Ftotw&v_k_YrK_vk@+S5iiF}sae{DnYqnFhno{MQvuoeb3ulB+)c(7M2 zW+F#a$DhdV+h+-6nk-;9-`kp={zXx8cyH(rW7tfCeB!SgydFyDI@?a~P7PD?&GG;8 zgJl8FD@0heX@9SN?9?qCT|{puac!zf*2hwU;N4@i0ind^02yQ`sn;)v*3u5&-gOTK z^>%0ue*x?&>bjG-7b1?}Onz1t7}l%a~#{ziq4U=+S>4zgP`n2BeG% z7%Bx+y_0wVCoDm{@zWH$IzM;xBnX3~Hu)LPF3BsZ^{$4eTF(LAyR+F9FJ!Q(hh?{n z?xA&y%?`Hd`OuWd&x1S+eo(j;)Qz^PNFYnK~0(bL((on}qp$WnSba z38ro?F0KLz#Ob{pRz0+ZF%K{&m7qm8UjLqN1_$)VRT`IGB0aadv+LN>(p!{wKW_n` zwQsj7gS*#r$SF8s0eK6hdtf@d2i?iDB~jt%C3YQO=AaEI1A+0#H(P{^<;NO|=>{)9 zx(W~t$Gy0POZ0wgQ6F3ZMlV}53X83?g6kM!>tR+Q(GHf!kmj?4HtlU^-N(@Zw?Qn6lds1s{VKzXP@?6k;s ztc}4mCwZ>vsSQAY@Y|Flq_%?Jj?Dm^&s1l?(z_V1@sy(O3Vy+w;?mP^?B7OI2aJZl zU?bJVogCJrZ0}T4KmI;Ci1T5BQX+<8GZO*~E?)Zw`zJqUIatutF8_QK^%2g*YP}x$ z9oQ@4F$DPS+Y0)aNkRTFNo<0}`!R$zjsN~_(lRo}(kF=?ZtdH^S%%YI!#JqU<|yihT3BX*fK1q}BM+xyNEKa`>?-36)g*!; zzTyd1>|J3PWq#<5lezAtexo+y?O-UeJWs`4PG3@d_>|0njhEas^Li1 zx)NRyrE$&T$m5UM`y)r8*9+RZUg&~Mm_<6^~3p>4c+pPtHee^hZNs|WTO8I*WOR5mi z>ZN>#;&v|4iR~YceY6V+SrOn?!>kkU-2d~fOlXKEa*7%|Oantv2Q&dd#q4#eiPSx| z8Za*Mc>}uV4-4^#BVmX0K&d?m$eF*mJT7VTX-EAKjCx?cT_M=1LfqTVBjg)AX66_- zwp>MjZtJ8b%Cf~Xhw_|ZMCpU(MR-G&l%1W&07hKs$5k@CBg&1$EQx}mmj)wF@NQ1T zL)nADgAq4b<<;GhENSuxVqA_tu@tb!s0W?x&N+SIYZ1Cvzs#`3se99^t{{f2Pc4o! zBmQBHWCby|JYpD7+rP`YT>~`$m`?c<&{=eR@QviF1Q_gmj7V;N(gpcAW^*eBqE!Sg7zvxK=o@B0# zc6hHQzUgH)%{-XwEN=ZGjjPj1w~%kD$V+Jb{PsM!h<-91p$(01YzGDqcasZ zCRr{JA>-idqw_GQX|8b`AeB`TrzalG0H`_{ytIm46lMup95oPO0aLBbzwCTIQh);h zBGM8PQD2ZaA+uZ_tUiD4UVj!m6@&@*fGIbHzDU4UWSYX!mJ1ydG=DG-+E!FBE>2*c>i6GRHp4?g9&B?W{Aae&9(Y?`b2-I1d%`54{YF084y82YTo@ z?nd_d9^-5dW;sFvzs0xS<~sgnRmNlR6z;AbqExyK%XsICL7K@O{``iBtF*xLbfdlq zLPE@p4Q#))@;`xc)DCFL*|pgp%U~e6xS+>QlcRY(LwBMBFQVOm_{GJPP@u8@DkP_* zWW7SijC{&wK!|zJis~t|Aqy$5Fv{7Y+|G#iJ1_IWD;u%#!XZ1*9~4K%%+o&2?3j$( zL6JMz6w&ZNWo)r~7>d1kJRAF+bUsA*m(68h7BnDnBk<~!_6nVsJ=1tW9u(0Rq3b@c zAV8Y?U2_cov1Bq2qC2r7<-@e5ZVj=VcEdzkIKv4>hBesQ7GQ3e1eXaHH}{J1f}Z)o zV6^O}@H={96ckB-q{rXBoeEkbQ;rN(x~ub1COuHV{u>V1NS6_^w5o+A#!V+z)}Ic~ z-rL*DB`8=tqZ?fmVE^Jwd$mX*K$t3!>!lI8RyzDHPmy~kQ=Q`6@(_zu3YEn42PBh& z6T;HT10%Ul`4HT1$n*IC$g?yU)t&Zyut$EE0b5^eMc9AU`p5aBbZ!aytg@=g^dyV0 z95S1jdR|jGpa>Tv+Qeo`2Z(xldIEqS$+$obO3qUAz2IiD*vxPEgW;}R1i zZcs(M*SKAYsZC6sN|;;Tz-@vl*JhqxrkG$e@E5t&;M=FinA+p>IbI1_ssw z_L&_HJidq2c%e_;Zqb9U)Nmrd`eB=lU)L&auCAUE*Z2?oxBlvWaivKv8 z_*t`cYjkvU4{kAZ=hYl@(+FT~9e{yd-D1x11T<+?e+!4c@d7ntf>R(x*En&$G zCD8mx88_^K1@W{tQjY0ek-1bJp={=Rxgv-f^DQ5!nsHQsBp1x~o88ZMVUuDCa|OrS z0lb?8FJL-64~luLYMlF!WRNTQGvf18D@B-6?*UP64uMU!XAF1=IeMoW#Rr|bQ<5HW zAr*@Qu?QlHWOPEDvU$@0_$8t%f4c956i*b=E)z6vB+amOAA({abJzoqh-?bS{}J0f zVvWv2@L8j{c^bQuTv<#nmk*tP;jOkW0L}k`_;Dxd!ueSv3`y!>zpNi!10>F(r_Qm* z`l3qbqS}H5J$U8qD=K2$6eHzGm9`MpmkwgT53p%!Zqb|V@o6es_|67jp|HA3$73E~ zvnSG7^Nwv>K$Kt9?>H|n9TV*nvzU$U#qVyP)MO$@o8CZd(q+cweG6x=Sfz}=c^gPy z$;490SldzL_#bI~Xb)CBKu{mPUifQcX~L=O#!eP&H2Sn-tQfI7-N|+0b%omNuyjyl zlfjDd0S%3$R|#454mYU_j^yOd4lm1bV+a^$^V<;Bxbn!h+~qV!nPST7METo~*Ygc; zprv%i`mX#g3!IBW3<*7}E^ zIdInad2W1j_Wi>)4j}16>jxK>$9QR{_^WQE0AIYsx+Fxr_dBi_sdgRJDBwaonAr@> zjz>mI?jp;irFoJEfl^u(Vr6Fj?3+?KaFXS+5sXf~OjZzYJ;$w!#PD}~B@+M>4UqD| z&)_HVT=-qA4?b}s5QT;_jVe>)h--?8SPL-CqAAmxL!ON3nU-*$x}&Ty3R z-=cV>36rSLNo#6io1VF%zhmoB(P(uu`Nh-Xy?TD5q>yNESZK*xDS)xzLyIZkK#^cLJ$o$0eU z8m1)A+R!LBVT3)xn=2)~(Fg$KlX#sNgS0H!HMRNQzh%#Mr1kFNlX_ZbS8d*ZRHJ@8 zmoD}(l-vskyGyFAD8m6{^+VNIzbQ4d3mBxyhAc*wi2KZcQ0?k;kAu&}F>}g|XU7g+ z_}a6}DuGUFzr;=n9--T$#QhO7Am8PDXP&?B-VxnTe$?0!&38raR|UI1k5Uq|c4a7v zlis{lz1vUMc)<2yvwJ#Xgl}g%db?N`${rVseDpAHL5J&is(a zB=3-ShTwKFYwN84Hm-UVv zj^wASH-1w;feBIfzCy_jz#*&uK>Bq8qLcIc1g2}q{i+$2ui6hj3=)-Eo!&J0p~n?6 z%Vc))8%t#gRO%N{B3=<`jsAAX#_z~TS*k#4!L3%O{sU3b(S2Tsr=d=+rkZU+|+=@%6q?%8SX5URbo>rpQV11hOYOTmH zs{QeKoms*h(4J+NdCct0B5wrV2s{MerhLfLn(QjICxEe}hF+OzM5y?b?$)&A`QiFa zmb;9_=arN)%n59$j=5? zeE`xQfs{i2Q?^d1z3-9pRFf30FlYXMv8W&=bYjsrd;!Ik0KR$FP4B~_^RPHv#MbtX z;6Za0uTR;J_Wx18ib}>{k}Udyh-p`Ry)X3`LGsy~>{in~)0BRm8g))hGvxc;Sq2E? zGY&HtnC97X6b!qh<06flN)hYq?t~2XLqsWx-`I1P2F>V4bm<2Nw$WzZ^D)RGIsr?o zxx`^01oNXB!=;oAH*KCls{00T3%cdQqxq-!FC*&Or(Rz*1BRT-&Xuug2()WOc`0dj z_WfEte<9YyVdy~5-@oS>Oiex9Gcn@>hL(nxqVN@vqjs>M3);~X;=(D#m)3T1w|Cp} zI^AbdWtL`GY3pQ0#KW$W*|11gsP)TOAuk3quR-dB(pTV7P(AO}cPbqP{=ZBw=jxMYqjP~zEUH2$o+6Vf@FO7eZ-P6 ziv|R*w49tN-J$454J>N;O4f#YtK)BPp9M%dBsF%K_H?@-vn!R1jBp*<86(Y<<#qZP^C?%)cd&(bSOhc;|2o|9p{8KJutW6iVx=EhBVuNl#=T^zYK+*CmNV?TCHVK; z*^%1g>{91)DPNwh>@-;XzWBH1>=y6Z6PK?VA%Jny$`w);xkTmU zL#|$v{69eFuD~?Jix5iv#iEdA;~c47rbsXLDw6cnJf~sI54o!X0M?(0&P~j31BO zEl#Fq4HLkKC3N4-U^QR2W_XR|R^!0ZMSpx}F@h=j@^jZ~zf zJCR@6Fo5M^anc@_y)oL+i+nnir@s$KK4H9!yLe|lQ{7*J9*M_D(HwTF7 z1#ON@=UhxHys0K!bi&X5H$=g=@@ek6dCD=2*b)vAZgs@y*GnULA8{J=9=yefo7-)5 z1|w(LxZ9_i@JPl>Y=HaZE&~2M&Xjd(@HR7YZ?h||U4QOwVj@syFQ-2!GMH@B9bk8d z2IlMNon>MM4S>|Y@wzS#Xvt*Leo(B^?E${0=i#ze9-@ySZOFtOB^04@kArk%<7DXj zi=G|@<}IjYG_Nn;i1FmhOPPYt$HV=JVhk&Ze7uO$QYI(xv>^5DfI#A}LAMQhBQVIs zn=6wa@>g2jyYL69>+0%U?=E{J$tbdf==yKG|C$KW*?~~%9t4)vIVOZq(i;*Lj(#Cw zMiCe74oHF*eERH2IO5k%${0Pr-!d+ehscR>lgs5()^U9Q?%m9#8Q?FK-J(+WVu-J~Rcjs|;St1*2I8QL!n5sBXb~|I;DL2?X9}7bha-)aHseypB#0aMCYB zKAF-ttuuDdPn{eb7r|6fj!vk;(acMq+ADa)ZyG0o46%>pbZ zT&?d#b~2Q7B!%LXGfu*V!an{!Y{_6C$Uv%NTU}rGvaa4-(}Pan=Y8~BFev7cPV+RD zWDP-I<}RtRjU4Ow_(vQkWU?vF|63-{5fXh1=ZMf+4m!|Tpm`mA_?|!8iO%)_AwG7j z^tgbFGei0%wZoA*D?(d8RRY`Gv{@h59w{i@(ogXh`tVsh^drr0qdQxpO2%xj!*g5D z-K$n14`|AAsrNM~g};gLff7{MR;J>=#U@OTFeBvJ7I7|RmJyN0?dfUnOg&;F4|JvQ zjWJN8#o7u>EZ|vKP85y-KN?objj2#m#4ojNdY+Z=NBJ{}kz^Il{*Ve!Y z^~s3n)JGFzV^hF50lL%9W*8-4kUoBt1>f1_DYVoW^h2NZ*ZbeRNb$-^&QuOY>(E|q zZTJifgHaY=iumB2<{i-ksY@=3YWO@}?xOQjSkwF3+)q15PnU<$)3%af8yAkm<);yM0}HAv>miTts&j|$ zyxoHDiaapr!8{Iviu|2!07mD&g91$4=T;;lK@1w~(xVcUL%g#UJ)mc<9bPt)j=ojk z_mCw)J7iI!1;edj0s(pFanpHyAW=lW{ESXnTRGa!>`cmcl74d{yOuOKLF|h26y^dK zA6d*hU{kN7D!CNZ#R6)>-9h_9wQ^A%JMsfQnzvK)d!)UPDuqqt>=@bBFYgYhA;5C#t+zWm zFPz1Ua6~fSArvU|;?_b}uE>m=+LOU87^oX*{a^-i{e5|R#y9GJj|D1tI#LGP3Fi&O zGDrKQNzdlyroSMG&K}GPz`x0$id+$`OGiZtI1uHeliiZY;ADWrlc?qA;5P~WTUIND zB6B@Q)?uguZcqWFhN%7VRScA0uC#9u-t_#M~+<*Q1z?YUT{b;}a8d1^P8T@!p5+G%vl6fqv_h^6}DAlAE(x3A zt+MTGe4l4A(D}&g^Gvb>4UE3dV7MuM5jA3N|3fhAuCLexc-eu@hm`Y3Dn#J4t2bba zAyB)|Huhe`PZ@g}W1f|MA=0?^gGZ7aNox>L=X>(Q8~Yx8LZp5yg?In5bdxO5f(qje z+Pt&545nB)^ppNb=mzD18LKKY-ouSxbg^D9>Fh!6d#lLW+Pi9MY6f7`NBd>@LGoOL z0OgErrn+g%^*$CVi>IghO`08WY-T98xRHIIUAF$s?d7~tbL?)-W_(;+Z>xC1z3(kc zPc*1tw~2O!w8}!>)4N&uFtOi$W^E=+b2@g4C*InLK<%#AIeSiLd3AfKxh&PM2nM6Q zf#OXVcd8F-gEdg4udd`EQtQxWTh@5%iy1&;asi#~raV7r=rIAx);s8_hAPw9%N8<| z#%@vncxO9Ph0WS%&?R>hm_=!tK3ipJ62kZqC}BlnP5ZGL-6{we?)Dl1Z|(w1Si6}k z^jLi|VwpIb4z^`>#fU&Y*A}0tf~tOqaBM$3$9r<_D+65Up0D8!48V-G0BpJbA1t+p zwFVqdd;zp6rkT*9L{e;5PT4aZuOOQIYWiWz0X-NQlVhk1SlmUkIPN7quCvn2+k!PLm`3Ay02s1vXi9tvlab`%# z(~S3fcOVx!9jRUGO+YsXVcuSj(_N>trfv0)44~TcVg6y*$PS}1G9}uCWf#fuG?DhbmJ2T}t)+_3j=5MJgVrN5kOfnqE366n(Vk+`KH*j=a4aN0x32+^ zQMxfhE%%F4J&If|TbnDg33t>n;_?naS>IdoNlteBVBksP!fE)buS9nu^Ac>S$Ebebv zn^Voh<*9TtS00Ea&++byi(jix0d*jZ_oVhVC_%IX_2vo;lEOP!&Wk&QaMS^+UR`Kn z8&7RB8T5YnOUI0PSoq((XN}*wfbis0Mn*sU>vHsuZpDRv zl_B@?65QY2yx-FT?ikZ6$vLnhrtT3oU&DxcaI7Yfbr5Rx~bA zOE!ZwHHS47Vo~E0D|5@*bZB)<)_Eco;2J!o4K(U4O{5;W^d)#XH{vvZEi{%vONSb1apY9LE7*UX8EVKqVnvY|3&s#D73HJ1bLNC9MqIZySe(yS z6HdK;pOFy3p%I$^j|~3%$f*0EF|ySrNqk_;r7=zZ{fTj1+v|e;P=~~Wwhd1=o7L_x z2xn-6F}){3v7%@9wxmKUsL?XNxTd*`tnAZ}LMVj%{phA8sk`0n<7W;iLfgjzoc9Rj z-S@NVtp>U0RL2}93Dliep9c13Yv@qe1%9t5^m4$~dbV2#CNOBtUwu+a?2yuqf&}1; znJxobpzIpJYR3 zf{vhK{RKd*SsnLBo)%Yy3_MPOCdAcTj|u7_nOoY_Ne51ZIwJM^%MV-E^wYv!*dIkFRWk`<;Fav}W(+ z?>!cktA4w-1uBU;0p0DT6iG>Gqmu>lFPMv;2Hz$*_~;)G;c*D?o@ibm(pT<5Vv095 zK;3ia=`(PTPcQc$Adpkw*=vGQ+r4HbosO~VMJS-WXKSomq0IB-*_xXl%l5~a%CZz0 znEv1}*V7&U;zN(aj@%ofLEYgbv@uE62&b7u=HsMmJOoQIZ?p``PkP1wF%XZ>O(iQM zpx*Web(a6^D89F}0y)k`zPuf;HHmVy!a1wa!I@N&Ba14p8{U@#2#9w|$pIo_#rxlW z%CSp6F-zcf$# z_Q=cf?;8jcP!EOgk{FFgwi~a8#mYP}Gi80~Wis&RgeeJvm{LjIAo6vyx1qvh${G7^ zM>O0pWNIsd0PIr3iH8t0syB3zQGxB19l)!)`%Dsa4l?lg8PUJ&+>U~t!JkJt&A$~9 zt8~u3#z4B^W89aLp`Mw^i|ewBdZdU#>?OMqq# zk55vCLfd+`cC+#MK*=o)Y~9Hg#Pgn=TT~U&wx#(AJ28vJqSq!B)_+&RmVhF7=ES>I zUwaFSobx|_&;EM!c-*n4=D{oR#u$-}y8%diN84(?RV!Q6Qq2t6=w~C>LP$V{;x}M5 z)y%ih3-#UE5j-6I_(Cj)5X!qRE8yulzI}4Ma^X8qar0^MTpd14e(S~d#~5%)j7o;E zkt=NrZGUf|GAmkE?PXC10+M*L{z-1s2M;%Y z7!1*{^PBcxYc~z@*XVn-G-%*Esv zU}pOrpiwKrtTr)*i-;2K!wk0Z@5WywRsnQ?%OK!PyKi#BXl!qSNTxGuiD$Vee5<_z ze5(U|>&Ax%HrK^nebejPW~Lca0JlwBGw_??hVa=eL}j6d$7~i)D+YZF6geMk zGPkNv+Kk-9nEKV{fmz1W{_e600loUMpzW~g+0oHmBOnFgROIZyf4y01%nhcWy*ni~ zQGZUT+a$p>HUg*Iz#0<}m&xFmW?`2i%9~gdFacbyi+Ir*>RW;eX!%=TVkZALBSVV4 zRJ2BR;RoxYK>i~p3v>2!$*e$u{c^S4sI7&WEyUt*YoGuTMFvftzcEw}IKvJwncRra zxvWSRxF_R#ciogxQ%NvAJTD9-yczN>HWx{Cuv+&Hs>WPBC4UrZ32Bh0zX62$2QbF> zTsj>ik{&`#VSQZ~+WBxlMDPrAt!lF$)-Y4)331q>>2LTccPGxywyL^MaA^lngij9O z#LvS!!>WLLb9MWAGYR@8?)KPInJJiTlOyD_Rs=Fs);_wjZ(3rd1GaY{S4TzTzI!F3 zmXmt-Cu?s+!uj(bcdP)V=4@_mk4?+#dK!lhmbsqZ^%-)KU2SJYm6w>wEh&%_UFN5T zg+0ObBG%{x*b=G;hoGTcpS#@=J**cA<)^Td{G^~2#)TxrhRT|u6k^GIu31<7NXx(-m}#VHb!dLiatwgquM zsn>he(3i{fscBmg)kSZv07tc2f;G7E;7(=j8lZ0iq|W8#vEr*A_AGH&5(Hxw>ID&T zVSU0`4(`Lw~# zjVadh2$F*BKl01}ZEIOGo;KYZ@ymI(%eu9qtWwjXrrA?sn7+ExpK_W|l9zp#DB z?&3W+@nd1cPS?!>HNA+FFHaj=D*Ys(;Ub%;(eT6qv6~q{*KOZnD_J%A;f`z^w@4bq zTO&Gga(du4J`cISJa%MT7G<{DmgiP9P%qxqt}zp0M0J!kif+m(V7kVF&Y>c}Aa73= zkAHq@gF8GZW!)6WYXP;bD5y_K{=Q(!TNQC*zlKIqGYPGk(Sy)){hz1|Rkynt>V*rY;3a=GX=_D1qA3?+BxZ*2G|d_Vsv$dH`N%Cu;ctf}}7qKJp&#pg)1 zLWjIH=1HC;0tx9)GhZg)s$a|1A0KPeM>D2r-S0q_aworikZ1gRgQmw0S4=Ik4ch|6 ze3o>Z`#mt|m=Q_ol|3CRj-5LvIJ@Wt`Zepi7xr?{+M=+GZJ+lrI?LKib%BfaHF3Y(=!lDX0wpXKk(!36w!*00#1Muu9{5taA?7L+ z_D+f?imIuCec!$L8JNvNrPl)V0iSf=wt=phyonRNcFis=|8oN{2eU9(U`pWDZJc;_ zxa)Bv4DYCSt-19Z*zR|wS>`;STdfs_H)$ zI>;7FTI^(p7##ZFq=k@&SO+M)LJ+JGb2URWEd!EK8-U`D^2+{^c;NQ()>*!-Yl}Ua zVzYF`|L0kL*^tm=HmLI1Y)gb*+Iw5*_%vvP2Z`nKi`o+6N;lLzd(kW?KsD9Rscd)71`T-!#F4a4`wIuLD9vr=%%il$j)iuROd4H!|S?)+xdGo3n7bfFm$_wcrg{ z#CZthw6@a#{byf|cKk&tp5dX{~ z@_$>`>IjX&v=M*T=4;7GNf&Wm?5jlh)n~wUei||hQ9a}{aCsuR9txLr5zF_C~Yt#0koY(}aGQ?&S@GZMldjE%>6LW`f}Vb_*)HxV*t=*q6YPNXs^fYkcM;(tU2d z=EiLRGjt&Iej-*ug(Yyvn0?_P&#vmJcQb=Zd!+% zJ}Q_BALvDT9JO-t`H30dXhi2m3jOeGrX3u&n43nzEs*AUipN`Qc)<2KI$Gi=NAjY0M>qUp-U18KNw6B`|G zfGm?`b@<;4*ZzXD(S$MPE8l=Ts3K0V25!Mt$SUxIg$F;PmU!$(K!bJu1UOy)Ug0L} z(G{)26EKW4eF{>891;q8&%7@1zu>p#_zt9dY%CKvcgaM03l7`uVPpOWxK3ZZv%qbxZA|FqO7lI-W*ij#RJEH>1TlXdDctI&%VSREzIO%0D?2kF`yFAq6Kty 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