Skip to content

15.5. 内置事件参考:所有系统事件、参数与可改字段

导读 这一节是 第 15 章 事件系统 的配套参考表。第 15 章讲的是“事件系统怎么用、心智模型是什么”,这一节回答另一个更具体的问题:框架到底内置了哪些事件?每个事件发布时 params 里有哪些字段?哪些字段我改了真的会生效? 全节按生命周期 / 消息链路 / Chatter 步进 / 提示词 / LLM / Tool·Action·Command 六组列出,每条都标注“发布者会回写”的字段,方便你判断改动是否真的影响主流程。

15.5.1 先把“可修改”这件事讲准

第 15 章已经强调过:事件系统是链式传递共享参数,你可以改 params 里的字段。但“能改”和“改了有用”不是一回事。

按发布者是否会把你的改动读回去,字段分三类:

标记含义
回写事件链跑完后,发布者会把这个字段读回去并应用到主流程。改它会对系统行为产生真实影响。
链内发布者不读回,但字段会沿链传给后续处理器。改它只影响下游订阅者看到的内容。
纯通知字段,一般只读。改了既不回写也不影响下游(除非下游恰好读它)。

另外两点通用规则:

  • 拦截:几乎所有事件都可以用 EventDecision.STOP 终止后续处理器。但只有当后续处理器里包含“真正干活的订阅者”时,STOP 才有拦截意义(例如 ON_MESSAGE_RECEIVED 后面跟着消息分发器)。下文在每个事件上会单独点出 STOP 是否有实际拦截效果。
  • 结构稳定:无论哪种字段,都不要增删 params 的 key 集合,只能改值。这是第 15.4 节就定下的硬约束。

术语对齐:本节“发布者”指框架内部调用 event_bus.publish(...) 的那一段代码;“订阅者 / 处理器”指你的 BaseEventHandler

15.5.2 系统生命周期事件

这一组事件参数很少,基本是“到点了,通知一声”,几乎没有可改字段。

ON_START"on_start"

  • 何时触发:Bot 完成全部初始化、即将进入主运行循环时(bot.pyrun())。
  • 典型用途:插件做一次性启动初始化、连接外部资源、启动后台任务。
字段类型说明
(无)发布时 params 为空字典 {}
  • 可修改字段:无。这是一个纯通知事件,params 是空的,你只能“听到”,没有可改的东西。
  • 拦截STOP 没有实际意义(后面没有关键订阅者依赖它)。

ON_STOP"on_stop"

  • 何时触发:Bot 开始关闭、但在插件卸载之前。
  • 典型用途:插件在卸载前做收尾清理(关连接、刷盘、停任务)。
字段类型说明
(无)params 为空字典 {}
  • 可修改字段:无。
  • 拦截:无意义。

ON_ALL_PLUGIN_LOADED"on_all_plugin_loaded"

  • 何时触发:所有插件加载并注册完成后触发一次。
  • 典型用途:依赖其他插件组件的初始化(例如 skill_manager 在此刻收集已注册技能)。
字段类型说明
(无)params 为空字典 {}
  • 可修改字段:无。
  • 注意:消息分发器(StreamLoopManager)以低优先级订阅了这个事件来启动自身,所以不要 STOP,否则会话循环可能起不来。

15.5.3 组件与插件生命周期事件

这一组在加载 / 卸载时触发,字段主要是身份信息。

ON_COMPONENT_LOADED"on_component_loaded"

  • 何时触发:任意组件被注册到 Registry 之后。
  • 典型用途:发现别的插件挂上来的组件、做反向索引、延迟绑定依赖。
字段类型说明
signaturestr组件签名,plugin:component_type:component_name
plugin_namestr所属插件名
component_typestr组件类型字符串(tool/action/event_handler …)
component_namestr组件名
component_classtype组件类对象本身
  • 可修改字段:均为链内字段,发布者不回写。改了只影响后续处理器看到的内容。
  • 拦截:一般不拦截。

ON_COMPONENT_UNLOADED"on_component_unloaded"

  • 何时触发:单个组件被注销时。
