
Flue useResponseStart/Finish 详解拦截响应的每一刻【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flue在Flue这个轻量级 sandbox agent framework沙箱智能体框架中useResponseStart和useResponseFinish是两枚埋点在响应生命周期两端的观测钩子前者在响应的真正开始时精确触发一次后者在响应的真正结束时精确触发一次。它们让你在毫秒级抓住 Agent 响应的每一次唤醒与收尾把耗时、token 用量、应用标记等元数据直接盖章到响应消息上供客户端在正文之外读取。什么是响应生命周期钩子Flue 的 Agent 是一个普通函数函数体内通过一系列use*钩子声明能力useModel选模型、useTool挂工具、useSkill挂载技能……而事件钩子则负责在生命周期的关键接缝上运行回调。其中共有四个事件钩子触发时机各不相同钩子触发时机可否异步useResponseStart响应的真正开始每个响应仅一次❌ 同步useAgentStart每收到一条投递消息运行一次✅ 可异步useAgentFinish每个本应停止的点都会运行✅ 可异步useResponseFinish响应的真正结束每个响应仅一次❌ 同步理解这对钩子的关键是响应response这个概念一次响应可以吸收多条投递进来的消息消息在轮次边界加入正在进行的响应。此时useAgentStart会为每条消息重新触发但响应本身只唤醒一次——useResponseStart和useResponseFinish只跟响应绑定各触发一次不多不少。useResponseStart在响应醒来的一瞬它的执行时机极其靠前在任何模型调用之前、在任何useAgentStart回调之前同步地运行一次。回调的签名很克制接收一个上下文返回一个普通对象或什么都不返回。useResponseStart(({ metadata }) ({ ...metadata, startedAt: Date.now() }));收到的ctx.metadata是本响应目前已累积的元数据按声明顺序、来自更先的钩子返回的对象会被深度合并deep-merge到响应消息的metadata字段上——这是 AI SDK 惯例中的信封字段客户端可以在消息正文之外读取它不返回任何东西则只观测、不附着完全合法。官方钩子实现就几行代码可读性很高use-response-start.ts类型定义ResponseStartContext等在 message-output.ts。useResponseFinish在响应的真正结尾useAgentFinish在每个本应停止的点运行且可以追加信号让响应继续而useResponseFinish运行在最后一轮收尾循环结束之后——此时响应真正落地它拿到的response聚合数据是最终的useResponseFinish(({ metadata, response }) ({ finishedAt: Date.now(), elapsed: Date.now() - (metadata.startedAt as number), totalTokens: response.usage.totalTokens, toolCalls: response.toolCalls.length, }));它的上下文比 start 侧多了一份response对象response.usage—— 整个响应跨所有轮次、所有重试的聚合 token 用量response.toolCalls—— 该响应发起过的全部工具调用来自持久化记录日志ctx.metadata—— 包含useResponseStart附着的内容从持久化日志读取因此重试后依然保留。实现见 use-response-finish.ts。典型用法给响应盖上计量章把两个钩子组合起来是最经典的模式——记录响应耗时与用量useResponseStart(() ({ startedAt: Date.now() })); useResponseFinish(({ metadata, response }) ({ elapsed: Date.now() - (metadata.startedAt as number), totalTokens: response.usage.totalTokens, }));项目里就有现成的例子评估场景中的服务状态 Agent 用useResponseFinish把用量与模型名写进元数据供测试框架从回复上读取——见 service-status.ts 与 harness.ts。在可观测性文档中官方也推荐把useResponseFinish作为在响应元数据上盖 token 计量的正确位置observability.md。新手必知的 5 个行为细节 同步且只观测回调不能append、不能dispatch、拿不到 harness也不能是异步——返回 Promise 会直接令提交失败。需要异步的启动工作请放进useAgentStart异步收尾工作请放进useAgentFinish。Fail-fast回调抛异常会直接失败整个提交没有重试、没有恢复。元数据对模型不可见写入的 metadata 永远不会进入模型提示词也永远不会重新触发 Agent——纯粹是面向客户端的信封数据。至少一次语义钩子回调按 at-least-once 运行中断后的重试会重跑但持久化结果不会重复。子 Agent 中不可用在 subagent 渲染里调用这两个钩子会直接抛错——响应元数据只装饰面向客户端的公开对话。延伸阅读钩子总览指南含事件钩子完整示例agent-hooks.mdAPI 参考含useResponseStart()/useResponseFinish()的完整契约与合并规则agent-hooks-api.md运行时钩子源码目录packages/runtime/src/hooks/从唤醒到落地useResponseStart与useResponseFinish用两行声明就帮你在响应的每一刻留痕——这正是 Flue 响应式钩子体系优雅的地方像写组件一样写 Agent观测与计量信手拈来。【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flue创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考