perf: 结构化插件的表示格式; 优化插件开发接口

This commit is contained in:
Soulter
2024-03-12 18:50:50 +08:00
parent 1af481f5f9
commit e643eea365
22 changed files with 457 additions and 215 deletions

View File

@@ -1 +1,11 @@
from cores.qqbot.global_object import GlobalObject
from cores.qqbot.types import (
PluginMetadata,
RegisteredLLM,
RegisteredPlugin,
RegisteredPlatform,
RegisteredPlugins,
PluginType,
GlobalObject,
AstrMessageEvent,
CommandResult
)

View File

@@ -1,4 +1,3 @@
from cores.qqbot.global_object import GlobalObject
from typing import Union
import os
import json
@@ -19,7 +18,6 @@ def load_config(namespace: str) -> Union[dict, bool]:
ret[k] = data[k]["value"]
return ret
def put_config(namespace: str, name: str, key: str, value, description: str):
'''
将配置项写入以namespace为名字的配置文件如果key不存在于目标配置文件中。当前 value 仅支持 str, int, float, bool, list 类型(暂不支持 dict

View File

@@ -0,0 +1,6 @@
'''
大语言模型.
插件开发者可以继承这个类来做实现。
'''
from model.provider.provider import Provider as LLMProvider

View File

@@ -1,5 +1,5 @@
from cores.qqbot.core import oper_msg
from cores.qqbot.global_object import AstrMessageEvent, CommandResult
from cores.qqbot.types import AstrMessageEvent, CommandResult
from model.platform._message_result import MessageResult
'''

View File

@@ -0,0 +1,11 @@
'''
消息平台。
Platform类是消息平台的抽象类定义了消息平台的基本接口。
消息平台的具体实现类需要继承Platform类并实现其中的抽象方法。
'''
from model.platform._platfrom import Platform
from model.platform.qq_gocq import QQGOCQ
from model.platform.qq_official import QQOfficial

View File

@@ -0,0 +1,77 @@
'''
允许开发者注册某一个类的实例到 LLM 或者 PLATFORM 中,方便其他插件调用。
必须分别实现 Platform 和 LLMProvider 中涉及的接口
'''
from model.provider.provider import Provider as LLMProvider
from model.platform._platfrom import Platform
from cores.qqbot.types import GlobalObject, RegisteredPlatform, RegisteredLLM
def register_platform(platform_name: str, platform_instance: Platform, context: GlobalObject) -> None:
'''
注册一个消息平台。
Args:
platform_name: 平台名称。
platform_instance: 平台实例。
'''
# check 是否已经注册
for platform in context.platforms:
if platform.platform_name == platform_name:
raise ValueError(f"Platform {platform_name} has been registered.")
# check
should_attrs = Platform.__dir__()
has_attrs = platform_instance.__dir__()
if not all([attr in has_attrs for attr in should_attrs]):
raise ValueError(f"Platform {platform_name} should implement all methods in LLMProvider.")
context.platforms.append(RegisteredPlatform(platform_name, platform_instance))
def register_llm(llm_name: str, llm_instance: LLMProvider, context: GlobalObject) -> None:
'''
注册一个大语言模型。
Args:
llm_name: 大语言模型名称。
llm_instance: 大语言模型实例。
'''
# check 是否已经注册
for llm in context.llms:
if llm.llm_name == llm_name:
raise ValueError(f"LLMProvider {llm_name} has been registered.")
# check
should_attrs = LLMProvider.__dir__()
has_attrs = llm_instance.__dir__()
if not all([attr in has_attrs for attr in should_attrs]):
raise ValueError(f"LLMProvider {llm_name} should implement all methods in LLMProvider.")
context.llms.append(RegisteredLLM(llm_name, llm_instance))
def unregister_platform(platform_name: str, context: GlobalObject) -> None:
'''
注销一个消息平台。
Args:
platform_name: 平台名称。
'''
for i, platform in enumerate(context.platforms):
if platform.platform_name == platform_name:
context.platforms.pop(i)
return
def unregister_llm(llm_name: str, context: GlobalObject) -> None:
'''
注销一个大语言模型。
Args:
llm_name: 大语言模型名称。
'''
for i, llm in enumerate(context.llms):
if llm.llm_name == llm_name:
context.llms.pop(i)
return

View File

@@ -0,0 +1,5 @@
'''
插件类型
'''
from cores.qqbot.types import PluginType