Hook 是 QitOS 中首要的运行时扩展点。它们让你在不修改智能体本身的情况下,观察并对 Engine 内部的每个阶段转换做出反应。本教程覆盖完整的 Hook 生命周期、Hook 接收的上下文对象,以及如何编写步骤级和工具级的 Hook。Documentation Index
Fetch the complete documentation index at: https://qitor.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Hook 与 Critic 的区别
QitOS 有两种运行在不同层面的扩展机制:| 机制 | 角色 | 能否修改流程? |
|---|---|---|
| Hook | 观察与副作用 | 不能 — Hook 只被通知,不参与控制 |
| Critic | 控制与门控 | 能 — Critic 可以否决或修改决策 |
Step 1: EngineHook 基类
每个 Hook 都继承自EngineHook。基类为每个生命周期回调定义了空操作方法,因此你只需覆盖需要的方法。
| 回调 | 触发时机 |
|---|---|
on_run_start(task, state, engine) | 第一个步骤开始之前 |
on_before_step(ctx, engine) | 步骤开始之前 |
on_before_decide(ctx, engine) | 调用 LLM 之前 |
on_after_decide(ctx, engine) | LLM 返回决策之后 |
on_before_act(ctx, engine) | 执行动作之前 |
on_after_act(ctx, engine) | 动作执行完毕之后 |
on_before_critic(ctx, engine) | Critic 运行之前 |
on_after_critic(ctx, engine) | Critic 运行完毕之后 |
on_before_reduce(ctx, engine) | reduce() 将结果归约到状态之前 |
on_after_reduce(ctx, engine) | reduce() 完成之后 |
on_before_check_stop(ctx, engine) | 评估停止条件之前 |
on_after_check_stop(ctx, engine) | 评估停止条件之后 |
on_after_step(ctx, engine) | 步骤完全结束后 |
on_recover(ctx, engine) | Engine 从错误中恢复时 |
on_run_end(result, engine) | 最终步骤完成之后 |
| 回调 | 触发时机 |
|---|---|
on_session_start(ctx, engine) | 交互式会话开始时 |
on_session_end(ctx, engine) | 交互式会话结束时 |
on_before_compact(ctx, engine) | 上下文压缩运行之前 |
on_after_compact(ctx, engine) | 上下文压缩完成之后 |
on_event(event, state, record, engine) | 每次发射 RuntimeEvent 时 |
on_step_end(record, state, engine) | StepRecord 完成归档时 |
None。只需覆盖你关心的回调。
Step 2: HookContext 与 ToolHookContext
每个步骤级回调都接收一个HookContext 数据类,它携带了 Hook 可能需要的所有信息:
ToolHookContext,它在 HookContext 基础上扩展了工具特有的字段:
phase 字段来自 RuntimePhase 枚举:
Step 3: 编写自定义日志 Hook
一个常见用例是记录每个阶段转换,以便后续分析。下面是一个LifecycleRecorderHook,它为每个回调记录时间戳和步骤 ID:
LifecycleRecorderHook 添加到任何运行都是安全的,不会产生副作用。
Step 4: 工具级 Hook
工具级 Hook 围绕单次工具调用触发,让你可以精细地观察智能体调用了哪些工具以及它们的返回值。| 回调 | 上下文 | 用途 |
|---|---|---|
on_before_tool_use | ToolHookContext(尚无 tool_result) | 在执行前记录或校验 |
on_after_tool_use | ToolHookContext(包含 tool_result) | 检查或记录结果 |
on_permission_denied | ToolHookContext(包含 permission_decision) | 追踪被拒绝的工具调用 |
on_permission_denied 来监控安全边界,而无需修改权限系统本身。
Step 5: 在 Engine 上注册 Hook
在调用run() 之前,将 Hook 注册到 Engine 实例上:
完整生命周期图
on_recover 代替该步骤的其余回调触发,Engine 可能根据配置决定重试或中止。
相关指南:Critic
了解 Critic 与 Hook 的区别,以及如何使用 Critic 进行控制流和决策门控。
下一篇教程:多智能体系统
构建包含协调者和工作者智能体的系统,实现任务的并行调度。