字段类型说明
signaturestr被卸载组件的签名
plugin_namestr所属插件名
  • 可修改字段:无回写。链内
  • 拦截:一般不拦截。

ON_PLUGIN_UNLOADED"on_plugin_unloaded"

  • 何时触发:整个插件被卸载、其 on_plugin_unloaded() 钩子执行完之后。
字段类型说明
plugin_namestr被卸载的插件名
manifestPluginManifest | None插件清单对象(可能为 None
  • 可修改字段:无回写。链内
  • 拦截:一般不拦截。

15.5.4 消息链路事件

这一组是事件系统最常用的入口,也是真正能“拦截 / 改写消息”的地方。

ON_MESSAGE_RECEIVED"on_message_received"

  • 何时触发:适配器把一条标准消息送进核心后,MessageReceiver 发布。
  • 典型用途:消息审计、内容过滤、改写 message 内容、拦截消息。
字段类型说明
messageMessage标准消息对象
envelopeMessageEnvelope原始消息信封
adapter_signaturestr来源适配器签名
  • 可修改字段
    • message链内(强生效)。发布者本身不回写,但系统消息分发器 _on_message_received 以默认优先级订阅了这个事件,会从 params["message"] 取消息去建流、入未读队列。所以高优先级处理器改 message,分发器看到的就是改后的
    • envelope / adapter_signature链内,仅影响下游订阅者。
  • 拦截STOP实际拦截效果——会阻止消息分发器运行,等于把这条消息“吃掉”不进对话流。这是事件系统做消息拦截的正门。

ON_RECEIVED_OTHER_MESSAGE"on_received_other_message"

  • 何时触发:收到非标准消息(适配器无法直接转成 Message 的内容)时发布,给插件一个把它“翻译成标准消息”的机会。
  • 典型用途:把特殊平台消息(如某种自定义事件)转成可读文本,纳入对话流。
字段类型说明
rawdict原始信封内容
processedstr处理后的可读文本,初始为空串 ""
  • 可修改字段
    • processed回写。发布者会读回这个字段;若非空,就用它构造一条简化 Message 并再发一次 ON_MESSAGE_RECEIVED。这是本事件的核心写入点。
  • 拦截STOP 等价于让 processed 保持空,消息被丢弃。

ON_MESSAGE_SENT"on_message_sent"

  • 何时触发:核心决定发送一条消息、在真正交给适配器之前
  • 典型用途:发送前最后改写、发送风控、拦截发送。
字段类型说明
messageMessage即将发送的消息
envelopeMessageEnvelope发送信封
adapter_signaturestr目标适配器签名
continue_sendbool是否继续发送,初始 True
  • 可修改字段
    • continue_send回写。发布者读回它,若为 False取消本次发送。这是“软拦截”发送的标准做法。
  • 拦截STOP 同样会取消发送(直接不走后续发送逻辑)。

AFTER_MESSAGE_SENT"after_message_sent"

  • 何时触发:平台发送成功、历史持久化完成之后。
  • 典型用途:发送后统计、落库、通知。
字段类型说明
messageMessage已发送的消息
envelopeMessageEnvelope发送信封
adapter_signaturestr目标适配器签名
  • 可修改字段:无回写。链内,纯通知。
  • 拦截:无意义(消息已经发出去了)。

15.5.5 Chatter 步进事件

这一组围绕 Chatter 生成器的每一步。

ON_CHATTER_STEP"on_chatter_step"

  • 何时触发:驱动器取出一个 ConversationTick、即将让 Chatter 生成器步进之前
  • 典型用途:按条件跳过某一步、步进前注入状态。
字段类型说明
stream_idstr聊天流 ID
contextStreamContext流上下文对象
tickConversationTick当前 tick
chatter_gene异步生成器Chatter 会话生成器
continuebool是否继续执行本 tick,初始 True
  • 可修改字段
    • continue回写。发布者读回它,若为 False跳过本次 tick,不调用 Chatter。
  • 拦截STOP 会终止后续处理器;效果上类似把 continueFalse,但更“粗暴”——建议优先用 continue=False

AFTER_CHATTER_STEP"after_chatter_step"

  • 何时触发:Chatter 单步执行完成之后(无论结果是 Wait/Success/Failure/Stop)。
  • 典型用途:步后统计、记忆工具使用跟踪(booku_memory 即订阅此事件)。
字段类型说明
stream_idstr聊天流 ID
contextStreamContext流上下文对象
tickConversationTick当前 tick
chatter_namestrChatter 名称
resultWait | Success | Failure | Stop本步结果对象
result_typestr结果类型名(wait/success/failure/stop
step_datadict | NoneChatter 在结果对象上挂的步骤元数据
(step_data 展开字段)视 Chatter 而定step_data 非空,其键值会被 updateparams 顶层
  • 可修改字段:无回写。链内——step_data 展开出的字段(如 step_scopeused_tools)会传给后续处理器。
  • 拦截:无意义(步子已经跑完了)。

15.5.6 上下文请求与提示词事件

ON_INTERNAL_CONTEXT_REQUESTED"on_internal_context_requested"

  • 何时触发default_chatter 在会话中遇到 internal_context 等待恢复事件,需要向插件索取额外上下文时。
  • 典型用途:插件按 context_key 提供内部上下文片段。
字段类型说明
stream_idstr聊天流 ID
context_keystr请求的上下文键
contentstr上下文文本,初始空串 ""
context_idslist[str]关联上下文 ID 列表,初始 []
  • 可修改字段
    • content回写。发布者读回,作为返回给 Chatter 的文本。
    • context_ids回写。发布者读回,作为关联 ID 列表。
  • 拦截:一般不拦截。

ON_PROMPT_BUILD"on_prompt_build"

  • 何时触发PromptTemplate.build() 真正渲染模板之前
  • 典型用途:往 values.extra 注入内容、改模板、调整渲染策略(booku_memory 的记忆闪回即用此事件)。
字段类型说明
namestr模板名
templatestr模板字符串
valuesdict[str, Any]占位符值映射
policiesdict[str, RenderPolicy]占位符渲染策略
strictbool是否严格模式
  • 可修改字段
    • template回写。改后用新模板渲染。
    • values回写。改后用新值映射渲染(往 values.extra 追加内容是最常见用法)。
    • policies回写。改后用新策略。
  • 拦截:一般不拦截(拦截等于不渲染,会直接静默降级用原模板)。

15.5.7 LLM 请求生命周期事件

这一组三件套围绕一次大模型请求:BEFORE → 成功则 AFTER,重试耗尽则 ON_..._FAILED

BEFORE_LLM_REQUEST"before_llm_request"

  • 何时触发:组装好 payloads / tools / stream、即将调用 provider 的 create() 之前。
  • 典型用途:改请求体、注入/裁剪工具、切换流式开关。
字段类型说明
request_namestr请求名
model_identifierstr模型标识
streambool是否流式
toolslist工具列表
payloadslist[LLMPayload]请求载荷
meta_datadict请求元数据
  • 可修改字段
    • payloads回写(需为 list)。
    • tools回写(需为 list)。
    • stream回写(需为 bool)。
  • 拦截STOP 会跳过后续处理器,但发布者仍按当前 params 发请求;想真正“不发请求”应改 payloads 或在更上层处理。

AFTER_LLM_REQUEST"after_llm_request"

  • 何时触发:大模型请求成功返回、LLMResponse 组装好之后。
  • 典型用途:改写模型回复、调整 reasoning、增删 tool_calls。
字段类型说明
request_namestr请求名
model_identifierstr模型标识
streambool是否流式
successbool是否成功(此事件恒为 True
latencyfloat耗时(秒)
retry_countint重试次数
messagestr | None模型回复文本
reasoning_contentstr | None思维链文本
reasoning_partslist思维链分段
tool_callslist[ToolCall]工具调用列表
usagedict | Nonetoken 用量
meta_datadict请求元数据
  • 可修改字段
    • message回写(需为 strNone)。
    • reasoning_content回写(需为 strNone)。
    • reasoning_parts回写(需为 list)。
    • tool_calls回写(需为 list,元素可为 ToolCalldict)。
  • 拦截:一般不拦截。

ON_LLM_REQUEST_FAILED"on_llm_request_failed"

  • 何时触发:重试耗尽、最终抛出异常之前。
  • 典型用途:记录失败、改写最终抛出的异常。
字段类型说明
request_namestr请求名
model_identifierstr模型标识
payloadslist请求载荷
toolslist工具列表
streambool是否流式
errorBaseException分类后的异常对象
error_typestr异常类型名
error_messagestr异常消息字符串
retry_countint重试次数
latencyfloat耗时(秒)
meta_datadict请求元数据
  • 可修改字段
    • error回写(需为 BaseException 实例)。改后这个异常会被作为最终异常抛出。
  • 拦截:一般不拦截。

15.5.8 Tool / Action / Command 调用生命周期事件

这三类组件共享同一套“BEFORE → 成功 AFTER / 失败 ON_..._FAILED”三段式,字段结构也很像,放在一起看。

Tool 调用

BEFORE_TOOL_CALL"before_tool_call"

字段类型说明
signaturestr工具签名
tool_namestr工具名
tool_descriptionstr工具描述
argsdict调用参数
messageMessage触发调用的消息
  • 可修改字段args回写,需为 dict,会替换实际传给 Tool 的参数)、message回写,非 None 则替换)。

AFTER_TOOL_CALL"after_tool_call"

字段类型说明
signaturestr工具签名
tool_namestr工具名
tool_descriptionstr工具描述
argsdict调用参数
resultAny工具返回值
successbool是否成功
execution_timefloat耗时(秒)
messageMessage触发调用的消息
  • 可修改字段result回写,非 None 则替换返回值)。

