后台任务
智能体可以在回答之后让工作继续运行:一个开发服务器、一次耗时很长的构建,或一个独立工作的子智能体。OAR 把这称为后台任务。输入区上方的任务面板会列出这些任务,让你逐个停止它们并打开命令的输出;智能体对已结束任务的报告会作为一条单独的回复到达。
什么算作后台任务 #
- 智能体留下继续运行的 shell 命令,例如开发服务器或耗时很长的构建。0.9.12 新增 在 Grok 上,则是每个运行超过两秒的命令。
- 在后台工作的子智能体。子智能体有单独的页面;在这里,它们只是面板中的又一行。
- Monitor 任务,以及在 Claude 上的 Ultracode 工作流(参见 Ultracode 工作流)。
当智能体已经回答、只剩下这类任务时,对话不再运行一轮,但也并非空闲。其他智能体看到的是状态 background_(参见其他智能体如何看到它)。你看到的是任务面板,只要还有任务在运行,它就一直显示。对话列表通过标题的颜色体现这一点:有一轮或后台工作正在运行的会话会保持亮绿色标题(参见一行显示什么)。
任务面板 #
面板紧挨在消息框上方。它折叠为一行,例如 2 background tasks running(2 个后台任务正在运行),任务运行时带有一个旋转图标;列出已结束的命令时还会显示 · 1 finished。点击这一行即可打开列表。没有可显示的内容时面板会隐藏;行数超出可显示的范围时,列表可以滚动。
每一行显示:
| 部分 | 含义 |
|---|---|
| 图标和类型徽标 | shell 命令为 Bash,子智能体为 Subagent(子智能体)(或智能体自己的类型,例如 Explore),此外还有 Workflow(工作流)、Monitor |
| 描述 | 智能体给任务起的名称。在 Claude 和 DeepSeek 上,点击子智能体的描述会打开它的记录。0.9.12 新增 点击 shell 命令或 Monitor 任务的描述会打开它的控制台 |
| 活动行 | 任务此刻正在运行的工具调用,否则为它的进度摘要 |
| 模型和 token | 在提供商报告时显示 |
| 步数 | 0.9.12 新增 对子智能体而言,它已经进行的工具调用次数,例如 22 steps,在提供商报告时显示 |
| 测试运行小标签 | 0.9.12 新增 当命令的输出是一次测试运行时显示 ✓ 412 ✘ 2 |
| 静默提示 | 0.9.12 新增 当命令已经静默时显示 no output for 12 min。0.9.13 新增 对于管道到 tail 的命令,悬停提示会说明原因(管道到 tail 的命令) |
| 已用时间 | 面板打开时持续计时,显示为 42s、4m 20s 或 1h 5m |
| Stop(停止) | 只停止这一个任务 |
运行中的行没有单独的状态标签:面板中的任务就是正在运行的任务。子智能体结束时会离开面板;shell 命令或 Monitor 任务可以作为已结束的行保留一小时。按下 Stop 后,按钮会显示 Stopping…(正在停止…),直到面板下一次更新,最长 15 秒。
在 Copilot 的 SDK 引擎上,当 Copilot 运行时无法列出其后台任务时,shell 就没有 Stop 按钮。这样的 shell 只能用 Kill session(强制结束会话)结束(参见什么会结束任务)。
预览卡片也位于同一个面板中,排在任务上方。参见你会看到什么。启动预览服务器的任务结束后,预览仍会让面板保持打开。
任务控制台 0.9.12 新增 #
在面板中点击 shell 命令或 Monitor 任务的描述,就会打开它的控制台,即命令的输出。这样你无需询问智能体,就能看到构建、开发服务器或测试运行正在做什么。在手机上,它会占满屏幕。0.9.13 新增 在较宽的屏幕上,它止于面板中该任务所在行的上方,因此这一行的测试小标签、计时和 Stop 会保持可见,并在它旁边实时更新。按 Escape、×、点击它的外部或按返回按钮都会关闭它。
- 打开时显示最后 2,000 行,新的输出会实时跟上。向上滚动后,你会停留在原处,Jump to end ↓(跳到末尾)会带你回到末尾。
- 顶部的 Load earlier(加载更早的内容)会向前翻阅整个日志,每次最多 2,000 行,直到加载了约 5 MB。超过之后,按钮会显示 older output not loaded(较早的输出未加载)。0.9.13 新增 只要有更早的输出,控制台的标题栏中也有同样的按钮,因此你在跟随长日志末尾时也能随手点到它。
- 重绘同一行的进度条只显示其最后状态,连续重复多次的行只显示一次,并带有
×N。 - 颜色会保留,因此红色的失败仍是红色。0.9.13 新增 反色文本会交换其颜色,因此 vitest 的 RUN、PASS 和 FAIL 徽标会显示为填充样式。其他控制码会被丢弃,一行在 4,000 个字符处截断。
- 凭据会被抹去:常见格式的令牌和密钥、
Bearer和Basic请求头、地址中的密码,以及API_或TOKEN= password:这类名称后面的值,都会显示为[redacted]。0.9.13 新增 以下内容也是如此:curl -u name:中的密码,password --password、--token和--secret的值,mysql -p…、docker login -p、sshpass -p、redis-,AWS 秘密访问密钥,Slack webhook 路径,地址中的cli -a ?key=、&sig=和&token=的值,以及任意认证方案的Authorization请求头。$API_或TOKEN $(cat ~/.这样的引用保持不变。面板中的任务行也以同样的方式清理:任务的描述、摘要和活动行。token)
标题栏显示任务名称、它的类型(Shell 或 Monitor)、已运行的时间,以及它的状态:running、completed、stopped、failed, exit code 1,或 0.9.13 新增 waiting for its worker after the relay restart(参见中继重启之后)。它还带有静默提示和测试运行小标签,任务运行时还有它自己的 Stop。
此中继或其他中继上的智能体可以用 read_ 读取同样的输出。各提供商提供哪些功能,见按提供商。
| 控制台显示 | 原因 |
|---|---|
| No output yet. Lines appear as the task writes them.(暂无输出。任务写入时会逐行显示。) | 任务到目前为止还没有写入任何内容 |
| This task wrote no output.(此任务没有写入任何输出。) | 任务结束时没有任何输出 |
| This session did not report an output file for this task. Sessions started before the task console need a restart to show output.(此会话未报告此任务的输出文件。在任务控制台之前启动的会话需要重启才能显示输出。) | Claude、DeepSeek、Copilot 或 Grok 会话没有为该任务指明文件:它的智能体是在更新到 0.9.12 之前启动的,或者它是一个没有 Stop 的 Copilot shell |
| Output is not available for this provider.(此提供商不提供输出。) | 提供商没有向中继提供该任务的输出。0.9.13 新增 这一行的悬停提示也会这样说明 |
| Output is not available for this task.(此任务没有可用的输出。) | 中继知道该任务,但没有可以读取其输出的文件 |
| Sub-agents have no shell output; open the sub-agent view.(子智能体没有 shell 输出;请打开子智能体视图。) | 该任务是子智能体:它的标题会打开它的记录 |
| Waiting for the worker to send the output…(正在等待 worker 发送输出…) | 输出来自智能体的进程,而它还没有响应 |
| The session's worker is not connected, so the output cannot be read now.(会话的 worker 未连接,因此暂时无法读取输出。) | 智能体的进程没有在运行 |
| This task's output is no longer available.(此任务的输出已不可用。) | 任务在一个多小时前就已结束,或者它在更新到 0.9.13 之前运行,且中继此后重启过 |
静默任务 #
正在运行的 shell 命令或 Monitor 任务如果一分钟或更长时间没有写入任何内容,会在它的行和控制台标题栏中注明:no output for 12 min。达到 Settings → General → Mark a background task as quiet after(设置 → 常规 → 后台任务多久无输出后标记为静默)设定的时间后,提示会变为琥珀色。该设置默认为 10 分钟,范围为 1 到 120 分钟,适用于该中继上的所有浏览器。
静默不等于卡住:有些步骤会长时间不输出任何内容。打开控制台查看最后几行,然后等待、调高该设置,或用 Stop 停止该任务。中继每 10 秒查看一次输出,因此提示最多会滞后这么长时间。
管道到 tail 的命令 0.9.13 新增 #
管道到 tail 的命令,例如 npm test 2>&1 | tail -40,在结束之前不会写出任何内容:tail 会把最后几行一直留到那时。它的控制台看起来就像卡住了一样。当任务的命令行显示出这样的管道时,控制台会标出输出停止的位置,直到有更多输出到来或任务结束:
Output stops here: this command pipes into tail, so the rest arrives when it ends.
Logging to a file instead (> run.log 2>&1) and following that file shows it live.
这一行的 no output for N min 提示在悬停时也会这样说明。tail -f 和 head 会随到随传,因此不会被标记。要实时观察运行情况,请让智能体把日志写入文件(> run.),然后跟随该文件。
Claude、DeepSeek、Copilot 和 Grok 会为此报告 shell 任务的命令行。中继会像处理输出那样抹去其中的凭据,并保留前 2,000 个字符。智能体在更新到 0.9.13 之前启动的会话不会报告命令行。
测试运行 #
当命令的输出看起来像 vitest、Playwright、node:test、jest、pytest 或 turbo 的测试运行时(通过 pnpm 启动时也一样),它的行和控制台标题栏会显示一个带计数的小标签:有测试失败时显示红色的 ✓ 412 ✘ 2,没有失败时显示 ✓ 38。将鼠标悬停在小标签上,可查看测试运行器以及通过、失败和跳过的数量。计数会随运行的进行而更新。0.9.13 新增 仍在进行的运行会按其整个日志计数,无论日志多长,并随日志增长继续读取,因此即使输出超出了控制台显示的范围,小标签也会计入每一个测试。一旦运行器打印出最终摘要,就以该摘要为准。
在控制台中,点击小标签或旁边的 first failure(首次失败)按钮(有测试失败时显示)会跳转到已加载输出中的第一个失败测试。如果它位于更早的输出中,控制台会提示这一点;Load earlier 可以把它加载进来。
已结束的命令 #
中继从文件读取输出的 shell 命令或 Monitor 任务,在结束后会以变暗的行在面板中保留一小时:完成时为 ✓,失败时为 ✘,被停止时为 ■,0.9.13 新增 中继无法知道它如何结束时为 ?(中继重启之后),并附带运行时长和测试小标签。它的控制台仍可打开,因此在智能体转去做别的事之后,你仍然可以查看某次运行失败的原因。× 会隐藏这一行,直到你重新加载页面。每个对话最多保留 20 个这样的行。0.9.13 新增 它们在中继重启后仍会保留(参见中继重启之后)。
任务结束时 #
任务结束时会离开面板,或者命令会作为已结束的行保留下来。智能体会被唤醒,查看结果并作出回答。这个回答是一条续接回复:它不是对你某条消息的回答,其标题栏带有 background continuation(后台续接)徽标。你可以像阅读其他回复一样阅读它。
在通知方面,续接回复与其他回复相同,因此会在一轮结束时通知你的设备,在这里也会通知你,对应的是 Settings → Notifications(设置 → 通知)中的 Turn completed(本轮已完成)。监视该会话的智能体则会收到 task_ 或 task_ 事件(参见其他智能体如何看到它)。
如果在任务结束与其续接回复之间发生了中继重启,续接回复会被丢弃,而不会重新运行。参见重启与恢复。
Ultracode 工作流 #
Ultracode 工作流是 Claude 的一项功能。面板会把它显示为带展开箭头的 Workflow 行。点开展开箭头即可查看进度树。
- 阶段显示为标题,工作流的智能体位于其下。
- 每个智能体都会显示一个状态图标(
○排队中,◐运行中,✓已完成,✗失败或被终止)、它的标签,以及一行包含模型、token、工具调用次数和用时的信息;重试之后还会显示attempt 2。运行中的智能体还会显示它正在使用的工具。 - 日志行(最后五行)位于各阶段上方。
- 超过 100 个智能体的树以 +N more agents(+N 个智能体)结尾。
工作流运行期间,树是展开的;工作流结束后,树会折叠。只要这一行还在面板中,你用展开箭头做出的选择就会保留。工作流运行期间,树可能缺少阶段标题和日志行;最终的树会包含它们。
工作流结束时,总结它的回复会在对话记录中保留一张折叠的卡片:
🧩 Finished background task — review-shared-modules · 20 agents · 1.2M tok · 28m
打开它可以查看最终的树。未知的字段会被省略;没有完成的工作流会在括号中说明情况,例如 Finished background task (failed),或者在结果始终没有到达时显示 (unconfirmed)。该卡片会随回复一起保存,重新加载后仍然存在。
后台任务超时 #
Settings → General → Background task timeout(设置 → 常规 → 后台任务超时)设定在回复之后,仅靠后台任务可以让会话保持运行多长时间。它是一个滑块,范围为 0 到 10 小时,步长为 5 分钟。默认值是 4 小时。0 表示没有上限:任务会一直运行,直到完成或被你停止。
时间到后,中继会停止这些任务,智能体会像对待任何结束的任务一样,在续接回复中报告情况。在 Claude 和 DeepSeek 上,只有当除了任务之外没有别的东西让会话保持运行时才会计时,而只要中间运行了一轮,计时就会从零重新开始。在 Copilot 的 SDK 引擎上,每个任务都有自己的计时,从该任务启动时开始。它与其他计时器的关系见轮次与队列。
| 提供商 | 时间到后 |
|---|---|
| Claude、DeepSeek | 每个仍在运行的任务都会被停止。如果一分钟后仍有任务被列出,中继会把它从列表中删除,并让会话收尾 |
| GitHub Copilot 和 OpenAI,SDK 引擎 | 中继会取消每个已超出时限的任务。运行时多次拒绝取消的任务会从面板中删除。没有 Stop 按钮的 shell 无法被取消:中继会不再等待它,此时 0 按 30 分钟计算 |
| Claude Cloud | 该设置只决定这一轮等待这项工作多长时间,设为 0 时为 60 分钟。之后这一轮结束,并附上一条提示,让你发送消息以了解结果 |
什么会结束任务 #
| 你的操作 | 任务会怎样 |
|---|---|
| 对正在运行的回复按 Stop | 回复结束。在 Copilot 上,它启动的任务通常会继续运行,每个任务都有自己的 Stop;如果运行时无法只中断回复,Stop 也会取消后台智能体。在 Claude 和 DeepSeek 上,中继会中断回复,智能体进程会继续执行它的任务;只有在中断失败时,中继才会结束该进程,任务也随之结束 |
| 对某一行按 Stop | 该任务结束 |
| 归档或删除对话 | 有任务运行时会被拒绝,并显示一条通知。请先在面板中停止任务,或者对没有 Stop 按钮的任务使用 Kill session |
| Kill session | 停止会话的 worker,连同它的所有任务。面板会清空。下一条消息会重新启动智能体 |
| 超时 | 见上文 |
| 中继重启 | 只要 worker 继续运行,就没有影响。见下文 |
中继重启之后 0.9.11 新增 #
在中继重启期间持续运行的 worker 会保留它的任务,中继会在该 worker 下一次发送心跳时再次向它询问这些任务。它们会以原来的开始时间回到面板中,因此会话显示为仍在工作:Suspend host(让主机休眠)会等待它们,监视中的会话也不会收到 all_。在中继离线期间结束的任务仍会报告其结束。
worker 在更新到 0.9.11 之前启动的会话还无法回答这个询问。它会显示一行 background work, details not reported since the relay restarted (Kill session in its ⋯ menu ends it)(后台工作,中继重启后未报告详情,在其 ⋯ 菜单中用 Kill session 结束),直到它报告变化为止。中继启动后的前 45 秒内,休眠也会等待尚未报告的会话。
0.9.12 新增 回到面板的任务,其控制台可以再次打开,并带有完整的日志;中继查看过输出后,静默提示会再次出现。
0.9.13 新增 中继会把控制台的行保存在它的数据库中,因此控制台在重启后也会保留:
- 已结束的行会带着它们的 ✓ 或 ✘ 回来,并保留到其一小时期限结束。
- 运行中命令的控制台会立即读取其输出,不必等其 worker 报告。在 worker 确认命令仍在运行之前,控制台会显示它正在等待其 worker,并且没有 Stop。
- worker 没有回来的命令(例如在重启电脑时,它随中继一起停止了)会在大约一分半钟后被标记为已结束,绝不会再次显示为运行中。中继无法知道它是如何结束的,因此它的行显示一个中性的
?,而不是 ✓ 或 ✘,标题为 ended, result unknown(已结束,结果未知)。在这一小时剩下的时间里,它的输出仍然可以读取。
在更新到 0.9.13 之前运行的命令没有存储的行;它们会在其 worker 报告时回来,如上所述。
在 Linux 服务下,重启会停止 worker,它们的任务也随之停止;参见重启会保留什么。
其他智能体如何看到它 #
list_ 和 read_ 会为每个会话给出一个 state:running_、background_(智能体已经回答,后台工作仍在运行)或 idle。它们还会列出其 tasks,即后台智能体和 shell 任务,以及每个任务何时启动、上次何时有活动、如何结束,以及已知时的退出码。因此,只有后台任务的会话不会显示为不活动。0.9.12 新增 在 Copilot 的 SDK 引擎上,已结束的任务会报告 completed、failed 或 stopped,shell 会报告其退出码,子智能体会把其结果(或错误)作为摘要报告;在此之前,这类任务都以 unknown 结束。
监视该会话的智能体可以被事件 task_ 和 task_ 唤醒,每个事件都带有任务的描述、结果和摘要。被停止的任务,或以非零退出码退出的任务,都算作失败。它也可以请求 task_。0.9.13 新增 默认情况下,监视者会得知已结束的子智能体和每个失败的任务,但不会得知正常结束的 shell 命令或 Monitor 任务;要获得这些,需要指定 task_。
0.9.12 新增 read_ 还会给出每个任务的 task、它是否有可读取的输出,以及命令的静默时长和测试计数。0.9.13 新增 在提供商报告时,它还会给出 shell 任务的命令行。任务的描述、摘要、最后一次工具调用和命令行中的凭据都会被抹去,与控制台中一样。然后,read_ 会读取该输出的末尾部分,清理方式与控制台相同。
按提供商 #
| 提供商 | 任务面板和每个任务的 Stop | 控制台 0.9.12 新增 |
|---|---|---|
| Claude | 有:shell 命令、子智能体、Monitor 任务和 Ultracode 工作流 | Claude CLI 为该命令写入的文件。在知道该文件之前,读取最后 8 KB,每 3 秒重新读取一次 |
| DeepSeek 0.9.17 新增 | 与 Claude 相同,但没有 Ultracode 工作流:DeepSeek 没有 Ultracode 推理强度 | 与 Claude 相同 |
| GitHub Copilot 和 OpenAI,SDK 引擎 | 有:后台智能体和 shell。有些 shell 没有 Stop | 分离 shell 自己的日志。其他 shell 显示运行时报告的近期输出,并在其变化时复制;标题栏显示 output mirrored from the runtime's recent window(从运行时最近窗口镜像的输出)。没有 Stop 的 shell 没有可显示的输出 |
| GitHub Copilot 和 OpenAI,扩展引擎 | 没有面板 | |
| Claude Cloud | 没有面板。工作运行期间,这一轮会在 Background task timeout 设定的时间内保持打开,结果以续接回复的形式到达 | |
| Cursor | 没有面板 | |
| Grok | 0.9.12 新增 有:智能体打开的每个运行超过两秒的终端,显示为带有 Stop 的 Bash 行。当智能体用完该终端或命令退出时,它会离开面板 | 终端的输出,从第一个字节开始保留,最多 50 MB |
| OpenAI Image | 不适用 |
Ultracode 树和 Finished background task(已完成的后台任务)卡片只在 Claude 上存在。完整的功能对照表见提供商一览。