装饰器底层会基于我们重写的方法构造一个AgentMiddleware子类的实例,以@after_model 装饰器底层实现为例,关键代码如下
![图片[1]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1068.png)
这是after_model最终返回的内容。
上述代码中的wrapped是after_model内部的装饰器,代码如下
![图片[2]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1069.png)
上述代码等价于
![图片[3]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1070.png)
而func(state, runtime) 正是我们定义的、被@after_model 修饰的函数,在上述案例中对应的是
after_model_middleware,
上述代码的含义是
- 创建一个AgentMiddleware的子类
- 类名为middleware_name,即创建agent时传递的中间件名称,上述案例中是after_model_middleware
- 这个子类有两个属性state_schema 和tools
- 有一个方法: after_model ,逻辑等同于func(state, runtime) 。
- 最后的括号() 表示实例化子类,返回一个对象
所以,用装饰器最终返回的也是一个AgentMiddleware的子类对象,并且重写了after_model方法,和
基于类的自定义方式本质是一样的。
5.3.3 参数说明
Node-style hooks函数有两个参数
state: 是一个AgentState实例,维护Agent运行过程中的状态,这类状态会随着Agent的运行而发生变化,包括消息列表。
runtime: 是一个Runtime实例,维护Agent运行过程中的上下文环境,包括上下文、长期记忆等。
5.3.4 返回值说明
返回 None:不修改状态(不修改Agent状态)
![图片[4]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1071.png)
jump_to 目标:
- “end” – 结束 Agent
- “tools” – 跳到工具节点
- 其他自定义节点
5.3.5 装饰器参数:can_jump_to
这里就涉及到Node-style的四个hook函数可以接收额外参数can_jump_to 。
钩子函数可以改变Agent正常的运行轨迹。比如:发现上下文窗口溢出,直接跳转至结尾,提前终止整个Agent。
can_jump_to 决定了钩子函数可以直接跳转至流程的哪些位置,可取值如下:
- end:跳转至Agent流程末尾,或第一个after_agent钩子,直接终止整个流程。
- tools:跳转至工具节点。
- model:跳转至模型节点,或第一个before_model钩子。
1. 基于装饰器实现
![图片[5]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1072.png)
![图片[6]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1073.png)
![图片[7]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1074.png)
![图片[8]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1075.png)
![图片[9]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1076.png)
![图片[10]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1077.png)
![图片[11]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1078.png)
![图片[12]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1079.png)
![图片[13]-5.3.2 两种方法的统一-大赛人网](https://www.dsrw.com/wp-content/uploads/2026/11/image-1080.png)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END















请登录后查看评论内容