ON_TOOL_CALL_FAILED"on_tool_call_failed"

字段类型说明
signaturestr工具签名
tool_namestr工具名
tool_descriptionstr工具描述
argsdict调用参数
errorBaseException异常对象
error_typestr异常类型名
error_messagestr异常消息字符串
execution_timefloat耗时(秒)
messageMessage触发调用的消息
  • 可修改字段:无回写。链内,纯通知(异常照常抛出)。

Action 调用

BEFORE_ACTION_CALL"before_action_call"

字段类型说明
signaturestr动作签名
action_namestr动作名
action_descriptionstr动作描述
argsdict调用参数
messageMessage触发调用的消息
  • 可修改字段args回写,需为 dict)、message回写,非 None 则替换)。

AFTER_ACTION_CALL"after_action_call"

字段类型说明
signaturestr动作签名
action_namestr动作名
action_descriptionstr动作描述
argsdict调用参数
resultAny动作返回值
successbool是否成功
execution_timefloat耗时(秒)
messageMessage触发调用的消息
  • 可修改字段result回写)、message回写)。

ON_ACTION_CALL_FAILED"on_action_call_failed"

字段类型说明
signaturestr动作签名
action_namestr动作名
action_descriptionstr动作描述
argsdict调用参数
errorBaseException异常对象
error_typestr异常类型名
error_messagestr异常消息字符串
execution_timefloat耗时(秒)
messageMessage触发调用的消息
  • 可修改字段:无回写。链内,纯通知。

