agent framework-spring ai alibaba随便记记
FunctionToolCallback与McpToolCallback是不同的:FunctionToolCallback是自定义的一些工具-函数等,相当于方法的进一步封装作为“公共方法”。上下文工程(Context Engineering)正是解决这一问题的核心理念:以正确的格式提供正确的信息和工具,使 LLM 能够可靠地完成任务。(2)Interceptor,抽象类有ToolIntercept
spring ai alibaba
零、reactAgent
Chatclient已经弃用,使用ChatModel
内嵌node仅为两种,这里面支持ChatClient-可以自定义advisor chain
private final AgentLlmNode llmNode;
private final AgentToolNode toolNode;
一、记忆
使用自带的saver()
实现自定义的hook-before model-进行数据库存储
消息的取舍-可采用策略(修剪、删除、总结-extends ModelHook)
二、token
估算token
// 估算 token 数量(简化版)
int estimatedTokens = messages.stream()
.mapToInt(m -> m.getText().length() / 4)
.sum();
三、agent即工具 
FunctionToolCallback与McpToolCallback是不同的:FunctionToolCallback是自定义的一些工具-函数等,相当于方法的进一步封装作为“公共方法”。而获取mcp server连接来的工具天然实现toolcallback。
agent作为工具使用作为子智能体,实现implements BiFunction<String, ToolContext, String>,其中ToolContext作为运行时的
“公共笔记本”,写入共享参数和获取参数
例如:
场景一:
获取-读取公共参数人员id,可以作为一个提取,有点类似chatclient的advisor方法,作为一个公共的函数,想在哪里使用就配置上即可
然后可以作为主智能体的Interceptor
public class SubAgentInterceptor extends ModelInterceptor
public class UserInfoTool implements BiFunction<String, ToolContext, String> {
@Override
public String apply(String query, ToolContext toolContext) {
// 从上下文中获取用户信息
RunnableConfig config = (RunnableConfig) toolContext.getContext().get("config");
String userId = (String) config.metadata("user_id").orElse("");
if ("user_123".equals(userId)) {
return "用户是 John Smith";
} else {
return "未知用户";
}
}
}
四、FunctionToolCallback、hook、 interceptor
公共方法函数:FunctionToolCallback
运行时动态:interceptor 、hook
上下文工程(Context Engineering)正是解决这一问题的核心理念:以正确的格式提供正确的信息和工具,使 LLM 能够可靠地完成任务。
五、可自定义实现
(1)FunctionToolCallback
public class UserInfoTool implements BiFunction<String, ToolContext, String> {}
(2)Interceptor,抽象类有ToolInterceptor、ToolInterceptor,实现自Interceptor。
常用的有TodoListInterceptor:提供todo list管理功能给之呢个题,这个拦截器提高了在复杂问题的时候系统提示词去设置待办事项
场景一:
例如动态获取用户名作为曾倩
public class DynamicPromptInterceptor extends ModelInterceptor {
六,参数共享
OverAllState与Runnableconfig的数据是不一样的
举例子
对一个线程,只从该线程下的对话,有该用户的多个提问
线程主键就应该存在Runnableconfig.metadata中,作为长期记忆的用户画像的用户主键 存在Runnableconfig的context中; 多个提问的主键应该存入Runnableconfig
OverAllState中,作为额外固定信息;

官方举例子为:
RunnableConfig 提供了一个 context() 方法,允许你在同一个执行流程中的多个 Hook 调用、多轮模型或工具调用之间共享数据。这对于实现计数器、累积统计信息或跨多次调用维护状态非常有用。
适用场景:
跟踪模型或工具调用次数
累积性能指标(总耗时、平均响应时间等)
在 before/after Hook 之间传递临时数据
实现基于计数的限流或断路器
这是config的配置
可变性不同
metadata:不可变 (immutable)
一旦初始化,执行期间不改变
类似"只读配置"
context:可变 (mutable)
执行过程中会不断更新
节点可以读取和修改其中的数据
也就是说,如果在agent执行过程中会对其进行更新操作就放在context,而metadata类似”只读配置“
更多推荐




所有评论(0)