跳转到内容

概念

现代智能体只有能够操作文件系统中的真实文件,才能发挥最佳效果。沙盒智能体可以利用专用工具和 shell 命令搜索并处理大型文档集、编辑文件、生成产物以及运行命令。沙盒为模型提供了一个持久工作区,智能体可以在其中代您完成工作。Agents SDK 中的沙盒智能体可帮助您将智能体与沙盒环境配对运行,轻松地将正确文件放入文件系统,并大规模编排沙盒以启动、停止和恢复任务。

您可以围绕智能体所需的数据定义工作区。全新工作区可以从 GitHub 仓库、本地文件和目录、合成任务文件、S3 或 Azure Blob Storage 等远程文件系统,以及您提供的其他沙盒输入中填充内容。

具有计算能力的沙盒智能体运行框架

SandboxAgent 扩展自 Agent,因此它仍然是一个 Agent。它保留常规智能体接口,例如 instructionstoolshandoffsmcpServersmodelSettings、输出类型、护栏和钩子,并且仍通过常规的 run()Runner API 运行。变化的是执行边界:

  • SandboxAgent 定义智能体本身:常规智能体配置,以及 defaultManifestbaseInstructionsrunAs 等沙盒专用默认值,还有文件系统工具、shell 访问、技能、记忆或压缩等能力。
  • Manifest 声明全新沙盒工作区所需的初始内容和布局,包括文件、仓库、挂载和环境。
  • 沙盒会话是运行命令和更改文件的实时执行环境。
  • sandbox 运行选项决定本次运行如何获取沙盒会话,例如直接注入会话、根据序列化的沙盒会话状态重新连接,或通过沙盒客户端创建全新的沙盒会话。
  • 已保存的沙盒状态和快照可让后续运行重新连接到之前的工作,或使用已保存的内容为全新沙盒会话提供初始数据。

Manifest 定义新沙盒工作区的初始内容。它并不描述每个实时沙盒中的当前文件,因为复用的会话、序列化的会话状态和快照都可以在运行时提供或更改工作区。

本页中的”沙盒会话”是指由沙盒客户端管理的实时执行环境。确切边界取决于客户端:Unix 本地会话在主机上的本地工作区中运行,而 Docker 和托管客户端则提供更强的环境隔离。这与会话中介绍的 SDK 对话式 Session 接口不同。

外层运行时仍负责审批、追踪、交接和恢复记录。沙盒会话负责命令、文件更改和环境隔离。这种职责划分是该模型的核心部分。

一次沙盒运行会将智能体定义与每次运行的沙盒配置结合起来。运行器会准备智能体,将其绑定到实时沙盒会话,并可保存状态以供后续运行使用。

SandboxAgent智能体及沙盒默认值
运行器准备指令并绑定能力工具
沙盒会话运行命令和更改文件的工作区
已保存状态稍后恢复或为全新工作区提供初始数据

沙盒专用默认值保留在 SandboxAgent 上。每次运行的沙盒会话选择则保留在 sandbox 运行选项中。

可以将生命周期分为三个阶段:

  1. 使用 SandboxAgentManifest 和能力定义智能体及工作区初始内容。
  2. 通过向 run()Runner 提供用于注入、恢复或创建沙盒会话的 sandbox 运行选项来执行运行。
  3. 稍后通过运行器管理的 RunState、显式沙盒 sessionState 或已保存的工作区快照继续运行。

如果 shell 访问只是一项偶尔使用的工具,请先使用工具中的托管 shell。当工作区隔离、沙盒客户端选择或沙盒会话恢复行为属于设计的一部分时,再使用沙盒智能体。

沙盒智能体非常适合以工作区为中心的工作流,例如:

  • 编码和调试:针对 GitHub 仓库中的问题报告编排自动修复并运行针对性测试。
  • 文档处理和编辑:从用户的财务文档中提取信息,并创建填写完毕的税务表单草稿。
  • 基于文件的审查或分析:在回答前检查入职资料包、生成的报告或产物集合。
  • 隔离的多智能体模式:为每个审查智能体或编码子智能体提供独立工作区。
  • 多步骤工作区任务:在一次运行中修复错误,之后再添加回归测试,或从快照或沙盒会话状态恢复。

