插件
MoFA 插件系统示例。
Rhai 脚本
可热重载的运行时插件。
位置: examples/rhai_scripting/
use mofa_sdk::plugins::{RhaiPlugin, RhaiPluginManager};
#[tokio::main]
async fn main() -> Result<()> {
let mut manager = RhaiPluginManager::new();
// 从文件加载插件
let plugin = RhaiPlugin::from_file("./plugins/transform.rhai").await?;
manager.register(plugin).await?;
// 调用插件函数
let result = manager.call("transform", json!({"text": "hello world"})).await?;
println!("Result: {:?}", result);
Ok(())
}
Rhai 插件脚本
// plugins/transform.rhai
fn transform(input) {
let text = input["text"];
let upper = text.to_upper_case();
let words = upper.split(" ");
let result = [];
for word in words {
result.push(word);
}
result
}
fn on_init() {
print("Transform plugin loaded!");
}
热重载
文件变更时自动重载插件。
位置: examples/rhai_hot_reload/
use mofa_sdk::plugins::HotReloadWatcher;
#[tokio::main]
async fn main() -> Result<()> {
let manager = Arc::new(RwLock::new(RhaiPluginManager::new()));
// 监听变更
let watcher = HotReloadWatcher::new("./plugins/")?;
let manager_clone = manager.clone();
watcher.on_change(move |path| {
let manager = manager_clone.clone();
async move {
let mut mgr = manager.write().await;
mgr.reload(&path).await?;
println!("Reloaded: {:?}", path);
Ok(())
}
});
// 保持运行
tokio::signal::ctrl_c().await?;
Ok(())
}
Rust 插件
编译时插件,性能最优。
#![allow(unused)]
fn main() {
use mofa_sdk::kernel::plugin::{AgentPlugin, PluginContext, PluginResult};
pub struct LoggingPlugin {
level: String,
}
#[async_trait]
impl AgentPlugin for LoggingPlugin {
fn name(&self) -> &str { "logging" }
fn version(&self) -> &str { "1.0.0" }
async fn initialize(&mut self, _ctx: &PluginContext) -> PluginResult<()> {
println!("Logging plugin initialized with level: {}", self.level);
Ok(())
}
async fn on_before_execute(&self, input: &AgentInput) -> PluginResult<()> {
println!("[{}] Input: {}", self.level, input.to_text());
Ok(())
}
async fn on_after_execute(&self, output: &AgentOutput) -> PluginResult<()> {
println!("[{}] Output: {:?}", self.level, output.as_text());
Ok(())
}
}
}
WASM 插件
跨语言插件,支持沙箱隔离。
位置: examples/wasm_plugin/
use mofa_sdk::plugins::WasmPlugin;
#[tokio::main]
async fn main() -> Result<()> {
// 加载 WASM 插件
let plugin = WasmPlugin::load("./plugins/my_plugin.wasm").await?;
// 调用导出函数
let result = plugin.call("process", b"input data").await?;
println!("Result: {}", String::from_utf8_lossy(&result));
Ok(())
}
WASM 插件(Rust 源码)
#![allow(unused)]
fn main() {
// plugins/my_plugin/src/lib.rs
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn process(input: &[u8]) -> Vec<u8> {
// 处理输入并返回输出
input.to_vec()
}
}
运行示例
# Rhai 脚本
cargo run -p rhai_scripting
# 热重载
cargo run -p rhai_hot_reload
# WASM 插件
cargo run -p wasm_plugin
# 插件演示
cargo run -p plugin_demo
可用示例
| 示例 | 描述 |
|---|---|
rhai_scripting | Rhai 运行时脚本 |
rhai_hot_reload | 热重载演示 |
wasm_plugin | WASM 插件开发 |
plugin_demo | 插件系统演示 |
plugin_system | 插件系统展示 |