跳转至

Plugin API

在 Java SDK 中,插件体系基于 PluginRegistry 构建。与 Python SDK 中显式的 Plugin 抽象基类不同,Java SDK 将 GatewayWorker 作为主要的扩展点,并通过 PluginRegistry 来管理插件式组件。这种架构设计使 Java 开发者可以更直接地利用强类型特性来组织可复用的业务模块。

架构对比

概念 Python SDK Java SDK
扩展基类 Plugin 抽象基类 GatewayWorker 抽象类(直接扩展)
配置注册 Plugin.register_agent_configs() GatewayWorker.getAgentTypes() + PluginRegistry
插件注册 PluginRegistry.register_bundle() PluginRegistry.registerBundle()
生命周期钩子 Plugin 的生命周期方法 Worker 配置中的回调 / 钩子方法

在 Java SDK 中,通常不需要单独定义一个 "Plugin" 类。开发者直接继承 GatewayWorker 并通过 PluginRegistry 注册即可完成插件式组装。


GatewayWorker(扩展点)

GatewayWorker 是 Java SDK 中所有可扩展业务逻辑的基类。它既是 Worker 的核心,也承担了 Python SDK 中 Plugin 的角色。

public abstract class GatewayWorker {
    /**
     * 返回此 Worker 支持的 Agent 类型列表。
     * 相当于 Python SDK 中 Plugin.register_agent_configs() 的 agent_id 列表。
     */
    public abstract List<String> getAgentTypes();

    /**
     * 核心业务处理逻辑。
     *
     * @param command 命令对象
     * @param context 任务上下文
     * @return 任务处理结果
     */
    public abstract Object processCommand(GatewayCommand command, AgentContext context);
}

生命周期钩子

Worker 配置支持以下生命周期回调,可以通过覆写对应方法或注册回调来实现:

public class MyWorker extends GatewayWorker {

    @Override
    public List<String> getAgentTypes() {
        return List.of("my_agent", "data_processor");
    }

    @Override
    public Object processCommand(GatewayCommand command, AgentContext context) {
        // 核心处理逻辑
        return Map.of("status", "completed", "content", "处理完成");
    }

    /** Worker 启动时调用 */
    public void onWorkerStartup() {
        System.out.println("Worker 已启动");
    }

    /** Worker 关闭时调用 */
    public void onWorkerShutdown() {
        System.out.println("Worker 正在关闭");
    }

    /** 任务开始前调用 */
    public void onTaskStart(AgentContext context) {
        System.out.println("任务开始: " + context.getCurrentMessageId());
    }

    /** 任务成功完成时调用 */
    public void onTaskComplete(AgentContext context, Object result) {
        System.out.println("任务完成: " + context.getCurrentMessageId());
    }

    /** 任务出错时调用 */
    public void onTaskError(AgentContext context, Exception error) {
        System.err.println("任务出错: " + error.getMessage());
    }

    /** 任务取消时调用 */
    public void onTaskCancel(AgentContext context) {
        System.out.println("任务被取消: " + context.getCurrentMessageId());
    }
}

PluginRegistry

PluginRegistry 负责管理已注册的 Worker 实例(即插件式组件),提供统一的查找和配置能力。

public class PluginRegistry {
    /**
     * 注册一个 Worker 实例(插件包)。
     *
     * @param worker 要注册的 GatewayWorker 实例
     */
    public void registerBundle(GatewayWorker worker);

    /**
     * 根据 Agent 类型获取对应的 Worker。
     *
     * @param agentType Agent 类型标识
     * @return 对应的 GatewayWorker 实例,若未找到则返回 null
     */
    public GatewayWorker getPlugin(String agentType);

    /**
     * 列出所有已注册的 Agent 类型及其 Worker。
     *
     * @return Agent 类型到 Worker 实例的映射
     */
    public Map<String, GatewayWorker> listPlugins();
}

使用示例

// 创建 PluginRegistry
PluginRegistry registry = new PluginRegistry();

// 注册多个 Worker(相当于注册插件)
registry.registerBundle(new MyDataAnalyzer());
registry.registerBundle(new MyReportGenerator());
registry.registerBundle(new MyChartBuilder());

// 查询已注册的插件
GatewayWorker dataAnalyzer = registry.getPlugin("data_analyzer");
System.out.println("找到 worker: " + dataAnalyzer.getClass().getSimpleName());

