尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LangGraph 中间件钩子时机:before_agent 与 wrap_model_call 根本不在一层
LangGraph 中间件钩子时机before_agent 与 wrap_model_call 根本不在一层摘要before_agent和wrap_model_call都能拦在大模型前面但它们分属两个完全不同的层级一个是 Agent 节点级的前置钩子一个是模型调用层的包装器。混淆两者会导致两类典型 bug——想改模型参数却改不动 state或者把每次请求都要跑的逻辑错放进了只执行一次的钩子里。本文给出两者的触发位置、作用域、完整时序并补上夹在中间的before_model这一层。一、结论先行before_agentwrap_model_call一句话这一轮 Agent 开跑前动 graph state单次 LLM 请求的前后动 messages / 模型参数 / 返回值层级Graph / Agent 节点钩子Model 调用层包装器前提先对齐两者都参与拦截/包装大模型调用但触发时机和作用域完全不一样。二、before_agentAgent 节点级前置钩子执行时机Agent 节点开始运行之前。触发点进入 Agent 节点还没有调用 LLMAgent 刚拿到当前 state。所处阶段State 已加载Agent 逻辑准备启动但模型请求还没构建。能干什么修改整个 graph state历史、问题、参数权限校验、前置过滤、改写用户输入注入全局上下文、路由分支判断不能直接拦截模型调用本身。它只是 Agent 节点的前置钩子。一句话Agent 跑之前state 层面预处理。三、wrap_model_call模型调用层包装器执行时机Agent 内部准备发起 LLM 请求的时候。触发点Agent 已组装好 prompt、messages即将发给 LLM包裹model.invoke()这一层。所处阶段Agent 业务逻辑已跑完生成好待传给大模型的消息列表进入模型调用环节。能干什么修改发给 LLM 的 messages、temperature、top_p 等模型参数埋点、计时、缓存、重试包装拦截 / 替换模型返回结果捕获模型抛出的异常作用域只包装单次模型调用不改动上层 graph state回调里可以间接改但不是它本职。一句话LLM API 请求发出前后模型调用层包装。四、完整时序Graph 调度 └── 进入 Agent 节点 └── before_agent 【触发每轮 Agent 节点一次】 └── Agent 内部逻辑工具选择 / 消息组装 └── before_model 【触发每次模型调用前】 └── wrap_model_call 【触发包裹单次调用】 └── model.invoke() └── LLM 返回 └── after_model └── Agent 后处理 └── after_agent 【触发调用结束一次】 └── 写回 state五、别漏了中间的 before_model这是三者里最容易混的一层官方定义很明确钩子何时跑与 wrap_model_call 的关系before_agent每次 invoke 开头一次最早还没进模型层before_model每次模型调用前早于wrap_model_callwrap_model_call包裹每次模型调用包住真正的model.invoke()after_model每次模型响应后、工具执行前人工审核最自然的位置after_agent每次 invoke 结束一次收尾、通知、保存结果选哪个的判据想在模型调用之前动 state裁剪历史、注入上下文、PII 脱敏→before_model想在模型调用这层做控制流重试、缓存、降级换模型、动态工具集→wrap_model_call想在整个 Agent 开跑前做一次性准备加载记忆、鉴权、路由→before_agent。六、核心差异汇总维度before_agentwrap_model_call层级Graph / Agent 节点钩子Model 调用层包装器触发时机Agent 节点启动前调用 LLM API 前后操作对象Graph StateLLM 请求消息、模型参数、模型返回值多轮 Agent每一轮 Agent 节点触发一次每调用一次 LLM 就触发一次一轮内可能多次典型用途前置校验、改写输入、分支路由埋点、缓存、重试、修改 prompt返回契约dict[str, Any]或CommandExtendedModelResponse(model_response..., commandCommand(update{...}))七、容易踩的坑执行次数不对称一轮 Agent 内部若连续多次调用 LLM先思考 → 调工具 → 二次推理wrap_model_call会执行多次而before_agent只在进入本轮 Agent 节点时执行一次。影响范围不对称before_agent直接改 state会影响 Agent 后续全部逻辑wrap_model_call的改动默认只影响当前这一次模型请求。返回契约用错wrap_model_call里直接return {key: value}是不符合契约的必须包成ExtendedModelResponse(..., commandCommand(update{...}))。把一次性初始化塞进wrap_model_call加载记忆、建立连接这类逻辑每次模型调用都会重跑应放before_agent。多个中间件叠加时顺序反直觉before_*按列表正序after_*逆序wrap_*嵌套列表第一个是最外层。八、一句话总结before_agent管这一轮开跑前的 state 准备wrap_model_call管每一次模型调用的请求与响应。需要一次性前置处理就选前者需要覆盖每次模型调用就选后者——中间还有个before_model适合每次调模型前动 state、但不需要包裹调用过程的场景。
RELATED

