Hook 与 Critic 的区别
QitOS 有两种运行在不同层面的扩展机制:
当你需要记录日志、追踪、采集指标或触发外部通知时,使用 Hook。当你需要约束或覆盖智能体行为时,使用 Critic。
Step 1: EngineHook 基类
每个 Hook 都继承自EngineHook。基类为每个生命周期回调定义了空操作方法,因此你只需覆盖需要的方法。
示意片段(非独立程序;完整执行文件见本页链接)。
在步骤循环之外触发的额外生命周期回调:
所有空操作方法返回
None。只需覆盖你关心的回调。
Step 2: HookContext 与 ToolHookContext
每个步骤级回调都接收一个HookContext 数据类,它携带了 Hook 可能需要的所有信息:
示意片段(非独立程序;完整执行文件见本页链接)。
ToolHookContext,它在 HookContext 基础上扩展了工具特有的字段:
示意片段(非独立程序;完整执行文件见本页链接)。
phase 字段来自 RuntimePhase 枚举:
示意片段(非独立程序;完整执行文件见本页链接)。
Step 3: 编写自定义日志 Hook
一个常见用例是记录每个阶段转换,以便后续分析。下面是一个LifecycleRecorderHook,它为每个回调记录时间戳和步骤 ID:
示意片段(非独立程序;完整执行文件见本页链接)。
LifecycleRecorderHook 添加到任何运行都是安全的,不会产生副作用。
Step 4: 工具级 Hook
工具级 Hook 围绕单次工具调用触发,让你可以精细地观察智能体调用了哪些工具以及它们的返回值。 示意片段(非独立程序;完整执行文件见本页链接)。
使用
on_permission_denied 来监控安全边界,而无需修改权限系统本身。
Step 5: 在 Engine 上注册 Hook
在调用run() 之前,将 Hook 注册到 Engine 实例上:
示意片段(非独立程序;完整执行文件见本页链接)。
完整生命周期图
on_recover 代替该步骤的其余回调触发,Engine 可能根据配置决定重试或中止。
相关指南:Critic
了解 Critic 与 Hook 的区别,以及如何使用 Critic 进行控制流和决策门控。
下一篇教程:多智能体系统
构建包含协调者和工作者智能体的系统,实现任务的并行调度。
