当前位置: 首页 > news >正文

LangGraph4j 学习系列(2)-条件工作流

接上节继续,本节将演示条件工作流如何用langgraph4j实现

image

经过node-1节点时,根据该节点的输出状态值,来决定流向node-2,还是node-3 ?

 
一、定义节点
1 public class Node2Action implements NodeAction<AgentState> {
2     @Override
3     public Map<String, Object> apply(AgentState state) throws Exception {
4         System.out.println("current Node: node-2");
5         return Map.of("myData", "node2-my-value",
6                 "node2Key", "node2-value");
7     }
8 }
平平无奇的Node2
1 public class Node3Action implements NodeAction<AgentState> {
2     @Override
3     public Map<String, Object> apply(AgentState state) throws Exception {
4         System.out.println("current Node: node-3");
5         return Map.of("myData", "node3-my-value",
6                 "node3Key", "node3-value");
7     }
8 }
平平无奇的Node3
 1 public class Node1Action implements NodeAction<AgentState> {
 2 
 3     private static final String KEY_NEXT_NODE = "nextNode";
 4     private static final String DEFAULT_NEXT = "3";
 5 
 6     @Override
 7     public Map<String, Object> apply(AgentState state) throws Exception {
 8         System.out.println("current Node: node-1");
 9         String next = resolveNextNode(state);
10         return Map.of(
11                 "myData", "node1-my-value",
12                 "node1Key", "node1-value",
13                 KEY_NEXT_NODE, next);
14     }
15 
16     private String resolveNextNode(AgentState state) {
17         Optional<Object> routeTo = state.value(KEY_NEXT_NODE);
18         if (routeTo.isEmpty()) {
19             return DEFAULT_NEXT;
20         }
21         Object v = routeTo.get();
22         String s = v.toString();
23         if ("2".equals(s) || "3".equals(s)) {
24             return s;
25         }
26         return DEFAULT_NEXT;
27     }
28 }
Node1(路由节点)

 

二、定义条件边

 1 public class RoutingEdgeAction implements EdgeAction<AgentState> {
 2 
 3     private static final String KEY_NEXT_NODE = "nextNode";
 4 
 5     private final Set<String> allowedNodes;
 6     private final String defaultNode;
 7 
 8     public RoutingEdgeAction(Set<String> allowedNodes, String defaultNode) {
 9         this.allowedNodes = Set.copyOf(allowedNodes);
10         if (!this.allowedNodes.contains(defaultNode)) {
11             throw new IllegalArgumentException("defaultNode must be in allowedNodes: " + defaultNode);
12         }
13         this.defaultNode = defaultNode;
14     }
15 
16     @Override
17     public String apply(AgentState state) throws Exception {
18         //根据上1个节点的状态值,执行路由
19         System.out.println("current Edge: routing edge");
20         String next = resolveNextNode(state);
21         if (allowedNodes.contains(next)) {
22             return next;
23         }
24         return defaultNode;
25     }
26 
27     private String resolveNextNode(AgentState state) {
28         Optional<Object> nextOpt = state.value(KEY_NEXT_NODE);
29         if (nextOpt.isEmpty()) {
30             return defaultNode;
31         }
32         Object v = nextOpt.get();
33         return v.toString();
34     }
35 }
条件边

 

三、完整示例

 1 public class ConditionalGraphApplication {
 2 
 3     private static final Set<String> CONDITIONAL_TARGETS = Set.of("2", "3");
 4     private static final String DEFAULT_TARGET = "2";
 5 
 6     public static void main(String[] args) throws GraphStateException {
 7         StateGraph<AgentState> conditionalGraph = getConditionalGraph();
 8 
 9         System.out.println(conditionalGraph.getGraph(GraphRepresentation.Type.MERMAID, "conditional Graph", true).content());
10 
11         try {
12             conditionalGraph.compile()
13                     .invoke(Map.of("test", "test-init-value"))
14                     .ifPresent(c -> System.out.println(c.data()));
15         } catch (GraphStateException e) {
16             System.err.println("Graph execution failed: " + e.getMessage());
17             throw e;
18         } catch (Exception e) {
19             System.err.println("Unexpected error: " + e.getMessage());
20             throw new RuntimeException(e);
21         }
22     }
23 
24     public static StateGraph<AgentState> getConditionalGraph() throws GraphStateException {
25         return new StateGraph<>(AgentState::new)
26                 .addNode("node-1", node_async(new Node1Action()))
27                 .addNode("node-2", node_async(new Node2Action()))
28                 .addNode("node-3", node_async(new Node3Action()))
29                 .addEdge(START, "node-1")
30                 .addConditionalEdges("node-1",
31                         edge_async(new RoutingEdgeAction(CONDITIONAL_TARGETS, DEFAULT_TARGET)),
32                         // 如果返回2,则跳到node-2,如果返回3,则跳到node-3
33                         Map.of("2", "node-2",
34                                 "3", "node-3"))
35                 .addEdge("node-2", GraphDefinition.END)
36                 .addEdge("node-3", GraphDefinition.END);
37     }
38 }
View Code

 

