AIDAWORK / SEQUENCE

ReAct 轮次证明、挂起与原工具续跑

独立图页 ↗
机制说明(SoT)图是辅读 · 结论以说明与证据为准

构造 Runtime 时,公共基础依赖与 memory/internalToolDeps 分别保存。每轮解析生成 TurnConfig,composeDeps 再组合模型、工具、提示词与策略,得到供 orchestrate 消费的 OrchestratorDeps。

本页可直接往下读完整机制说明,不需要「演示 / 播放故事」。术语不熟先看 术语表。

先读机制说明,结论以说明与证据为准 · 基于固定代码版本核验 · 部署状态另行确认

机制说明(全文)

OrchestratorRuntime 装配与执行

启动依赖如何成为本轮执行环境

构造 Runtime 时,公共基础依赖与 memory/internalToolDeps 分别保存。每轮解析生成 TurnConfig,composeDeps 再组合模型、工具、提示词与策略,得到供 orchestrate 消费的 OrchestratorDeps。

prepareExecution 是普通执行与持久化准入共同使用的准备边界,本身不请求模型。resolveAndRun 在准备成功后调用 orchestrate;文本 Worker 也可使用准备能力。因此共享机制的边界比单个便捷入口更深。

ReAct 循环内部:轮次证明、断点续跑与上下文收敛

进入 orchestrate → driveReActLoop 后,模型循环在受控边界内推进:

  1. 单轮所有权与工具调用证明(OwnedRoundProjection / OwnedToolCallProjection):每轮记录 system、messagesDigest、toolsDigest 与 acceptedResponseDigest,通过进程内 WeakMap 绑定由当前驱动颁发的真实调用证明,外部调用方不能凭猜测文本伪造轮次状态。
  2. 原工具断点续跑(resumeOriginalToolRound):当上一轮因本机读取或前置依赖挂起并满足恢复条件时,由原 Work owner 携带 OriginalToolRoundResume 直接复跑该单次挂载的 SDK 工具调用(严格核对 runId、invocationId、boundarySeq、toolCallId、toolDomain 与 argsDigest),不重新请求 LLM Provider。
  3. 原地打转熔断(RepeatedToolCallBreaker):按确定性指纹(工具名 + 规范化参数 + 规范化结果)统计连续完全相同的工具轮次,达到阈值(默认 REPEATED_TOOL_CALL_LIMIT = 3)触发 REPEATED_IDENTICAL_TOOL_CALL 熔断;挂起未决或有独立失败预算的本机/桌面/插件工具域不计入。
  4. 下一轮上下文裁剪与持久读占位(slimToolResultsForNextRound / durableLocalReadPlaceholder):超长工具输出仅对下一轮模型上下文做截断(read_files 与图像结果豁免,SSE 与持久化仍保留完整原始输出);本机持久读在消息历史中只存 status: "received" 证明占位,不把本机文件正文落入通用消息表。

模型上下文压缩重建与前缀完整性核验(run-work-model-rebuild)

当多轮执行因上下文窗口超限触发模型输入拒绝(ModelInputRejection)时,Runtime Work 通过确定性三步流水线压缩重建上下文(见视图 model-context-rebuild):

  1. 链式槽位预留(reserveRuntimeWorkModelRebuild):在 runtime_work_model_rebuilds 中按每条开放 Root 链最多预留 2 次重建(ordinal: 1 | 2),其中第 2 次必须精确绑定已消费的前驱 predecessorBuildId,仅当模型响应被接受收口后才允许开启新链。
  2. 候选摘要生成与前缀核验(prepareRuntimeWorkModelRebuildCandidate / verifyPreparedPrefix):生成压缩视图后,在 Root 事务内强制复核 sourceMessageIds 数量、顺序、Run 资格与 sourceDigest,并校验未切碎同一 Run 的已发布模型响应(split === false),否则抛 RUNTIME_WORK_MODEL_REBUILD_SOURCE_CHANGED。
  3. Repeatable-Read 原子消费(admitRuntimeWorkModelRebuildRequest):在 repeatable read 隔离级别与当前 claim fence 下复核驱动端授权、写入不可变的 runtime_work_model_rebuild_consumptions 并推进 run_checkpoints;若遇 40001 序列化冲突仅重试 DB 事务,绝不重跑摘要生成。

证据与范围

  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L379–407 · prepareExecution · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L278–308 · composeDeps · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L397–427 · durableText · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L69–70 · RunExecutionWorker · e2adc9a3c325
  • aida-agent · docs/adr/0018-orchestrator-runtime-and-turn-config.md L9–54 · e2adc9a3c325
  • aida-agent · packages/agent/src/orchestrator/drive-react-loop.ts L82–161 · OwnedRoundProjection · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/resume-original-tool.ts L14–75 · resumeOriginalToolRound · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/repeated-tool-call-breaker.ts L12–90 · RepeatedToolCallBreaker · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/context-tool-result.ts L25–60 · slimToolResultsForNextRound · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/message-projection.ts L27–46 · durableLocalReadPlaceholder · 7f2e519936b5

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

机制说明

OrchestratorRuntime 装配与执行

启动依赖如何成为本轮执行环境

构造 Runtime 时,公共基础依赖与 memory/internalToolDeps 分别保存。每轮解析生成 TurnConfig,composeDeps 再组合模型、工具、提示词与策略,得到供 orchestrate 消费的 OrchestratorDeps。

prepareExecution 是普通执行与持久化准入共同使用的准备边界,本身不请求模型。resolveAndRun 在准备成功后调用 orchestrate;文本 Worker 也可使用准备能力。因此共享机制的边界比单个便捷入口更深。

ReAct 循环内部:轮次证明、断点续跑与上下文收敛

进入 orchestrate → driveReActLoop 后,模型循环在受控边界内推进:

  1. 单轮所有权与工具调用证明(OwnedRoundProjection / OwnedToolCallProjection):每轮记录 system、messagesDigest、toolsDigest 与 acceptedResponseDigest,通过进程内 WeakMap 绑定由当前驱动颁发的真实调用证明,外部调用方不能凭猜测文本伪造轮次状态。
  2. 原工具断点续跑(resumeOriginalToolRound):当上一轮因本机读取或前置依赖挂起并满足恢复条件时,由原 Work owner 携带 OriginalToolRoundResume 直接复跑该单次挂载的 SDK 工具调用(严格核对 runId、invocationId、boundarySeq、toolCallId、toolDomain 与 argsDigest),不重新请求 LLM Provider。
  3. 原地打转熔断(RepeatedToolCallBreaker):按确定性指纹(工具名 + 规范化参数 + 规范化结果)统计连续完全相同的工具轮次,达到阈值(默认 REPEATED_TOOL_CALL_LIMIT = 3)触发 REPEATED_IDENTICAL_TOOL_CALL 熔断;挂起未决或有独立失败预算的本机/桌面/插件工具域不计入。
  4. 下一轮上下文裁剪与持久读占位(slimToolResultsForNextRound / durableLocalReadPlaceholder):超长工具输出仅对下一轮模型上下文做截断(read_files 与图像结果豁免,SSE 与持久化仍保留完整原始输出);本机持久读在消息历史中只存 status: "received" 证明占位,不把本机文件正文落入通用消息表。

模型上下文压缩重建与前缀完整性核验(run-work-model-rebuild)

当多轮执行因上下文窗口超限触发模型输入拒绝(ModelInputRejection)时,Runtime Work 通过确定性三步流水线压缩重建上下文(见视图 model-context-rebuild):

  1. 链式槽位预留(reserveRuntimeWorkModelRebuild):在 runtime_work_model_rebuilds 中按每条开放 Root 链最多预留 2 次重建(ordinal: 1 | 2),其中第 2 次必须精确绑定已消费的前驱 predecessorBuildId,仅当模型响应被接受收口后才允许开启新链。
  2. 候选摘要生成与前缀核验(prepareRuntimeWorkModelRebuildCandidate / verifyPreparedPrefix):生成压缩视图后,在 Root 事务内强制复核 sourceMessageIds 数量、顺序、Run 资格与 sourceDigest,并校验未切碎同一 Run 的已发布模型响应(split === false),否则抛 RUNTIME_WORK_MODEL_REBUILD_SOURCE_CHANGED。
  3. Repeatable-Read 原子消费(admitRuntimeWorkModelRebuildRequest):在 repeatable read 隔离级别与当前 claim fence 下复核驱动端授权、写入不可变的 runtime_work_model_rebuild_consumptions 并推进 run_checkpoints;若遇 40001 序列化冲突仅重试 DB 事务,绝不重跑摘要生成。

证据与范围

  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L379–407 · prepareExecution · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L278–308 · composeDeps · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/orchestrator-runtime.ts L397–427 · durableText · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L69–70 · RunExecutionWorker · e2adc9a3c325
  • aida-agent · docs/adr/0018-orchestrator-runtime-and-turn-config.md L9–54 · e2adc9a3c325
  • aida-agent · packages/agent/src/orchestrator/drive-react-loop.ts L82–161 · OwnedRoundProjection · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/resume-original-tool.ts L14–75 · resumeOriginalToolRound · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/repeated-tool-call-breaker.ts L12–90 · RepeatedToolCallBreaker · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/context-tool-result.ts L25–60 · slimToolResultsForNextRound · 7f2e519936b5
  • aida-agent · packages/agent/src/orchestrator/message-projection.ts L27–46 · durableLocalReadPlaceholder · 7f2e519936b5

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