如果不需要访问文件或持续存在的文件系统,请继续使用 Agent。如果 shell 访问只是一项偶尔使用的能力,请添加托管 shell;如果工作区边界本身就是功能的一部分,请使用沙盒智能体。

在 macOS 或 Linux 上进行本地开发时,请先使用 UnixLocalSandboxClient。在 Windows 上,请改用 DockerSandboxClient 或托管提供商。在任何受支持的平台上,需要容器隔离或镜像一致性时可改用 DockerSandboxClient;需要由提供商管理执行时,则可改用托管提供商。

大多数情况下,SandboxAgent 定义保持不变,只需在 sandbox 运行选项中更改沙盒客户端及其选项。有关本地、Docker、托管和远程挂载选项,请参阅沙盒客户端

层级主要 SDK 组件所回答的问题
智能体定义SandboxAgentManifest、能力要运行什么智能体,以及它应以什么样的全新会话工作区约定作为起点?
沙盒执行sandbox 运行选项、沙盒客户端和实时沙盒会话本次运行如何获取实时沙盒会话,以及工作在哪里执行?
已保存的沙盒状态RunState 沙盒载荷、sessionState 和快照此工作流如何重新连接到之前的沙盒工作,或使用已保存的内容为全新沙盒会话提供初始数据?

主要 SDK 组件与这些层级的对应关系如下:

组件负责的内容需要回答的问题
SandboxAgent智能体定义此智能体应该做什么,以及哪些默认值应随其携带?
Manifest全新会话的工作区文件和文件夹运行开始时,文件系统中应存在哪些文件和文件夹?
Capability沙盒原生行为应将哪些工具、指令片段或运行时行为附加到此智能体?
sandbox 运行选项每次运行的沙盒客户端和沙盒会话来源本次运行应该注入、恢复还是创建沙盒会话?
RunState运行器管理的已保存沙盒状态我是否正在恢复之前由运行器管理的工作流,并自动延续其沙盒状态?
sandbox.sessionState显式序列化的沙盒会话状态我是否想从已经在 RunState 外部序列化的沙盒状态恢复?
sandbox.snapshot用于全新沙盒会话的已保存工作区内容新沙盒会话是否应从已保存的文件和产物开始?

实际的设计顺序如下:

  1. 使用 Manifest 或清单初始化对象定义全新会话的工作区约定。
  2. 使用 SandboxAgent 定义智能体。
  3. 添加内置或自定义能力。
  4. 决定每次运行应如何在 run(agent, input, { sandbox: ... })new Runner({ sandbox: ... }) 中获取沙盒会话。

运行时,运行器会将该定义转换为由沙盒支持的具体运行:

  1. sandbox 运行选项解析沙盒会话。
  2. 确定本次运行实际使用的工作区输入。
  3. 让能力处理生成的清单。
  4. 按固定顺序构建最终指令:SDK 的默认沙盒提示;如果您显式覆盖,则使用 baseInstructions;然后是 instructions、能力指令片段、任何远程挂载策略文本,最后是渲染后的文件系统树。
  5. 将能力工具绑定到实时沙盒会话,并通过常规的 run()Runner API 运行准备好的智能体。

沙盒机制不会改变轮次的含义。一个轮次仍是一个模型步骤,而不是一条 shell 命令或一次沙盒操作。沙盒侧操作与轮次之间不存在固定的 1:1 映射。实际使用中,只有当沙盒工作完成后智能体运行时需要模型再次响应时,才会消耗另一个轮次。

以下是在常规 Agent 字段之外提供的沙盒专用选项:

选项最佳用途
defaultManifest运行器创建的全新沙盒会话所使用的默认工作区。
instructions追加在 SDK 沙盒提示之后的角色、工作流和成功标准。
baseInstructions用于替换 SDK 沙盒提示的高级逃生舱。
capabilities应随此智能体携带的沙盒原生工具和行为。
runAs面向模型的沙盒工具所使用的用户身份,例如 shell 命令、文件读取和补丁操作。

沙盒客户端选择、沙盒会话复用、清单覆盖和快照选择都应放在 sandbox 运行选项中,而不是智能体上。

defaultManifest 是运行器为此智能体创建全新沙盒会话时使用的默认工作区。可以传入 Manifest 实例,也可以传入与 new Manifest(...) 相同的初始化对象。使用它来指定智能体通常应从哪些文件、仓库、辅助材料、输出目录和挂载开始。

