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

シェル

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

シェルツールを使うと、モデルは一通りの機能を備えたターミナル環境で作業できます。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 API でのコンテナの参照

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 と同じコンテナ API とファイル 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_id を container_reference とともに渡します。コンテナの稼働中は、マウントしたスキルとコンテナ内の既存ファイルを引き続き利用できます。

作業完了時のコンテナの削除

作業が完了したら、非アクティブ状態が続いて有効期限が切れるのを待たずに、コンテナを明示的に削除できます。

コンテナの削除
curl -L -X DELETE 'https://api.openai.com/v1/containers/container_id' \
  -H "Authorization: Bearer $OPENAI_API_KEY"

ドメイン別のシークレット

domain_secrets は、allowed_domains リスト内のドメインが Authorization: Bearer <token> のように機密情報を含む認証ヘッダーを必要とする場合に使用します。

各シークレットのエントリには、以下を含めます。

  • 対象ドメイン
  • 識別しやすいシークレット名
  • シークレットの値

実行時の動作は以下のとおりです。

  • モデルとランタイムには、実際の認証情報の代わりにプレースホルダー名(例:$API_KEY)が表示されます。
  • 認証情報の置換を担うサイドカーは、承認済みの宛先に対してのみシークレットの実際の値を適用します。
  • シークレットの実際の値は 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 API のシェル出力

ホスト型シェルとローカルシェルでは、同じ種類の出力項目を使用します。シェルの実行は、次の 2 つの出力項目のペアで表されます。

  • 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 をモデルに返すことで、独自のローカルランタイムでもシェルコマンドを実行できます。

ファイルシステムを自分で制御する必要がある場合や、内部ツールにアクセスする必要がある場合は、このモードを使用します。ツールの種類を shell に、環境の種類を local に設定します。廃止された local_shell ツールから移行する場合は、リクエストを更新し、実行ループで 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 の出力項目を受け取ったら、以下の手順に従います。

  • 実行前に各コマンドを確認します。許可リストを使用し、破壊的な操作を行うコマンドや機密データにアクセスするコマンドには、実行前の承認を必須とします。
  • ファイルシステムとネットワークへのアクセス範囲、メモリ使用量、実行時間に明示的な制限を設けたサンドボックスで、承認済みのコマンドを実行します。モデルがタイムアウト値を提案した場合も、自分で設定したタイムアウトを適用します。
  • 監査のため、コマンドとその実行結果をログに記録します。
  • stdout、stderr、終了結果を取得します。
  • 次のリクエストで、結果を 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 のサンプルです。

よくあるエラーへの対処

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

リスクと安全対策

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

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

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

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

接続先を信頼できるドメインに限定

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

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

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

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

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