OpenHuman Trigger Reactor 设计解析:面向外部触发事件的窄域反应 Agent 提示词与实现
发布时间:2026/9/10 4:54:53 作者:尧图编辑部 阅读量:1,286

OpenHuman Trigger Reactor 设计解析面向外部触发事件的窄域反应 Agent 提示词与实现【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman导读OpenHuman 的 Trigger Reactortrigger_reactor是一个被 Trigger Triage 分类器按需调度的窄域专家它不为外部触发器规划完整响应而是以 1~2 次工具调用完成一次小型反应副作用——写一条记忆笔记、标记某条通知已处理、发出一个跟进动作一旦发现任务超出预估就立即升级给 Orchestrator。本文以 src/openhuman/agent/registry/agents/trigger_reactor/prompt.md 为核心骨架结合其 agent 配置、prompt 构建器、triage 决策解析、升级派发与事件契约等源码实现完整讲解该 Agent 的职责边界、执行路径、约束、输出契约与底层原理并给出可复用的配置与排查指引。一、Trigger Reactor 在整个触发器链路中的位置OpenHuman 会收到来自多种外部系统的触发器事件Composio Webhook、定时任务cron、入站 Webhook 隧道、任务板卡片等。这些事件首先被包装成统一的TriggerEnvelope见 src/openhuman/agent/triage/envelope.rs随后进入run_triage → apply_decision的决策管线。分类器trigger_triage提示词见 src/openhuman/agent/registry/agents/trigger_triage/prompt.md负责给出四选一的决策动作语义下游处理drop噪音、重复、垃圾、完全无关仅记录日志无下游工作acknowledge值得记住但无需 Agent 行动仅记录日志未来补记忆写入react需要一次窄幅单步副作用派发trigger_reactor子 Agentescalate需要推理、多步骤、多技能派发orchestrator子 Agent其中react正是 Trigger Reactor 的用武之地当动作足够简单一个小型工具型 Agent 用一两次工具调用就能完成时分类器会把任务交给它而不是交给重型规划器。二、职责定位只做反应不做规划prompt.md对 Trigger Reactor 的身份定义非常明确You are theTrigger Reactor— a narrow specialist ... the person who writes a one-sentence memory note, marks a notification as handled, or fires a single follow-up — not the person who plans a whole response.换句话说它把自己类比为写一句话便签、勾掉一条通知、发出单个跟进的人而不是规划整场响应的人。它的定位决定了它与 Orchestrator 的本质区别React 是执行Escalate 才是规划。它是如何被调用的prompt.md说明了调用上下文分类器triage classifier判定该触发器值得一次小型反应既不是drop也不是深度升级到 orchestrator分类器写好的任务提示词作为用户消息user message传入其中包含触发器的来源source、标签label和关键载荷字段payload fields该任务消息之上的系统提示词system prompt已由标准的 prompt 构建器注入用户当前的记忆 / 工作区上下文用于判断触发器是否与用户正在做的工作相关。这条用户消息由分类器生成的契约在 src/openhuman/agent/triage/escalation.rs 中得到印证dispatch_target_agent从分类器决策中取出target_agent与prompt通过subagent_runner::run_subagent(definition, prompt, ...)把该 prompt 作为任务下发给目标 Agent。三、两条执行路径React 与 Escalateprompt.md明确规定了 Reactor 只有两条可走的路路径一React反应用一次、最多两次工具调用执行反应然后返回简短确认。典型形态持久化记忆笔记调用memory_store汇总触发器内容先回忆再决定调用memory_recall检索既有上下文再决定是否存储任何东西读取工作区状态调用read_workspace_state为反应提供落地依据链式两次调用如果第一次调用提示你反应应该不同可以把上述两个调用串联起来。从 src/openhuman/agent/registry/agents/trigger_reactor/agent.toml 的工具白名单可以看到Reactor 的工具面被刻意收窄为三个memory_store、read_workspace_state、spawn_subagent。其中写路径memory_store与读路径memory_recall在 src/openhuman/agent/harness/memory_protocol.rs 中被归类为MemoryOp::Write/ 读取操作且注释明确要求写入前先调用memory_recall避免重复创建条目。路径二Escalate升级如果 Reactor 发现自己要做的反应实际上比分类器预估的更大——例如触发器关联多步骤工作流、需要多技能编排、或需要自己做不了的决定——就调用spawn_subagent传agent_id: orchestrator和完整的任务描述然后在 orchestrator 返回后停止。该升级在运行时层面由 src/openhuman/agent/harness/subagent_runner/tool_prep.rs 的is_subagent_spawn_tool识别spawn_subagent以及delegate_*与agent_prepare_context等派生工具并在 src/openhuman/agent/harness/session/builder/mod.rs 的should_synthesize_delegation_tools中为ToolScope::Named且名单含spawn_subagent的 Agent 合成派发工具。四、四类绝对禁止事项prompt.md用四组负面约束划定了 Reactor 的行为边界这些约束同时是运维调试的重要依据不要规划。如果即将写下一串步骤列表说明派错 Agent 了——升级给 orchestrator。不要串联超过约 3 次工具调用。Reactor 回合一旦膨胀几乎总是升级形状的任务在伪装。不要重新解读 triage 决策。分类器已经判定这是react而非drop如果你认为它看起来像噪音写一行记忆笔记承认你看到过它然后停止——不要对你没创建过的东西调用memory_forget。不要向用户提问澄清。这一回合运行在总线派发的任务中没有用户可回答无法决定就升级。第 2 条与agent.toml中的max_iterations 6形成提示词软约束 配置硬上限的双层防护即使模型偶尔失控回合也会在 6 次迭代处被强制截断。五、输出契约简短、可 grep、动词开头prompt.md要求 Reactor 在工具调用后返回一段 1~3 句话的短段落描述自己做了什么。这段文本会进入TriggerEscalated事件载荷和 ops 仪表盘因此要求保持简短terse便于 grepgrep-friendly以动词开头例如 Persisted a memory note about…、Escalated to orchestrator because…。在事件层面src/core/events.rs 的DomainEvent::TriggerEscalated携带source、external_id、display_label、target_agent四个字段——Reactor 的输出文本正是被这类事件承接供仪表盘与审计使用。六、配置详解agent.toml 逐项拆解src/openhuman/agent/registry/agents/trigger_reactor/agent.toml 完整定义了 Reactor 的运行时参数配置项值含义idtrigger_reactor注册在 AgentDefinitionRegistry 中的定义 IDdisplay_nameTrigger Reactor展示名when_to_use执行小型反应动作供分类器 / 人类判断何时派发的描述temperature0.3低随机性保证反应动作稳定可预期max_iterations6单回合最大工具调用迭代硬上限sandbox_modenone不进入沙箱写路径工具需要真实环境omit_identitytrue省略身份段——它是程序化调用的窄域专家不是一线 Agentomit_memory_contextfalse保留记忆 / 工作区段用于落地反应omit_safety_preamblefalse保留安全前导omit_profilefalse保留 PROFILE.md——用于个性化小消息如替用户发出跟进 DM提供姓名、角色、语气omit_memory_mdfalse保留 MEMORY.md 的策展上下文每个会话冻结omit_memory_md的 KV 缓存契约trigger_memory_agentalways每次回合都触发记忆 Agent 同步model.hintagentic总是走远程模型反应工作命中写路径工具需要可靠的原生工具调用1B 级本地模型无法胜任agentic提示经常规RouterProvider路由到后端的 agentic 层级tools.namedmemory_store、read_workspace_state、spawn_subagent刻意收窄的工具白名单配置文件中的注释揭示了关键设计取舍Reactor 的写路径工具memory_store等对模型工具调用可靠性要求高因此强制远程模型hint agentic同时omit_identity true表明它不是面向用户的一线 Agent而是被程序化调用的内部组件。七、源码实现prompt 是如何装配出来的Reactor 的提示词并非直接以文件形式发送给模型而是通过 src/openhuman/agent/registry/agents/trigger_reactor/prompt.rs 的build()函数动态装配const ARCHETYPE: str include_str!(prompt.md); pub fn build(ctx: PromptContext_) - ResultString { let mut out String::with_capacity(4096); out.push_str(ARCHETYPE.trim_end()); // 1. 架构提示词本文主体 // 2. 用户文件段PROFILE.md / MEMORY.md let user_files render_user_files(ctx)?; // 3. 工具目录段按工具的调用格式渲染 let tools render_tools(ctx)?; // 4. 工作区段工作目录 文件列举边界 let workspace render_workspace(ctx)?; Ok(out) }各分段渲染器位于 src/openhuman/agent/prompts/render_helpers_part_01.rsrender_user_files负责PROFILE.mdMEMORY.md注入对应agent.toml中omit_profile false/omit_memory_md falserender_tools渲染工具目录render_workspace渲染工作区块。装配顺序即模型实际看到的顺序runner 不再做任何后处理。该 Agent 的注册在 src/openhuman/agent/registry/agents/loader.rs通过include_str!(trigger_reactor/agent.toml)与prompt_fn: super::trigger_reactor::prompt::build绑定模块出口在 src/openhuman/agent/registry/agents/mod.rs。八、上游triage 决策的容错解析Reactor 被派发的前提是分类器给出了可解析的react决策。src/openhuman/agent/triage/decision.rs 的parse_triage_decision对小型本地模型如gemma3:1b-it-qat常见的输出瑕疵做了系统性容错优先提取最后一个json 围栏块小模型常在 JSON 后追加评论无围栏时做括号配对提取最后一个平衡的{ … }对象兼容 Heres my decision: { … }剥离尾逗号,}→}、,]→]动作值小写化Drop→drop配合#[serde(rename_all lowercase)]校验不变量React/Escalate必须同时具备target_agent与prompt否则返回ParseError::MissingTarget触发远程重试。其中TriageAction枚举decision.rs的requires_target()正是解析器拒绝缺目标的 React/Escalate 回复的依据。这一层容错保障了即使是小模型也能稳定产出驱动 Reactor 的决策。九、下游决策副作用与升级派发triage/escalation.rs 的apply_decision是决策的副作用执行器Reactor 相关流程为始终发布TriggerEvaluated计数一切触发器是仪表盘的唯一事实来源字段含used_local、latency_ms见 events.rsdrop/acknowledge仅记录日志若触发器关联任务板卡片还会把卡片终态门控为Rejected防止板轮询器在下一 tick 重新派发gate_linked_card_terminalreact/escalate走统一派发路径若信封带card_link改走确定性任务调度器claim → 自主运行 → 写回否则经过外部效果审批门approval gateReact / Escalate会代表用户调用外部效果工具这里先让用户整体批准/拒绝整个升级而不是逐个工具放行——工具循环层仍保留逐工具门控形成纵深防御代码注释标注为 #1339通过审批后调用dispatch_target_agent构建完整Agent含 provider、工具注册表、记忆后端安装ParentExecutionContext仅允许嵌套派发目标 Agent 本身最终经run_subagent执行成功发布TriggerEscalated失败发布TriggerEscalationFailed字段见 events.rs。代码注释还给出了成本模型react/escalate触发器相对稀少多数是drop/acknowledge因此即使构建完整Agent较重其成本也是可接受的。十、触发器信封Reactor 收到的输入长什么样TriggerEnvelopesrc/openhuman/agent/triage/envelope.rs是贯穿整条管线的统一数据结构包含source来源枚举目前支持Composio、WebviewIntegration、Webhook、Cron、External五类source_str()见 envelope.rsexternal_id来源稳定的单次发生 IDComposio 用metadata.uuidWebhook 用隧道 IDcron 用 job ID作为事件关联 IDdisplay_label人类可读单行标签如composio/gmail/GMAIL_NEW_GMAIL_MESSAGEpayload来源原始载荷分类前在 evaluator 中被截断到约 8 KB防止超大 Gmail 正文撑爆小模型上下文received_at接收时间戳用于计算latency_mscard_link当触发器对应任务板卡片时设置引导升级路径改走确定性调度器。配套的构造器from_composio/from_webhook/from_cron/from_external在 envelope.rs并有完整单元测试envelope_tests.rs覆盖各来源的字段映射。十一、与 Orchestrator 的分工边界理解 Reactor 的关键是对照 Orchestrator。src/openhuman/agent/registry/agents/orchestrator/prompt.md 展示了重型规划器的能力面plan工具做多步任务分解、spawn_async_subagent做并行工作线程、request_plan_review在动手前请求用户审阅计划并执行严格的派发层级chat → worker 或 chat → reasoning → worker禁止同层委托。对照可见Reactor单步、窄工具面、低温度、不提问、不规划、1~2 次调用即收尾Orchestrator多步分解、多技能编排、并行派发、交互式计划审批。triage提示词给出的取舍原则是react用于单技能单步动作一旦工作触及多个技能、或需要超出已提供上下文的记忆查找就优先escalate。十二、测试与验证Reactor 的提示词构建器配有单元测试 src/openhuman/agent/registry/agents/trigger_reactor/prompt_tests.rsbuild_returns_nonempty_body以最小PromptContext空工具集、空可见名单、PFormat 调用格式调用build()断言装配出的系统提示词非空。此外triage 决策解析decision_tests.rs、升级派发escalation_tests.rs与事件events_tests.rs均有独立测试覆盖为分类器 → Reactor整条链路提供回归保障。十三、总结与进一步阅读Trigger Reactor 是 OpenHuman 触发器处理体系中的轻量执行层它以一份精心设计的系统提示词prompt.md约束模型只做 1~2 次调用的反应以 agent.toml 的窄工具面、低温度、迭代上限和远程模型路由提供运行时保障并由 triage 决策解析、审批门控、事件契约与测试构成完整的工程闭环。阅读本文后可继续深入以下文件分类器提示词src/openhuman/agent/registry/agents/trigger_triage/prompt.md四分类决策与 JSON 输出契约决策解析src/openhuman/agent/triage/decision.rs容错解析算法副作用与派发src/openhuman/agent/triage/escalation.rs审批门、任务板路径、sub-agent 派发事件契约src/core/events.rsTriggerEvaluated/TriggerEscalated/TriggerEscalationFailed记忆协议src/openhuman/agent/harness/memory_protocol.rsmemory_store/memory_recall/memory_forget的读写归类【免费下载链接】openhumanOpenHuman is an open source personal AI for Mac, Windows and Linux — local-first memory, agent orchestration, and deep research.项目地址: https://gitcode.com/GitHub_Trending/op/openhuman创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考