SEO基础

SEO基础

Products

当前位置:首页 > SEO基础 >

中间件如何嵌入Agent执行流程?

96SEO 2026-09-07 09:39 2


读完这篇你会知道

一、为什么需要中间件?使用者痛点先说清楚,

User Pain Point:

中间件如何嵌入Agent执行流程?
  • "Agent 在长对话时频繁抛出 Token 超限错误,导致流程中断"
  • "工具调用失败时直接报错。让整个 Agent 崩溃"
  • "无法在运行时指令或工具列表,只能重启 Agent"
  • "只观测而不能 Callback 无法满足业务需求"

C​allback 是只读的观测——你看到发生了什么但不能改它。

C​allback 的局限性让许多团队不得不在业务层面硬编码工作流或频繁重启 Agent。为了解决这些痛点,中间件提供可写拦截功能:

  • 在模型调用前 消息历史 – 防止 Token 超限。
  • 在工具调用返回后修改结果 – 防止崩溃。
  • 在 Agent 开始时动态加工具或修改 instruction – 灵活应对变化需求。
  • 用自己的模型替换框架的模型 – 提高稳定性。
  • 自动修补悬空工具调用 – 避免因使用者打断导致错误。
  • 两阶段上下文压缩– 解决 Token 上限问题。

这些能力都需要中间件,Callback 做不到。

二、接口:个钩子

// adk/handler.gotype
TypedChatModelAgentMiddleware interface {
// . Agent 运行前:改 instruction / 工具列表
BeforeAgent
// . Agent 成功结束后
AfterAgent
// . 每次调模型前:
消息历史 + ToolInfos
BeforeModelRewriteState
// . 模型返回后:对模型回复做后处理
AfterModelRewriteState
// -. 包装同步 / 流式工具调用
WrapInvokableToolCall
WrapStreamableToolCall
// -. 包装 Enhanced 同步 / 流式工具调用
WrapEnhancedInvokableToolCall(ctx。endpoint EnhancedInvokableToolCallEndpoint,tCtx *ToolContext) (EnhancedInvokableToolCallEndpoint,error)
WrapEnhancedStreamableToolCall(
ctx context.Context,endpoint StreamableToolCallEndpoint,tCtx *tool.Context) (
streamable.ToolInvocationEndpoint,error)
// . 包装模型本身
WrapModel(ctx context.Context,m model.BaseModel,mc *adk.TypedBaseChatModelMiddlewareConfig) (
model.BaseModel,error)}

*个方法全部实现太繁琐。嵌入 adk.TypedBaseChatModelAgentMiddleware /// 提供 个默认 no‑op,仅需覆盖关心的那个:.

type MyMiddleware struct {
// 嵌入基类。获得所有 no‑op 默认实现
*adk.TypedBaseChatModelAgentMiddleware
}
// 只实现需要的
func BeforeModelRewriteState(
ctx context.Context,state *adk.ChatMessageStore,mc *adk.ModelContext) (
context.Context,*adk.ChatMessageStore,error) {
// 在这里
消息历史…,return ctx,state,nil
}

*注册到 Agent:.

agent,_:= adk.NewChatMessageStore,&adk.ChatMessageStoreConfig{
从Name来看,"my_agent",Model:m,Middlewares:。})

