13 个回调事件,rail 以类为单位挂载、按优先级排序
挂载点在 core 里定义为 AgentCallbackEvent 枚举,覆盖调用前后、外层任务迭代前后、ReAct 迭代结束、用户消息准入、插话队列消费、模型调用与工具调用的前后及异常,共 13 个。第三方代码以 AgentRail 子类的形式挂上来:一个 rail 可以同时注册工具与提示词片段、改写输入、拦截执行,priority 一个数字同时决定 init 顺序和回调顺序(同文件 672 行起)。harness/rails/ 下已有安全、中断确认、任务完成、技能、子代理等十几种 rail。注意 AFTER_REACT_ITERATION 只在完整成功的迭代后触发,任何提前退出的路径都不会触发。
- 适合
- 要把安全、审批、任务完成等横切能力打包成可复用组件的团队。
- 代价
- 事件要在内外两层 Agent 之间正确路由,漏了不会报错、只会静默失效。
此后的变化
- 2026-W38 →
新增 AgentRail.callback_priority(event),允许同一个 rail 为不同事件声明不同的钩子优先级,而不必更改其整体注册顺序,修复了可观测性 rail(优先级 10)结束工具 span 早于 evolution rail(优先级 60+)排空订阅、导致 AFTER_TOOL_CALL 触发条件从未真正触发的问题。本格此前只描述 rail 是按优先级排序的类,未涉及「同一个 rail 内不同事件可有不同优先级」这层细节。
class AgentCallbackEvent(str, Enum):
"""Agent callback event types for agent lifecycle.
Lifecycle Callbacks:
BEFORE_INVOKE: Before agent.invoke() starts
AFTER_INVOKE: After agent.invoke() completes
BEFORE_TASK_ITERATION: Before one outer task-loop iteration starts
AFTER_TASK_ITERATION: After one outer task-loop iteration completes
AFTER_REACT_ITERATION: After one inner ReAct iteration completes
(LLM + all tool calls + ToolMessage writes). Only fires on
fully successful iterations, not on any break path.
Input Callbacks:
ON_USER_MESSAGE: Before one consumed input (a new round's query, a
follow-up, a steering message, or a resumed workflow interrupt)
is written into the conversation. Rails may rewrite its content;
see :class:`UserMessageInputs`.
BEFORE_STEERING_DRAIN: Before pending steering messages are taken off
the queue, and only when some are pending. Rails cap how many this
model call absorbs; see :class:`SteeringDrainInputs`.
Model Interaction Callbacks:
BEFORE_MODEL_CALL: Before LLM is called
AFTER_MODEL_CALL: After LLM response is received
ON_MODEL_EXCEPTION: When LLM call raises
Tool Execution Callbacks:
BEFORE_TOOL_CALL: Before a tool is executed
AFTER_TOOL_CALL: After a tool execution completes
ON_TOOL_EXCEPTION: When tool execution raises
"""
BEFORE_INVOKE = "before_invoke"
AFTER_INVOKE = "after_invoke"
BEFORE_TASK_ITERATION = "before_task_iteration"
AFTER_TASK_ITERATION = "after_task_iteration"
AFTER_REACT_ITERATION = "after_react_iteration"
ON_USER_MESSAGE = "on_user_message"
BEFORE_STEERING_DRAIN = "before_steering_drain"
BEFORE_MODEL_CALL = "before_model_call"
AFTER_MODEL_CALL = "after_model_call"
ON_MODEL_EXCEPTION = "on_model_exception"
BEFORE_TOOL_CALL = "before_tool_call"
AFTER_TOOL_CALL = "after_tool_call"
ON_TOOL_EXCEPTION = "on_tool_exception"