For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主要導覽

Shell

在託管容器或您自己的本機執行環境中執行 Shell 指令。

Shell 工具讓模型能在完整的終端環境中工作。我們支援透過 Responses API 在本機或託管環境中執行 Shell 指令。

Shell 工具讓模型能透過以下任一方式執行指令:

Shell 可透過 Responses API 使用,但不支援 Chat Completions API。

執行任意 Shell 指令可能帶來危險。務必在沙盒中執行,盡可能使用允許清單或拒絕清單,並記錄工具活動以供稽核。

託管 Shell 環境快速入門

從執行計算到處理多媒體,若任務需要更豐富且具確定性的處理能力,託管 Shell 環境可提供原生且簡便的選擇。

若希望 OpenAI 為該請求佈建並管理容器,請使用 container_auto

搭配 container_auto 使用 Shell 工具
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      { "type": "shell", "environment": { "type": "container_auto" } }
    ],
    "input": [
      {
        "type": "message",
        "role": "user",
        "content": [
          { "type": "input_text", "text": "Execute: ls -lah /mnt/data && python --version && node --version" }
        ]
      }
    ],
    "tool_choice": "auto"
  }'

託管執行環境詳細資訊

  • 執行環境目前以 Debian 12 為基礎,日後可能變更。
  • 預設工作目錄為 /mnt/data
  • /mnt/data 一律存在,且是用來存放使用者可下載產出檔案的受支援路徑。
  • 託管 Shell 環境不支援互動式 TTY 工作階段。
  • 託管 Shell 環境中的指令不會以 sudo 執行。
  • 若工作流程需要,您可以在容器內執行服務。

目前預先安裝的程式語言包括:

  • Python 3.11
  • Node.js 22.16
  • Java 17.0
  • PHP 8.2
  • Ruby 3.1
  • Go 1.23

在多個請求之間重複使用容器

若反覆迭代的工作流程需要長時間執行的環境,請先建立容器,再於後續的 Responses API 呼叫中參照該容器。

1. 建立容器

建立可重複使用的容器
curl -L 'https://api.openai.com/v1/containers' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "name": "analysis-container",
    "memory_limit": "1g",
    "expires_after": { "anchor": "last_active_at", "minutes": 20 }
  }'

2. 在 Responses 中參照容器

搭配 container_reference 使用 Shell
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "cntr_08f3d96c87a585390069118b594f7481a088b16cda7d9415fe"
        }
      }
    ],
    "input": "List files in the container and show disk usage."
  }'

附加技能

技能是可重複使用且具版本管理的套件組合,您可以將其掛載至託管 Shell 環境。掛載後即可決定有哪些技能可用,而模型會在執行 Shell 時決定是否呼叫這些技能。

如需上傳及版本管理的詳細資訊,請參閱技能指南

建立附加技能的容器
curl -L 'https://api.openai.com/v1/containers' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "name": "skill-container",
    "skills": [
      { "type": "skill_reference", "skill_id": "skill_4db6f1a2c9e73508b41f9da06e2c7b5f" },
      { "type": "skill_reference", "skill_id": "openai-spreadsheets", "version": "latest" }
    ]
  }'

網路存取

託管容器預設無法對外存取網路。

若要啟用:

  1. 管理員必須在儀表板中設定組織的允許清單。
  2. 您必須在請求中明確設定容器環境的 network_policy
搭配網路允許清單使用 Shell 工具
curl -L 'https://api.openai.com/v1/responses' \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-astra",
    "tool_choice": "required",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_auto",
          "network_policy": {
            "type": "allowlist",
            "allowed_domains": ["pypi.org", "files.pythonhosted.org", "github.com"]
          }
        }
      }
    ],
    "input": [
      {
        "role": "user",
        "content": "In the container, pip install httpx beautifulsoup4, fetch release pages, and write /mnt/data/release_digest.md."
      }
    ]
  }'

將網域加入允許清單會帶來安全風險,例如提示注入 導致的資料外洩。請只加入您信任,且 攻擊者無法用來接收外洩資料的網域。使用此工具前,請仔細閱讀下方的「風險與 安全」一節。

網路政策的優先順序

有多項控制措施時:

  • 組織的允許清單定義了 allowed_domains 的完整集合。
  • 請求層級的 network_policy 會進一步限制存取。
  • allowed_domains 包含組織允許清單以外的網域,請求就會失敗。

資料保留與容器生命週期

託管 Shell 環境與程式碼解譯器使用的託管容器,在有效期間內可能會將暫時的應用程式狀態寫入容器檔案系統(底層使用暫存區塊儲存空間)。容器到期或被明確刪除時,容器資料也會一併刪除。

如需資料控制的詳細資訊,請參閱「ZDR 與資料駐留」。

下載產出檔案

託管 Shell 環境可產生可下載的檔案。請使用與程式碼解譯器相同的 container/files API,擷取寫入 /mnt/data 下的產出檔案。

其他資料控制選項

如果你希望內容和檔案僅在託管環境的生命週期內暫存,可以在請求中內嵌檔案,並在容器中掛載內嵌技能。

使用內嵌檔案和內嵌技能
INLINE_ZIP=$(base64 -i ./csv_insights.zip)
REPORT_CSV=$(base64 -i ./report.csv)

CONTAINER_ID=$(
  curl -sL 'https://api.openai.com/v1/containers' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d '{
      "name": "inline-skill-container",
      "skills": [
        {
          "type": "inline",
          "name": "csv-insights",
          "description": "Summarize CSV files and produce a markdown report.",
          "source": {
            "type": "base64",
            "media_type": "application/zip",
            "data": "'"$INLINE_ZIP"'"
          }
        }
      ]
    }' | jq -r '.id'
)

curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "'"$CONTAINER_ID"'"
        }
      }
    ],
    "input": [
      {
        "role": "user",
        "content": [
          {
            "type": "input_file",
            "filename": "report.csv",
            "file_data": "data:text/csv;base64,'"${REPORT_CSV}"'"
          },
          {
            "type": "input_text",
            "text": "Use the csv-insights skill to summarize report.csv."
          }
        ]
      }
    ]
  }'

在後續請求中,使用 container_reference 並傳入相同的 container_id。容器仍處於作用中狀態時,已掛載的技能和容器中的現有檔案都可繼續使用。

主動刪除容器

工作完成後,你可以直接刪除容器,不必等待容器因閒置而到期。

刪除容器
curl -L -X DELETE 'https://api.openai.com/v1/containers/container_id' \
  -H "Authorization: Bearer $OPENAI_API_KEY"

網域機密資訊

allowed_domains 清單中的網域需要含有私密資訊的授權標頭(例如 Authorization: Bearer <token>)時,請使用 domain_secrets

每筆機密資訊包含:

  • 目標網域
  • 易於辨識的機密名稱
  • 機密值

執行時:

  • 模型和執行環境看到的是預留位置名稱(例如 $API_KEY),而非原始憑證。
  • 驗證轉換 sidecar 只會對已核准的目的地套用原始機密值。
  • 原始機密值不會持久儲存於 API 伺服器上,也不會出現在模型可見的上下文中。

這讓助理能夠呼叫受保護的服務,同時降低外洩風險。

搭配 domain_secrets 使用 Shell 工具
curl -L 'https://api.openai.com/v1/responses' \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-astra",
    "input": [
      {
        "role": "user",
        "content": "Use curl to call https://httpbin.org/headers with header Authorization: Bearer $API_KEY. Tell me what you see in the final text response."
      }
    ],
    "tool_choice": "required",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_auto",
          "network_policy": {
            "type": "allowlist",
            "allowed_domains": ["httpbin.org"],
            "domain_secrets": [
              {
                "domain": "httpbin.org",
                "name": "API_KEY",
                "value": "debug-secret-123"
              }
            ]
          }
        }
      }
    ]
  }'

多輪工作流程

若要在同一個託管環境中繼續工作,請重複使用該容器,並傳入 previous_response_id

繼續 Shell 工作流程
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "previous_response_id": "resp_2a8e5c9174d63b0f18a4c572de9f64a1b3c76d508e12f9ab47",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "cntr_f19c2b51e4a06793d82d54a7be0fc9154d3361ab28ce7f6041"
        }
      }
    ],
    "input": "Read /mnt/data/top5.csv and report the top candidate."
  }'

Responses 中的 Shell 輸出

託管 Shell 環境和本機 Shell 使用相同的輸出項目類型。Shell 執行會以成對的輸出項目表示:

  • shell_call:模型要求執行的指令。
  • shell_call_output:指令輸出和結束結果。
shell_call 項目範例
{
  "type": "shell_call",
  "call_id": "call_9d14ac6f2b73485e91c0f4da6e1b27c8",
  "action": {
    "commands": ["ls -l"],
    "timeout_ms": 120000,
    "max_output_length": 4096
  },
  "status": "in_progress"
}

本機 Shell 模式

你也可以執行 shell_call 動作,並將 shell_call_output 傳回模型,在自己的本機執行環境中執行 Shell 指令。

當你需要完全掌控執行環境、檔案系統存取或現有內部工具時,請使用此模式。

本機 Shell 請求
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "instructions": "The local bash shell environment is on Mac.",
    "input": "find me the largest pdf file in ~/Documents",
    "tools": [{ "type": "shell", "environment": { "type": "local" } }]
  }'

