Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

OpenAI Agents API を使い、Cloudflare Containers で Codex を実行する

最終更新 Markdown で表示Agent セットアップ

OpenAI Agents API は、OpenAI が管理する API を通じて、アプリケーションに Codex ハーネスへのアクセスを与えます。OpenAI がセッション、オーケストレーション、コンテキストの圧縮、回復を管理し、アプリケーションはツールを提供します。Cloudflare Containers は実行環境を提供できます。

Cloudflare Containers で、セルフホストの OpenAI Agents API セッションを実行します。各セッションには、codex exec-server を動かすコンテナを裏付ける Durable Object があります。署名付きの OpenAI Webhook がセッションのオーケストレーションを管理します。

アプリケーションが OpenAI のタスクを作成し、Webhook が Cloudflare コンテナを起動し、アプリケーションが結果を取得するアーキテクチャ

このガイドで使う Worker とコンテナイメージは Cloudflare executor テンプレート に含まれます。

仕組み

  • Cloudflare Worker: 署名付きの OpenAI Webhook を受け取り、エージェントセッションごとに 1 つのコンテナを管理します。
  • Cloudflare Container: codex exec-server と、エージェントが生成したコードを /workspace のファイルに対して実行します。
  • Codex executor: 制限付き API キーで OpenAI へ外向き接続します。ワークスペースは Cloudflare アカウント内に残ります。

前提条件

次が必要です。

  • Containers へのアクセスがある Cloudflare アカウント
  • OpenAI Agents API へのアクセスと OpenAI API キー
  • curl
  • 手動デプロイの場合は、Node.js 24 以降、npm、Docker、Wrangler

このガイドでは、codex exec-server が使う制限付き OpenAI API キーを「executor キー」と呼びます。必要な権限は api.model.readapi.agents.environments.connect です。Worker が使うアプリケーションキーには api.agents.read が必要です。両方のキーは、同じ組織、プロジェクト、ユーザーまたはサービスアカウントの所有者に属している必要があります。

クイックスタート

最も速いセットアップは Deploy to Cloudflare ボタンです。次の手順で OpenAI エージェントを作成し、実行環境をデプロイし、Webhook を登録し、/workspace でテストタスクを実行します。

  1. OpenAI エージェントを作成する。 OpenAI API キーを設定してから、エージェントを作成します。
export OPENAI_API_KEY="<OPENAI_API_KEY>"
curl "https://api.openai.com/v1/agents" \
	--request POST \
	--header "OpenAI-Beta: agents=v1" \
	--header "Authorization: Bearer $OPENAI_API_KEY" \
	--json '{
		"name": "sandbox-demo",
		"model": "gpt-5.6-sol"
	}'

応答の id フィールドをコピーし、エージェント ID として保存します。

export OPENAI_AGENT_ID="agent_..."
  1. Worker とコンテナをデプロイする。 コンテナのクリーンアップエンドポイント用の共有シークレットを生成し、保存します。

    openssl rand -hex 32

    Deploy to Cloudflare を選びます。

    Deploy to Cloudflare

    求められたら、次の値を入力します。

    変数
    OPENAI_API_KEY セッション状態の取得に使う OpenAI キー
    OPENAI_EXECUTOR_API_KEY 制限付きの executor キー
    OPENAI_AGENT_ID 上で作成したエージェント ID
    OPENAI_WEBHOOK_SECRET 初回デプロイでは pending-webhook-registration
    EXECUTOR_CLIENT_SECRET 上で生成した共有シークレット

    デプロイした Worker URL を保存します。

    export WORKER_URL="https://<YOUR_WORKER>.workers.dev"

    コンテナは 30 秒間利用できます(EXECUTOR_KEEP_ALIVE_SECONDS で設定可能)。プリウォームとアイドル時のスナップショットは、デフォルトで有効です。

  2. Webhook を登録する。 OpenAI プロジェクトの Webhook 設定 で、公開到達可能なエンドポイント https://<YOUR_WORKER>.workers.dev/webhook を登録します。

    次のイベントを購読します。

    • agent.session.created
    • agent.session.action_required
    • agent.session.in_progress
    • agent.session.idle
    • agent.session.failed

    OpenAI が返す署名シークレットをコピーします。Worker の Settings > Variables and SecretsOPENAI_WEBHOOK_SECRET を置き換え、Deploy を選びます。手動デプロイした場合は、Cloudflare テンプレートディレクトリから Wrangler で設定します。

    npx wrangler secret put OPENAI_WEBHOOK_SECRET

    セットアップを確認します。

    curl --fail-with-body "$WORKER_URL/health"

    応答に "configured": true"webhook_configured": true の両方が含まれるとき、このガイド向けに Worker の準備ができています。

  3. テストタスクを実行する。 セルフホストセッションを作成します。

curl "https://api.openai.com/v1/agents/sessions" \
	--request POST \
	--header "OpenAI-Beta: agents=v1" \
	--header "Authorization: Bearer $OPENAI_API_KEY" \
	--json '{
		"agent_id": "$OPENAI_AGENT_ID",
		"environment": {
				"type": "self_hosted",
				"workspace_directory": "/workspace"
		}
	}'

応答の id フィールドをコピーし、セッション ID として保存します。

export SESSION_ID="sess_..."

1 つのターミナルでセッションのイベントストリームを開きます。

curl --no-buffer \
  "https://api.openai.com/v1/agents/sessions/$SESSION_ID/events" \
  --header "OpenAI-Beta: agents=v1" \
  --header "Authorization: Bearer $OPENAI_API_KEY" \
  --header "Accept: text/event-stream"

ストリームを開いたまま、別のターミナルからタスクを送信します。

curl "https://api.openai.com/v1/agents/sessions/$SESSION_ID/events" \
	--request POST \
	--header "OpenAI-Beta: agents=v1" \
	--header "Authorization: Bearer $OPENAI_API_KEY" \
	--json '{
		"events": [
				{
						"type": "session.input.message",
						"input": [
								{
										"role": "user",
										"content": [
												{
														"type": "input_text",
														"text": "Use the shell to write hello to /workspace/hello.txt, then read it."
												}
										]
								}
						]
				}
		]
	}'

イベントストリームに、エージェントの進行状況と応答が表示されます。

手動でデプロイする

上の手順 2 のデプロイボタンの代わりに、次を行います。

  1. Cloudflare テンプレートリポジトリをクローンし、依存関係をインストールし、Cloudflare にログインします。

    git clone https://github.com/cloudflare/sandbox-sdk.git
    cd sandbox-sdk
    npm install
    cd openai/agents-api
    npx wrangler login
  2. コンテナのクリーンアップエンドポイント用の共有シークレットを生成し、保存します。

    openssl rand -hex 32
  3. Worker シークレットを保存します。求められたら、OpenAI キー、制限付き executor キー、エージェント ID、共有シークレットを入力します。

    npx wrangler secret put OPENAI_API_KEY
    npx wrangler secret put OPENAI_EXECUTOR_API_KEY
    npx wrangler secret put OPENAI_AGENT_ID
    npx wrangler secret put EXECUTOR_CLIENT_SECRET
  4. Worker とコンテナをデプロイします。

    npm run deploy

EXECUTOR_KEEP_ALIVE_SECONDSEXECUTOR_PREWARM_ENABLEDEXECUTOR_SNAPSHOTS_ENABLED は、wrangler.jsonc のシークレットではない設定です。

デプロイした Worker URL を保存し、上の手順 3 を完了します。手順 4 を実行する前に、選んだ OpenAI の例リポジトリのルートへ戻ります。

既存セッションに再接続する

セッションのイベントストリームを再度開き、続きの入力を送信します。

curl "https://api.openai.com/v1/agents/sessions/$SESSION_ID/events" \
	--request POST \
	--header "OpenAI-Beta: agents=v1" \
	--header "Authorization: Bearer $OPENAI_API_KEY" \
	--json '{
		"events": [
				{
						"type": "session.input.message",
						"input": [
								{
										"role": "user",
										"content": [
												{
														"type": "input_text",
														"text": "Read /workspace/hello.txt again."
												}
										]
								}
						]
				}
		]
	}'

Cloudflare Workers 上の Agents API

HTTP インターフェイス付きの完全な TypeScript アプリケーションは、Cloudflare Sandbox SDK リポジトリの basic Agents API の例 を参照してください。

この例は OpenAI Agents API TypeScript SDK を使い、デプロイした executor Worker を裏付けるセルフホストセッションを作成します。初回入力、続きの入力、クリーンアップのエンドポイントがあります。POST /demo エンドポイントは一連のワークフローを実行します。セッション作成、コンテナ内でのファイルの書き込みと読み取り、続きのメッセージ送信、OpenAI セッションと Cloudflare executor の削除です。

クリーンアップ

OpenAI セッションを削除します。

curl "https://api.openai.com/v1/agents/sessions/$SESSION_ID" \
	--request DELETE \
	--header "OpenAI-Beta: agents=v1" \
	--header "Authorization: Bearer $OPENAI_API_KEY"

Cloudflare Container をすぐに止めるには、デプロイ時に保存した共有シークレットを使います。

export WORKER_URL="https://<YOUR_WORKER>.workers.dev"
export EXECUTOR_CLIENT_SECRET="<EXECUTOR_CLIENT_SECRET>"

curl --fail-with-body \
  --request DELETE \
  --header "Authorization: Bearer $EXECUTOR_CLIENT_SECRET" \
  "$WORKER_URL/executors/$SESSION_ID"

OpenAI セッションの削除では、コンテナのクリーンアップ Webhook は送られません。明示的なクリーンアップがないと、アイドルセッションは次の環境接続向けにスナップショットを保持します。失敗セッションの Webhook、または 404 Not Found を返すセッション参照は、コンテナを解放し、保存済みスナップショットを消します。