defaultManifest 仅提供默认工作区。一次运行可以使用 sandbox.manifest 覆盖 defaultManifest,而复用或恢复的沙盒会话会保留其现有工作区状态。

定义清单
import { file, gitRepo, Manifest } from '@openai/agents/sandbox';
const manifest = new Manifest({
root: '/workspace',
entries: {
'task.md': file({
content: 'Fix the failing test and summarize the change.',
}),
repo: gitRepo({
repo: 'openai/openai-agents-js',
ref: 'main',
}),
},
environment: {
NODE_ENV: 'test',
},
});

使用 instructions 设置应在不同提示下保持不变的简短规则。在 SandboxAgent 中,这些指令会追加到 SDK 的沙盒基础提示之后,因此您既能保留内置沙盒指导,又能添加自己的角色、工作流和成功标准。

仅当您想替换 SDK 的沙盒基础提示时才使用 baseInstructions。大多数智能体不应设置它。

放置位置用途示例
instructions智能体的稳定角色、工作流规则和成功标准。“检查入职文档,然后交接。”、“将最终文件写入 output/。“
baseInstructions完全替换 SDK 的沙盒基础提示。自定义底层沙盒封装提示。
用户提示本次运行的一次性请求。“总结此工作区。“
清单中的工作区文件较长的任务规范、仓库本地指令或范围明确的参考材料。repo/task.md、文档集合、示例资料包。

应避免将用户的一次性任务复制到 instructions 中、嵌入本应放入清单的长篇参考材料、重复内置能力已注入的工具文档,或混入模型在运行时不需要的本地安装说明。

能力会将沙盒原生行为附加到 SandboxAgent。它们可以在运行开始前调整工作区、追加沙盒专用指令、公开绑定到实时沙盒会话的工具,并调整该智能体的模型行为或输入处理。

内置能力包括:

能力添加时机说明
shell()智能体需要 shell 访问权限。添加 exec_command;当沙盒客户端支持 PTY 交互时,还会添加 write_stdin
filesystem()智能体需要编辑文件或检查本地图像。添加 apply_patchview_image;补丁路径相对于工作区根目录。
skills()您希望在沙盒中发现并写入技能。对于沙盒本地的 SKILL.md 技能,优先使用此能力,而不是手动挂载 .agents.agents/skills
memory()后续运行应读取或生成记忆产物。需要 shell();实时更新还需要 filesystem()
compaction()长时间运行的流程需要在压缩项之后修剪上下文。调整模型采样和输入处理。

默认情况下,SandboxAgent.capabilities 使用 Capabilities.default(),其中包括 filesystem()shell()compaction()。如果传入 capabilities: [...],该列表将替换默认列表,因此请加入您仍需要的所有默认能力。

Manifest 描述全新沙盒会话的工作区。它可以设置工作区 root、声明文件和目录、复制本地文件、克隆 Git 仓库、附加远程存储挂载、设置环境变量、定义用户或组,以及授权访问工作区之外的特定绝对路径。

清单环境值默认会持久保存。对于 API 密钥、访问令牌或其他不应与沙盒状态一起保存的短期凭据,请使用 { value: "...", ephemeral: true } 等临时条目。

对于在清单物化或恢复时必须重新查找的密钥,请继承 EnvValueReference 并使用 registerEnvValueReference() 注册。引用仅持久保存非敏感的查找元数据,并通过 resolve() 解析当前运行时值。每个子类都必须声明自己稳定、非空的静态 type,且 serialize() 不得包含保留字段 value。重建清单前,请在每个进程中注册解析器,并让解析器验证查找键并实施允许列表。恢复持久化 RunState 中的环境引用时,需要提供包含对应引用条目的当前可信清单;否则,SDK 会在恢复会话前拒绝恢复操作。

清单条目路径相对于工作区。它们不能是绝对路径,也不能使用 .. 逃逸工作区,这可以让工作区约定在本地、Docker 和托管客户端之间保持可移植性。

使用清单条目提供智能体开始工作前所需的材料:

清单条目用途
file()dir()小型合成输入、辅助文件或输出目录。
localFile()localDir()应写入沙盒的主机文件或目录。
gitRepo()应提取到工作区的仓库。
s3Mount()gcsMount()r2Mount()azureBlobMount()s3FilesMount() 等挂载应显示在沙盒内的外部存储。

