Solon v3.10.1

harness - helloworld

</> markdown
2026年4月3日 下午2:09:49
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-harness</artifactId>
</dependency>

理论上可能内置预任意 Java 项目中。具体开发时,可以直接使用,或者参考它的实现代码。//后续会进一步丰富文档

1、示意代码

代码听配置类:

  • HarnessProperties,用于配置智能体马具特性,具体可参考:《config.yml 配置详解》
  • AgentDefinition,用于定义子代理(主要涉及系统提示词,与工具权限)
import org.noear.solon.ai.agent.AgentSession;
import org.noear.solon.ai.agent.AgentSessionProvider;
import org.noear.solon.ai.agent.react.ReActAgent;
import org.noear.solon.ai.agent.session.InMemoryAgentSession;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.harness.HarnessEngine;
import org.noear.solon.ai.harness.HarnessProperties;
import org.noear.solon.ai.harness.agent.AgentDefinition;
import org.noear.solon.ai.harness.permission.ToolPermission;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class DemoApp {
    public static void main(String[] arg) throws Throwable {
        //--- 1. 初始化
        HarnessProperties harnessProps = new HarnessProperties(".tmp/");
        harnessProps.addTools(ToolPermission.TOOL_ALL_FULL); //设定工具权限
        harnessProps.setChatModel(null); //设定大模型配置

        ChatModel chatModel = ChatModel.of(harnessProps.getChatModel()).build();
        AgentSessionProvider sessionProvider = new AgentSessionProvider() {
            private Map<String, AgentSession> sessionMap = new ConcurrentHashMap<>();

            @Override
            public AgentSession getSession(String instanceId) {
                return sessionMap.computeIfAbsent(instanceId, k -> InMemoryAgentSession.of(k));
            }
        };

        HarnessEngine engine = HarnessEngine.builder()
                .properties(harnessProps)
                .chatModel(chatModel)
                .sessionProvider(sessionProvider)
                .build();

        //--- 用主代理执行
        csae1(engine, "hello");

        //--- 动态创建子代理执行(好处理可以动态创建不同的工具权限)
        case2(engine, "hello");

    }

    private static void csae1(HarnessEngine engine, String prompt) throws Throwable {
        AgentSession session = engine.getSession(HarnessEngine.SESSION_DEFAULT);

        //--- 用主代理模式
        engine.getMainAgent().prompt(prompt)
                .session(session) //没有,则为临时会话
                .options(o -> {
                    //按需,动态指定工作区(没有,则为默认工作区)
                    o.toolContextPut(HarnessEngine.ATTR_CWD, "xxx");
                })
                .call();
    }

    private static void case2(HarnessEngine engine, String prompt) throws Throwable {
        AgentSession session = engine.getSession(HarnessEngine.SESSION_DEFAULT);

        //动态定义智能体
        AgentDefinition definition = new AgentDefinition();
        definition.setSystemPrompt("xxx"); //系统提示词
        definition.getMetadata().addTools(ToolPermission.TOOL_BASH); //工具权限

        ReActAgent subagent = engine.createSubagent(definition).build();
        subagent.prompt(prompt)
                .session(session) //没有,则为临时会话
                .options(o -> {
                    //按需,动态指定工作区(没有,则为默认工作区)
                    o.toolContextPut(HarnessEngine.ATTR_CWD, "xxx");
                })
                .call();
    }
}