百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文
让我们来一起来开发Agent系列一(构建你的第一个AI Agent工作流)

让我们来一起来开发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的基本使用方法:

  1. 定义状态类和状态模式
  2. 创建工作流节点
  3. 定义节点执行顺序
  4. 编译并运行工作流

在下一篇文章中,我们将介绍更高级的功能,如FC、条件边和动态路由,让你能够构建更复杂的AI Agent工作流。