请求生命周期#
了解钩子的顺序,才能选对钩子。每个阶段都会对所有扩展执行完毕,才进入下一阶段;扩展按 priority 升序运行(数值小的先执行)。
new request
│
on_tool() register the tools this request can call
│
on_state() restore history and inject system instructions
│
on_message() transform the pending user input
│
append input
│
before_run()
│
turn 1..n before_turn() → model step → tools → after_turn()
│
after_run() → on_success() → RUN_COMPLETED
由于 on_tool 总是在 on_state 之前完成,提供 guidelines 的扩展可以描述每一个工具,无论它是哪个扩展注册的。优先级只改变同一阶段内部的顺序。
一个轮次#
before_turn()
│
before_model(context, request) adjust context before this model call
│
model streams deltas → final response
│
after_model()
│
├─ no tool calls ─▶ after_turn() ─▶ final answer
│
└─ tool calls ────▶ before_tool() ─▶ run tool ─▶ after_tool()
│
after_turn() ◀───────┘
│
next turn
在任何钩子里都可以用 await context.emit(AgentEvent(...)) 发出 UI 进度,正在消费 Agent.stream() 的一方就能看到这个事件。
该用哪个钩子?#
钩子 |
用途 |
|---|---|
|
注册请求级工具。 |
|
恢复历史记录,并添加系统指令。 |
|
在用户输入发送出去之前改写它。 |
|
必须在模型调用前一刻改变的内容,包括压缩。 |
|
读取响应、用量,或记录检查点。 |
|
审批、改写或观察一次工具调用。 |
|
持久化结果并释放请求级状态。 |
|
在失败或取消之后做清理。 |
成功、失败与取消#
清理需要覆盖这三条路径:
模型或钩子出错时会调用
on_error,并向上抛出原始异常。取消请求会发布
RunCancelledEvent;on_error和on_success都不会运行。工具失败则不同:它会变成一条失败的工具结果,让模型能据此应对,而不是让整个请求失败。