Command 执行

BEFORE_COMMAND_EXECUTE"before_command_execute"

字段类型说明
signaturestr命令签名
command_namestr命令名
command_descriptionstr命令描述
command_pathstr命令路径
argsdict命令参数
message_textstr传给命令的子路由文本
messageMessage触发命令的消息
  • 可修改字段message_text回写,需为 str,会替换传给命令的文本)、message回写,非 None 则替换)。

AFTER_COMMAND_EXECUTE"after_command_execute"

字段类型说明
signaturestr命令签名
command_namestr命令名
command_descriptionstr命令描述
command_pathstr命令路径
argsdict命令参数
message_textstr子路由文本
resultAny命令返回值
successbool是否成功
execution_timefloat耗时(秒)
messageMessage触发命令的消息
  • 可修改字段result回写)。

ON_COMMAND_EXECUTE_FAILED"on_command_execute_failed"

字段类型说明
signaturestr命令签名
command_namestr命令名
command_descriptionstr命令描述
command_pathstr命令路径
argsdict命令参数
message_textstr子路由文本
errorBaseException异常对象
error_typestr异常类型名
error_messagestr异常消息字符串
execution_timefloat耗时(秒)
messageMessage触发命令的消息
  • 可修改字段:无回写。链内,纯通知。

15.5.9 预留事件