// 列出所有已注册的 Agent 类型
Map<String, GatewayWorker> allPlugins = registry.listPlugins();
for (String agentType : allPlugins.keySet()) {
    System.out.println("已注册 Agent 类型: " + agentType);
}

AgentConfig

AgentConfig 是一个数据类,描述单个 Agent 的配置信息。通常由 GatewayWorker 在注册阶段提供。

public class AgentConfig {
    /** Agent 唯一标识 */
    private String agentId;

    /** Agent 显示名称 */
    private String name;

    /** Agent 描述信息 */
    private String description;

    /** 工具函数映射(工具名 -> 函数引用) */
    private Map<String, Object> tools;

    /** 提示词配置 */
    private Map<String, String> prompts;

    /** 技能配置 */
    private Map<String, Object> skills;

    /** 回调配置 */
    private Map<String, List<Object>> callbacks;

    /** 知识库配置 */
    private Map<String, Object> knowledgeBases;

    /** 子 Agent 列表 */
    private List<String> subAgents;

    /** 扩展配置 */
    private Map<String, Object> extra;

    /** 注册冲突时的处理策略 */
    private String onConflict;
}

属性表

属性 类型 描述
agentId String Agent 唯一标识
name String Agent 显示名称
description String Agent 描述信息
tools Map<String, Object> 工具函数映射
prompts Map<String, String> 提示词配置
skills Map<String, Object> 技能配置
callbacks Map<String, List<Object>> 生命周期回调配置
knowledgeBases Map<String, Object> 知识库配置
subAgents List<String> 依赖的子 Agent 类型列表
extra Map<String, Object> 扩展配置项
onConflict String 冲突处理策略(默认 "error",可选 "replace", "skip"

使用示例

AgentConfig config = new AgentConfig();
config.setAgentId("smart_assistant");
config.setName("智能助手");
config.setDescription("处理用户自然语言请求的智能 Agent");
config.setTools(Map.of(
    "search", searchFunction,
    "calculate", calculateFunction
));
config.setPrompts(Map.of(
    "system", "你是一个智能助手,负责回答用户问题。",
    "welcome", "你好,请问有什么可以帮助你的?"
));
config.setSubAgents(List.of("data_analyzer", "report_generator"));
config.setOnConflict("error");

完整使用示例

以下示例展示如何通过 PluginRegistry 注册多个 Worker,构建一个完整的 Agent 插件体系:

// 1. 定义数据分析器 Worker
public class DataAnalyzer extends GatewayWorker {

    private AgentConfig config;

    public DataAnalyzer() {
        config = new AgentConfig();
        config.setAgentId("data_analyzer");
        config.setName("数据分析器");
        config.setDescription("对输入数据执行统计分析");
    }

    @Override
    public List<String> getAgentTypes() {
        return List.of("data_analyzer");
    }

    @Override
    public Object processCommand(GatewayCommand command, AgentContext context) {
        // 分析逻辑
        context.emitChunk("正在分析数据...");
        return Map.of("status", "completed", "content", "分析结果");
    }

    public void onWorkerStartup() {
        System.out.println("[DataAnalyzer] 启动完成");
    }
}

// 2. 定义报表生成器 Worker
public class ReportGenerator extends GatewayWorker {

    @Override
    public List<String> getAgentTypes() {
        return List.of("report_generator");
    }

    @Override
    public Object processCommand(GatewayCommand command, AgentContext context) {
        context.emitChunk("正在生成报表...");
        context.emitArtifact("https://reports.example.com/report_001.pdf");
        return Map.of("status", "completed", "content", "报表已生成");
    }
}

// 3. 通过 PluginRegistry 管理所有 Worker
public class PluginManager {
    private PluginRegistry registry;

    public PluginManager() {
        registry = new PluginRegistry();
        initializePlugins();
    }

    private void initializePlugins() {
        // 注册所有 Worker(相当于注册插件)
        registry.registerBundle(new DataAnalyzer());
        registry.registerBundle(new ReportGenerator());

        System.out.println("已注册 " + registry.listPlugins().size() + " 个插件");
    }

    public GatewayWorker getPlugin(String agentType) {
        return registry.getPlugin(agentType);
    }
}