Replies: 1 comment
-
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
State 泛型化Proposal
提案背景
当前 spring-ai-alibaba-graph-core 中的状态管理完全依赖
OverAllState,它是一个基于Map<String, Object>的弱类型容器。用户在节点中读写状态时必须使用字符串 key 和手动类型转换(如state.value("messages", List.class)),这带来了以下问题:1. 缺乏类型安全 :编译期无法检测 key 拼写错误或类型不匹配,运行时才会暴露
2. 可读性差 :每个节点无法知道某一个key是在哪被写入,在哪被读取
3. IDE 支持弱 :无法利用自动补全、重构、跳转定义等 IDE 能力
用户期望能够定义一个普通的 Java 实体类(POJO)作为 Graph 的状态类型,通过字段声明和注解来描述状态结构和更新策略,同时保持与现有
OverAllStateAPI 的完全向后兼容。效果对比
改造前:
改造后:
变更范围
GraphState
引入
GraphState标记接口作为所有状态类型的基础契约,要求实现Serializable,不包含任何方法。@StateField注解
引入
@StateField可选注解keyStrategy:允许用户在 POJO 字段上声明更新策略(KeyStrategy),未标注的字段默认使用ReplaceStrategy,不想序列化的字段使用 Java 内置的transient关键字。fieldName:指定序列化时使用的字段名,默认为空字符串(表示使用 Java 字段名)。当 POJO 字段名与Map<String, Object>中的 key 不一致时(例如与旧版OverAllState的 key 对齐),可通过此属性指定映射名。streaming:标记该字段是否承载流式数据,默认为false。当NodeActionResult携带Flux<?>时,框架通过此标记确定流式数据对应的状态字段 key。每个状态类中最多只能有一个字段标记streaming = true。StateFieldScanner
引入
StateFieldScanner工具类,通过反射扫描状态类的字段及@StateField注解,自动提取KeyStrategy映射核心API泛型化
将
StateGraph、CompiledGraph、NodeAction、AsyncNodeAction、AsyncNodeActionWithConfig等核心 API 泛型化,引入类型参数<S extends GraphState>用户原有的NodeAction的兼容方式
提供
OverallStateNodeAction函数式接口,保留旧版返回Map<String, Object>的 Action 签名,并通过内置的wrap静态方法将其包装为新版泛型NodeAction<OverAllState>序列化
泛型化
StateSerializer,使其支持任意GraphState子类型的序列化节点流式输出
原先用户如果需要一个节点里面返回流式输出,只需要在apply()方法中返回的Map value中使用Flux流就行。graph框架侧会判断类型是否为flux,如果是flux,则会走flux的流式逻辑。
State泛型改造后,NodeAction返回的结果为
NodeActionResult, 框架侧通过判断streamingFlux==null来判断是否走流式的逻辑。流式逻辑中除了将message 包装成
StreamingOutput之外,还需要将flux流式输出的完整结果再更新到对应的字段里面。StateField注解中提供了**streaming=true**(约束:整个State中,只能有一个字段带上streaming = true)可以找到这个对应的字段名,进而将flux流式输出后的完整结果再更新到对应的字段值中。其他
agent-framework
对用户暴露的API改造小,主要是各种自定义Node和Edge的改造
spring-ai-alibaba-starter-builtin-nodes(break change)
所有的nodes都需要适配新的NodeAction定义
Beta Was this translation helpful? Give feedback.
All reactions