--- title: 中间件链 updated: 2026-04-11 status: active tags: [module, middleware, runtime] --- # 中间件链 > 从 [[index]] 导航。关联模块: [[chat]] [[butler]] [[memory]] ## 设计思想 **中间件是请求处理的管道,按优先级顺序执行。** - 优先级 0-999,数值越小越先执行(`middleware.rs` 按升序排列) - 每层中间件实现 `AgentMiddleware` trait,4个 hook 点: `before_completion` / `before_tool_call` / `after_tool_call` / `after_completion` - 所有消息流(聊天、管家)都经过完整中间件链 - 中间件可返回 `Stop`/`Block`/`AbortLoop` 决策来中断流程 ## 代码逻辑 ### 15 层中间件(注册顺序见 `kernel/mod.rs:190-360`) | # | 中间件 | 文件 | 职责 | 注册条件 | |---|--------|------|------|----------| | 1 | ButlerRouter | `middleware/butler_router.rs` | 语义技能路由 + system prompt 增强 | 始终 | | 2 | DataMasking | `middleware/data_masking.rs` | 手机号/身份证等敏感数据脱敏 | 始终 | | 3 | Compaction | `middleware/compaction.rs` | 超阈值时压缩对话历史 | `compaction_threshold > 0` | | 4 | Memory | `middleware/memory.rs` | 对话后自动提取记忆 | 始终 | | 5 | LoopGuard | `middleware/loop_guard.rs` | 防止工具调用无限循环 | 始终 | | 6 | TokenCalibration | `middleware/token_calibration.rs` | Token 用量校准 | 始终 | | 7 | SkillIndex | `middleware/skill_index.rs` | 注入技能索引到 system prompt | `!skill_index.is_empty()` | | 8 | Title | `middleware/title.rs` | 自动生成会话标题 | 始终 | | 9 | DanglingTool | `middleware/dangling_tool.rs` | 修复缺失的工具调用结果 | 始终 | | 10 | ToolError | `middleware/tool_error.rs` | 格式化工具错误供 LLM 恢复 | 始终 | | 11 | ToolOutputGuard | `middleware/tool_output_guard.rs` | 工具输出安全检查 | 始终 | | 12 | Guardrail | `middleware/guardrail.rs` | shell_exec/file_write/web_fetch 安全规则 | 始终 | | 13 | SubagentLimit | `middleware/subagent_limit.rs` | 限制并发子 agent | 始终 | | 14 | TrajectoryRecorder | `middleware/trajectory_recorder.rs` | 轨迹记录 + 压缩 | 始终 (V13-FIX-01 注册) | ### 优先级分类(来自 `middleware.rs` 头注释) | 范围 | 类别 | 包含的中间件 | |------|------|-------------| | 100-199 | 上下文塑造 | Compaction, Memory | | 200-399 | 能力 | SkillIndex, Guardrail | | 400-599 | 安全 | LoopGuard, DataMasking | | 600-799 | 遥测 | TokenCalibration, Title, TrajectoryRecorder | ### 中间件执行流 ``` 用户消息 → AgentLoop → chain.run_before_completion(ctx) → [按优先级升序] 每层 middleware.before_completion() → Continue: 继续下一层 → Stop(reason): 中断循环,返回 reason → LLM 调用 → (工具调用时) chain.run_before_tool_call() → Allow: 允许执行 → Block(msg): 阻止,返回错误给 LLM → ReplaceInput: 替换参数后允许 → AbortLoop: 立即终止整个循环 → chain.run_after_tool_call() → chain.run_after_completion() ``` ### 核心接口 ```rust // crates/zclaw-runtime/src/middleware.rs trait AgentMiddleware: Send + Sync { fn name(&self) -> &str; fn priority(&self) -> i32 { 500 } async fn before_completion(&self, ctx: &mut MiddlewareContext) -> Result; async fn before_tool_call(&self, ctx: &MiddlewareContext, tool_name: &str, tool_input: &Value) -> Result; async fn after_tool_call(&self, ctx: &mut MiddlewareContext, tool_name: &str, result: &Value) -> Result<()>; async fn after_completion(&self, ctx: &MiddlewareContext) -> Result<()>; } ``` ### 注册位置 `crates/zclaw-kernel/src/kernel/mod.rs:190-345` — `create_middleware_chain()` 方法,13 次 `chain.register()` + 1 个条件注册。 ## 关联模块 - [[butler]] — ButlerRouter 是管家模式的核心 - [[chat]] — 每条消息经过完整中间件链 - [[memory]] — Memory 中间件从对话提取记忆 - [[hands-skills]] — SkillIndex 中间件注入技能索引 ## 关键文件 | 文件 | 职责 | |------|------| | `crates/zclaw-runtime/src/middleware.rs` | AgentMiddleware trait + MiddlewareChain | | `crates/zclaw-runtime/src/middleware/` | 14 个中间件实现 (14个 .rs 文件) | | `crates/zclaw-kernel/src/kernel/mod.rs:190-345` | 注册入口 |