Solon v3.10.3

extensions 扩展开发(hook? plugin?)

</> markdown
2026年4月22日 下午1:19:08

SolonCode Extensions 是基于 Java 技术栈的扩展机制,类似于 ClaudeCode 的 Hook 或 OpenCode 的 Plugin。

它通过实现 HarnessExtension 接口,深度介入 ReActAgent.Builder 的装配过程,支持开发者为 Agent 添加工具 (Tools)、设置拦截器 (Interceptors) 等。相比高层接口,这是一种更基础、更自由且全面的定制方式。

1、核心接口

所有扩展插件都需要实现 HarnessExtension 接口。通过 configure 方法,你可以获得当前 Agent 的名称及其构建器实例,从而进行增强。

引入依赖(注意:soloncode 已依赖的包,都要标为 provided)

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-harness</artifactId>
    <scope>provided</scope>
</dependency>

编写代码(仅为示意)

public class Extension1 implements HarnessExtension {
    @Override
    public void configure(String agentName, ReActAgent.Builder agentBuilder) {
        // 在此处对 agentBuilder 进行定制,例如添加 Tool 或 Interceptor
        agentBuilder.defaultInterceptorAdd(new ReActInterceptor() {
            @Override
            public void onAgentStart(ReActTrace trace) {
                System.out.println("任务要开始了...");
            }

            @Override
            public void onReason(ReActTrace trace, AssistantMessage message) {
                System.out.println("又思考了...");
            }

            @Override
            public ChatResponse interceptCall(ChatRequest req, CallChain chain) throws IOException {
                System.out.println("要调用工具了...");
                return chain.doIntercept(req);
            }
        });
    }
}

2、安装方式

编译打包后,将生成的 JAR 包存放在以下目录:

  • 路径: ~/.soloncode/extensions/

3、装配与生效

SolonCode 提供两种装配方式:手动显式配置 和 基于 Solon SPI 的自动装配

方式 A:手动配置 (Manual)

适用于需要精确控制加载顺序或仅在特定环境下启用的扩展。

在配置文件中指定扩展类的全限定名:

soloncode:
  extensions:
    - "org.codecli.ext1.MyExtension"

方式 B:自动装配 (Auto-Configuration)

推荐方式。基于 Solon Plugin 机制,实现“即插即用”,无需在 YAML 中手动声明。

1) 创建插件类

public class MyExtensionPlugin implements Plugin {
    @Override
    public void start(AppContext context) throws Throwable {
        // 将扩展类注册到容器中,SolonCode 会自动识别并加载
        context.beanMake(MyExtension.class);
    }
}

2) 配置 SPI

在资源目录 META-INF/solon/ 下创建插件声明文件(参考:Solon SPI 机制)。