multi - 示例4 - 协作协议
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);
}
}