Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

插件

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_scriptingRhai 运行时脚本
rhai_hot_reload热重载演示
wasm_pluginWASM 插件开发
plugin_demo插件系统演示
plugin_system插件系统展示

相关链接