工作流
Graph 是 Agent Framework 的底层运行时。我们建议开发者使用 Agent Framework 构建高阶应用,但直接使用底层 Graph API 也是完全可行的。 Graph 是一个低级工作流和多智能体编排框架,使开发者能够实现复杂的应用程序编排。
Agent 编排的核心引擎
ARGI Graph 是 Agent 编排背后的核心引擎,在底层,ARGI 框架会将 Agent 编排为 Graph,组成一个由节点串联而成的 DAG 图。
Graph 引擎核心概念与定义
ARGI Graph 有以下三个核心概念:
- 状态(State):定义了在 Node 与 Edge 之间传递的数据结构,是整个 Agent 上下文传递的核心载体,具体实现上是一个
Map<String, Object>。 - 节点(Node):Graph 中的每个 Node 是执行逻辑单元,接受当前 State 作为输入,执行某些操作(如调用 LLM 或自定义逻辑),并返回对 State 的更新。
- 边(Edge):定义 Node 间的控制流,可为固定连接,也可依据状态条件动态决定下一步执行路径,实现分支逻辑

通过组合 Node 和 Edge,开发者可以创建复杂的循环工作流,随着时间的推移不断更新 State 状态。然而,真正的力量来自 ARGI 如何管理这种 State 状态。
简而言之:Node 完成工作,Edge 告诉下一步该做什么。
Graph 引擎提供的 Low-level API
ARGI 同时提供了声明式的 Agentic API 与底层原子化的 Graph API,两种模式都对开发者开发,**Agentic API vs Graph API **应该怎么选?前文我们已经重点介绍了 Agentic API 的开发模式,相比于 Agentic API,Graph API 可以让开发者对流程有更全面的控制,开发者可以独立定义每个 Node 的逻辑、每条边的逻辑,最终按照业务需要编排成完成的流程图。
以下是使用 Graph API 实现 DeepResearch 类工作流的流程图定义,演示了 Graph API 的具体使用方法:
Graph 引擎提供更多运行时特性
整个 ARGI 框架底层基于 Spring AI 实现(下图绿色部分),因此在 Augmented LLM 层次提供了 Model、Tool Calling、MCP、RAG 等原子能力的完善定义,具备厂商无关、 易用性高、可扩展性强的特点。
在 Agentic Framework 这一层(下图蓝色部分),是 ARGI 框架提供的核心抽象。定义了 Graph 引擎将以及面向开发者的 Agentic API、Graph API 来实现智能体流程编排。

除了流程编排之外,Graph 引擎还原生支持 Streaming、Human In the Loop、Memory & Context 等智能体核心能力。
- **Streaming:**流式响应对于 Agent 交互非常关键,同时与模型生成式的特性非常契合,框架可以将每个 Node 节点的运行情况、LLM Token 实时的发送到用户端。
- **Human In the Loop:**允许对 Agent 运行过程中的工具调用进行评估、修改、批准。在模型驱动的应用中特别有用,让用户具备为 Agent 验证有效性、纠正错误、增加上下文的能力。
- **Memory & Context:**框架可以处理Agent应用运行期的 短期记忆 与 长期记忆。短期记忆是指一个会话周期内的数据、历史消息传递;长期记忆指跨多个会话时,Agent 可以了解历史用户偏好与信息。
定义自己的Node
在 ARGI Graph 中,Node 是工作流的基本执行单元。每个 Node 负责处理特定的业务逻辑,接收状态(State)作为输入,并返回更新后的状态。
Node 接口
自定义 Node 需要实现 NodeAction 或 NodeActionWithConfig 接口:
public interface NodeAction {
Map<String, Object> apply(OverAllState state) throws Exception;
}
public interface NodeActionWithConfig {
Map<String, Object> apply(OverAllState state, RunnableConfig config) throws Exception;
}
主要区别:
NodeAction:只接收状态作为参数,适用于简单的业务逻辑NodeActionWithConfig:额外接收运行配置,可以访问元数据、线程ID等信息,适用于需要上下文信息的场景
基础 Node 示例
以下是一个简单的文本处理 Node:
import io.github.agentic.ai.graph.OverAllState;
import io.github.agentic.ai.graph.action.NodeAction;
import java.util.HashMap;
import java.util.Map;
public class TextProcessorNode implements NodeAction {
@Override
public Map<String, Object> apply(OverAllState state) throws Exception {
// 1. 从状态中获取输入
String input = state.value("query", "").toString();
// 2. 执行业务逻辑
String processedText = input.toUpperCase().trim();
// 3. 返回更新后的状态
Map<String, Object> result = new HashMap<>();
result.put("processed_text", processedText);
return result;
}
}