OpenAI 预热沙箱
预热环境允许在创建智能体会话前,先创建 OpenAI 托管沙箱、安装软件包、加载文件并运行初始化命令。任务到达后,将已准备环境附加到会话,再启动智能体。
延迟要求较高时适合预热:例如用户选择数据集时,报告应用就准备 Python 依赖;用户编写请求时,编码工作流先准备工作区。提前启动初始化,可减少用户实际等待时间。
工作方式
环境是运行工具的工作区,会话保存智能体配置与对话。预热将两者分开:
- 创建环境:提供任务需要的软件包、文件及初始化命令。
- 等待就绪:轮询环境直到
ready,或使用 webhook。 - 启动会话:创建会话时传入环境 ID。
也可在初始化未结束时附加环境,但智能体要等初始化完成才能访问工作区。
价格
预热免费,包括附加会话前的容器用量。未附加的预热沙箱五分钟后过期。
附加到会话后,按标准容器价格计费。
准备报告工作区
本例先安装 pandas 并加载小型 CSV,之后让智能体使用工作区计算合计。
使用 Python SDK 3.28.0、Node.js SDK 7.32.0、Java SDK 4.80.0、Ruby SDK 0.103.0 或更高版本。
1. 创建环境
向 POST /v1/agents/environments 发送工作区配置:
来源示例 1(javascript):
// [中文] 示例 1:1. 创建环境。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import OpenAI from "openai";
const client = new OpenAI();
const environment = await client.beta.agents.environments.create({
environment: {
type: "openai_hosted",
packages: { python: ["pandas==2.2.3"] },
files: [
{
type: "inline",
path: "/workspace/amounts.csv",
data: "YW1vdW50CjEwCjIwCjMwCg==",
},
],
setup_commands: [
{
command: 'python -c "import pandas; print(pandas.__version__)"',
cwd: "/workspace",
},
],
},
});
const environmentId = environment.id;
console.log(environmentId);
来源示例 2(python):
## [中文] 示例 2:1. 创建环境。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
from openai import OpenAI
client = OpenAI()
environment = client.beta.agents.environments.create(
environment={
"type": "openai_hosted",
"packages": {"python": ["pandas==2.2.3"]},
"files": [
{
"type": "inline",
"path": "/workspace/amounts.csv",
"data": "YW1vdW50CjEwCjIwCjMwCg==",
}
],
"setup_commands": [
{
"command": 'python -c "import pandas; print(pandas.__version__)"',
"cwd": "/workspace",
}
],
}
)
environment_id = environment.id
print(environment_id)
来源示例 3(java):
// [中文] 示例 3:1. 创建环境。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.beta.agents.HostedEnvironmentFileParam;
import com.openai.models.beta.agents.SetupCommandParam;
import com.openai.models.beta.agents.environments.EnvironmentCreateParams;
var client = OpenAIOkHttpClient.fromEnv();
var environment =
client
.beta()
.agents()
.environments()
.create(
EnvironmentCreateParams.builder()
.environment(
EnvironmentCreateParams.Environment.builder()
.packages(
EnvironmentCreateParams.Environment.Packages.builder()
.addPython("pandas==2.2.3")
.build())
.addFile(
HostedEnvironmentFileParam.Inline.builder()
.path("/workspace/amounts.csv")
.data("YW1vdW50CjEwCjIwCjMwCg==")
.build())
.addSetupCommand(
SetupCommandParam.builder()
.command(
"python -c \"import pandas; print(pandas.__version__)\"")
.cwd("/workspace")
.build())
.build())
.build());
String environmentId = environment.id();
System.out.println(environmentId);
来源示例 4(ruby):
## [中文] 示例 4:1. 创建环境。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
require "openai"
client = OpenAI::Client.new
environment = client.beta.agents.environments.create(
environment: {
type: :openai_hosted,
packages: { python: ["pandas==2.2.3"] },
files: [
{
type: :inline,
path: "/workspace/amounts.csv",
data: "YW1vdW50CjEwCjIwCjMwCg=="
}
],
setup_commands: [
{
command: 'python -c "import pandas; print(pandas.__version__)"',
cwd: "/workspace"
}
]
}
)
environment_id = environment.id
puts environment_id
来源示例 5(bash):
## [中文] 示例 5:1. 创建环境。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/environments;示例占位地址需替换为实际资源。
curl https://api.openai.com/v1/agents/environments \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"environment": {
"type": "openai_hosted",
"packages": {
"python": ["pandas==2.2.3"]
},
"files": [
{
"type": "inline",
"path": "/workspace/amounts.csv",
"data": "YW1vdW50CjEwCjIwCjMwCg=="
}
],
"setup_commands": [
{
"command": "python -c \"import pandas; print(pandas.__version__)\"",
"cwd": "/workspace"
}
]
}
}'
SDK 示例会保存返回的 id。cURL 用法将它保存到 shell 变量:
来源示例 6(bash):
## [中文] 示例 6:1. 创建环境。
## [中文] 把创建环境返回的真实 ID 保存到 ENVIRONMENT_ID;此赋值本身不创建或连接环境。
ENVIRONMENT_ID="ccarenv_REPLACE_WITH_RETURNED_ID"
创建独立环境时,environment.type 使用 openai_hosted。
2. 检查就绪状态
使用第一步保存的 ID 读取环境:
来源示例 7(javascript):
// [中文] 示例 7:2. 检查就绪状态。
// [中文] 读取预热环境当前状态;ready 表示初始化完成,不代表已有智能体连接。
const current = await client.beta.agents.environments.retrieve(environmentId);
console.log(current.status);
来源示例 8(python):
## [中文] 示例 8:2. 检查就绪状态。
## [中文] 读取预热环境当前状态;ready 表示初始化完成,不代表已有智能体连接。
current = client.beta.agents.environments.retrieve(environment_id)
print(current.status)
来源示例 9(go):
// [中文] 示例 9:2. 检查就绪状态。
// [中文] 读取指定环境的当前状态,等待 ready 后再附加;非就绪状态按本节排障。
current, err := client.Beta.Agents.Environments.Get(context.Background(), environmentID)
if err != nil {
panic(err)
}
fmt.Println(current.Status)
来源示例 10(java):
// [中文] 示例 10:2. 检查就绪状态。
// [中文] 读取预热环境当前状态;ready 表示初始化完成,不代表已有智能体连接。
var current = client.beta().agents().environments().retrieve(environmentId);
System.out.println(current.status());
来源示例 11(ruby):
## [中文] 示例 11:2. 检查就绪状态。
## [中文] 读取预热环境当前状态;ready 表示初始化完成,不代表已有智能体连接。
current = client.beta.agents.environments.retrieve(environment_id)
puts current.status
来源示例 12(bash):
## [中文] 示例 12:2. 检查就绪状态。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/environments/$ENVIRONMENT_ID;示例占位地址需替换为实际资源。
curl \
"https://api.openai.com/v1/agents/environments/$ENVIRONMENT_ID" \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY"
初始化期间状态为 pending,变成 ready 后,工作区准备完成,可以附加到会话。就绪不代表智能体已连接:没有会话时,环境也可能为 ready。
不想轮询,可让项目 webhook 订阅 agent.environment.ready 与 agent.environment.failed。
若在初始化完成前附加环境,使用会话的 agent.session.environment.ready 或 agent.session.environment.failed 跟踪初始化。可读取以 "stream": true 创建会话的响应流,或打开 GET /v1/agents/sessions/{session_id}/events,见会话事件。
3. 附加环境并运行任务
创建会话时提供已保存环境 ID、智能体及第一条输入:
来源示例 13(javascript):
程序文字说明30:用pandas读取/workspace/amounts.csv,计算amount列总和并报告。
// [中文] 示例 13:3. 附加环境并运行任务。
// [中文] 创建会话,保存返回会话 ID;设置 stream 时继续读取事件,创建请求本身不保证任务成功。
const stream = await client.beta.agents.sessions.create({
agent: { model: "gpt-6-astra" },
environment: { type: "openai_hosted", environment_id: environmentId },
input:
"Use pandas to read /workspace/amounts.csv, calculate the sum of the amount column, and report the total.",
stream: true,
});
try {
for await (const event of stream) {
console.log(event);
}
} finally {
stream.controller.abort();
}
来源示例 14(python):
沿用程序文字说明30。
## [中文] 示例 14:3. 附加环境并运行任务。
## [中文] 创建会话,保存返回会话 ID;设置 stream 时继续读取事件,创建请求本身不保证任务成功。
stream = client.beta.agents.sessions.create(
agent={"model": "gpt-6-astra"},
environment={"type": "openai_hosted", "environment_id": environment_id},
input="Use pandas to read /workspace/amounts.csv, calculate the sum of the amount column, and report the total.",
stream=True,
)
with stream:
for event in stream:
print(event.model_dump_json())
来源示例 15(java):
沿用程序文字说明30。
// [中文] 示例 15:3. 附加环境并运行任务。
// [中文] 创建会话,保存返回会话 ID;设置 stream 时继续读取事件,创建请求本身不保证任务成功。
import com.openai.models.beta.agents.EnvironmentParam;
import com.openai.models.beta.agents.sessions.SessionCreateParams;
var params =
SessionCreateParams.builder()
.agent(SessionCreateParams.Agent.builder().model("gpt-6-astra").build())
.environment(
EnvironmentParam.OpenAIHosted.builder().environmentId(environmentId).build())
.input(
"Use pandas to read /workspace/amounts.csv, calculate the sum of the amount column, and report the total.")
.build();
try (var stream = client.beta().agents().sessions().createStreaming(params)) {
stream.stream().forEach(System.out::println);
}
来源示例 16(ruby):
沿用程序文字说明30。
## [中文] 示例 16:3. 附加环境并运行任务。
## [中文] 创建会话,保存返回会话 ID;设置 stream 时继续读取事件,创建请求本身不保证任务成功。
stream = client.beta.agents.sessions.create_streaming(
agent: { model: "gpt-6-astra" },
environment: {
type: :openai_hosted,
environment_id: environment_id
},
input: "Use pandas to read /workspace/amounts.csv, calculate the sum of the amount column, and report the total."
)
begin
stream.each { |event| puts event.to_json }
ensure
stream.close
end
来源示例 17(bash):
沿用程序文字说明30。
## [中文] 示例 17:3. 附加环境并运行任务。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/sessions;示例占位地址需替换为实际资源。
curl --no-buffer https://api.openai.com/v1/agents/sessions \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"agent": {
"model": "gpt-6-astra"
},
"environment": {
"type": "openai_hosted",
"environment_id": "$ENVIRONMENT_ID"
},
"input": "Use pandas to read /workspace/amounts.csv, calculate the sum of the amount column, and report the total.",
"stream": true
}
EOF
常见错误
根据错误消息和当前环境状态选择恢复方式。新创建的共享环境最多附加128个会话,复用时会共享工作区;较早环境可能仍采用单会话生命周期。
| 错误或现象 | 处理方式 |
|---|---|
| 附加已过期环境 | 新建环境并使用新ID。未使用环境五分钟过期,重试旧ID不会恢复工作区。 |
404 环境未找到 |
检查ID,并使用与创建时相同的组织、项目和创建身份;过期或不可用则新建。 |
409 共享环境达到会话上限 |
每环境最多128个会话;复用已有会话或为新增会话创建另一环境。 |
使用已保存的环境模板
多个任务需要相同软件包和初始化时,可先保存环境模板,再在创建各预热环境时提供模板 ID:
来源示例 18(javascript):
// [中文] 示例 18:使用已保存的环境模板。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import OpenAI from "openai";
const client = new OpenAI();
const environment = await client.beta.agents.environments.create({
environment: {
type: "openai_hosted",
environment_template_id: "envtmpl_REPLACE_WITH_TEMPLATE_ID",
},
});
console.log(environment.id);
来源示例 19(python):
## [中文] 示例 19:使用已保存的环境模板。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
from openai import OpenAI
client = OpenAI()
environment = client.beta.agents.environments.create(
environment={
"type": "openai_hosted",
"environment_template_id": "envtmpl_REPLACE_WITH_TEMPLATE_ID",
}
)
print(environment.id)
来源示例 20(java):
// [中文] 示例 20:使用已保存的环境模板。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.beta.agents.environments.EnvironmentCreateParams;
var client = OpenAIOkHttpClient.fromEnv();
var environment =
client
.beta()
.agents()
.environments()
.create(
EnvironmentCreateParams.builder()
.environment(
EnvironmentCreateParams.Environment.builder()
.environmentTemplateId("envtmpl_REPLACE_WITH_TEMPLATE_ID")
.build())
.build());
System.out.println(environment.id());
来源示例 21(ruby):
## [中文] 示例 21:使用已保存的环境模板。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
require "openai"
client = OpenAI::Client.new
environment = client.beta.agents.environments.create(
environment: {
type: :openai_hosted,
environment_template_id: "envtmpl_REPLACE_WITH_TEMPLATE_ID"
}
)
puts environment.id
来源示例 22(bash):
## [中文] 示例 22:使用已保存的环境模板。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/environments;示例占位地址需替换为实际资源。
curl https://api.openai.com/v1/agents/environments \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"environment": {
"type": "openai_hosted",
"environment_template_id": "envtmpl_REPLACE_WITH_TEMPLATE_ID"
}
}'
为计算机使用预热沙箱
浏览器任务可在会话开始前准备托管浏览器和虚拟显示器。创建环境时包含 desktop.enabled:
来源示例 23(javascript):
// [中文] 示例 23:为计算机使用预热沙箱。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import OpenAI from "openai";
const client = new OpenAI();
const environment = await client.beta.agents.environments.create({
environment: {
type: "openai_hosted",
desktop: { enabled: true },
},
});
console.log(environment.id);
来源示例 24(python):
## [中文] 示例 24:为计算机使用预热沙箱。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
from openai import OpenAI
client = OpenAI()
environment = client.beta.agents.environments.create(
environment={
"type": "openai_hosted",
"desktop": {"enabled": True},
}
)
print(environment.id)
来源示例 25(java):
// [中文] 示例 25:为计算机使用预热沙箱。
// [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.beta.agents.environments.EnvironmentCreateParams;
var client = OpenAIOkHttpClient.fromEnv();
var environment =
client
.beta()
.agents()
.environments()
.create(
EnvironmentCreateParams.builder()
.environment(
EnvironmentCreateParams.Environment.builder()
.desktop(
EnvironmentCreateParams.Environment.Desktop.builder()
.enabled(true)
.build())
.build())
.build());
System.out.println(environment.id());
来源示例 26(ruby):
## [中文] 示例 26:为计算机使用预热沙箱。
## [中文] 在会话外创建预热环境,保存环境 ID;等待 ready 后附加,或让会话等待初始化。
require "openai"
client = OpenAI::Client.new
environment = client.beta.agents.environments.create(
environment: {
type: :openai_hosted,
desktop: { enabled: true }
}
)
puts environment.id
来源示例 27(bash):
## [中文] 示例 27:为计算机使用预热沙箱。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/environments;示例占位地址需替换为实际资源。
curl https://api.openai.com/v1/agents/environments \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"environment": {
"type": "openai_hosted",
"desktop": {
"enabled": true
}
}
}'
创建会话时附加该环境 ID,并为智能体提供 computer_use 工具。会话使用环境已保存的桌面配置。工具配置和浏览器源批准见计算机使用。
列出环境
GET /v1/agents/environments 返回当前组织、项目中,由当前身份创建的活动环境:
来源示例 28(javascript):
// [中文] 示例 28:列出环境。
// [中文] 列出当前身份创建的活动环境,本段只显示返回的一页;更多结果需要分页。
const environments = await client.beta.agents.environments.list({
limit: 20,
order: "desc",
});
console.log(environments.data);
来源示例 29(python):
## [中文] 示例 29:列出环境。
## [中文] 列出当前身份创建的活动环境,本段只显示返回的一页;更多结果需要分页。
environments = client.beta.agents.environments.list(limit=20, order="desc")
for item in environments.data:
print(item.model_dump_json())
来源示例 30(java):
// [中文] 示例 30:列出环境。
// [中文] 列出当前身份创建的活动环境,本段只显示返回的一页;更多结果需要分页。
import com.openai.models.beta.agents.environments.EnvironmentListParams;
var environments =
client
.beta()
.agents()
.environments()
.list(
EnvironmentListParams.builder()
.limit(20L)
.order(EnvironmentListParams.Order.DESC)
.build());
System.out.println(environments.items());
来源示例 31(ruby):
## [中文] 示例 31:列出环境。
## [中文] 列出当前身份创建的活动环境,本段只显示返回的一页;更多结果需要分页。
environments = client.beta.agents.environments.list(
limit: 20,
order: :desc
)
(environments.data || []).each { |item| puts item.to_json }
来源示例 32(bash):
## [中文] 示例 32:列出环境。
## [中文] 本段涉及的请求或服务地址:https://api.openai.com/v1/agents/environments?limit=20&order=desc;示例占位地址需替换为实际资源。
curl \
"https://api.openai.com/v1/agents/environments?limit=20&order=desc" \
-H "OpenAI-Beta: agents=v1" \
-H "Authorization: Bearer $OPENAI_API_KEY"
列表包含附加会话前后的环境,状态可能为 pending、ready、connected、disconnected 或 suspended;不含失败、过期、删除和终止的环境。列表中的环境可能已附加一个或多个会话。
默认按最新优先排列。has_more 为真时,将上一响应 last_id 作为 after 取下一页。limit 为1—100,默认20;order 为 asc 或 desc。
生命周期与复用
- 多会话共享一个环境:创建各会话时提供相同
environment_id,即可共享文件、进程、已安装包和环境配置,各会话仍有独立对话历史。工作区变更对其他已附加会话可见;需隔离任务时使用不同环境。每环境最多128个会话,此行为适用于新创建独立环境,旧环境保留原生命周期。 - 未用环境会过期:始终未附加的环境五分钟后过期,因此应接近预计任务开始时间再预热。
- 保持创建身份一致:读取、列出和附加操作要求相同组织、项目及认证身份。同一身份的不同密钥,包括轮换后的密钥,可访问同一环境。
- 共享环境在不活动后过期:第一次附加启动20分钟空闲期限,任一已附加会话或环境文件 API 的活动会延长期限,待处理工作和活动轮次会阻止空闲过期。删除会话只移除该会话,不删除共享工作区;最后一个会话删除后,仍可在空闲截止前重新附加。API 没有独立环境删除端点。
安全重试创建请求
创建环境时可发送 Idempotency-Key 请求头。请求超时或响应丢失,用相同键、相同请求体重试,避免重复创建环境。
原环境仍可用时,已完成的重试返回其 ID 和当前状态。创建仍在进行、结果不确定、环境已不可用或参数不一致时,已保留键可能返回 409,不会创建替代环境。键保留24小时,之后复用同一键可能创建新环境;有意创建另一个环境时使用新键。

TRAE-AI编程


更多建议: