Skip to main content

mofa_kernel/agent/plugins/
mod.rs

1// 插件系统
2//!
3//! 提供动态插件机制,允许用户在运行时扩展和控制上下文内容
4//!
5//! 插件可以在以下阶段介入:
6//! 1. 请求处理前:预处理用户输入
7//! 2. 上下文组装前:动态添加/修改上下文内容
8//! 3. LLM响应后:后处理LLM返回结果
9//!
10//! 插件可以是HTTP请求、自定义函数等任何实现了Plugin trait的类型
11//! 运行时层提供执行器与默认注册中心实现。
12
13use crate::agent::context::AgentContext;
14use crate::agent::error::AgentResult;
15use crate::agent::types::{AgentInput, AgentOutput};
16use async_trait::async_trait;
17use std::collections::HashMap;
18use std::sync::Arc;
19
20// ============================================================================
21// 插件接口
22// ============================================================================
23
24/// 插件执行阶段
25#[derive(Debug, Clone, Copy, PartialEq, Eq)]
26pub enum PluginStage {
27    /// 请求处理前
28    PreRequest,
29    /// 上下文组装前
30    PreContext,
31    /// LLM响应后
32    PostResponse,
33    /// 整个流程完成后
34    PostProcess,
35}
36
37/// 插件元数据
38#[derive(Debug, Clone, Default)]
39pub struct PluginMetadata {
40    /// 插件名称
41    pub name: String,
42    /// 插件描述
43    pub description: String,
44    /// 插件版本
45    pub version: String,
46    /// 支持的执行阶段
47    pub stages: Vec<PluginStage>,
48    /// 自定义属性
49    pub custom: HashMap<String, String>,
50}
51
52/// 插件接口
53#[async_trait]
54pub trait Plugin: Send + Sync {
55    /// 获取插件名称
56    fn name(&self) -> &str;
57
58    /// 获取插件描述
59    fn description(&self) -> &str;
60
61    /// 获取插件元数据
62    fn metadata(&self) -> PluginMetadata;
63
64    /// 在请求处理前执行
65    /// 可以修改输入内容
66    async fn pre_request(&self, input: AgentInput, _ctx: &AgentContext) -> AgentResult<AgentInput> {
67        Ok(input)
68    }
69
70    /// 在上下文组装前执行
71    /// 可以动态修改上下文
72    async fn pre_context(&self, _ctx: &AgentContext) -> AgentResult<()> {
73        Ok(())
74    }
75
76    /// 在LLM响应后执行
77    /// 可以修改LLM返回的结果
78    async fn post_response(
79        &self,
80        output: AgentOutput,
81        _ctx: &AgentContext,
82    ) -> AgentResult<AgentOutput> {
83        Ok(output)
84    }
85
86    /// 在整个流程完成后执行
87    /// 可以进行清理或后续处理
88    async fn post_process(&self, _ctx: &AgentContext) -> AgentResult<()> {
89        Ok(())
90    }
91}
92
93// ============================================================================
94// 插件注册中心
95// ============================================================================
96
97/// 插件注册中心
98pub trait PluginRegistry: Send + Sync {
99    /// 注册插件
100    fn register(&self, plugin: Arc<dyn Plugin>) -> AgentResult<()>;
101
102    /// 批量注册插件
103    fn register_all(&self, plugins: Vec<Arc<dyn Plugin>>) -> AgentResult<()> {
104        for plugin in plugins {
105            self.register(plugin)?;
106        }
107        Ok(())
108    }
109
110    /// 移除插件
111    fn unregister(&self, name: &str) -> AgentResult<bool>;
112
113    /// 获取插件
114    fn get(&self, name: &str) -> Option<Arc<dyn Plugin>>;
115
116    /// 列出所有插件
117    fn list(&self) -> Vec<Arc<dyn Plugin>>;
118
119    /// 列出指定阶段的插件
120    fn list_by_stage(&self, stage: PluginStage) -> Vec<Arc<dyn Plugin>>;
121
122    /// 检查插件是否存在
123    fn contains(&self, name: &str) -> bool;
124
125    /// 插件数量
126    fn count(&self) -> usize;
127}