Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
AUDIT_TRACKER: V13-GAP-01~05 FIXED, GAP-06 PARTIALLY_FIXED wiki/middleware: 15层 (TrajectoryRecorder V13注册) wiki/log: 2026-04-13 变更记录 CLAUDE.md: 中间件链 14→15 层 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.3 KiB
4.3 KiB
title, updated, status, tags
| title | updated | status | tags | |||
|---|---|---|---|---|---|---|
| 中间件链 | 2026-04-11 | active |
|
中间件链
设计思想
中间件是请求处理的管道,按优先级顺序执行。
- 优先级 0-999,数值越小越先执行(
middleware.rs按升序排列) - 每层中间件实现
AgentMiddlewaretrait,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()
核心接口
// 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<MiddlewareDecision>;
async fn before_tool_call(&self, ctx: &MiddlewareContext, tool_name: &str, tool_input: &Value) -> Result<ToolCallDecision>;
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 |
注册入口 |