对于本地物化,localFile()localDir() 的源路径必须位于本地源基础目录内。默认基础目录是 Node 进程的当前工作目录,本地沙盒客户端在物化条目时可能会提供客户端专用的基础目录。如果源必须来自其他主机绝对目录,请添加范围尽可能小的 Manifest.extraPathGrants 条目。

本地延迟技能发现也会使用 extraPathGrants。如果 localDirLazySkillSource() 指向源基础目录之外,且清单未授权该目录,则会将其忽略。对于共享技能、数据集和参考仓库等输入集合,建议设置 readOnly: true

每项路径授权都有一个沙盒路径,并可在需要时指定单独的主机路径:

  • path 是沙盒内可见的 POSIX 绝对路径。
  • hostPath 是可选的主机原生绝对路径,在主机路径与沙盒路径不同时使用。在 Windows 上,它必须包含驱动器限定符;不支持 UNC 路径和设备路径。

UnixLocalSandboxClient 要求主机路径与沙盒路径相同,因此使用它时请省略 hostPath。如果创建容器所用的清单中存在授权,DockerSandboxClient 支持单独的 hostPath。它无法在已运行的容器上添加或更改该映射。Docker 命令可以使用创建时已授权的沙盒路径作为其 workdir;工作区和已配置授权之外的路径仍会被拒绝。

授权共享本地源
import { Manifest, localDir, skills } from '@openai/agents/sandbox';
import { localDirLazySkillSource } from '@openai/agents/sandbox/local';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const appRoot = dirname(fileURLToPath(import.meta.url));
const repoDir = join(appRoot, 'repo');
const sharedSkillsDir = '/opt/company/agent-skills';
const manifest = new Manifest({
extraPathGrants: [
{
path: sharedSkillsDir,
readOnly: true,
description: 'Shared skill bundle.',
},
],
entries: {
repo: localDir({ src: repoDir }),
},
});
const skillCapability = skills({
lazyFrom: localDirLazySkillSource({
src: sharedSkillsDir,
}),
});

挂载条目描述要公开哪些存储;挂载策略描述沙盒后端如何附加这些存储。有关挂载选项和提供商支持,请参阅沙盒客户端

Permissions 控制清单条目的文件系统权限。它针对沙盒物化的文件,而不是模型权限、审批策略或 API 凭据。

用户是可以在沙盒中执行工作的身份。如果希望某个身份存在于沙盒中,请将用户添加到清单;当 shell 命令、文件读取和补丁操作等面向模型的沙盒工具应以该用户身份运行时,再设置 SandboxAgent.runAs

如果还需要文件级共享规则,请将用户与清单组及条目的 group 元数据结合使用。runAs 用户控制由谁执行沙盒原生操作;Permissions 控制沙盒物化工作区后,该用户可以读取、写入或执行哪些文件。

SnapshotSpec 指定全新沙盒会话应从何处恢复已保存的工作区内容,以及将其持久保存到何处。它是沙盒工作区的快照策略,而 sessionState 是用于恢复特定沙盒后端的序列化连接状态。

当应用提供远程快照客户端时,可使用本地快照实现本地持久快照,或使用远程快照。挂载路径和临时路径不会作为持久工作区内容复制到快照中。恢复数据时,SDK 会在将归档写入工作区之前,拒绝任何与受保护挂载路径或临时路径重叠的归档成员。如果工作区根目录本身是临时目录,则只能恢复空归档。

生命周期有两种模式:SDK 所有开发者所有

SDK 所有运行器拥有实时沙盒。
  1. 传入 sandbox.client

  2. 运行器创建或恢复沙盒会话。
  3. 智能体运行,并可持久保存由快照支持的工作区状态。

  4. 运行器关闭其拥有的资源。
开发者所有您的应用程序拥有实时沙盒。
  1. 创建 session

  2. sandbox.session 传入运行。

  3. 智能体使用现有工作区。
  4. 自行检查、复用并关闭会话。

当沙盒只需存在一次运行时,请使用 SDK 所有的生命周期。传入 client、可选的 manifest、可选的 snapshot 和客户端 options;运行器会创建或恢复沙盒、运行智能体、持久保存由快照支持的工作区状态,并允许客户端清理运行器拥有的资源。