代码证据

引用核验检查固定 commit 的文件与范围;实现结论来自代码阅读。自动检查不证明生产环境已启用。

已核验实现

RuntimeBaseDeps 与启动持有的 memory/internalToolDeps 在构造时分开,composeDeps 合并每轮 TurnConfig。

aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:434–4627f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareExecution
aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:320–3507f2e519936b57902d4907ed8026fe1ecdd146e82符号:composeDeps
已核验实现

普通实时入口经 resolveAndRun → prepareExecution → orchestrate;runtime-work-v1 受理经 chat-work-prepare 调 OrchestratorRuntime.prepareExecution(runtimeProtocol=RUNTIME_WORK_PROTOCOL)做绑定准备,RunExecutionWorker 的执行尝试(run-execution-attempt:prepareWork,runtime-v2.1 存量为 prepareText)也复用 prepareExecution;不应描述所有入口只调用 resolveAndRun。

aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:434–4627f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareExecution
aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:411–4187f2e519936b57902d4907ed8026fe1ecdd146e82符号:resolveAndRun
aida-agentpackages/agent/src/session/chat-work-prepare.ts:422–4477f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareExecution
aida-agentpackages/agent/src/gateway/orchestrator-runtime.ts:434–4667f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareExecution
aida-agentpackages/agent/src/runtime/execution/run-execution-attempt.ts:356–3737f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareText
aida-agentpackages/agent/src/runtime/execution/run-execution-attempt.ts:576–5787f2e519936b57902d4907ed8026fe1ecdd146e82符号:prepareWork
已核验实现

ADR-0018 记录了双入口依赖漏传与全局关键字段过度触发的历史背景;图中旧路径仅作为历史对照。

aida-agentdocs/adr/0018-orchestrator-runtime-and-turn-config.md:10–307f2e519936b57902d4907ed8026fe1ecdd146e82
已核验实现

driveReActLoop 维护进程内 OwnedRoundProjection / OwnedToolCallProjection 证明,支持原 Work owner 经 resumeOriginalToolRound 复跑已捕获的单次工具调用而不重调模型,由 RepeatedToolCallBreaker 对连续相同工具轮次做确定性熔断,并通过 slimToolResultsForNextRound 与 durableLocalReadPlaceholder 控制下一轮模型输入体积与本机读占位。

aida-agentpackages/agent/src/orchestrator/drive-react-loop.ts:159–2387f2e519936b57902d4907ed8026fe1ecdd146e82符号:OwnedRoundProjection
aida-agentpackages/agent/src/orchestrator/resume-original-tool.ts:14–757f2e519936b57902d4907ed8026fe1ecdd146e82符号:resumeOriginalToolRound
aida-agentpackages/agent/src/orchestrator/repeated-tool-call-breaker.ts:65–1227f2e519936b57902d4907ed8026fe1ecdd146e82符号:RepeatedToolCallBreaker
aida-agentpackages/agent/src/orchestrator/context-tool-result.ts:33–687f2e519936b57902d4907ed8026fe1ecdd146e82符号:slimToolResultsForNextRound
aida-agentpackages/agent/src/orchestrator/message-projection.ts:30–497f2e519936b57902d4907ed8026fe1ecdd146e82符号:durableLocalReadPlaceholder
已核验实现

模型上下文压缩重建(run-work-model-rebuild):reserveRuntimeWorkModelRebuild 每条开放 Root 链最多预留 2 次重建(ordinal 1|2);verifyPreparedPrefix 在事务内校验源消息未跨 Run 分裂(split=false)且哈希未变;admitRuntimeWorkModelRebuildRequest 在 repeatable-read 事务内原子写入 runtime_work_model_rebuild_consumptions 并推进 run_checkpoints。

aida-agentpackages/agent/src/runtime/work/run-work-model-rebuild.ts:99–1497f2e519936b57902d4907ed8026fe1ecdd146e82符号:reserveRuntimeWorkModelRebuild
aida-agentpackages/agent/src/runtime/work/run-work-model-rebuild-candidate.ts:383–4257f2e519936b57902d4907ed8026fe1ecdd146e82符号:verifyPreparedPrefix
aida-agentpackages/agent/src/runtime/work/run-work-model-rebuild-admission.ts:304–3617f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitRuntimeWorkModelRebuildRequest