solon-flow 集成参考(硬编码方式)
硬编码方式即:没有 yaml 配置,也没有容器参与;使用纯 Java 编码。
(基于上个示例)调整
- 所有节点组件,去掉
@Component注解。作为普通类 - 取消
flow/demo1.yml编排文件 - 修改 DemoAi,通过代码构建“流图”(v3.7.3 后支持)
DemoAgent 修改后示例:
public class DemoAgent {
private static final Logger log = LoggerFactory.getLogger(DemoAi2.class);
public static void main(String[] args) throws Throwable {
final int MAX_REVISIONS = 3;
FlowEngine flowEngine = FlowEngine.newInstance();
ChatModel chatModel = ChatModel.of("http://127.0.0.1:11434/api/chat")
.provider("ollama")
.model("qwen2.5:1.5b")
.build();
FlowContext context = FlowContext.of()
.put("MAX_REVISIONS", MAX_REVISIONS)
.put("draft_content", "")
.put("review_status", "NONE")
.put("feedback", "")
.put("revision_count", new AtomicInteger(0))
.put("messages", Utils.asList(ChatMessage.ofUser("智能家居的未来趋势和潜在挑战。")));
log.info("--- 启动内容审核 Agent ---");
Graph graph = Graph.create("demo1", decl -> {
decl.addStart("start").linkAdd("agent");
decl.addActivity("agent").task(new AiNodeAgent(chatModel)).linkAdd("review");
decl.addExclusive("review").task(new AiNodeReview())
.linkAdd("final_approval", lc -> lc.when(fc -> "APPROVED".equals(fc.get("review_status"))))
.linkAdd("final_failure", lc -> lc.when(fc -> "REJECTED".equals(fc.get("review_status")) && fc.<AtomicInteger>getAs("revision_count").get() >= MAX_REVISIONS))
.linkAdd("agent", lc -> lc.when(fc -> "REJECTED".equals(fc.get("review_status")) && fc.<AtomicInteger>getAs("revision_count").get() < MAX_REVISIONS))
.linkAdd("review");
decl.addActivity("final_approval").task(new AiNodeFinalApproval()).linkAdd("end");
decl.addActivity("final_failure").task(new AiNodeFinalFailure()).linkAdd("end");
decl.addEnd("end");
});
//执行
flowEngine.eval(graph, context);
//执行后打印
System.out.println(context.get("draft_content").toString());
List<ChatMessage> messageList = context.getAs("messages");
for (ChatMessage message : messageList) {
System.out.println(message);
}
}
}