ON_NOTICE_RECEIVED"on_notice_received"

  • 状态:已在 EventType 中定义,但当前核心尚未发布,是为适配器预留的通知通道。
  • 典型用途:适配器可自行用它广播平台通知(如戳一戳、撤回)。注意 onebot_adapter 目前用的是自定义的 OneBotEvent.ON_RECEIVED.* 事件,而非此枚举。
  • 建议:订阅前先确认你的目标适配器是否真的发布了这个事件;插件之间协作优先用自定义事件。

15.5.10 速查总表

下表把所有内置事件压成一行,方便快速回查。“回写字段”列空表示无回写字段(纯通知或空参数)。

事件枚举字符串值何时触发回写字段(改了真生效)STOP 有意义?
ON_STARTon_startBot 启动完成
ON_STOPon_stopBot 开始关闭
ON_ALL_PLUGIN_LOADEDon_all_plugin_loaded所有插件加载完否(会阻断会话循环启动)
ON_COMPONENT_LOADEDon_component_loaded组件注册后一般否
ON_COMPONENT_UNLOADEDon_component_unloaded组件注销时一般否
ON_PLUGIN_UNLOADEDon_plugin_unloaded插件卸载后一般否
ON_MESSAGE_RECEIVEDon_message_received收到标准消息(发布者不回写,但 message 影响下游分发器)(拦截消息入流)
ON_RECEIVED_OTHER_MESSAGEon_received_other_message收到非标准消息processed是(等价丢弃)
ON_MESSAGE_SENTon_message_sent发送前continue_send(取消发送)
AFTER_MESSAGE_SENTafter_message_sent发送成功后
ON_CHATTER_STEPon_chatter_stepChatter 步进前continue可,但优先用 continue=False
AFTER_CHATTER_STEPafter_chatter_stepChatter 步进后
ON_INTERNAL_CONTEXT_REQUESTEDon_internal_context_requested索取内部上下文contentcontext_ids一般否
ON_PROMPT_BUILDon_prompt_build模板渲染前templatevaluespolicies一般否
BEFORE_LLM_REQUESTbefore_llm_requestLLM 请求前payloadstoolsstream可,但请求仍按当前 params 发
AFTER_LLM_REQUESTafter_llm_requestLLM 请求成功后messagereasoning_contentreasoning_partstool_calls一般否
ON_LLM_REQUEST_FAILEDon_llm_request_failedLLM 重试耗尽error一般否
BEFORE_TOOL_CALLbefore_tool_callTool 调用前argsmessage
AFTER_TOOL_CALLafter_tool_callTool 调用后result一般否
ON_TOOL_CALL_FAILEDon_tool_call_failedTool 调用失败
BEFORE_ACTION_CALLbefore_action_callAction 调用前argsmessage
AFTER_ACTION_CALLafter_action_callAction 调用后resultmessage一般否
ON_ACTION_CALL_FAILEDon_action_call_failedAction 调用失败
BEFORE_COMMAND_EXECUTEbefore_command_execute命令执行前message_textmessage
AFTER_COMMAND_EXECUTEafter_command_execute命令执行后result一般否
ON_COMMAND_EXECUTE_FAILEDon_command_execute_failed命令执行失败
ON_NOTICE_RECEIVEDon_notice_received(预留,核心未发布)

最后提醒:所有事件都遵循第 15.4 节的硬约束——返回的 params 必须保留原始 key 集合,只能改值,不能增删字段。回写字段也必须满足发布者校验的类型(如 bool / list / str),否则会被静默忽略。

贡献者

The avatar of contributor named as micraft1024a micraft1024a

页面历史

Released under the GPL-3.0 License.