相关推荐

Python数据结构:栈、队列、set、map、list用法与避坑

Python数据结构:栈、队列、set、map、list用法与避坑

写代码久了你会发现,真正天天在用的反而不是那些花哨的框架,而是几个最基础的数据结构:栈、队列、set、map、list。很多性能问题、代码可读性问题,本质上是数据结构用错了。今天我把这几个容器的常用方法、适用场景、还有我踩过的…

📅 2026/10/15 2:27:46
仓颉 stdx.crypto.keys 密钥枚举详解:Curve 椭圆曲线与 PadOption 填充模式

仓颉 stdx.crypto.keys 密钥枚举详解:Curve 椭圆曲线与 PadOption 填充模式

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

📅 2026/10/15 2:27:46
第一个挖到的漏洞,未授权 SQL 注入

第一个挖到的漏洞,未授权 SQL 注入

从一个后台登录口到未授权 SQL 注入:ThinkPHP exp 表达式注入发现复盘说明:本文为个人授权测试后的技术复盘,目标已完全脱敏(域名、IP、库名、哈希、盐值均为占位演示值)。漏洞已通过合法渠道提交并结案,仅…

📅 2026/10/15 2:27:46
MORE NEWS

更多资讯

📰

2000-2024年 各省生产总值GDP、人均GDP和经济发展水平数据 xlsx

1、数据概况 本数据集系统整理了2000年至2024年间全国31个省级行政区的宏观经济指标,涵盖地区生产总值、人均地区生产总值及经济发展水平三项核心变量。数据基础来源于国家统计局公开发布的历年统计资料,并辅以各省统计年鉴进行交叉核验,确保…

📰

2001-2024年 管理层讨论与分析文本

1、MD&A 文本数据 “管理层讨论与分析”(MD&A)是上市公司定期报告中的核心叙述性章节,承载着管理层对经营成果的深度解读与前瞻判断。不同于财务报表的标准化数据,MD&A 部分以文字形式揭示业绩波动的驱动因素、行业竞…

📰

2001-2024年 供应链多元化数据+文献+代码

1、数据复刻来源 此数据集复刻了沈国兵、沈彬朝发表于《经济研究》2025年第10期的论文《企业数字化与供应链多元化:来自中国的证据》。测算过程聚焦于企业前五大供应商的采购数据,仅保留各年度五大供应商排序完整的企业样本,提取每家供应商的…

📰

FlexRay总线深度实战:时间触发调度与双通道冗余机制解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

2001-2024年 企业绿色媒体覆盖率绿色新闻数据+文献代码

1、数据来源 本数据集以中国A股上市公司为对象,系统采集了2001年至2024年间主要财经媒体及新闻门户的公开报道全文。在构建指标时,采用基于词典的文本分析方法:首先,通过关键词匹配技术,将每条新闻文本与预先编制的“…

📰

企业微信API如何接入现有系统?接口层与业务层怎么划分

很多企业研发团队在初次对接企业微信 API 时,为了赶进度,习惯性地采用“直连模式”:在 Webhook 的接收函数里直接写 if-else 业务判断,甚至直接连上内部 CRM 的数据库执行 SQL。 这种“烟囱式”的强耦合代码,在初期或…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