四、运行结果

1 current Node: node-1
2 current Edge: routing edge
3 current Node: node-3
4 {node1Key=node1-value, test=test-init-value, nextNode=3, node3Key=node3-value, myData=node3-my-value}

 

示例代码:https://github.com/yjmyzz/langgraph4j-study/tree/main/src/main/java/org/bsc/langgraph4j/agent/_06_conditional

http://www.jsqmd.com/news/424140/

相关文章:

  • 2026年选购指南:主流摩擦系数仪厂家综合对比,摩擦系数仪/检测仪/试验机/分析仪/测试仪/测量仪,摩擦系数仪工厂选哪家 - 品牌推荐师
  • 聊聊江西初中毕业选院校的经验,江西新华电脑学院口碑怎么样? - 工业品牌热点
  • 2026年市面上优秀的自立袋销售厂家推荐,中封袋/四边封包装袋/八边封包装袋/三边封包装袋,自立袋生产商排行榜 - 品牌推荐师
  • 三菱FX5U伺服机器人程序开发指南
  • 2026年市场口碑佳的ISO认证公司TOP榜,助力企业品质提升,知识产权认证/3C认证,ISO认证公司哪家好 - 品牌推荐师
  • 分析江苏数控折弯机质量可靠的厂家排名,有哪些上榜? - 工业推荐榜
  • 论云原生架构在高并发系统中的设计与实践
  • 2026年全国上诉律师服务费用大汇总,专业上诉律师哪家权威怎么选 - 工业品网
  • YOLOv13涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇 | 引入 LFSB 差分双维注意融合模块,通过交替特征融合与分离策略,能够精准区分目标特征,顶会助力YOLOv13有效涨点
  • free AI Music Generator All In One
  • 国产化编辑器怎样兼容Word复杂格式导入?
  • 讲讲泰艺包装有实力吗,在深圳地区口碑怎么样 - 工业品牌热点
  • CO-STAR提示词模板深度解析:从冠军框架到实战应用
  • 2026年广州热门除甲醛产品年度排名靠谱的品牌口碑佳 - mypinpai
  • 日本数学教育家“dy/dx不是分数”谬论使学生不能正确认识导数概念
  • 别再瞎找了!降AIGC软件 千笔·降AIGC助手 VS 学术猹,本科生专属神器!
  • Rust开发必备:深入解析标准库与第三方Derive宏的核心差异与应用实践
  • 农业系统如何集成Word文档样式解析组件?
  • 2026年水泵选购指南:热门型号与性能排名解析,酸碱中和实验室污水设备/大通量滤芯,水泵生产商排名 - 品牌推荐师
  • 导师推荐 9个降AI率软件降AIGC网站:本科生降AI率必备工具深度测评
  • 国防项目富文本工具支持Word截图粘贴吗?
  • 赶deadline必备! 10个AI论文工具测评:专科生毕业论文写作神器推荐
  • 学校官网编辑器需要哪些Word格式保留功能?
  • 金融行业文件系统如何用WebUploader+PHP加密传输大额报表的分片数据?
  • 工程建筑行业如何通过WebUploader+PHP实现BIM模型文件的分片传输?
  • 少走弯路:10个AI论文平台深度测评,本科生毕业论文写作必备工具推荐
  • 2026更新版!一键生成论文工具,专科生专属,千笔AI VS 知文AI
  • docker安装rabbitmq一些命令
  • 方法的调用
  • 分析昆明信誉好的软装设计品牌企业,推荐靠谱的给我 - mypinpai