Spring Ai Alibaba Graph源码解读系列—action

原文链接地址:Spring Ai Alibaba Graph源码解读系列---action

从今天起,我们来系统梳理下Spring Ai Alibaba Graph的源码,会给出各个部分的功能、作用,以及会新增许多Graph的案例,初步会在一个月内完结。因为目前相关代码正在快速迭代中,维护的飞书在线云文档会同步最新的源码解读及案例,让我们持续跟进业界最新技术,Let's Go!

本期先介绍action部分,主要是接收OverAllState、RunnableConfig对节点、边触发相应的动作

  • 如果你初步使用过Graph框架,你会发现我们的节点都是NodeAction的实现类,条件边都是EdgeAction的实现类

action

NodeAction

函数式接口,定义图中节点的基本同步操作

  • apply 方法:接受当前状态,并返回更新的状态映射
java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;

import java.util.Map;

@FunctionalInterface
public interface NodeAction {

    Map<String, Object> apply(OverAllState state) throws Exception;

}

AsyncNodeAction

函数式接口,定义节点的异步操作行为,表示接受状态参数并返回异步结果

|-----------|---------------------------------------------------|
| 方法名称 | 描述 |
| apply | 核心执行方法,接受当前状态,返回包含更新状态的 CompletableFuture |
| nodeasync | 将同步的NodeAction转换为异步版本,通过CompletableFuture包装同步操作结果 |

java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import io.opentelemetry.context.Context;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;

/**
 * Represents an asynchronous node action that operates on an agent state and returns
 * state update.
 *
 */
@FunctionalInterface
public interface AsyncNodeAction extends Function<OverAllState, CompletableFuture<Map<String, Object>>> {

    /**
     * Applies this action to the given agent state.
     * @param state the agent state
     * @return a CompletableFuture representing the result of the action
     */
    CompletableFuture<Map<String, Object>> apply(OverAllState state);

    /**
     * Creates an asynchronous node action from a synchronous node action.
     * @param syncAction the synchronous node action
     * @return an asynchronous node action
     */
    static AsyncNodeAction nodeasync(NodeAction syncAction) {
       return state -> {
          Context context = Context.current();
          CompletableFuture<Map<String, Object>> result = new CompletableFuture<>();
          try {
             result.complete(syncAction.apply(state));
          }
          catch (Exception e) {
             result.completeExceptionally(e);
          }
          return result;
       };
    }

}

NodeActionWithConfig

函数式接口,定义图中节点的基本同步操作,同时携带运行配置信息

  • apply 方法:接受当前状态和运行配置,并返回更新的状态映射
java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.RunnableConfig;

import java.util.Map;

@FunctionalInterface
public interface NodeActionWithConfig {

    Map<String, Object> apply(OverAllState state, RunnableConfig config) throws Exception;

}

AsyncNodeActionWithConfig

函数式接口,用于定义节点的异步操作行为,接受状态和配置参数并返回异步结果

|-----------|-------------------------------------------------------------------------|
| 方法名称 | 描述 |
| apply | 核心执行方法,接受当前状态和运行配置,返回包含更新状态的 CompletableFuture |
| nodeasync | 将同步的NodeActionWithConfig转换为异步版本,通过CompletableFuture包装同步操作结果 |
| of | 将简单的AsyncNodeAction (只接受状态参数) 转换为 AsyncNodeActionWithConfig (接受状态和配置参数) |

java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import io.opentelemetry.context.Context;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;

public interface AsyncNodeActionWithConfig
       extends BiFunction<OverAllState, RunnableConfig, CompletableFuture<Map<String, Object>>> {

    /**
     * Applies this action to the given agent state.
     * @param state the agent state
     * @return a CompletableFuture representing the result of the action
     */
    CompletableFuture<Map<String, Object>> apply(OverAllState state, RunnableConfig config);

    static AsyncNodeActionWithConfig nodeasync(NodeActionWithConfig syncAction) {
       return (state, config) -> {
          Context context = Context.current();
          CompletableFuture<Map<String, Object>> result = new CompletableFuture<>();
          try {
             result.complete(syncAction.apply(state, config));
          }
          catch (Exception e) {
             result.completeExceptionally(e);
          }
          return result;
       };
    }

    /**
     * Adapts a simple AsyncNodeAction to an AsyncNodeActionWithConfig.
     * @param action the simple AsyncNodeAction to be adapted
     * @return an AsyncNodeActionWithConfig that wraps the given AsyncNodeAction
     */
    static AsyncNodeActionWithConfig of(AsyncNodeAction action) {
       return (t, config) -> action.apply(t);
    }

}

