-
让我们来一起来开发Agent系列一(构建你的第一个AI Agent工作流)
- 网站名称:让我们来一起来开发Agent系列一(构建你的第一个AI Agent工作流)
- 网站分类:技术文章
- 收录时间:2025-10-01 20:02
- 网站地址:
“让我们来一起来开发Agent系列一(构建你的第一个AI Agent工作流)” 网站介绍
上一篇文章我们了解了,Agent的开发的12个原则,接下来我们来尝试开发Agent,考虑Agent开发是一个长期的过程,我们将做一系列的文章,想学习Agent开发的同学,可以关注下,方便看到后续更新。这篇文章,我们将用一个Java类,来引导朋友们Agent开发入门。看过我之前文章的朋友应该知道,之前介绍过很多关于langgraph4j的文章,引导大家入门我们就使用langgraph4j。
LangGraph4j入门系列(一):构建你的第一个AI Agent工作流
在AI Agent开发日益火热的今天,构建复杂的工作流变得越来越重要。本系列将带你逐步掌握使用LangGraph4j构建AI Agent的技能,从基础概念到高级应用,让你能够轻松构建自己的智能工作流系统。
什么是LangGraph4j?
LangGraph4j是一个受LangGraph启发的Java库,用于构建基于状态机的AI Agent工作流。它提供了强大的状态管理、节点编排和条件路由功能,是构建复杂AI应用的理想选择。
系列目标
本系列旨在通过实际代码示例,帮助开发者:
- 理解AI Agent工作流的基本概念
- 掌握LangGraph4j的核心组件使用
- 构建可扩展的AI Agent应用
- 实现复杂的状态管理和节点协调
第一篇:Hello World - 构建第一个LangGraph4j应用
在本篇中,我们将创建一个简单的问候工作流,包含三个节点:问候、处理和结束。通过这个例子,你将了解LangGraph4j的基本使用方法。
完整代码示例
package 你自己的包名;
import org.bsc.async.AsyncGenerator;
import org.bsc.langgraph4j.CompiledGraph;
import org.bsc.langgraph4j.NodeOutput;
import org.bsc.langgraph4j.StateGraph;
import org.bsc.langgraph4j.state.AgentState;
import org.bsc.langgraph4j.state.Channel;
import org.bsc.langgraph4j.state.Channels;
import java.io.Serializable;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import static org.bsc.langgraph4j.StateGraph.END;
/**
* LangGraph4j 入门教学示例
*
* 本示例演示了如何使用 LangGraph4j 创建一个简单的工作流:
* 1. 定义状态类和状态模式
* 2. 创建工作流节点
* 3. 定义节点之间的执行顺序
* 4. 编译并运行工作流
*
* @author 教学示例
*/
public class HelloLangGraph4j {
/**
* 自定义状态类 - 继承自 AgentState
*
* 状态类用于在工作流的各个节点之间传递和共享数据
*/
public static class AgentHelloState extends AgentState implements Serializable {
// ========== 状态字段定义 ==========
/** 消息列表字段名 */
public static final String MESSAGE = "message";
/** 步骤计数字段名 */
public static final String STEPS_KEY = "step";
/**
* 状态模式定义 - 定义每个字段的数据类型和更新方式
*
* Channel 类型说明:
* - Channels.appender(): 追加模式,新值会添加到列表中
* - Channels.base(): 替换模式,新值会替换旧值
*/
public static final Map<String, Channel<?>> SCHEMA = Map.of(
MESSAGE, Channels.appender(ArrayList::new), // 消息列表,支持追加
STEPS_KEY, Channels.base(() -> 0) // 步骤计数,支持替换
);
// ========== 构造函数 ==========
/**
* 构造函数 - 初始化状态
* @param initData 初始数据
*/
public AgentHelloState(Map<String, Object> initData) {
super(initData);
// 确保必要字段有默认值
if (!initData.containsKey(MESSAGE)) {
this.value(MESSAGE, List.of());
}
if (!initData.containsKey(STEPS_KEY)) {
this.value(STEPS_KEY, 0);
}
}
// ========== 便捷方法 ==========
/**
* 获取消息列表
* @return 消息列表
*/
public List<String> getMessage() {
return this.<List<String>>value(MESSAGE).orElse(new ArrayList<>());
}
/**
* 设置步骤数
* @param steps 步骤数
*/
public void setStep(int steps) {
this.value(STEPS_KEY, steps);
}
/**
* 获取当前步骤数
* @return 当前步骤数
*/
public int getStep() {
return this.<Integer>value(STEPS_KEY).orElse(0);
}
}
/**
* 主函数 - 演示 LangGraph4j 的基本用法
*/
public static void main(String[] args) throws Exception {
System.out.println(" 欢迎使用 LangGraph4j 教学示例!");
System.out.println("本示例将演示一个包含三个节点的简单工作流\n");
// ========== 1. 创建状态图 ==========
StateGraph<AgentHelloState> workflow = new StateGraph<>(
AgentHelloState.SCHEMA, // 状态模式
AgentHelloState::new // 状态构造函数
);
// ========== 2. 添加工作流节点 ==========
// 节点1:问候节点
workflow.addNode("greet", (state) -> {
System.out.println(" 执行问候节点...");
int currentStep = state.getStep() + 1;
System.out.println(" 当前步骤: " + currentStep);
// 返回状态更新 - 这是 LangGraph4j 中更新状态的标准方式
Map<String, Object> updates = new HashMap<>();
updates.put(AgentHelloState.MESSAGE, "Hello, LangGraph4j!");
updates.put(AgentHelloState.STEPS_KEY, currentStep);
return CompletableFuture.completedFuture(updates);
});
// 节点2:处理节点
workflow.addNode("process", (state) -> {
System.out.println(" 执行处理节点...");
int currentStep = state.getStep() + 1;
System.out.println(" 当前步骤: " + currentStep);
Map<String, Object> updates = new HashMap<>();
updates.put(AgentHelloState.MESSAGE, "这是一个轻量级的AI工作流框架!");
updates.put(AgentHelloState.STEPS_KEY, currentStep);
return CompletableFuture.completedFuture(updates);
});
// 节点3:结束节点
workflow.addNode("finish", (state) -> {
System.out.println(" 执行结束节点...");
int currentStep = state.getStep() + 1;
System.out.println(" 当前步骤: " + currentStep);
Map<String, Object> updates = new HashMap<>();
updates.put(AgentHelloState.MESSAGE, " 工作流执行完成!");
updates.put(AgentHelloState.STEPS_KEY, currentStep);
return CompletableFuture.completedFuture(updates);
});
// ========== 3. 定义节点执行顺序 ==========
workflow.addEdge(StateGraph.START, "greet"); // 开始 -> 问候节点
workflow.addEdge("greet", "process"); // 问候节点 -> 处理节点
workflow.addEdge("process", "finish"); // 处理节点 -> 结束节点
workflow.addEdge("finish", END); // 结束节点 -> 结束
// ========== 4. 编译工作流 ==========
CompiledGraph<AgentHelloState> app = workflow.compile();
// ========== 5. 准备初始状态 ==========
Map<String, Object> initialStateMap = Map.of(
AgentHelloState.MESSAGE, "初始消息",
AgentHelloState.STEPS_KEY, 0
);
// ========== 6. 执行工作流 ==========
System.out.println("开始执行工作流...\n");
AsyncGenerator<NodeOutput<AgentHelloState>> stream = app.stream(initialStateMap);
stream.forEach(nodeOutput -> {
System.out.println("节点输出: " + nodeOutput.node());
System.out.println("状态更新: " + nodeOutput.state());
System.out.println("---");
});
System.out.println("\n 恭喜!你已经成功运行了 LangGraph4j 教学示例!");
System.out.println("\n 学习要点总结:");
System.out.println("1. 状态类继承 AgentState 并定义 SCHEMA");
System.out.println("2. 使用 StateGraph 创建工作流");
System.out.println("3. 通过 addNode() 添加节点逻辑");
System.out.println("4. 通过 addEdge() 定义执行顺序");
System.out.println("5. 编译后使用 stream() 执行工作流");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>huiwsper</artifactId>
<groupId>com.hntec</groupId>
<version>1.0.16-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>huiwsper-test</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<langgraph4j.version>1.6.1</langgraph4j.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bsc.langgraph4j</groupId>
<artifactId>langgraph4j-bom</artifactId>
<version>${langgraph4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.bsc.langgraph4j</groupId>
<artifactId>langgraph4j-core</artifactId>
</dependency>
<!-- Add other langgraph4j modules if needed, e.g., langgraph4j-langchain4j -->
</dependencies>
</project>
这个是上述pom文件,我本身工程Springboot 工程,父工程不方便展示。如有问题,有兴趣的朋友可以私下关注我找我沟通。
核心概念解析
1. 状态定义
在LangGraph4j中,状态是工作流的核心。我们通过继承 AgentState 来定义自己的状态类 AgentHelloState,并在其中定义状态字段和模式:
- MESSAGE 字段使用 Channels.appender() 模式,表示消息会被追加到列表中
- STEPS_KEY 字段使用 Channels.base() 模式,表示值会被直接替换
2. 节点创建
通过 addNode() 方法添加工作流节点,每个节点都是一个函数,接收当前状态并返回更新后的状态:
workflow.addNode("greet", (state) -> {
// 节点逻辑
Map<String, Object> updates = new HashMap<>();
// 添加状态更新
return CompletableFuture.completedFuture(updates);
});
3. 边定义
使用 addEdge() 方法定义节点之间的执行顺序,构建工作流的执行路径:
workflow.addEdge(StateGraph.START, "greet"); // 开始节点
workflow.addEdge("greet", "process");
workflow.addEdge("process", "finish");
workflow.addEdge("finish", END); // 结束节点
运行结果
执行该程序将输出类似以下内容:
/Library/jdk-17.0.12.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=54504:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/anhui/code/huiwsper/huiwsper/huiwsper-test/target/classes:/Users/anhui/java/repository/org/bsc/langgraph4j/langgraph4j-core/1.6.1/langgraph4j-core-1.6.1.jar:/Users/anhui/java/repository/org/bsc/async/async-generator/3.2.2/async-generator-3.2.2.jar:/Users/anhui/java/repository/org/slf4j/slf4j-api/2.0.16/slf4j-api-2.0.16.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-starter-netflix-eureka-client/4.1.3/spring-cloud-starter-netflix-eureka-client-4.1.3.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-starter/4.1.4/spring-cloud-starter-4.1.4.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-context/4.1.4/spring-cloud-context-4.1.4.jar:/Users/anhui/java/repository/org/springframework/security/spring-security-crypto/6.3.4/spring-security-crypto-6.3.4.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-commons/4.1.4/spring-cloud-commons-4.1.4.jar:/Users/anhui/java/repository/org/springframework/security/spring-security-rsa/1.1.3/spring-security-rsa-1.1.3.jar:/Users/anhui/java/repository/org/bouncycastle/bcprov-jdk18on/1.78/bcprov-jdk18on-1.78.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-netflix-eureka-client/4.1.3/spring-cloud-netflix-eureka-client-4.1.3.jar:/Users/anhui/java/repository/org/apache/httpcomponents/client5/httpclient5/5.3.1/httpclient5-5.3.1.jar:/Users/anhui/java/repository/org/apache/httpcomponents/core5/httpcore5/5.2.5/httpcore5-5.2.5.jar:/Users/anhui/java/repository/org/apache/httpcomponents/core5/httpcore5-h2/5.2.5/httpcore5-h2-5.2.5.jar:/Users/anhui/java/repository/com/netflix/eureka/eureka-client/2.0.3/eureka-client-2.0.3.jar:/Users/anhui/java/repository/com/thoughtworks/xstream/xstream/1.4.20/xstream-1.4.20.jar:/Users/anhui/java/repository/io/github/x-stream/mxparser/1.2.2/mxparser-1.2.2.jar:/Users/anhui/java/repository/xmlpull/xmlpull/1.1.3.1/xmlpull-1.1.3.1.jar:/Users/anhui/java/repository/jakarta/ws/rs/jakarta.ws.rs-api/3.1.0/jakarta.ws.rs-api-3.1.0.jar:/Users/anhui/java/repository/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar:/Users/anhui/java/repository/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar:/Users/anhui/java/repository/com/netflix/spectator/spectator-api/1.7.3/spectator-api-1.7.3.jar:/Users/anhui/java/repository/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar:/Users/anhui/java/repository/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar:/Users/anhui/java/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar:/Users/anhui/java/repository/commons-configuration/commons-configuration/1.10/commons-configuration-1.10.jar:/Users/anhui/java/repository/commons-lang/commons-lang/2.6/commons-lang-2.6.jar:/Users/anhui/java/repository/com/fasterxml/jackson/core/jackson-annotations/2.17.2/jackson-annotations-2.17.2.jar:/Users/anhui/java/repository/com/fasterxml/jackson/core/jackson-core/2.17.2/jackson-core-2.17.2.jar:/Users/anhui/java/repository/com/netflix/netflix-commons/netflix-eventbus/0.3.0/netflix-eventbus-0.3.0.jar:/Users/anhui/java/repository/com/netflix/netflix-commons/netflix-infix/0.3.0/netflix-infix-0.3.0.jar:/Users/anhui/java/repository/commons-jxpath/commons-jxpath/1.3/commons-jxpath-1.3.jar:/Users/anhui/java/repository/joda-time/joda-time/2.3/joda-time-2.3.jar:/Users/anhui/java/repository/org/antlr/antlr-runtime/3.4/antlr-runtime-3.4.jar:/Users/anhui/java/repository/org/antlr/stringtemplate/3.2.1/stringtemplate-3.2.1.jar:/Users/anhui/java/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/Users/anhui/java/repository/com/netflix/servo/servo-core/0.5.3/servo-core-0.5.3.jar:/Users/anhui/java/repository/org/apache/commons/commons-math/2.2/commons-math-2.2.jar:/Users/anhui/java/repository/javax/annotation/javax.annotation-api/1.2/javax.annotation-api-1.2.jar:/Users/anhui/java/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar:/Users/anhui/java/repository/com/netflix/eureka/eureka-core/2.0.3/eureka-core-2.0.3.jar:/Users/anhui/java/repository/com/fasterxml/woodstox/woodstox-core/6.2.1/woodstox-core-6.2.1.jar:/Users/anhui/java/repository/org/codehaus/woodstox/stax2-api/4.2.1/stax2-api-4.2.1.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-starter-loadbalancer/4.1.4/spring-cloud-starter-loadbalancer-4.1.4.jar:/Users/anhui/java/repository/org/springframework/cloud/spring-cloud-loadbalancer/4.1.4/spring-cloud-loadbalancer-4.1.4.jar:/Users/anhui/java/repository/io/projectreactor/addons/reactor-extra/3.5.2/reactor-extra-3.5.2.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-cache/3.3.5/spring-boot-starter-cache-3.3.5.jar:/Users/anhui/java/repository/com/stoyanr/evictor/1.0.0/evictor-1.0.0.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-web/3.3.5/spring-boot-starter-web-3.3.5.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter/3.3.5/spring-boot-starter-3.3.5.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot/3.3.5/spring-boot-3.3.5.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-logging/3.3.5/spring-boot-starter-logging-3.3.5.jar:/Users/anhui/java/repository/ch/qos/logback/logback-classic/1.5.11/logback-classic-1.5.11.jar:/Users/anhui/java/repository/ch/qos/logback/logback-core/1.5.11/logback-core-1.5.11.jar:/Users/anhui/java/repository/org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar:/Users/anhui/java/repository/org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar:/Users/anhui/java/repository/org/slf4j/jul-to-slf4j/2.0.16/jul-to-slf4j-2.0.16.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-json/3.3.5/spring-boot-starter-json-3.3.5.jar:/Users/anhui/java/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.2/jackson-datatype-jdk8-2.17.2.jar:/Users/anhui/java/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.2/jackson-datatype-jsr310-2.17.2.jar:/Users/anhui/java/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.2/jackson-module-parameter-names-2.17.2.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-tomcat/3.3.5/spring-boot-starter-tomcat-3.3.5.jar:/Users/anhui/java/repository/org/apache/tomcat/embed/tomcat-embed-core/10.1.31/tomcat-embed-core-10.1.31.jar:/Users/anhui/java/repository/org/apache/tomcat/embed/tomcat-embed-el/10.1.31/tomcat-embed-el-10.1.31.jar:/Users/anhui/java/repository/org/apache/tomcat/embed/tomcat-embed-websocket/10.1.31/tomcat-embed-websocket-10.1.31.jar:/Users/anhui/java/repository/org/springframework/spring-web/6.1.14/spring-web-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-beans/6.1.14/spring-beans-6.1.14.jar:/Users/anhui/java/repository/io/micrometer/micrometer-observation/1.13.6/micrometer-observation-1.13.6.jar:/Users/anhui/java/repository/io/micrometer/micrometer-commons/1.13.6/micrometer-commons-1.13.6.jar:/Users/anhui/java/repository/org/springframework/spring-webmvc/6.1.14/spring-webmvc-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-context/6.1.14/spring-context-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-expression/6.1.14/spring-expression-6.1.14.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-configuration-processor/3.3.5/spring-boot-configuration-processor-3.3.5.jar:/Users/anhui/java/repository/org/apache/skywalking/apm-toolkit-trace/8.7.0/apm-toolkit-trace-8.7.0.jar:/Users/anhui/java/repository/org/apache/skywalking/apm-toolkit-logback-1.x/8.7.0/apm-toolkit-logback-1.x-8.7.0.jar:/Users/anhui/java/repository/com/ctrip/framework/apollo/apollo-client/2.3.0/apollo-client-2.3.0.jar:/Users/anhui/java/repository/com/ctrip/framework/apollo/apollo-core/2.3.0/apollo-core-2.3.0.jar:/Users/anhui/java/repository/com/google/inject/guice/5.0.1/guice-5.0.1.jar:/Users/anhui/java/repository/javax/inject/javax.inject/1/javax.inject-1.jar:/Users/anhui/java/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/Users/anhui/java/repository/org/yaml/snakeyaml/2.2/snakeyaml-2.2.jar:/Users/anhui/java/repository/io/swagger/core/v3/swagger-annotations/2.2.25/swagger-annotations-2.2.25.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-aop/3.3.5/spring-boot-starter-aop-3.3.5.jar:/Users/anhui/java/repository/org/springframework/spring-aop/6.1.14/spring-aop-6.1.14.jar:/Users/anhui/java/repository/org/aspectj/aspectjweaver/1.9.22.1/aspectjweaver-1.9.22.1.jar:/Users/anhui/java/repository/com/alibaba/druid-spring-boot-starter/1.2.23/druid-spring-boot-starter-1.2.23.jar:/Users/anhui/java/repository/com/alibaba/druid/1.2.23/druid-1.2.23.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-autoconfigure/3.3.5/spring-boot-autoconfigure-3.3.5.jar:/Users/anhui/java/repository/org/glassfish/jaxb/jaxb-runtime/4.0.5/jaxb-runtime-4.0.5.jar:/Users/anhui/java/repository/org/glassfish/jaxb/jaxb-core/4.0.5/jaxb-core-4.0.5.jar:/Users/anhui/java/repository/org/eclipse/angus/angus-activation/2.0.2/angus-activation-2.0.2.jar:/Users/anhui/java/repository/org/glassfish/jaxb/txw2/4.0.5/txw2-4.0.5.jar:/Users/anhui/java/repository/com/sun/istack/istack-commons-runtime/4.1.2/istack-commons-runtime-4.1.2.jar:/Users/anhui/java/repository/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar:/Users/anhui/java/repository/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar:/Users/anhui/java/repository/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar:/Users/anhui/java/repository/jakarta/xml/bind/jakarta.xml.bind-api/4.0.2/jakarta.xml.bind-api-4.0.2.jar:/Users/anhui/java/repository/jakarta/activation/jakarta.activation-api/2.1.3/jakarta.activation-api-2.1.3.jar:/Users/anhui/java/repository/net/bytebuddy/byte-buddy/1.14.19/byte-buddy-1.14.19.jar:/Users/anhui/java/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar:/Users/anhui/java/repository/org/springframework/spring-core/6.1.14/spring-core-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-jcl/6.1.14/spring-jcl-6.1.14.jar:/Users/anhui/java/repository/com/ebank/pay/common/epay-common-bean/0.0.8-SNAPSHOT/epay-common-bean-0.0.8-SNAPSHOT.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-spring-boot-starter/2.0.9/knife4j-spring-boot-starter-2.0.9.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-spring-boot-autoconfigure/2.0.9/knife4j-spring-boot-autoconfigure-2.0.9.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-spring/2.0.9/knife4j-spring-2.0.9.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-annotations/2.0.9/knife4j-annotations-2.0.9.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-core/2.0.9/knife4j-core-2.0.9.jar:/Users/anhui/java/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar:/Users/anhui/java/repository/io/swagger/swagger-models/1.5.22/swagger-models-1.5.22.jar:/Users/anhui/java/repository/io/swagger/swagger-annotations/1.5.22/swagger-annotations-1.5.22.jar:/Users/anhui/java/repository/io/springfox/springfox-swagger2/2.10.5/springfox-swagger2-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-spi/2.10.5/springfox-spi-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-core/2.10.5/springfox-core-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-schema/2.10.5/springfox-schema-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-swagger-common/2.10.5/springfox-swagger-common-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-spring-web/2.10.5/springfox-spring-web-2.10.5.jar:/Users/anhui/java/repository/io/github/classgraph/classgraph/4.1.7/classgraph-4.1.7.jar:/Users/anhui/java/repository/org/springframework/plugin/spring-plugin-core/2.0.0.RELEASE/spring-plugin-core-2.0.0.RELEASE.jar:/Users/anhui/java/repository/org/springframework/plugin/spring-plugin-metadata/2.0.0.RELEASE/spring-plugin-metadata-2.0.0.RELEASE.jar:/Users/anhui/java/repository/org/mapstruct/mapstruct/1.3.1.Final/mapstruct-1.3.1.Final.jar:/Users/anhui/java/repository/io/springfox/springfox-bean-validators/2.10.5/springfox-bean-validators-2.10.5.jar:/Users/anhui/java/repository/io/springfox/springfox-spring-webmvc/2.10.5/springfox-spring-webmvc-2.10.5.jar:/Users/anhui/java/repository/com/github/xiaoymin/knife4j-spring-ui/2.0.9/knife4j-spring-ui-2.0.9.jar:/Users/anhui/java/repository/org/hibernate/validator/hibernate-validator/8.0.1.Final/hibernate-validator-8.0.1.Final.jar:/Users/anhui/java/repository/org/jboss/logging/jboss-logging/3.5.3.Final/jboss-logging-3.5.3.Final.jar:/Users/anhui/java/repository/com/fasterxml/classmate/1.7.0/classmate-1.7.0.jar:/Users/anhui/java/repository/cn/hutool/hutool-all/5.8.26/hutool-all-5.8.26.jar:/Users/anhui/java/repository/com/alibaba/fastjson/1.2.83/fastjson-1.2.83.jar:/Users/anhui/java/repository/commons-net/commons-net/3.8.0/commons-net-3.8.0.jar:/Users/anhui/java/repository/com/jcraft/jsch/0.1.55/jsch-0.1.55.jar:/Users/anhui/java/repository/io/netty/netty-all/4.1.114.Final/netty-all-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-buffer/4.1.114.Final/netty-buffer-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec/4.1.114.Final/netty-codec-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-dns/4.1.114.Final/netty-codec-dns-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-haproxy/4.1.114.Final/netty-codec-haproxy-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-http/4.1.114.Final/netty-codec-http-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-http2/4.1.114.Final/netty-codec-http2-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-memcache/4.1.114.Final/netty-codec-memcache-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-mqtt/4.1.114.Final/netty-codec-mqtt-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-redis/4.1.114.Final/netty-codec-redis-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-smtp/4.1.114.Final/netty-codec-smtp-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-socks/4.1.114.Final/netty-codec-socks-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-stomp/4.1.114.Final/netty-codec-stomp-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-codec-xml/4.1.114.Final/netty-codec-xml-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-common/4.1.114.Final/netty-common-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-handler/4.1.114.Final/netty-handler-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-unix-common/4.1.114.Final/netty-transport-native-unix-common-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-handler-proxy/4.1.114.Final/netty-handler-proxy-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-handler-ssl-ocsp/4.1.114.Final/netty-handler-ssl-ocsp-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-resolver/4.1.114.Final/netty-resolver-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-resolver-dns/4.1.114.Final/netty-resolver-dns-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport/4.1.114.Final/netty-transport-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-rxtx/4.1.114.Final/netty-transport-rxtx-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-sctp/4.1.114.Final/netty-transport-sctp-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-udt/4.1.114.Final/netty-transport-udt-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-classes-epoll/4.1.114.Final/netty-transport-classes-epoll-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-classes-kqueue/4.1.114.Final/netty-transport-classes-kqueue-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-resolver-dns-classes-macos/4.1.114.Final/netty-resolver-dns-classes-macos-4.1.114.Final.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-x86_64.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-aarch_64.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-riscv64.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-kqueue/4.1.114.Final/netty-transport-native-kqueue-4.1.114.Final-osx-x86_64.jar:/Users/anhui/java/repository/io/netty/netty-transport-native-kqueue/4.1.114.Final/netty-transport-native-kqueue-4.1.114.Final-osx-aarch_64.jar:/Users/anhui/java/repository/io/netty/netty-resolver-dns-native-macos/4.1.114.Final/netty-resolver-dns-native-macos-4.1.114.Final-osx-x86_64.jar:/Users/anhui/java/repository/io/netty/netty-resolver-dns-native-macos/4.1.114.Final/netty-resolver-dns-native-macos-4.1.114.Final-osx-aarch_64.jar:/Users/anhui/java/repository/jakarta/validation/jakarta.validation-api/3.0.2/jakarta.validation-api-3.0.2.jar:/Users/anhui/java/repository/org/hibernate/hibernate-validator/5.4.1.Final/hibernate-validator-5.4.1.Final.jar:/Users/anhui/java/repository/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final.jar:/Users/anhui/java/repository/org/bouncycastle/bcprov-jdk15to18/1.69/bcprov-jdk15to18-1.69.jar:/Users/anhui/java/repository/com/ebank/pay/common/epay-common-helper/0.0.8-SNAPSHOT/epay-common-helper-0.0.8-SNAPSHOT.jar:/Users/anhui/java/repository/io/github/openfeign/feign-core/13.3/feign-core-13.3.jar:/Users/anhui/java/repository/com/google/guava/guava/29.0-jre/guava-29.0-jre.jar:/Users/anhui/java/repository/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar:/Users/anhui/java/repository/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/Users/anhui/java/repository/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar:/Users/anhui/java/repository/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1.jar:/Users/anhui/java/repository/com/google/errorprone/error_prone_annotations/2.3.4/error_prone_annotations-2.3.4.jar:/Users/anhui/java/repository/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar:/Users/anhui/java/repository/com/ebank/pay/common/epay-common-utils/0.0.8-SNAPSHOT/epay-common-utils-0.0.8-20250701.143626-1.jar:/Users/anhui/java/repository/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar:/Users/anhui/java/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar:/Users/anhui/java/repository/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar:/Users/anhui/java/repository/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar:/Users/anhui/java/repository/io/jsonwebtoken/jjwt/0.9.1/jjwt-0.9.1.jar:/Users/anhui/java/repository/org/jasypt/jasypt/1.9.3/jasypt-1.9.3.jar:/Users/anhui/java/repository/com/ebank/pay/common/epay-common-config/0.0.8-SNAPSHOT/epay-common-config-0.0.8-SNAPSHOT.jar:/Users/anhui/java/repository/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar:/Users/anhui/java/repository/com/fasterxml/jackson/core/jackson-databind/2.17.2/jackson-databind-2.17.2.jar:/Users/anhui/java/repository/org/redisson/redisson-spring-boot-starter/3.37.0/redisson-spring-boot-starter-3.37.0.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-actuator/3.3.5/spring-boot-starter-actuator-3.3.5.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.5/spring-boot-actuator-autoconfigure-3.3.5.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-actuator/3.3.5/spring-boot-actuator-3.3.5.jar:/Users/anhui/java/repository/io/micrometer/micrometer-jakarta9/1.13.6/micrometer-jakarta9-1.13.6.jar:/Users/anhui/java/repository/io/micrometer/micrometer-core/1.13.6/micrometer-core-1.13.6.jar:/Users/anhui/java/repository/org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar:/Users/anhui/java/repository/org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar:/Users/anhui/java/repository/org/redisson/redisson/3.37.0/redisson-3.37.0.jar:/Users/anhui/java/repository/javax/cache/cache-api/1.1.1/cache-api-1.1.1.jar:/Users/anhui/java/repository/io/projectreactor/reactor-core/3.6.11/reactor-core-3.6.11.jar:/Users/anhui/java/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar:/Users/anhui/java/repository/io/reactivex/rxjava3/rxjava/3.1.9/rxjava-3.1.9.jar:/Users/anhui/java/repository/com/esotericsoftware/kryo/5.6.0/kryo-5.6.0.jar:/Users/anhui/java/repository/com/esotericsoftware/reflectasm/1.11.9/reflectasm-1.11.9.jar:/Users/anhui/java/repository/com/esotericsoftware/minlog/1.3.1/minlog-1.3.1.jar:/Users/anhui/java/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.17.2/jackson-dataformat-yaml-2.17.2.jar:/Users/anhui/java/repository/org/jodd/jodd-util/6.2.2/jodd-util-6.2.2.jar:/Users/anhui/java/repository/org/redisson/redisson-spring-data-33/3.37.0/redisson-spring-data-33-3.37.0.jar:/Users/anhui/java/repository/com/github/dozermapper/dozer-spring-boot-starter/7.0.0/dozer-spring-boot-starter-7.0.0.jar:/Users/anhui/java/repository/com/github/dozermapper/dozer-core/7.0.0/dozer-core-7.0.0.jar:/Users/anhui/java/repository/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar:/Users/anhui/java/repository/org/glassfish/jaxb/jaxb-xjc/4.0.5/jaxb-xjc-4.0.5.jar:/Users/anhui/java/repository/org/glassfish/jaxb/xsom/4.0.5/xsom-4.0.5.jar:/Users/anhui/java/repository/com/sun/xml/bind/external/relaxng-datatype/4.0.5/relaxng-datatype-4.0.5.jar:/Users/anhui/java/repository/org/glassfish/jaxb/codemodel/4.0.5/codemodel-4.0.5.jar:/Users/anhui/java/repository/com/sun/xml/bind/external/rngom/4.0.5/rngom-4.0.5.jar:/Users/anhui/java/repository/com/sun/xml/dtd-parser/dtd-parser/1.5.1/dtd-parser-1.5.1.jar:/Users/anhui/java/repository/com/sun/istack/istack-commons-tools/4.1.2/istack-commons-tools-4.1.2.jar:/Users/anhui/java/repository/org/slf4j/jcl-over-slf4j/2.0.16/jcl-over-slf4j-2.0.16.jar:/Users/anhui/java/repository/com/github/dozermapper/dozer-spring4/7.0.0/dozer-spring4-7.0.0.jar:/Users/anhui/java/repository/com/github/dozermapper/dozer-spring-boot-autoconfigure/7.0.0/dozer-spring-boot-autoconfigure-7.0.0.jar:/Users/anhui/java/repository/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar:/Users/anhui/java/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/Users/anhui/java/repository/com/sun/xml/bind/jaxb-impl/2.3.1/jaxb-impl-2.3.1.jar:/Users/anhui/java/repository/cn/dev33/sa-token-spring-boot3-starter/1.34.0/sa-token-spring-boot3-starter-1.34.0.jar:/Users/anhui/java/repository/cn/dev33/sa-token-jakarta-servlet/1.34.0/sa-token-jakarta-servlet-1.34.0.jar:/Users/anhui/java/repository/jakarta/servlet/jakarta.servlet-api/6.0.0/jakarta.servlet-api-6.0.0.jar:/Users/anhui/java/repository/cn/dev33/sa-token-spring-boot-autoconfig/1.34.0/sa-token-spring-boot-autoconfig-1.34.0.jar:/Users/anhui/java/repository/cn/dev33/sa-token-dao-redis-jackson/1.34.0/sa-token-dao-redis-jackson-1.34.0.jar:/Users/anhui/java/repository/cn/dev33/sa-token-core/1.34.0/sa-token-core-1.34.0.jar:/Users/anhui/java/repository/cloud/tianai/captcha/tianai-captcha-springboot-starter/1.5.1/tianai-captcha-springboot-starter-1.5.1.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-autoconfigure-processor/3.3.5/spring-boot-autoconfigure-processor-3.3.5.jar:/Users/anhui/java/repository/cloud/tianai/captcha/tianai-captcha/1.5.1/tianai-captcha-1.5.1.jar:/Users/anhui/java/repository/org/springframework/boot/spring-boot-starter-data-redis/3.3.5/spring-boot-starter-data-redis-3.3.5.jar:/Users/anhui/java/repository/io/lettuce/lettuce-core/6.3.2.RELEASE/lettuce-core-6.3.2.RELEASE.jar:/Users/anhui/java/repository/org/springframework/data/spring-data-redis/3.3.5/spring-data-redis-3.3.5.jar:/Users/anhui/java/repository/org/springframework/data/spring-data-keyvalue/3.3.5/spring-data-keyvalue-3.3.5.jar:/Users/anhui/java/repository/org/springframework/data/spring-data-commons/3.3.5/spring-data-commons-3.3.5.jar:/Users/anhui/java/repository/org/springframework/spring-tx/6.1.14/spring-tx-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-oxm/6.1.14/spring-oxm-6.1.14.jar:/Users/anhui/java/repository/org/springframework/spring-context-support/6.1.14/spring-context-support-6.1.14.jar:/Users/anhui/java/repository/org/duckdb/duckdb_jdbc/1.3.2.0/duckdb_jdbc-1.3.2.0.jar com.hntec.huiwsper.test.HelloLangGraph4j
欢迎使用 LangGraph4j 教学示例!
本示例将演示一个包含三个节点的简单工作流
开始执行工作流...
执行问候节点...
当前步骤: 1
节点输出: __START__
状态更新: {
message=[
初始消息
]
step=0
}
---
执行处理节点...
当前步骤: 2
节点输出: greet
状态更新: {
message=[
初始消息
Hello, LangGraph4j!
]
step=1
}
---
执行结束节点...
当前步骤: 3
节点输出: process
状态更新: {
message=[
初始消息
Hello, LangGraph4j!
这是一个轻量级的AI工作流框架!
]
step=2
}
---
节点输出: finish
状态更新: {
message=[
初始消息
Hello, LangGraph4j!
这是一个轻量级的AI工作流框架!
工作流执行完成!
]
step=3
}
---
节点输出: __END__
状态更新: {
message=[
初始消息
Hello, LangGraph4j!
这是一个轻量级的AI工作流框架!
工作流执行完成!
]
step=3
}
---
恭喜!你已经成功运行了 LangGraph4j 教学示例!
学习要点总结:
1. 状态类继承 AgentState 并定义 SCHEMA
2. 使用 StateGraph 创建工作流
3. 通过 addNode() 添加节点逻辑
4. 通过 addEdge() 定义执行顺序
5. 编译后使用 stream() 执行工作流
进程已结束,退出代码0
小结
通过这个简单的例子,我们学习了LangGraph4j的基本使用方法:
- 定义状态类和状态模式
- 创建工作流节点
- 定义节点执行顺序
- 编译并运行工作流
在下一篇文章中,我们将介绍更高级的功能,如FC、条件边和动态路由,让你能够构建更复杂的AI Agent工作流。
更多相关网站
- Python目录规范:呐,这个就叫专业!
- 在线文档预览kkFileView部署及使用指南
- 逐步分解,一文教会你如何用 jenkins+docker 实现主从模式
- 每天一个 Python 库:logging 用法精讲,高效简洁的输出日志
- Python疯狂练习60天——第十四天_疯狂python讲义豆瓣评分
- 开源:NginxWebUI一款图形化管理Nginx配置的工具
- 如何使用Java API操作HDFS系统?_hdfs java api的常见环境准备?
- Gitlab+P3C-PMD(阿里云插件)标准化你团队的代码和提交信息
- 使用 Docker 部署 最新版本Apache Doris3.0:踩坑与解决指南
- NginxWebUI - 图形化的 Nginx 配置管理工具
- Linux服务器终端中文乱码解决_linux 终端显示中文
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- java项目相关知识点整理_java工程项目
- java高级用法之:无所不能的java,本地方法调用实况
- 还用swagger 吗!推荐一种好用的接口文档自动管理方案
- 小技巧!两分钟解决IntelliJ IDEA中文乱码问题
- JavaEE高级开发:Tomcat7优化配置_tomcat9调优
- Java Java命令学习系列(一)——Jps
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- 兔兔工程量计算软件下载 (27)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- segoe ui是什么字体 (27)
- head first java电子版 (32)
- clickhouse中文文档 (28)
- jdk-8u181-linux-x64.tar.gz (32)
- 计算机网络自顶向下pdf (34)
- -dfile.encoding=utf-8 (33)
- jdk1.9下载 (32)