feat(plugin_system): 引入插件HTTP端点系统

引入了全新的 `BaseRouterComponent` 组件类型,允许插件开发者通过继承并实现 `register_endpoints` 方法来创建 FastAPI 路由。

- 插件系统现在可以自动发现并注册这些路由组件,并将它们挂载到主 FastAPI 应用的 `/plugins/<plugin_name>` 前缀下。
- 新增了全局配置 `[plugin_http_system]`,提供了总开关、API 速率限制和 API 密钥认证 (`X-API-Key`) 等功能,以确保端点的安全性和稳定性。
- 更新了 `hello_world_plugin` 插件,增加了一个简单的 `/greet` 端点作为实现示例。
This commit is contained in:
minecraft1024a
2025-11-16 12:41:35 +08:00
parent 4d088e6ce5
commit 42f0e0e023
15 changed files with 257 additions and 18 deletions

View File

@@ -1,6 +1,7 @@
import random
from typing import Any, ClassVar
from mmc.src.plugin_system.base.base_http_component import BaseRouterComponent
from src.common.logger import get_logger
# 修正导入路径让Pylance不再抱怨
@@ -24,6 +25,7 @@ from src.plugin_system.base.component_types import InjectionRule, InjectionType
logger = get_logger("hello_world_plugin")
class StartupMessageHandler(BaseEventHandler):
"""启动时打印消息的事件处理器。"""
@@ -198,12 +200,25 @@ class WeatherPrompt(BasePrompt):
return "当前天气晴朗温度25°C。"
class HelloWorldRouter(BaseRouterComponent):
"""一个简单的HTTP端点示例。"""
component_name = "hello_world_router"
component_description = "提供一个简单的 /greet HTTP GET 端点。"
def register_endpoints(self) -> None:
@self.router.get("/greet", summary="返回一个问候消息")
def greet():
"""这个端点返回一个固定的问候语。"""
return {"message": "Hello from your new API endpoint!"}
@register_plugin
class HelloWorldPlugin(BasePlugin):
"""一个包含四大核心组件和高级配置功能的入门示例插件。"""
plugin_name = "hello_world_plugin"
enable_plugin = False
enable_plugin = True
dependencies: ClassVar = []
python_dependencies: ClassVar = []
config_file_name = "config.toml"
@@ -225,7 +240,7 @@ class HelloWorldPlugin(BasePlugin):
def get_plugin_components(self) -> list[tuple[ComponentInfo, type]]:
"""根据配置文件动态注册插件的功能组件。"""
components: ClassVar[list[tuple[ComponentInfo, type]] ] = []
components: list[tuple[ComponentInfo, type]] = []
components.append((StartupMessageHandler.get_handler_info(), StartupMessageHandler))
components.append((GetSystemInfoTool.get_tool_info(), GetSystemInfoTool))
@@ -239,4 +254,7 @@ class HelloWorldPlugin(BasePlugin):
# 注册新的Prompt组件
components.append((WeatherPrompt.get_prompt_info(), WeatherPrompt))
# 注册新的Router组件
components.append((HelloWorldRouter.get_router_info(), HelloWorldRouter))
return components