---
doc-schema-version: 1
summary: "公告、Webhook 和无传递模式、故障警报和输出语言"
read_when:
- "将自动化输出路由到通道或 Webhook"
- "调整失败通知、阈值和冷却时间"
- "修复以错误语言回复的自动化"
title: "自动化交付"
sidebarTitle: "送货"
---
完成的运行发送其输出的位置、运行或交付失败时会发生什么,以及如何固定回复语言。 [Automations](/automation/cron-jobs) 指南的一部分。
## 交付与输出
| 模式 | 会发生什么 |
| ---------- | ------------------------------------------------------------------ |
| `announce` | 发送结果,然后在目标记录确认的交货 |
| `webhook` | 将完成事件载荷 POST 到一个 URL |
| `none` | 没有自动对话结果或通知 |
没有非空摘要的成功主 Webhook 运行会故意跳过 POST 并记录 `deliverySuppressionReason: "empty"`,以匹配公告交付的可选输出合同。即使没有摘要,执行错误仍然会发送错误事件。
主 Webhooks 在 HTTP 2xx 确认后记录传送。一条HTTP拒收记录**未交付**。如果请求可能已到达接收方,但其响应丢失或超时,则传送保持 **Unknown**;传输不会重试该不明确的发送。要求的交付也会导致完成情况未知,而尽力交付可以在不要求交付的情况下成功完成。
配置 `gateway.publicOrigin` 并启用 Control UI 时,聊天通知将包含指向 Control UI 的 `Inspect` 链接。命令和脚本完成公告打开自动化运行;孤立的代理公告打开运行会话。
对于 `announce`,接收结果的聊天拥有它。在通道确认传送后,使用通道转换和挂钩后实际发送的内容将结果添加到对话中。 OpenClaw 将一条助理消息写入该聊天记录中,以便下一个回复可以将其用作上下文。结果记录其作业并运行;重试不会重复它,并且 OpenClaw 在提交之前等待活动轮次。目标创建和记住的路线更新仅在确认交付后进行;新创建的目标继承源会话所需的沙箱策略。
新提交的可见结果会刷新目标的空闲新鲜度,因此空闲窗口内的回复会保留预定的问题。重播相同的结果、静默运行以及失败或不确定的交付不会刷新它。重复出现的可见结果可以使目标保持新鲜感;每日重置仍使用会话开始时间。
- 发送到创建的聊天将结果写入那里。
- 传送到不同的聊天或主题只会将结果 **写入目标**,而不写入创建聊天。
- 如果没有外部路由,例如 WebChat- 创建的作业,则创建会话会收到结果。
- 通过 CLI 或更早版本创建的作业在传递到聊天时也会获得目标转录,即使没有创建对话。
- `none`和`webhook`不写入对话结果。
如果目标聊天属于不同的客服人员,则会发送结果,但不会添加到任一客服人员的对话中。不带文本投影的通道本机有效负载在发送时不带对话条目并记录警告。
执行上下文是独立的:`isolated` 在没有对话历史记录的情况下启动,`current` 在分离运行中读取有界创建对话上下文,而 `session:` 使用持久执行会话。专用运行记录和工具历史记录不会复制到目标中。当持久执行会话已经是目标会话时,其最终辅助消息就是结果; OpenClaw 不附加第二个副本。
编辑显式传递坐标会将未来的结果移至该聊天或主题。捕获的创建会话绑定保持不可变;更改公共 `sessionKey` 不会重定向隐式传递。对于显式外部目标,启动新会话或重置目标聊天不会停止传递:结果将进入该聊天的当前会话。隐式创建者绑定传递要求在解析记住的外部路由之前捕获的创建对话存在并与其生成相匹配。隐式代理轮流公告通过发送和恢复保留该生成;无路由 WebChat 结果在提交时也需要它。如果创建对话已删除或重置,请重新创建作业或配置显式外部目标。命令和脚本公告会保留已解析的路由,而无需进行源生成检查,以匹配其现有行为。取消不会中断目标的活动转弯。经过验证的匹配 `message` 工具发送会抑制自动重新发送,而不是对话结果。
在没有外部路由的情况下,对话提交本身完成传递。 WebChat 立即收到提交的结果,并在重新连接后从 `chat.history` 返回相同的消息。失败或不确定的外部发送不会添加对话结果。不确定的发送会记录警告并且不会盲目重播。如果通道确认传送但对话写入失败,则传送仍然成功,并且运行会记录一条警告,表明结果未添加到对话中。
对话结果和通知共享静默回复处理。抑制标题会保留附加媒体,并且内部控制令牌不会出现在历史记录中。 `none` 禁用自动结果和通知;主要 `webhook` 交付仍然是仅外部模式。
请勿设置`delivery.channel: "webchat"`:内部对话坐标不是通道传递目标。保留外部路由未设置以传递到创建的 WebChat 会话。
每个出站自动化 Webhook 都使用严格的 SSRF 防护。对于主传递、完成和失败目标以及失败警报 Webhook,默认情况下会拒绝环回、private/internal、链接本地和其他特殊用途目标。
仅允许通过精确的主机名或 IP 豁免来指定你信任的接收方:
```json5
{
cron: {
webhookSsrfPolicy: {
allowedHostnames: ["127.0.0.1"],
},
},
}
```
仅当每个配置的自动化 Webhook 都可以访问受信任的专用网络服务时,才在 `webhookSsrfPolicy` 下使用 `dangerouslyAllowPrivateNetwork: true`。不制定政策会保持严格的行为。
使用`--announce --channel telegram --to "-1001234567890"`进行渠道投放。对于Telegram论坛主题,使用`-1001234567890:topic:123`; OpenClaw 还接受 Telegram- 拥有的 `-1001234567890:123` 简写。直接 RPC/config 调用者可以将 `delivery.threadId` 作为字符串或数字传递。 Slack/Discord/Mattermost 目标使用显式前缀(`channel:`、`user:`)。 Matrix 房间ID区分大小写;使用 Matrix 中的确切房间 ID 或 `room:!room:server` 表格。
要在 Control UI 自动化编辑器中发布通知,请在 **Advanced** 下选择一个通道和一个显式 **Account ID**,以查看 **To** 中配置的对话目标场。选择目标会保留您选择的帐户,并且不会推断主题。这些配置的建议仅适用于主要公告目标;故障警报路由仍然是独立的。您仍然可以输入建议中没有的目标。
在具有多个配置通道的主机上,使用 `automations add|create` 创建或使用 `automations edit` 更改的隔离通告作业必须设置 `--channel `,除非提供商前缀 `--to` 或保留的会话路由选择通道。仅当未解决的回退交付可接受时才使用 `--best-effort-deliver`;它不选择通道,并且交付失败不会导致作业失败。
仅当没有有效负载到达接收者时,通道公告才会重试瞬时故障。成功的重试会记录传送,而不会保留先前尝试的错误,包括尽力传送。公告重试循环不会重播部分或不明确的发送。
当 announce 交付使用 `channel: "last"` 或省略 `channel` 时,诸如 `telegram:123` 这样的提供方前缀目标可以在调度程序回退到会话历史或单个已配置频道之前选择频道。只有已加载插件所公布的前缀才是提供方选择器。如果 `delivery.channel` 已明确指定,则目标前缀必须指向同一提供方;`channel: "whatsapp"` 搭配 `to: "telegram:123"` 会被拒绝,而不会让 WhatsApp 将 Telegram ID 解释为电话号码。目标类型和服务前缀(`channel:`、`user:`、`imessage:`、`sms:`)仍然是由频道负责的目标语法,而不是提供方选择器。
对于孤立的作业,聊天传递是共享的:如果聊天路由可用,则座席甚至可以使用 `message` 工具,甚至可以使用 `--no-deliver`。如果代理发送到 configured/current 目标,OpenClaw 会跳过回退公告。否则,`announce`、`webhook` 和 `none` 仅控制跑步者在智能体转弯后对最终回复执行的操作。
计划的 `message` 操作使用拥有实时运行的网关。保留作业的帐户、渠道、目标和配置的传递路由,但不提供每次调用 `gatewayUrl` 或 `gatewayToken` 字段。普通和独立的消息调用仍然可以使用这些字段。要恢复其提示或模板提供的现有受信任作业,请仅编辑该提示或模板以删除这两个字段,然后再次运行相同的作业。网关操作会报告 `Scheduled message actions require the active bound Gateway. Remove per-call gatewayUrl and gatewayToken fields and retry.`,直到这些字段被删除;如果没有调度程序主机绑定,它会报告 `Scheduled message actions require an active bound Gateway.` 在其所属的网关上运行作业,而不是将连接字段复制到提示中。然后,下一次发送将使用实时绑定,包括当前取消和工具策略撤销。
当代理从活动聊天创建一个隔离提醒时,OpenClaw 会为回退 announce 路由存储保留的实时交付目标。内部会话键可能是小写;当当前聊天上下文可用时,不会根据这些键重建提供方交付目标。
隐式 announce 交付会使用已配置的频道允许列表来验证并重定向过时目标。DM 配对存储中的批准不是回退自动化接收者;当计划作业应主动发送到某个 DM 时,请设置 `delivery.to` 或配置频道的 `allowFrom` 条目。
### 失败通知
当请求可能已到达接收方但其响应丢失时,故障警报 Webhooks 保持 **Unknown**。明确的 HTTP 拒绝或失败证明在发送记录 **未交付** 之前,并允许应用程序内回退通知,包括当网关工作准入在传输开始之前拒绝警报时。未知的结果不会触发这种回退。
即使模型支持的运行的最终答复表明请求的任务被阻止或无法完成,模型支持的运行也可以成功完成。调度程序不会从辅助语句中推断执行失败。这样的回复遵循正常传递:`announce` 发送它,`none` 保持沉默,`NO_REPLY` 抑制纯文本公告,而不会导致运行失败。阻止程序报告本身不会增加执行失败次数、触发错误回退或请求失败警报或所有者对话修复。运行时错误,例如提供程序失败和执行超时,仍然使用下面的失败策略。
执行失败使用调度程序拥有的一种阈值和冷却策略。具有现有失败路线的作业在连续 2 次失败并有 1 小时冷却时间后默认会被覆盖。该路由可以是已解决的故障目标或作业的主要公告目标。没有此类路由的作业将保持安静,除非每个作业或全局 `failureAlert` 对象显式激活该策略。
在永久故障或耗尽重试后禁用的定时一次性作业会通知该终端故障,而无需等待连续故障阈值。观察程序触发的 `on-exit` 作业在任何执行错误(包括暂时性错误)时都会终止:重试将重新运行监视的命令。符合条件的自有工作在其所有者对话中收到维修请求;其他作业使用启用的故障警报路由。当未启用任何路由时,将发送自动禁用安全通知,包括 `failureAlert: false` 或继承的尽力而为抑制。共享警报冷却时间仍然适用。操作员取消和因网关重新启动而停用的运行不会发送任何修复、警报或自动禁用通知。
同一原因的重复故障形成一个事件,并且不会发送重复警报,即使在冷却时间到期或网关重新启动后也是如此。发生变化的原因或目标可以在冷却后发送新的警报。成功运行会清除事件及其冷却时间,而不会发送通知,因此下一次失败可以再次发出警报;这种复苏在自动化历史上依然清晰可见。跳过运行和未知的交付结果并不能建立恢复。成功的安静触发检查可以恢复触发故障,但无法确定先前失败的有效负载已恢复。
启动恢复可协调保存的运行结果中的事件,而无需发送历史通知。即使作业状态更新被中断,保存的成功运行也会清除旧事件,因此以后的重复事件可以再次发出警报。
失败通知路由按以下顺序解决:
1. 作业的 `failureAlert` 对象中的 Route 字段。
2. `job.delivery.failureDestination`,分层覆盖全局 `cron.failureAlert` 中的目标字段(`mode`、`channel`、`to`、`accountId`)。 `cron.failureDestination` 块不直接读取; `openclaw doctor --fix` 将其合并到全局对象中。
3. 作业的主要公布目标。
- `job.failureAlert: false` 禁用该作业的执行和所需交付失败警报。自动禁用安全通知保持活动状态。
- Global `cron.failureAlert.enabled: false` 禁用继承的通知。每个作业的 `failureAlert` 对象显式地重新启用该作业; `enabled: true` 显式启用全局策略。
- 每个作业 `failureAlert` 对象或任何全局 `cron.failureAlert` 对象都会激活并调整策略,即使作业没有现有路由也是如此。
- `delivery.bestEffort: true` 抑制 inherited/default 执行失败警报。明确的每个作业 `failureAlert` 仍然具有权威性。
- `delivery.failureDestination` 仅在 `sessionTarget="isolated"` 作业上受支持,除非主要传送模式为 `webhook`。
- 即使 `failureAlert.includeSkipped` 未设置或为 false, 本地提供商预检跳过也会使用正常的故障警报阈值、事件重复数据删除和冷却时间。启动提供程序或在自动化历史记录中检查其端点;重复作业保持启用状态,并在稍后的预检成功后恢复。当跳过的一次性没有剩余计划运行,或者作业暂停时,恢复提供程序并使用 **Run Now** 或重新计划自动化。失败警报将这些情况与其他计划运行的作业区分开来。这些跳过不请求所有者对话修复。明确的警报选择退出和尽力而为政策仍然适用。
- `failureAlert.includeSkipped: true` 将作业或全局自动化警报策略选择到其他重复跳过运行警报中。跳过的运行保留一个单独的连续跳过计数器,因此它们不会影响执行错误退避。
- `openclaw automations edit` 提供按作业设置提醒的选项:`--failure-alert`/`--no-failure-alert`、`--failure-alert-after `、`--failure-alert-channel`、`--failure-alert-to`、`--failure-alert-cooldown`、`--failure-alert-include-skipped`/`--failure-alert-exclude-skipped`、`--failure-alert-mode` 以及 `--failure-alert-account-id`。
在 Control UI 中,自定义故障警报显示存储的阈值、冷却时间和模式覆盖。省略的通道显示中性 `last` 选择而不存储它。将阈值或冷却时间留空,或为警报模式选择 **继承全局设置**,以使用网关的正常全局和路由默认值。冷却时间接受毫秒精度的小数秒,包括 `0` 表示无冷却时间;例如,`1.001` 秒保留 `1001` 毫秒。编辑其他作业字段或克隆作业会保留其警报策略,包括跳过运行设置。
所需的完成传递失败与执行失败不同:运行可以记录 `status: "ok"` 和 `completionStatus: "failed"`。它不会增加执行失败次数或退避。传送失败警报可以通过已解决的备用故障目标进行通知,而无需等待 `failureAlert.after`。多次配送失败也构成一次事件。更改失败的警报,包括执行警报后的第一次交付失败,遵循共享的 job/global `failureAlert.cooldownMs`(默认 1 小时);被抑制的警报仍然会在运行历史记录中留下传送失败。跳过运行和安静的触发检查不会清除交付事件或其冷却时间;成功完成即可。调度程序绝不会重试已经失败的主路由以获取警报。
聊天失败通知包括代理配置的用户时区中的运行开始时间。当配置 `gateway.publicOrigin` 并启用 Control UI 时,它们还包括到自动化运行的 `Inspect` 链接。 Webhook 消息文本保持稳定;集成可以从结构化 `runAtMs` 字段读取同一时刻并构建自己的链接。聊天通知显示已知命令和脚本故障的标准化故障原因或列入白名单的生产者事实。任意命令、路径、提供者主体、秘密、交付错误、跳过原因、诊断和 stack/error 文本保留在自动化历史记录中。故障 Webhook 保留用于诊断集成的结构化原始错误。
#### 业主对话修复
默认情况下修复处于打开状态。升级会改变您在聊天中发出警报的自有自动化所看到的内容:连续出现的第一个故障警报将成为创建作业的对话中的修复请求,并且该警报是后备。 `failureAlert: false` 的工作两者都得不到。
当从会话(具有所有者会话)创建的作业达到其执行失败警报阈值并且警报将转到聊天(`announce` 模式)时,OpenClaw 向该所有者会话发送修复请求而不是警报。该请求命名作业并包括其计划、名称、有效负载和最后一个错误;名称、有效负载和错误被标记为不可信数据。命令作业和退出或流计划仅限操作员使用,并像以前一样发出警报。
对话像普通代理轮流一样处理请求,就好像它收到了一条消息:它在该对话的会话中运行,并包含其记录、工作区和工具策略,并且回复将转到对话自己的路线,包括其线程或主题。心跳设置不适用。对于重复性作业,短暂的中断不会得到回复,它可以在工作区中修复的问题(例如作业遵循的帮助程序脚本或说明文件)可以通过一行注释来修复,否则它会询问您确切需要什么。对于终端一次性故障,代理会执行仍然需要的工作或安排更正的自动化,如果不再需要工作则保持沉默,或者询问您缺少什么。该请求不携带您的发件人身份,因此自动化控制等所有者专用工具将无法使用;改变工作本身发生在你的回复回合中。
调度程序的修复指令保留在模型记录中,而不是聊天提要中。聊天仅显示智能体的维修说明或帮助请求;待处理的输入、实时更新和重新加载的历史记录会忽略内部请求。
每个故障条纹最多收到一个修复请求,即使其原因稍后发生变化。当作业没有所有者对话或被排除在修复之外时,会像以前一样发送警报。如果一次性修复请求无法启动,则会发送正常故障警报。当维修轮流进行时,重复作业继续运行。失败的运行仅在修复轮次完成后开始验证修复;较早的运行仍计入失败连续次数,但不会触发修复失败警报。如果修复轮次超过其正常代理超时,则下一次故障将发送警报。随后的连续警报会按照通常的冷却时间进行。一次成功的奔跑会悄无声息地消除连胜。添加结算跟踪之前记录的现有事件保留之前的行为:请求后的下一次故障可以发出警报。
当提供商网络故障、请求超时、过载、速率限制或服务器错误导致其快速调度程序重新运行(30 秒、1 分钟、然后 5 分钟,或者作业的下一个计划运行(如果先出现)时,警报和修复请求会等待。无论计划如何,保留最多涵盖这三次重新运行,并且当作业没有下一次运行时(禁用作业、完成一次或没有未来槽位的计划),永远不会应用。如果这些重新运行也失败,则正常警报或修复将伴随完整的失败计数;如果成功,则不会发送任何内容。作业本身导致的故障不会被保留:其自身的执行超时、脚本故障和命令作业超时通常指向作业,因此它们会在正常阈值下发出警报或修复。
在执行开始之前重新加载插件后,脚本设置会刷新已停用的工具。如果恢复失败,警报会解释工具无法刷新并且脚本未运行,然后指向自动化历史记录和插件状态。无法运行的监视器没有关于它所监视的系统的新证据。
提供程序拒绝不受支持的模型会在作业状态和运行历史记录中记录 `model_not_found`。故障通知指向 `openclaw doctor --fix`(用于提供商声明的停用)或 changing/removing(自动化模型覆盖)。已知已退役的自动化模型路由在另一个推理请求之前失败。当代理的模型策略允许时,Doctor 会用提供者声明的后继者替换覆盖。如果没有声明的后继者,它将清除覆盖,以便作业继承代理默认值。如果不允许固定覆盖的后继者,Doctor 会保留引用并报告所需的策略更改。仅缺少帐户目录条目或发现中断并不授权迁移。
调度程序还提供安全支持。基于时间的重复作业在连续 10 次执行失败后自动禁用;一次成功的跑步将重置该连续记录。当终端重复出现故障时,更丰富的自动禁用通知将取代常规阈值警报。重复的计划计算失败会在 3 次错误后自动禁用。终端一次性执行失败也会记录`state.autoDisabled`,当修复请求或故障警报拥有通知时,不会添加安全通知。该作业将 `state.autoDisabled.reason` 记录为 `consecutive-failures` 或 `schedule-errors`(`openclaw doctor` 报告)。原始错误保留在自动化历史中。排除原因后,运行`openclaw automations enable `;启用会清除记录的原因和故障条纹。由于禁用的作业被默认列表隐藏,因此请使用 `openclaw automations list --all` 检查它们。操作员取消、重新启动停用以及手动强制运行已暂停的 `on-exit` 作业不会记录自动禁用。
### 输出语言
自动化作业不会根据频道、区域设置或之前的消息推断回复语言。请将语言规则放入计划消息或模板中:
```bash
openclaw automations edit \
--message "Summarize the updates. Respond in Chinese; keep URLs, code, and product names unchanged."
```
对于模板文件,请将语言说明保留在渲染后的提示中,并在作业运行前验证诸如 `{{language}}` 之类的占位符是否已填充。如果输出混杂多种语言,请明确说明规则,例如:"叙述性文本使用中文,技术术语保留英文。"