EdgeAction

函数式接口,定义图中边的条件判断操作

  • apply 方法:接受当前状态,返回下一个执行节点 ID
java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;

/**
 * Represents an edge action that operates on an agent state and returns a result.
 *
 */
@FunctionalInterface
public interface EdgeAction {

    /**
     * Applies this action to the given agent state.
     * @param state the agent state
     * @return a result of the action
     * @throws Exception if an error occurs during the action
     */
    String apply(OverAllState state) throws Exception;

}

AsyncEdgeAction

函数式接口,定义图中边的异步条件判断操作,接受状态参数并返回字符串结果

|-----------|---------------------------------------------------|
| 方法名称 | 描述 |
| apply | 核心执行方法,接受当前状态,返回下一步执行的节点ID |
| edgeasync | 将同步的EdgeAction转换为异步版本,通过CompletableFuture包装同步操作结果 |

java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import io.opentelemetry.context.Context;

import java.util.concurrent.CompletableFuture;
import java.util.function.Function;

/**
 * Represents an asynchronous edge action that operates on an agent state and returns a
 * new route.
 *
 */
@FunctionalInterface
public interface AsyncEdgeAction extends Function<OverAllState, CompletableFuture<String>> {

    /**
     * Applies this action to the given agent state.
     * @param state the agent state
     * @return a CompletableFuture representing the result of the action
     */
    CompletableFuture<String> apply(OverAllState state);

    /**
     * Creates an asynchronous edge action from a synchronous edge action.
     * @param syncAction the synchronous edge action
     * @return an asynchronous edge action
     */
    static AsyncEdgeAction edgeasync(EdgeAction syncAction) {
       return state -> {
          Context context = Context.current();
          CompletableFuture<String> result = new CompletableFuture<>();
          try {
             result.complete(syncAction.apply(state));
          }
          catch (Exception e) {
             result.completeExceptionally(e);
          }
          return result;
       };
    }

}

Command

封装图执行的接下一个节点,及状态更新

java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;

/**
 * Represents the outcome of a {@link CommandAction} within a LangGraph4j graph. A
 * {@code Command} encapsulates instructions for the graph's next step, including an
 * optional target node to transition to and a map of updates to be applied to the
 * {@link OverAllState}.
 *
 * @param gotoNode containing the name of the next node to execute.
 * @param update A {@link Map} containing key-value pairs representing updates to be
 * merged into the current agent state. An empty map indicates no state updates.
 */
public record Command(String gotoNode, Map<String, Object> update) {

    public Command {
       Objects.requireNonNull(gotoNode, "gotoNode cannot be null");
       Objects.requireNonNull(update, "update cannot be null");
    }

    /**
     * Constructs a {@code Command} that specifies only the next node to transition to,
     * with no state updates. If {@code gotoNode} is null, it will be treated as an empty
     * {@link Optional}.
     * @param gotoNode The name of the next node to transition to. Can be null.
     */
    public Command(String gotoNode) {
       this(gotoNode, Map.of());
    }

}

CommandAction

函数式接口,定义 Command 对象的节点操作

  • apply 方法:接受当前状态和运行配置,返回 Command 对象
java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.RunnableConfig;

@FunctionalInterface
public interface CommandAction {

    Command apply(OverAllState state, RunnableConfig config) throws Exception;

}

AsyncCommandAction

函数式接口,定义异步的命令动作,接受状态和配置参数并返回异步命令结果

java 复制代码
package com.alibaba.cloud.ai.graph.action;

import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.RunnableConfig;
import io.opentelemetry.context.Context;

import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;

public interface AsyncCommandAction extends BiFunction<OverAllState, RunnableConfig, CompletableFuture<Command>> {

    static AsyncCommandAction nodeasync(CommandAction syncAction) {
       return (state, config) -> {
          Context context = Context.current();
          var result = new CompletableFuture<Command>();
          try {
             result.complete(syncAction.apply(state, config));
          }
          catch (Exception e) {
             result.completeExceptionally(e);
          }
          return result;
       };
    }

    static AsyncCommandAction of(AsyncEdgeAction action) {
       return (state, config) -> action.apply(state).thenApply(Command::new);
    }

}

往期文章

第一章内容

SpringAI(GA)的chat:快速上手+自动注入源码解读

SpringAI(GA):ChatClient调用链路解读

第二章内容

SpringAI的Advisor:快速上手+源码解读

SpringAI(GA):Sqlite、Mysql、Redis消息存储快速上手

第三章内容

SpringAI(GA):Tool工具整合---快速上手

SpringAI(GA):Tool源码+工具触发链路解读

第四章内容

SpringAI(GA):结构化输出的快速上手+源码解读

第五章内容

SpringAI(GA):内存、Redis、ES的向量数据库存储---快速上手

SpringAI(GA):向量数据库理论源码解读+Redis、Es接入源码

第六章内容

SpringAI(GA):RAG快速上手+模块化解读

SpringAI(GA):RAG下的ETL快速上手

SpringAI(GA):RAG下的ETL源码解读

第七章内容

SpringAI(GA):Nacos2下的分布式MCP

SpringAI(GA):Nacos3下的分布式MCP

SpringAI(GA):MCP源码解读

SpringAI(GA): SpringAI下的MCP源码解读

进阶:MCP服务鉴权案例

Spring AI Alibaba MCP Gateway GateWay无缝斜街存量应用转换 MCP 工具

MCP的SSE重连机制,源码分析

MCP的returnDirect生效了?

第八章内容

SpringAI(GA): 多模型评估篇

第九章内容

SpringAI(GA):观测篇快速上手+源码解读

第十章内容

Spring AI Alibaba Graph:快速入门

Spring AI Alibaba Graph:多节点并行---快速上手

Spring AI Alibaba Graph:节点流式透传案例

Spring AI Alibaba Graph:分配MCP到指定节点

Spring AI Alibaba Graph:中断!人类反馈介入,流程丝滑走完~

说明:往前文章可能有些细节有所调整,可69.9付费获取飞书云文档在线版预览,体验感更加,更有专属SpringAI会员教程群答疑

学习交流圈

你好,我是影子,曾先后在🐻、新能源、老铁就职,兼任Spring AI Alibaba开源社区的Committer。目前新建了一个交流群,一个人走得快,一群人走得远,另外,本人长期维护一套飞书云文档笔记,涵盖后端、大数据系统化的面试资料,可私信免费获取

相关推荐
小蒜学长1 天前
大学园区二手书交易平台(代码+数据库+LW)
java·数据库·spring boot·后端
saberc81 天前
【vibe coding系列】0行代码编写,使用Go+Vue3+Flutter从0到1开发小绿书(一)
后端·go
Smilejudy1 天前
SQL 移植--SPL 轻量级多源混算实践 7
后端
yinke小琪1 天前
分库分表后,主键 ID 如何优雅生成?
java·后端·面试
wuxuanok1 天前
Spring Boot 全局异常处理问题分析与解决方案
java·spring boot·后端
bobz9651 天前
spine leaf 组网架构:leaf 和 spine 之间的链路 mtu 普遍都是 9000
后端
bobz9651 天前
arp 广播带 vlan id 么?
后端
optimistic_chen1 天前
【Java EE进阶 --- SpringBoot】Spring IoC
spring boot·后端·spring·java-ee·mvc·loc
bobz9651 天前
ipsec mtu 问题
后端
深圳蔓延科技1 天前
NIO和传统 BIO的性能较量
后端