三、钩子时序

    BeforeAgents │ ├── │ ├── BeforeM ← 改消息历史、改 ToolInfos │ │ │ ├── WrapM → 模型调用 │ │ │ └── AfterM ← 处理模型回复 │ ├── WrapInvokable/StreamableTools ← 工具执行时包装 │ ├── │ └── AfterAgents ← 成功结束 —– ——————-->. 关键点:
      • BeforeM 返回的 state 会持久化到 Agent 内部状态,影响后续所有轮次;WrapM 对消息修改不持久化,只影响当次调用。• WrapInvokableTools 在每次工具执行时调用,不是一次性编译期包装。• AfterAgents 只在成功结束时触发;老实说,超出最大迭代次数或取消上下文时不会触发 —– ——————-->.

      四、工具错误处理:WrapToolWithErrorHandler

      *最常用的工具层中间件——把工具报错转成字符串。避免因单个 tool 错误导致整个 Agent 崩溃*. 来自 .

      # Import snippet from components/tool/utils/error_handler.go
      import "github.com/cloudwego/eino/components/tool/utils"
      wrapped := utils.WrapToolWithErrorHandler(mytool,&
      func string{
      return fmt.Sprintf})
      // 将 wrapped 放进 Tools 列表即可。说起来,// 后续若 mytool 报错,将被转换为友好文本。// 并不会影响其它 tools 或者整体流程。//
      //
      //
      `error_handler.go` 的主要原因:
      go
      func. InvokableRun(
      ctx context.Context。
      args string,...opts...tool.Option){
      result,_:=s.i
      if err := compose.IsInterruptRerunError;err,=nil{
      return result,error}
      if err!=nil{
      return s.h,nil}
      return result。nil}
      **关键细节**:
      - `InterruptRerunError` 不被捕获;HITL 中断需透传,---
      

      五、patchtoolcalls:修补悬空工具调用

      *悬空 tool_call 通常是由于使用者提前发送新消息导致旧 tool 调用没有得到响应,从而造成 LLM API 报错*. go import patchtoolcalls' mw。_ := patchtoolcalls.New,&patchtoolcalls.Config{PatchedContentGenerator: func{ return fmt.Sprintf canceled",name,id),nil}}) agent,_ := adk.New... 默认占位内容为 “`%s with id %s was canceled…老实说,`”,中文环境则自动切换为中文提示。---

      六、reduction:两阶段上下文压缩

      *长期运行会产生大量 Token,上限被突破。是最头疼的问题之一*

      ### 阶段一:截断 至于触发条件,**每次 tool 完成后立即**。超过阈值 -> 保存原始全文至后端,并将 tool 消息替换为截断通知。bash ### 阶段二:清理 至于触发条件,**每次调模型前**。若总 token 超过阈值 -> 遍历旧记录,将完整内容卸载并仅保留占位符。go import ( “github.com/cloudwego/eino/adk/middlewares/reduction” “github.com/cloudwego/eino/adk/filesystem” ) mw,_ := reduction.New,&reduction.Config{ Backend: filesystem.NewLocalBackend,ReadFileToolkitName:"read_file",// 用来恢复卸载内容 MaxLengthForTrunc:,// 单条超长 tool 输出阈值 MaxTokensForClear:。// 总 token 阈值 ClearRetentionSuffixLimit:,// 保留最近几轮不清理 TokenCounter: func{ return countTokens,nil},}) **分工概览**: | 阶段 | 功能 | 时机 | 优势 | |------|------|------|------| | 截断 | 单条大 output 即刻处理 | tool 完成后 | 防止一次爆炸 | | 清理 | 多轮累计压缩 | 每次建模前 | 减少频繁 IO | **可选参数 `ClearAtLeastTokens`** 可避免过度清理导致缓存失效。---

      七、自定义中间件示例:限速工具调用

      go type RateLimitMW struct{ *adk.TypedBaseChatMachine* limiter*rate.Limiter} func NewRateLimitMW*RateLimitMW{ return &RateLimitMW{limiter: rate.NewLimiter。1)} } // 覆盖仅需限制 sync 调用: func.WrapInvokable( ctx context.Context,endpt adk.InvokEndpoint,tCtx*adk.ToolContext)( adk.InvokEndpoint,error){ return func{ if err:=m.limiter.Wait;err,=nil{return"",fmt.Errorf} return endpt}。nil} ---

      八、中间件 vs Callback :选哪个?

      需求 可以考虑
      记录日志 / 上报 traceCallback统计 Token 用量Callback - 只读观察
      改变数据结构,如删除冗余消息MiddleWare
      把 Tool 错误转成友好字符串MiddleWare
      加速限制或批量限制MiddleWare
      动态修改 instruction 或增加 toolsMiddleWare
      失败恢复/重试策略MiddleWare
      Token 上下文压缩MiddleWare
      修复悬空 Tool 调用MiddleWare ---
      Eino 的 Middleware 程序通过 TypedChat.... 接口提供 …个钩子,让你覆盖 Agent 执行流任意节点。基类 TypedBase…简化开发,只需关注关心的方法即可。已存在三个成熟中间件解决最常见工程难题:
        <-• 将 Tool 错误转为友好文本;<-• 自动补偿用户打断导致悬空 Tool 调用;<-• 双阶段上下文压缩防止 Token 超限。

      *主要区别: Callback —— 只观测数据,不可改动;老实说,Middleware —— 可写拦截,实现实时行为调整。

      下篇继续…

      ©️ 云堆社区

      📖代码



标签: 自定义

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback