先给结论

OpenAI Shell 是 Responses API 的终端工具:一次性任务可用 container_auto 在 OpenAI 托管容器执行;需要跨请求复用环境时使用 container_reference;需要访问自有文件或内部工具时使用 local,但命令必须由你的应用在受控沙箱执行并回传。Shell 不支持 Chat Completions,任意命令执行也不能直接信任。

OpenAI Shell 工具怎么用?

先选托管容器还是本地运行

场景环境责任边界
一次性计算、文件转换或命令链container_autoOpenAI 管理临时容器,你控制输入、网络和产物
多次请求复用文件与安装结果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

  1. 通过 Containers API 创建容器,并按业务记录 container_id。
  2. 上传输入文件或挂载需要的 Skills。
  3. 在 Responses 请求中把环境设为 container_reference。
  4. 在容器有效期内下载 /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 与产物哈希。
  • 把网页、仓库、文档和命令输出都视为不可信数据,防止其诱导扩大权限。

常见错误与排查顺序

  1. 工具不触发:确认使用 Responses API、模型当前支持 Shell,工具类型和 environment 正确。
  2. 命令需要交互:托管环境没有 TTY,改为非交互参数并设置超时。
  3. sudo 失败:托管命令不是 sudo;选择无需提权的路径或改用自控沙箱。
  4. 无法联网:核对组织白名单与请求 network_policy,两层都必须允许。
  5. 文件找不到:核对容器 ID、有效期、上传状态和 /mnt/data 路径。
  6. 本地循环卡住:检查是否保存原始 call_id,并返回正确的 shell_call_output 与 outcome。
  7. 输出太大:限制输出长度,把完整结果写入文件并只回传摘要。

上线前检查清单

  • 托管与本地模式分别有明确的权限、文件和网络边界。
  • 命令允许/拒绝策略、审批、超时、资源限制和取消均已测试。
  • 容器过期、重复请求、部分失败、非零退出和超时可以恢复。
  • 产物仅从 /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、产物、延迟和成本,再逐步开放文件、网络或本地环境。