実行ライフサイクル

  1. リクエスト: アプリケーションは OpenAI セッションを作成または取得し、Agents API 経由で入力を送信します。

  2. プリウォーム: デフォルトでは、署名付きの agent.session.created Webhook を受けた Worker が現在のセッション状態を取得し、環境 ID とリモート URL 付きでセルフホストコンテナを起動します。

  3. 整合: agent.session.action_required Webhook を受けた Worker は現在のセッション状態を取得し、設定したエージェントがそのセッションを所有していることを確認し、必要な環境 ID とリモート URL を読み取ります。

  4. 起動: セッション名の Durable Object が、接続詳細と制限付き executor キー付きで Cloudflare Container を起動します。codex exec-server は OpenAI へ外向き接続します。

  5. キープアライブ: コンテナ起動、環境接続アクション、agent.session.in_progress イベントはライフサイクル期限をセットします。期限が切れると、Worker は現在のセッション状態を取得し、アクティブなセッションへ別の期限を与えます。

  6. アイドル: agent.session.idle Webhook は、スナップショットが有効なときにコンテナ全体をスナップショットし、ライフサイクル期限をセットします。期限が切れると、Worker はコンテナを止め、スナップショットを保持します。

  7. 再接続: 新しい入力は、別の agent.session.action_required Webhook を送ります。Worker は同じ環境 ID の稼働中コンテナを再利用するか、次の環境を起動するときに保存済みスナップショットを復元します。

アプリケーションが Agents API セッションを作成し、OpenAI が Cloudflare へ Webhook を送り、コンテナの Codex executor が OpenAI に接続するライフサイクル

ワークスペースの復元

コンテナのスナップショットは現在プライベートベータです。Cloudflare アカウントでこの機能を有効にしたい場合は、担当の Cloudflare 担当者へ連絡してください。

EXECUTOR_SNAPSHOTS_ENABLEDtrue のとき、確認済みのアイドルセッションは、コンテナ停止前にコンテナ全体のスナップショットを作成します。次の環境接続はそのスナップショットを復元し、/workspace も含みます。スナップショット作成に失敗すると、Worker は現在のコンテナを動かし続け、別のライフサイクル確認を予約します。

スナップショットはベストエフォートのセッション回復であり、耐久性のあるバックアップではありません。失敗または削除したセッションと、明示的なクリーンアップは、保存済みスナップショットを消します。スナップショットが無効または使えない場合、次の executor は新しい /workspace を受け取ります。耐久性のあるファイルには、R2 FUSE マウント を使うようコンテナイメージを適応します。

コンテナへツールを追加する

executor イメージは、Cloudflare executor テンプレートの openai/agents-api/Dockerfile で定義されています。既存の apt-get install コマンドへ Debian パッケージを追加します。たとえば jq と Python を追加します。

RUN apt-get update \
    && apt-get install --yes --no-install-recommends \
      ca-certificates \
      curl \
      git \
      jq \
      python3 \
      ripgrep \
    && rm -rf /var/lib/apt/lists/*

イメージへ言語固有のツール(グローバル npm パッケージなど)もインストールできます。Dockerfile に API キーやそのほかのシークレットを置かないでください。ランタイムシークレットは Worker バインディングまたはコンテナの環境変数で渡します。

更新したイメージをビルドしてデプロイするには、openai/agents-api から npm run deploy を実行します。

セキュリティ上の考慮事項

実行可能な例は意図的に最小限です。本番向けに適応する前に、次のデフォルトを確認してください。

  • シークレット: コントローラーキー、Webhook シークレット、EXECUTOR_CLIENT_SECRET は Worker シークレットのままです。制限付き executor キーは CODEX_API_KEY としてコンテナへ渡され、コンテナ内のプロセスが読めます。コンテナインスタンスのほかの設定方法は コンテナの環境変数とシークレット を参照してください。
  • ネットワークアクセス: この例は、codex exec-server が OpenAI に届くよう外向きのインターネットアクセスを有効にします。宛先を制限したり、ほかのサービス向けの認証情報を注入したりするには コンテナの送信トラフィック制御 を使います。
  • ファイル: /workspace は一時的なコンテナストレージです。エージェントが変更すべきでない耐久性のあるソースファイルが必要なときは、読み取り専用の R2 FUSE マウント を使います。
  • Worker へのアクセス: OpenAI は対話型の Access ログインなしで /webhook に届く必要があります。Worker は OpenAI の Webhook 署名を検証し、手動クリーンアップエンドポイントには EXECUTOR_CLIENT_SECRET が必要です。ほかのルートを Cloudflare Access で保護する場合は、/webhook を到達可能のままにする パス固有のポリシー を使います。

詳細は Containers のアーキテクチャ を参照してください。

関連リソース

役に立ちましたか?