Skip to content

OpenClaw 子代理完成通知错误路由到 Webchat,Telegram 发起的任务收不到结果

问题

从 Telegram 发起任务后,父代理通过 sessions_spawn 启动子代理,子代理完成时有两种失败表现:

  1. 子代理结果去了 Webchat,Telegram 里什么都看不到
  2. 父代理无法继续,直接收到一条莫名的失败或空白消息

这个问题在 OpenClaw 2026.4.15 上可复现(来自 Webchat 发起的任务正常工作,来自 Telegram DM 的任务触发该 bug)。

根本原因:子代理完成的 announce 回调路由使用了错误的频道目标——始终路由到 Webchat/桌面界面,而非原始 Telegram 会话。父代理因为等不到 sync 结果而输出临时失败消息。这是一个已知 bug(#57385/#38300),暂无官方修复。

解决方案(社区 Workaround,已验证有效)

方案:两轮委托模式 + AGENTS.md 配置

在工作区的 AGENTS.md 中添加以下规则:

markdown
### 本地子代理委托(两轮模式)

当需要委托子代理完成任务时,使用两轮模式:

**第一轮(spawn 轮)**:只发起 spawn,输出 `NO_REPLY`
- 不要期待 sync 返回值
- 输出 `NO_REPLY`(OpenClaw 静默令牌,不向用户发送任何内容)

**第二轮(由 announce-callback 触发)**
- 等待子代理通过 announce 回调返回结果
- 收到 announce 后再向用户汇报

这样可以避免父代理在等待 sync 时发出错误的失败消息。

Linux/macOS:通过 systemd 固定 Webchat 连接

为了确保 announce 回调能正确路由,需要保持 Webchat 连接活跃:

创建 ~/.config/systemd/user/openclaw-webchat.service

ini
[Unit]
Description=OpenClaw Webchat Pin
After=network.target

[Service]
Type=simple
ExecStart=openclaw webchat connect --keep-alive
Restart=always
RestartSec=30

[Install]
WantedBy=default.target
bash
systemctl --user enable openclaw-webchat.service
systemctl --user start openclaw-webchat.service

验证方案有效性

在 Telegram 中发送任务,观察:

  1. 父代理回复 NO_REPLY(Telegram 无任何输出,正常)
  2. 子代理完成后通过 announce 将结果注入父代理
  3. 父代理将最终结果发回 Telegram

等待官方修复:关注 GitHub #57385#38300