由运行器管理沙盒会话
import { run } from '@openai/agents';
import { SandboxAgent } from '@openai/agents/sandbox';
import { UnixLocalSandboxClient } from '@openai/agents/sandbox/local';
const agent = new SandboxAgent({
name: 'Workspace reviewer',
model: 'gpt-5.6-sol',
instructions: 'Inspect the sandbox workspace before answering.',
});
const result = await run(agent, 'Inspect the workspace.', {
sandbox: {
client: new UnixLocalSandboxClient(),
},
});
console.log(result.finalOutput);

如果您想预先创建沙盒、在多次运行中复用同一个实时沙盒、在运行后检查文件、通过自行创建的沙盒进行流式传输,或精确决定清理时机,请使用开发者所有的生命周期。传入 session 会指示运行器使用该实时沙盒,但运行器不会替您关闭它。

自行管理沙盒会话
import { run } from '@openai/agents';
import { Manifest, SandboxAgent } from '@openai/agents/sandbox';
import { UnixLocalSandboxClient } from '@openai/agents/sandbox/local';
const manifest = new Manifest();
const agent = new SandboxAgent({
name: 'Workspace reviewer',
model: 'gpt-5.6-sol',
instructions: 'Inspect the sandbox workspace before answering.',
});
const client = new UnixLocalSandboxClient();
const session = await client.create({ manifest });
try {
await run(agent, 'First task.', { sandbox: { session } });
await run(agent, 'Follow-up task.', { sandbox: { session } });
} finally {
await session.close?.();
}

sandbox 运行选项包含每次运行的配置,用于确定沙盒会话的来源,以及如何初始化全新会话。

以下选项决定运行器应复用、恢复还是创建沙盒会话:

选项使用时机说明
client您希望运行器替您创建、恢复和清理沙盒会话。除非提供实时沙盒 session,否则为必需项。
session您已经自行创建实时沙盒会话。调用方拥有生命周期;运行器会复用该实时沙盒会话。
sessionState您拥有序列化的沙盒会话状态,但没有实时沙盒会话对象。需要 client;运行器从该显式状态恢复,并拥有恢复后的会话。

以下选项仅在运行器创建全新沙盒会话时生效:

选项使用时机说明
manifest您希望一次性覆盖全新会话的工作区。接受 Manifest 或清单初始化对象。省略时回退到 agent.defaultManifest
snapshot全新沙盒会话应从快照获取初始数据。适用于类似恢复的流程或远程快照客户端。
options沙盒客户端需要创建时选项。常用于 Docker 镜像、提供商超时及类似的客户端专用设置。

concurrencyLimits 控制可并行执行的沙盒物化工作量。当大型清单或本地目录复制需要更严格的资源控制时,请使用 manifestEntrieslocalDirFiles

物化控制有意设计为每次运行单独配置。请将其放在 sandbox 运行选项附近,这样同一个 SandboxAgent 就能对大型本地目录复制使用保守限制,并对小型清单使用更宽松的限制。

当清单包含许多相互独立的条目(如文件、目录、仓库和挂载)时,请使用 concurrencyLimits.manifestEntries。当 localDir() 条目包含大量文件,并且需要限制本地复制压力时,请使用 concurrencyLimits.localDirFiles

使用 archiveLimits 限制工作区恢复和重新连接期间的归档输入字节数、解压字节数和成员数量。传入空对象会启用默认限制:1 GiB 归档输入、4 GiB 解压内容和 100,000 个成员。将单个字段设置为 null 可仅禁用该项限制。省略 archiveLimits 或将整个选项设置为 null,则会完全禁用归档限制。

以下编码风格的示例非常适合作为默认起点:

沙盒编码任务
import { run } from '@openai/agents';
import {
Capabilities,
Manifest,
SandboxAgent,
localDir,
skills,
} from '@openai/agents/sandbox';
import {
UnixLocalSandboxClient,
localDirLazySkillSource,
} from '@openai/agents/sandbox/local';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const exampleDir = dirname(fileURLToPath(import.meta.url));
const hostRepoDir = join(exampleDir, 'repo');
const hostSkillsDir = join(exampleDir, 'skills');
const manifest = new Manifest({
entries: {
repo: localDir({ src: hostRepoDir }),
},
});
const agent = new SandboxAgent({
name: 'Sandbox engineer',
model: 'gpt-5.6-sol',
instructions:
'Read `repo/task.md` before editing files. Load the `$invoice-total-fixer` skill before changing code. Stay grounded in the repository, preserve existing behavior, and mention the exact verification command you ran. If you edit files with apply_patch, paths are relative to the sandbox workspace root.',
defaultManifest: manifest,
capabilities: [
...Capabilities.default(),
skills({
lazyFrom: localDirLazySkillSource({
src: hostSkillsDir,
}),
}),
],
});
const result = await run(
agent,
'Open `repo/task.md`, fix the issue, run the targeted test, and summarize the change.',
{
sandbox: {
client: new UnixLocalSandboxClient(),
},
},
);
console.log(result.finalOutput);

请从上面的完整示例开始。很多情况下,同一个 SandboxAgent 可以保持不变,只需更改沙盒客户端、沙盒会话来源或工作区来源。

保持智能体定义不变,仅更改运行配置。需要容器隔离或镜像一致性时使用 Docker;需要由提供商管理执行时使用托管提供商。有关示例和提供商选项,请参阅沙盒客户端

保持智能体定义不变,只使用 sandbox: { client, manifest } 替换全新会话的清单。当同一智能体角色需要针对不同仓库、资料包或任务集合运行,同时不希望重新构建智能体时,请使用此模式。

需要显式控制生命周期、运行后检查或复制输出时,请注入实时沙盒会话。为该次运行使用 sandbox: { session },并在应用程序代码中关闭会话。

如果已经在 RunState 外部序列化沙盒状态,可以使用 sandbox: { client, sessionState } 让运行器根据该状态重新连接。当沙盒状态存储在您自己的存储或作业系统中,并且希望 Runner 直接从中恢复时,请使用此模式。

使用 sandbox: { client, snapshot },通过已保存的文件和产物为新沙盒提供初始数据。当全新运行应从已保存的工作区内容开始,而非仅从 agent.defaultManifest 开始时,请使用此模式。

使用 skills({ from: gitRepo(...) }) 将本地技能来源替换为由仓库支持的来源。当技能集合有自己的发布周期,或应在多个沙盒之间共享时,请使用此模式。

工具智能体既可以拥有自己的沙盒边界,也可以复用父运行中的实时沙盒。复用适合快速的只读探索智能体:它可以检查父智能体正在使用的同一工作区,而无需承担创建、恢复或快照另一个沙盒的开销。

当工具智能体确实需要隔离时,请通过 sandboxAgent.asTool(...) 为其提供独立的 runConfig。如果工具智能体应自由修改内容、运行不受信任的命令,或使用不同后端或镜像,请使用独立沙盒。

保留沙盒工作区,同时继续在同一智能体上使用常规工具。沙盒能力可以与 toolsmcpServers、交接、模型设置和输出配置共存。

如果后续沙盒智能体运行应从之前的运行中学习,请使用 memory() 能力。记忆与 SDK 的对话式 Session 记忆不同:它会将经验提炼为沙盒工作区内的文件,后续运行便可读取这些文件。

有关设置、读取和生成行为、多轮对话及布局隔离,请参阅智能体记忆

明确单智能体模式后,下一个设计问题便是沙盒边界在更大系统中的位置。

沙盒智能体仍可与 SDK 的其他部分组合:

  • 交接:将文档密集型工作从非沙盒接收智能体交接给沙盒审查智能体。
  • Agents as tools:将多个沙盒智能体公开为工具,通常通过在每次 asTool(...) 调用中传入沙盒运行配置,让每个工具获得自己的沙盒边界。
  • MCP 和常规函数工具:沙盒能力可以与 mcpServers 和常规工具共存。
  • 运行智能体:沙盒运行仍使用常规的 run()Runner API。

使用交接时,仍只有一个顶层运行和一个顶层轮次循环。活动智能体会发生变化,但运行不会变成嵌套运行。

使用 asTool(...) 时,两者的关系有所不同。外层编排器使用一个外层轮次决定调用工具,而该工具调用会为沙盒智能体启动一次嵌套运行。嵌套运行拥有自己的轮次循环、maxTurns、审批,通常也有自己的沙盒运行配置。从外层编排器的角度来看,所有这些工作仍封装在一次工具调用之后,因此嵌套轮次不会增加外层运行的轮次计数器。