所有页面
本页内容

轮次与队列

一轮是一个工作回合:你发送一条提示词,智能体处理它,然后作答。一个对话由一系列轮次组成,一轮接着一轮。如果你在某一轮仍在运行时发送消息,OAR 会把它保留在队列中,直到这一轮结束。当一轮不再有进展时,OAR 会察觉到,把它放回队列,或附上一条说明结束它,而不会让它一直空转。

引导正在运行的一轮以及 Stop(停止)按钮见一轮运行期间。重启见重启与恢复。

一轮的状态 #

状态 你会看到什么
排队中 你的消息出现在对话记录中,下方有一个 Cancel(取消)按钮。
运行中 随着智能体工作,回复气泡逐渐填满,显示它的工具活动和一个 Stop 按钮。该对话在列表中显示为忙碌。
等待回答提问 提问卡片显示 Waiting for your answer(等待你的回答)。你回答后,这一轮继续。
已完成 回复已完整。
失败 回复是一条简短的系统提示,说明发生了什么。见当一轮失败时。
已停止 你按下了 Stop。

等待提问卡片的一轮永远不会被视为卡住。卡片本身见 ask_user。

一轮运行期间发送消息 #

一轮运行期间,发送按钮上显示的文字会告诉你这条消息将如何处理:

  • Steer(引导):消息进入正在运行的这一轮。Claude、DeepSeek 和 Copilot 的 SDK 引擎支持此功能。
  • Queue(加入队列):消息排在这一轮之后等待,并作为下一轮开始。在其他所有提供商上,按钮都显示 Queue;在 Claude、DeepSeek 和 SDK 引擎上,当这一轮正在等待提问卡片或计划审批,或正在压缩时,以及在 SDK 引擎上有工具调用正在运行时,按钮也显示 Queue。此时消息作为排队消息等待,并在卡片得到回答、压缩结束或工具调用完成后进入这一轮。

排队的消息按发送顺序运行,最早的最先。

如果你按下发送时设备处于离线状态,浏览器会保留这条消息并显示 You are offline. Message queued — it will send when the connection returns.。这是另一个队列:它位于你的设备上,连接恢复后会自动清空。

取消一条排队消息 #

在智能体开始处理之前,排队的消息都带有一个 Cancel 按钮。按下它会把该消息从队列中移除,并显示 Queued message cancelled.。如果智能体在此期间已经开始处理这条消息,中继会提示 Message is already being processed. Use Stop on the thinking bubble instead.

清空队列 #

对话的 ⋯ 菜单中有一行 Queue。它显示的是整个中继的计数,而不是这个对话的:

pending=1, processing=1, parked=0

Pending(待处理)的消息在等待轮到自己。Processing(处理中)的消息正在运行。Parked(已搁置)的消息被暂时搁置,例如在中继重启期间。

它旁边的 🚮 Empty queue(清空队列)会丢弃所有这些消息,涉及每个对话,也包括正在运行的一轮的消息。执行前会先弹出确认:

Drop all queue rows in pending, processing, and parked states?
This is a local maintenance action and cannot be undone.

之后会出现一条通知:Queue emptied: dropped 3 rows.(队列已清空:丢弃 3 行。),没有可丢弃的内容时则显示 Queue is already empty.(队列已经是空的。)。0.9.11 新增 任何已登录的浏览器都可以使用它:只需要访问令牌,别无其他(见只有中继所在机器能使用的端点)。如果中继拒绝执行,Failed to empty queue(清空队列失败)会说明原因。该操作只会把消息从队列中移除,不会让正在运行的智能体停下;要停下它,请使用 Stop。如果只想去掉一条消息,请改用那条消息上的 Cancel。

重新排队 #

出了问题的一轮并不一定就此丢失。在以下情况下,中继会把它放回队列并重试:

  • 这一轮卡住了(见下文),
  • 会话的 worker 进程在这一轮运行期间意外终止,
  • worker 报告了一个值得再试一次的失败。

每次重新排队都算作一次尝试。上限是每条消息 5 次尝试(配置文件中的 maxRequeueRetries,启动时读取),因此第五次失败就是最终结果。下一次尝试前的等待时间取决于原因:

原因 等待时间
这一轮卡住了 30 秒(中继认为其智能体连接离线时为 2 秒)
会话的 worker 进程意外终止 2 秒
worker 报告了失败 第一、二、三、四次失败后分别为 1、2、4、8 分钟
worker 在开始后 15 秒内、尚无任何活动或回复文本时报告了失败 10、20、40、80 秒

达到上限后,消息会彻底失败,并附带一条说明(见下文)。

有两种轮次不会重放。已经并入某个正在运行的轮次的消息若重放会被回答两次,因此它会改为失败并附带一条说明。后台任务自身的续接回复没有可以再次发送的提示词,因此会被丢弃。

当一轮卡住时 #

