OpenAI Shell 是 Responses API 的终端工具:一次性任务可用 container_auto 在 OpenAI 托管容器执行;需要跨请求复用环境时使用 container_reference;需要访问自有文件或内部工具时使用 local,但命令必须由你的应用在受控沙箱执行并回传。Shell 不支持 Chat Completions,任意命令执行也不能直接信任。
OpenAI Shell 工具怎么用?
先选托管容器还是本地运行
| 场景 | 环境 | 责任边界 |
|---|---|---|
| 一次性计算、文件转换或命令链 | container_auto | OpenAI 管理临时容器,你控制输入、网络和产物 |
| 多次请求复用文件与安装结果 | container_reference | 应用创建并记录 container_id,处理过期和删除 |
| 访问自有仓库、内网或既有工具 | local | 应用执行 shell_call、隔离权限并回传结果 |
| 只需 Python 数据分析 | Code Interpreter | 优先使用更聚焦的 Python 工具接口 |
托管 Shell 最小请求
官方当前示例使用 gpt-6-astra;模型可用性会变化,上线前应再次核对模型页。不要把示例模型写死成长期保证。
import OpenAI from "openai";
const client = new OpenAI();
const response = await client.responses.create({
model: "gpt-6-astra",
tools: [{
type: "shell",
environment: { type: "container_auto" }
}],
input: "列出 /mnt/data,并显示 Python 与 Node 版本。",
tool_choice: "auto"
});
console.log(response.output_text);托管运行时当前基于 Debian 12,默认工作目录是 /mnt/data;可下载产物也应写到这里。它没有交互式 TTY,命令不能使用 sudo,但工作流需要时可以在容器内启动服务。运行时和预装语言版本都可能调整,任务应先探测版本而不是假设。
需要复用环境时使用 container_reference
- 通过 Containers API 创建容器,并按业务记录
container_id。 - 上传输入文件或挂载需要的 Skills。
- 在 Responses 请求中把环境设为
container_reference。 - 在容器有效期内下载
/mnt/data产物,完成后主动清理。
const response = await client.responses.create({
model: "gpt-6-astra",
tools: [{
type: "shell",
environment: {
type: "container_reference",
container_id: container.id
}
}],
input: "检查已有文件并生成 /mnt/data/report.md"
});官方示例可把过期时间锚定到最后活跃时间并设置 20 分钟,但这不是永久存储承诺。容器过期或被显式删除后,临时文件会删除;业务数据应有自己的持久化与恢复方案。
文件、Skills 和产物怎么处理
- 把输入文件通过容器或 Responses 支持的文件入口提供,不要把二进制内容塞进命令参数。
- 要求模型把最终产物写入
/mnt/data,并校验文件名、大小、类型和内容后再给用户下载。 - 可在创建容器时附加版本化 Skill;同一活动容器内挂载内容可复用。
- 不要让不可信文档或 Skill 获得超出任务所需的文件、网络或密钥权限。
- 大输出应保存为文件或摘要;本地回传可用
max_output_length控制上下文体积。
联网默认关闭,白名单要双重收紧
托管容器默认没有出站网络。要联网,管理员需先在组织中配置允许域名,请求还要显式传入 network_policy;请求级配置只能缩小组织白名单。只允许任务确实需要、且攻击者不能用来接收外泄数据的域名。
environment: {
type: "container_auto",
network_policy: {
type: "allowlist",
allowed_domains: ["pypi.org", "files.pythonhosted.org"]
}
}需要给特定目标注入凭据时,可使用 domain_secrets 把值绑定到批准的域名与变量名。模型和运行时看到的是占位符,网络侧车仅对批准目标注入原值;这仍不等于可以信任远端内容,必须防范提示注入和数据外泄。
本地 Shell 的完整调用循环
本地模式用统一的 shell 工具和 environment: {type:"local"}。模型返回 shell_call 后,应用验证命令、在隔离运行时执行,捕获 stdout、stderr 与退出或超时结果,再用同一 call_id 返回 shell_call_output。不要把命令直接交给宿主机默认 Shell。
const first = await client.responses.create({
model: "gpt-6-astra",
instructions: "本地环境为 Linux;只允许读取工作目录。",
tools: [{ type: "shell", environment: { type: "local" } }],
input: "找出工作目录中最大的 PDF。"
});
// 应用校验并执行 first.output 中的 shell_call
const next = await client.responses.create({
model: "gpt-6-astra",
previous_response_id: first.id,
input: [{
type: "shell_call_output",
call_id: shellCall.call_id,
max_output_length: 4096,
output: [{
stdout: result.stdout,
stderr: result.stderr,
outcome: { type: "exit", exit_code: result.exitCode }
}]
}]
});超时应返回 outcome: {type:"timeout"};非零退出码也要如实回传,不能把失败包装成成功。旧文档中的 local_shell 属于旧迁移路径,新实现应优先使用当前统一的 shell 工具。
安全基线:模型建议命令,应用决定能否执行
- 每次执行使用独立沙箱、非特权用户和最小挂载,默认只读。
- 限制可执行文件、参数、工作目录、环境变量、网络域名、CPU、内存、进程数、输出和时长。
- 禁止访问宿主 Docker Socket、云元数据、SSH Key、生产凭据和用户未授权路径。
- 对删除、安装、外发、写入生产或产生费用的命令保留审批。
- 记录请求、模型、shell_call、策略判定、stdout/stderr 摘要、outcome 与产物哈希。
- 把网页、仓库、文档和命令输出都视为不可信数据,防止其诱导扩大权限。
常见错误与排查顺序
- 工具不触发:确认使用 Responses API、模型当前支持 Shell,工具类型和 environment 正确。
- 命令需要交互:托管环境没有 TTY,改为非交互参数并设置超时。
- sudo 失败:托管命令不是 sudo;选择无需提权的路径或改用自控沙箱。
- 无法联网:核对组织白名单与请求 network_policy,两层都必须允许。
- 文件找不到:核对容器 ID、有效期、上传状态和
/mnt/data路径。 - 本地循环卡住:检查是否保存原始 call_id,并返回正确的 shell_call_output 与 outcome。
- 输出太大:限制输出长度,把完整结果写入文件并只回传摘要。
上线前检查清单
- 托管与本地模式分别有明确的权限、文件和网络边界。
- 命令允许/拒绝策略、审批、超时、资源限制和取消均已测试。
- 容器过期、重复请求、部分失败、非零退出和超时可以恢复。
- 产物仅从
/mnt/data或受控本地目录导出,并经过校验。 - 凭据不进入提示、日志、stdout、产物或模型可见上下文。
- 对比 Shell、Code Interpreter 和普通 Function Calling 的成功率、延迟、Token 与单位成功成本。
常见问题
OpenAI Shell 工具和 Code Interpreter 有什么区别?
Shell 提供完整终端环境,可运行多种命令与语言;Code Interpreter 主要面向托管 Python 计算与数据分析。两者都可能使用 OpenAI 托管容器,但工具接口、输出项目和适用工作流不同。
Shell 可以通过 Chat Completions API 使用吗?
不可以。官方当前说明 Shell 仅通过 Responses API 提供;若旧应用仍基于 Chat Completions,需要先评估迁移到 Responses API。
container_auto 和 container_reference 怎么选?
一次性任务可用 container_auto 让 OpenAI 自动提供容器;需要跨请求复用文件或环境时,先用 Containers API 创建容器,再用 container_reference 和 container_id 引用,并处理容器过期与清理。
托管 Shell 默认能访问互联网吗?
不能。托管容器默认没有出站网络;管理员需要先配置组织域名白名单,请求中还要显式设置 network_policy。请求级域名只能进一步收紧组织白名单,不能扩大它。
本地 Shell 模式会在 OpenAI 服务器执行命令吗?
不会。environment.type 设为 local 后,模型返回 shell_call;你的应用必须在自有受控运行环境中执行命令,捕获 stdout、stderr 和 outcome,再用同一 call_id 返回 shell_call_output。
托管容器里的文件会永久保存吗?
不会。托管容器使用临时存储,容器过期或被删除后数据会删除。需要下载的产物应写入 /mnt/data,并在容器有效期内通过容器文件接口取回。
OpenAI Shell 工具安全吗?
任意命令执行具有高风险,不能默认安全。应使用隔离沙箱、最小文件与网络权限、命令允许或拒绝规则、超时和资源限制,并记录调用与结果;高影响写操作还要保留应用级审批。
本文核对日期为 2026-11-01。Shell 的模型支持、托管运行时、预装语言、容器生命周期、网络与安全能力可能变化;生产上线前请重新读取 Shell、Containers、Skills、Files 与 Deployment checklist 官方页面。
从只读、无网络的一次性任务开始
先用 container_auto 验证一个可重复的只读任务,记录命令、outcome、产物、延迟和成本,再逐步开放文件、网络或本地环境。