Solon v3.8.3

multi - 示例4 - 协作协议

</> markdown
2026年1月14日 上午10:46:52

示例代码

import demo.ai.agent.LlmUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.noear.solon.ai.agent.Agent;
import org.noear.solon.ai.agent.AgentSession;
import org.noear.solon.ai.agent.react.ReActAgent;
import org.noear.solon.ai.agent.react.ReActSystemPrompt;
import org.noear.solon.ai.agent.session.InMemoryAgentSession;
import org.noear.solon.ai.agent.team.TeamAgent;
import org.noear.solon.ai.agent.team.TeamProtocols;
import org.noear.solon.ai.agent.team.TeamTrace;
import org.noear.solon.ai.chat.ChatModel;
import org.noear.solon.ai.chat.prompt.Prompt;

import java.util.stream.Collectors;

/**
 * Blackboard 策略测试:基于共享状态的补位协作
 */
public class TeamAgentBlackboardTest {

    @Test
    public void testBlackboardLogic() throws Throwable {
        ChatModel chatModel = LlmUtil.getChatModel();

        // 1. 优化:使用 ReActSystemPromptCn 赋予 DB 设计师更明确的“黑板贡献”职责
        Agent databaseDesigner = ReActAgent.of(chatModel)
                .name("db_designer")
                .description("负责数据库表结构设计,输出 SQL 代码。")
                .systemPrompt(ReActSystemPrompt.builder()
                        .role("你是一个资深数据库架构师")
                        .instruction("### 职责\n" +
                                "1. 仅负责数据库表结构设计(SQL 代码)。\n" +
                                "2. 检查黑板,若尚无表结构,请基于需求设计 2 张核心表。\n" +
                                "3. 直接输出 SQL 代码块,不要多余解释。")
                        .build())
                .build();

        // 2. 优化:赋予 API 设计师“黑板观察者”职责,确保其基于已有 SQL 设计接口
        Agent apiDesigner = ReActAgent.of(chatModel)
                .name("api_designer")
                .description("负责 RESTful API 接口协议设计。")
                .systemPrompt(ReActSystemPrompt.builder()
                        .role("你是一个 API 接口专家")
                        .instruction("### 职责\n" +
                                "1. 仅负责 RESTful API 接口协议设计。\n" +
                                "2. **必须参考黑板上已有的数据库表结构**来设计 2 个核心接口。\n" +
                                "3. 确保接口字段与数据库字段一致。")
                        .build())
                .build();

        // 组建团队
        TeamAgent team = TeamAgent.of(chatModel)
                .name("blackboard_team")
                .protocol(TeamProtocols.BLACKBOARD)
                .agentAdd(databaseDesigner)
                .agentAdd(apiDesigner)
                .maxTotalIterations(5)
                .build();

        //
        System.out.println("--- Blackboard Team Graph ---\n" + team.getGraph().toYaml());

        AgentSession session = InMemoryAgentSession.of("session_blackboard_01");
        String query = "请为我的电商系统设计用户模块的数据库和配套接口。";
        String result = team.call(Prompt.of(query), session).getContent();

        System.out.println("=== 执行结果 ===\n" + result);

        TeamTrace trace = team.getTrace(session);
        Assertions.assertNotNull(trace);
        Assertions.assertTrue(trace.getStepCount() > 0);
    }
}