一轮可能只是慢,也可能是卡住了。OAR 无法通过查看回答来区分,因此它会关注活动迹象。监视分三类:中继监视 worker,每个 worker 监视它的智能体,另有两个上限分别约束后台工作和提问卡片。

计时器 默认值 在哪里更改 触发时你会看到什么
不活动:会话的 worker 没有任何活动迹象 10 分钟(中继认为其智能体连接离线时为 45 秒) 配置文件中的 processingTimeoutMs,单位为毫秒;编辑后需重启中继 这一轮回到队列,30 秒后重新开始。
Max turn duration(单轮最长时长):一轮的总时长 60 分钟,可设 0 到 10 小时,步长 5 分钟;0 表示不限制 Settings → General → Max turn duration(设置 → 常规 → 单轮最长时长) 同上:回到队列。在 Grok 上,这一轮会改为失败并附带一条说明。
Copilot(SDK 引擎)、Cursor 或 Grok 运行时静默:没有进行中的操作 120 秒 中继环境中的 OAR_TURN_STALL_IDLE_MS;设为 0 会关闭该监视 这一轮失败,并附带一条系统提示。
同上,但有模型请求正在运行 300 秒 OAR_TURN_STALL_MODEL_MS;0 表示不限制 这一轮失败,并附带一条系统提示。
同上,但有工具调用正在运行 30 分钟 OAR_TURN_STALL_TOOL_MS;0 表示不限制 这一轮失败,并附带一条系统提示。
Background task timeout(后台任务超时):会话回复之后,仅靠后台工作仍在运行 4 小时,可设 0 到 10 小时,步长 5 分钟;0 表示不限制 Settings → General → Background task timeout(设置 → 常规 → 后台任务超时) 中继停止这些任务。在 Claude Cloud 上则改为结束这一轮。见按提供商。
提问卡片等待 8 小时;Copilot 的扩展引擎上为 2 小时 不可调整 智能体会被告知无人回答,然后按对话的模式继续。

Linux 和 macOS 上的三个 OAR_TURN_STALL_* 变量

在会话运行于 tmux 中的环境里,为中继设置的变量不会传递给智能体的进程,因此这三个变量可能不起作用。见哪些变量会传递给智能体。

它们如何协同工作:

  • 中继监视 worker。 worker 每 10 秒报告一次它正在处理哪条消息。只要它还在报告,这一轮就是活着的,无论运行多久。如果报告中断的时间达到不活动窗口,中继就会把这一轮放回队列。中继每 15 秒检查一次。
  • Max turn duration 是硬性上限。 它能捕获挂起却仍在持续报告的 worker。判断时取两个时刻中较晚的那个:这一轮的开始时刻,以及你最后一次回答提问卡片的时刻;该时刻距今超过设置值,这一轮就算超限。因此,一次等你回答等了几个小时的问答,不会在你最后一次回答后马上被截断。但这里有一个需要注意的地方。当检查让任何一轮重新排队时,它会让所有开始时间早于上限的运行中轮次都重新排队,而且不会考虑你在这些轮次中的回答。因此,你最近刚回答过卡片的一轮,可能会和在同一次检查(每 15 秒一次)中达到上限的另一轮一起回到队列。如果一个长时间的轮次在没有明显原因的情况下被重新排队,请调高此设置或将其设为 0。
  • 每个 worker 也监视它的智能体。 对于 Copilot 的 SDK 引擎、Cursor 和 Grok,如果一轮在超过其窗口的时间内完全没有收到运行时的任何事件,就会失败。窗口长短取决于运行时正在做什么:一个不输出任何内容的命令可能会长时间安静,而一个正在输出内容的模型则不会。这就是三个窗口各不相同的原因。如果只设置了空闲窗口,另外两个会随它按比例调整。
  • 等待中的一轮永远不算卡住。 等待提问卡片的一轮会暂停中继的两道防护和 worker 的静默监视。(Grok 的上限和扩展引擎的 2 小时限制不会因此暂停。)压缩和 relay_tool 调用同样会暂停静默监视。Max turn duration 不知道 relay_tool 正在长时间等待,因此在默认的 60 分钟下,一次接近其最长时限的等待可能会被它提前截断。
  • 后台任务单独计算。 任务超时只在回复之后、仅靠后台任务维持会话时才开始计时。它不限制轮次。Claude Cloud 是例外,见下文。

重新排队不会显示为错误。消息回到 queued(排队中)状态并再次运行。只有在尝试次数用尽后,这一轮才会失败。

当一轮失败时 #

失败的一轮以中继发出的一条纯文本回复结束。它会说明发生了什么,以错误码结尾,并告诉你接下来该怎么做。例如,被静默监视结束的一轮会显示:

System note: the Copilot runtime sent nothing for 300s while a model request was running, so the relay ended the turn.

如果当时运行的是工具,说明中会写出它的名字:while a tool was running (build)。如果运行时在中继询问时不再应答,说明会写 the Copilot runtime stopped answering … (nothing for 120s, no reply when asked), so the relay ended the turn.

尝试次数用尽的消息会以以下其中一条失败:

Relay timeout after 5 attempts. Message was skipped to keep the queue moving. Retry the message.
Relay recovery limit reached after 5 attempts (stale-recovery). The worker kept dying before completing this turn, so the message was failed to keep the queue moving. Send it again to retry.

大多数失败最后都会建议你再次发送消息。有两种办法:

  • 再次发送。 粘贴或重新输入这条消息,或在对话记录提供 Resend(重新发送)的地方按下它。Resend 出现在被引导进某一轮、而该轮随后失败或被停止的消息上。它的标记显示 Steered into the turn above, which failed — not answered. 或 Stopped with the turn — not answered.。按下后,按钮在所有设备上都会显示 Resent(已重新发送)。
  • 使用回复上的按钮。 有些失败指明了中继可以替你完成的修复,失败的回复上会带有对应的按钮。Claude 账户问题会显示 Claude settings(Claude 设置)。0.9.17 新增 因余额用尽而被拒绝的 DeepSeek 轮次会显示 Top up DeepSeek(充值 DeepSeek)和 DeepSeek settings(DeepSeek 设置);因 API 密钥而被拒绝的则显示 DeepSeek settings(见 DeepSeek 错误)。无法启动的 Grok 轮次会显示 Install Grok CLI(安装 Grok CLI)和 Grok settings(Grok 设置);未登录时则显示 Sign in to Grok(登录 Grok)和 Grok settings。

会话 worker 因启动问题而停止的对话会在说明上显示一个 Retry(重试)按钮,按下后会重新启动 worker。

看似卡死的对话可以用 ⋯ 菜单中的 ☠️ Kill session(强制结束会话)解除,它会停止该对话的 worker。之后再次发送消息即可。

按提供商 #

队列、Cancel、Empty queue、不活动窗口和 Max turn duration 在每个提供商上都相同。不同的是对智能体本身的监视。

提供商 静默监视 Steer 或 Queue
GitHub Copilot 和 OpenAI,SDK 引擎 有:120 秒、300 秒和 30 分钟。每个空闲窗口内,worker 会询问一次运行时是否还在,并给它 5 秒时间应答;不应答的运行时会让这一轮立即结束。 Steer
GitHub Copilot,扩展引擎 没有静默监视。一轮总共限时 2 小时;时间用尽后,这一轮回到队列并计为一次失败的尝试,等待时间同上文。在默认的 60 分钟下,通常 Max turn duration 会先生效。提问卡片等待 2 小时。 Queue
Claude 仅观察。CLI 已 10 分钟(有工具调用未结束时为 30 分钟)没有任何输出的一轮会被记入 worker 的日志并继续运行,因为结束它会终止 CLI 及其后台任务。 Steer
DeepSeek 0.9.17 新增 与 Claude 相同:DeepSeek 对话运行的是 Claude Code,采用同样的仅观察监视。 Steer
Claude Cloud 不监视智能体的静默。worker 监视的是它的连接:120 秒没有数据的流会被重新打开,中断达 5 分钟的流会把消息交还给队列,下一次尝试会接续同一轮,而不是重新发送消息。连接保持正常、只是暂时安静的云端轮次会继续运行。如果智能体结束了它的这一轮,而后台工作仍在运行,这一轮会在 Background task timeout 设定的时长内保持打开(若该值为 0,则为 60 分钟)。之后它以一行活动记录结束,提示你发送一条消息来查看工作进展。 Queue
Cursor 有,使用相同的三个窗口。运行进行期间没有空闲阶段:除非有工具调用未结束,否则都算作模型请求。 Queue
Grok 有,使用相同的三个窗口;如有待处理的 relay_tool 调用,会先就该调用进行询问。在这里,把 OAR_TURN_STALL_IDLE_MS 设为 0 并不会关闭它。这一轮还受 Max turn duration 的上限约束,从这一轮开始时起算,不会因回答了提问而重新计时,你未回答的卡片等待时间也计算在内。达到上限的 Grok 轮次会以 System note: the Grok turn stalled and was stopped (grok turn exceeded the 60-minute turn ceiling). Send a new message to retry.(系统提示:Grok 这一轮停滞并已停止,grok turn exceeded the 60-minute turn ceiling。发送新消息即可重试。)失败(数字为你设置的值)。 Queue

Background task timeout 适用于 Claude、Claude API、DeepSeek、Copilot 的 SDK 引擎和 Claude Cloud。在 Claude、Claude API 和 DeepSeek 上,它会停止后台任务。在 Copilot 的 SDK 引擎上,中继会取消这些任务。在 Claude Cloud 上,它只决定这一轮等待这些任务多长时间。它不适用于其他提供商。