For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

シェル

ホスト型コンテナまたは独自のローカルランタイムでシェルコマンドを実行します。

シェルツールを使うと、モデルは完全なターミナル環境内で作業できます。Responses API を通じて、ローカル環境とホスト型環境の両方でシェルを実行できます。

シェルツールを使うと、モデルは次のいずれかの環境でコマンドを実行できます。

シェルは Responses API で利用できます。Chat Completions API では利用できません。

任意のシェルコマンドの実行には危険が伴う場合があります。必ずサンドボックス内で実行し、可能な限り許可リストや拒否リストを適用して、監査用にツールの操作ログを記録してください。

ホスト型シェルのクイックスタート

ホスト型シェルは、計算からマルチメディアの操作まで、より高度で決定論的な処理を必要とするタスクに適した、組み込みの使いやすい選択肢です。

リクエスト用のコンテナのプロビジョニングと管理を OpenAI に任せる場合は、container_auto を使用します。

container_auto を使用したシェルツール
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 は常に存在し、ユーザーがダウンロードできる成果物の保存先としてサポートされているパスです。
  • ホスト型シェルは対話型の TTY セッションをサポートしていません。
  • ホスト型シェルのコマンドは 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 を使用したシェルの利用
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."
  }'

スキルのアタッチ

スキルは、ホスト型シェル環境にマウントできる、再利用可能でバージョン管理されたバンドルです。マウントによって利用可能なスキルが定義され、シェルの実行時にモデルがそれらを呼び出すかどうかを判断します。

アップロードとバージョン管理の詳細は、スキルガイドを参照してください。

スキルをアタッチしたコンテナの作成
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 を明示的に設定する必要があります。
ネットワーク許可リストを使用したシェルツール
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 に組織の許可リストにないドメインが含まれていると、リクエストは失敗します。

データ保持とコンテナのライフサイクル

ホスト型シェルと Code Interpreter が使用するホスト型コンテナでは、コンテナがアクティブな間、一時的なアプリケーションの状態がコンテナのファイルシステム(一時的なブロックストレージを使用)に書き込まれる場合があります。コンテナの有効期限が切れるか、明示的に削除されると、コンテナ内のデータは削除されます。

データ制御の詳細は、ZDR とデータレジデンシーを参照してください。

成果物のダウンロード

ホスト型シェルでは、ダウンロード可能なファイルを生成できます。/mnt/data 配下に書き込まれた成果物を取得するには、Code Interpreter と同じ container/files API を使用します。

追加のデータ制御

コンテンツやファイルの保持をホスト環境のライフサイクル内に限定するには、リクエストにファイルをインラインで含め、コンテナにインラインスキルをマウントできます。

インラインファイルとインラインスキルの使用
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)が渡されます。
  • auth-translation サイドカーは、承認済みの接続先に対してのみ、シークレットの実際の値を適用します。
  • シークレットの実際の値は API サーバーに永続化されず、モデルが参照できるコンテキストにも含まれません。

これにより、アシスタントは漏えいのリスクを抑えながら、保護されたサービスを呼び出せます。

domain_secrets を使用したシェルツール
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 を渡します。

シェルワークフローの継続
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_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_call アクションを実行し、shell_call_output をモデルに返すことで、独自のローカルランタイムでシェルコマンドを実行することもできます。

実行環境、ファイルシステムへのアクセス、既存の内部ツールを完全に制御する必要がある場合は、このモードを使用します。

ローカルシェルのリクエスト
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 として返します。
ローカルシェルの実行処理の例
@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"
      }
    }
  ]
}

従来の実装からの移行については、旧版のローカルシェルガイドを参照してください。

Agents SDK でのローカルシェルの使用

Agents SDK を使用している場合は、独自に実装したシェルの実行処理をシェルツールのヘルパーに渡せます。

Agents SDK でのローカルシェルの使用
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 のリポジトリには、実際に動作するサンプルがあります。

シェルツールの例 - TypeScript

Agents SDK のシェルツールを使用する TypeScript のサンプルです。

シェルツールの例 - Python

Agents SDK のシェルツールを使用する Python のサンプルです。

よくあるエラーへの対処

  • コマンドの実行がタイムアウトした場合は、タイムアウトを示す結果と、それまでに取得した出力を返してください。
  • shell_callmax_output_length が含まれている場合は、shell_call_output にも含めてください。
  • 対話型のコマンドには依存せず、シェルツールは非対話形式で実行してください。
  • モデルが復旧手順を検討できるように、終了コードがゼロ以外の場合も出力を保持してください。

リスクと安全性

Containers API のネットワークアクセスを有効にすると強力な機能を利用できますが、セキュリティとデータガバナンスに関する重大なリスクも生じます。デフォルトでは、ネットワークアクセスは無効です。有効にする場合も、外部へのアクセスはタスクに必要な信頼できるドメインに厳しく限定してください。

ネットワークアクセスを有効にしたコンテナは、サードパーティーのサービスやパッケージレジストリと通信できます。そのため、データ漏えい、プロンプトインジェクションによるツールの不正利用、意図した範囲を超える偶発的なアクセスなどのリスクが生じます。ポリシーの許可範囲が広すぎる場合、見直されず固定されたままの場合、適用が一貫していない場合には、こうしたリスクが高まります。

ネットワーク経由で取得したコンテンツのプロンプトインジェクションリスクの理解

ネットワーク経由で取得する外部コンテンツには、モデルの動作を操作するための指示が隠されている可能性があります。信頼できないネットワーク上のコンテンツは、悪意がある可能性を前提に扱い、データやシステムを変更しうる操作には特に注意してください。

信頼できる接続先への限定

信頼でき、自ら継続的に管理しているドメインのみを許可してください。他のサービスへの通信を中継する仲介サービスやアグリゲーターには注意し、許可ドメインリストに追加する前に、データの取り扱いと保持の実態を確認してください。

リクエスト実行前後のレビューの組み込み

Responses API のレスポンスに含まれるシェルツールのコマンドと実行出力をレビューしてください。セッションごとに、要求されたホストと実際の外部接続先を記録してください。ログを定期的にレビューし、アクセスパターンが想定どおりであることを確認するとともに、想定からのずれや不審な動作を検出してください。

データレジデンシーと保持要件の確認

OpenAI のデータ管理は、OpenAI の管理範囲内で適用されます。ただし、ネットワーク接続を介してサードパーティーのサービスに送信されたデータには、そのサービスのデータ保持ポリシーが適用されます。外部エンドポイントが、自社のデータレジデンシー、保持、コンプライアンスの要件を満たしていることを確認してください。