收到 shell_call 輸出項目時:

  • 在你的執行環境中執行所要求的指令。
  • 擷取 stdoutstderr 和執行結果。
  • 在下一個請求中,以 shell_call_output 傳回結果。
本機 Shell 執行器範例
@dataclass
class CmdResult:
    stdout: str
    stderr: str
    exit_code: int | None
    timed_out: bool


class ShellExecutor:
    def __init__(self, default_timeout: float = 60):
        self.default_timeout = default_timeout

    def run(self, cmd: str, timeout: float | None = None) -> CmdResult:
        t = timeout or self.default_timeout
        p = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
        )
        try:
            out, err = p.communicate(timeout=t)
            return CmdResult(out, err, p.returncode, False)
        except subprocess.TimeoutExpired:
            p.kill()
            out, err = p.communicate()
            return CmdResult(out, err, p.returncode, True)
shell_call_output 酬載範例
{
  "type": "shell_call_output",
  "call_id": "call_3ef1b8c79a4d6520f9e3ab7d41c68f25",
  "max_output_length": 4096,
  "output": [
    {
      "stdout": "...",
      "stderr": "...",
      "outcome": {
        "type": "exit",
        "exit_code": 0
      }
    },
    {
      "stdout": "...",
      "stderr": "...",
      "outcome": {
        "type": "timeout"
      }
    }
  ]
}

如需舊版遷移的詳細資訊,請參閱舊版的本機 Shell 指南

搭配 Agents SDK 使用本機 Shell

如果你使用 Agents SDK,可以將自行實作的 Shell 執行器傳入 Shell 工具的輔助函式。

搭配 Agents SDK 使用本機 Shell
import { Agent, run, withTrace, shellTool } from "@openai/agents";

class LocalShell {
  async run(action) {
    return {
      output: [
        {
          stdout: "Shell is not available. Needs to be implemented first.",
          stderr: "",
          outcome: {
            type: "exit",
            exitCode: 1,
          },
        },
      ],
      maxOutputLength: action.maxOutputLength,
    };
  }
}

const shell = new LocalShell();

const agent = new Agent({
  name: "Shell Assistant",
  model: "gpt-6-astra",
  instructions:
    "You can execute shell commands to inspect the repository. Keep responses concise and include command output when helpful.",
  tools: [
    shellTool({
      shell,
      needsApproval: true,
      onApproval: async (_ctx, _approvalItem) => {
        return { approve: true };
      },
    }),
  ],
});

await withTrace("shell-tool-example", async () => {
  const result = await run(agent, "Show the Node.js version.");
  console.log(`\nFinal response:\n${result.finalOutput}`);
});

你可以在 SDK 程式碼庫中找到可執行的範例。

Shell 工具範例 - TypeScript

Agents SDK 中 Shell 工具的 TypeScript 範例。

Shell 工具範例 - Python

Agents SDK 中 Shell 工具的 Python 範例。

處理常見錯誤

  • 如果指令執行超過逾時期限,請回傳逾時結果,並附上已擷取的部分輸出。
  • 如果 shell_call 中有 max_output_length,請將其納入 shell_call_output
  • 不要依賴互動式指令;Shell 工具應以非互動方式執行。
  • 保留以非零結束代碼結束時的輸出,讓模型能推理後續的復原步驟。

風險與安全

在 Containers API 中啟用網路存取可提供強大的功能,但也會帶來顯著的安全性與資料治理風險。網路存取預設為停用。啟用後,對外存取仍應嚴格限制在任務所需的可信任網域。

啟用網路存取的容器可以與第三方服務和套件登錄庫互動。這會帶來資料外洩、提示注入導致工具遭到濫用,以及意外存取超出預定範圍等風險。如果政策範圍過廣、固定不變,或執行不一致,這些風險就會增加。

瞭解從網路擷取的內容所帶來的提示注入風險

透過網路擷取的任何外部內容,都可能含有意圖操控模型行為的隱藏指示。請將不受信任的網路內容視為可能具有惡意,並對可能修改資料或系統的動作採取額外的謹慎措施。

只連線至可信任的目的地

只允許你信任且持續維護的網域。對於代理連線至其他服務的中介服務和彙整服務,請謹慎評估,並在將其加入允許的網域清單前,審查其資料處理與保留做法。

在請求執行前後加入審查步驟

審查 Responses API 回應中提供的 Shell 工具指令與執行輸出。記錄每個工作階段所請求的主機和實際對外連線的目的地。定期審查記錄,確認存取模式符合預期、偵測偏離情況,並識別可疑行為。

確認資料駐留與保留要求

OpenAI 資料控制措施適用於 OpenAI 範圍內的資料。不過,透過網路連線傳送至第三方服務的資料,會受到該服務的資料保留政策規範。請確保外部端點符合你的資料駐留、保留與合規要求。