実行モデル
OpenAI はエージェントループを実行し、会話コンテキストを管理し、委譲ツールを提供します。 CoreWeave はエグゼキューターと、エージェントが作成するプログラムを実行します。 サンドボックスのプロビジョニング、ファイル転送、クリーンアップは、お使いのアプリケーション側で管理します。 コーディネーターとそのサブエージェントは、1 つのサンドボックスと 1 つのファイルシステムを共有します。 サブエージェントを作成しても、CoreWeave サンドボックスが別途作成されることはありません。 各スペシャリストにはそれぞれ専用の出力ファイルを割り当て、最終レポートはコーディネーターが担当するようにしてください。 こうしたファイルの割り当ては、書き込みの競合を避けるための慣例であり、アクセス制御ではありません。 詳しくは、OpenAI の マルチエージェントガイド を参照してください。要件
この例を実行する前に、次の要件を満たしてください。- Forge APIキー、または
SANDBOX_USERaction を持つ CoreWeave API アクセストークン、 および CPU サンドボックス 1 つ分のキャパシティ。 認証情報を選択するの手順に従ってください。 - Agents API へのアクセス権と、選択したモデルへのアクセス権を持つ OpenAI の project。
- Python と
uv。バージョンとロックファイルは、付属のレシピで指定されているものを使用してください。 api.openai.comへのアウトバウンド HTTPS 通信と、codex-cloud-environments.chatgpt.comへのセキュアな WebSocket アクセス。イメージのセットアップでは、エグゼキューターとランタイムの依存関係をインストールするためのパッケージ レジストリへのアクセスも必要です。
アプリケーションとエグゼキューターの認証情報を分離する
この例では、サンドボックス用の認証情報 1 つと OpenAI キー 2 つの、合計 3 つの認証情報を使用します。 各認証情報は 1 つのコンポーネントだけが使用するため、アプリケーションのアクセス権が サンドボックスに渡ることはありません。
このレシピのデフォルトは CoreWeave 認証です。Forge の APIキーを使用するには、
--sandbox-auth wandb を渡します。このレシピでは、Forge 認証に WANDB_API_KEY という環境変数名を厳密に使用する必要があり、FORGE_API_KEY は読み取りません。必須となるのは選択したサンドボックス用の認証情報のみですが、
どちらのモードでも OpenAI キーは 2 つとも必要です。アプリケーションは選択された
モードを記録するため、クリーンアップ時にも同じプロバイダーの認証情報が使用されます。
OpenAI のアプリケーションキーには、api.agents.read、api.agents.write、
api.responses.write が必要です。これとは別に、環境キーを
Agents > Environments > Keys で作成してください。
このキーの組織、project、およびユーザーまたはサービスアカウントの所有者は、セッションと同じである必要があります。
無関係な権限は None に設定してください。
このレシピでは、制限付きのエグゼキューターキーを SDK の environment_variables
引数で渡します。シークレットストアは設定しません。
アップロードするのはタスクの入力だけにしてください。アプリケーションの認証情報、ローカルの設定、
および検証ツールはサンドボックスの外に置きます。詳しくは
OpenAI の認証手順を参照してください。
エージェントセッションを接続する
実行可能なレシピでは、OpenAI と CoreWeave の SDK を使用して次のステップを実装しています。- セルフホストの Agents API セッションを作成し、そのセッション ID と環境
ID を保存します。エグゼキューターを起動する際は、返された
remote_urlをそのまま使用します。 - 最大ライフタイムを明示的に指定し、Python と Node の両方を含む CoreWeave サンドボックスを作成します。
- 返された環境 ID と、変更を加えていないリモート URL を指定して
codex exec-serverを起動します。制限付きのエグゼキューターキーのみをCODEX_API_KEYとして注入します。 - 合成された入力とタスクの指示をアップロードし、環境との 接続を確認します。タスクを送信し、その結果を確認します。
- クリーンアップの前に、生成されたアーティファクトと API アクティビティレコードを取得します。
client.beta.agents.sessions.create() に渡します。
--require-exit-codes チェックを使用すると、すべてのスペシャリストについて、数値の終了コード 0 による証拠が必須になります。started_at と completed_at の区間が重なっている場合は、サブエージェントのターンが同時に実行されたことを示します。ただし、これらのタイムスタンプの精度は秒単位であるため、
シェルプロセスが同時に実行されたことや、逐次実行より高速化されたことの証明にはなりません。
例を実行する
レシピのセットアップと実行の手順に従ってください。 このレシピには、独自の合成データ、タスク仕様、 アプリケーション、および独立した検証ツールが含まれています。 ダウンロードしたレポートは、検証ツールの検出結果と照らし合わせて確認してください。 セッションが存在している間は、 OpenAI Logs > Agents でもセッションのターンとツール呼び出しを確認できます。 該当する組織と project を選択してください。この例では チャット UI は提供しておらず、ChatGPT アプリや Codex アプリとのセッションの継続にも対応していません。 既存のコマンドラインインターフェース (CLI) ワークフローについては、 OpenAI Agents API in cws-agent を参照してください。 このレシピは SDK を直接使用するため、この CLI は不要です。Session、サンドボックス、ファイルの有効期間
何を保持するかを決める際は、会話、コンピュート、ワークスペースファイルをそれぞれ個別に管理してください。
コンピュートの有効期間は明示的に選択してください。このレシピでは最大ライフタイムを 20 分に設定しています。最大ライフタイムは上限であり、プロンプトのたびにリセットされる非アクティブタイマーではありません。
エグゼキューターを実行中の同じサンドボックスに再接続した場合、そのワークスペースは保持されます。一方、同じ環境 ID で代わりのコンピュートを起動しても、ファイルはリストアされません。
コンピュートを停止する前に、アーティファクトをダウンロードするか、CoreWeave の永続化機能を使用してください。
このレシピはアーティファクトをダウンロードしてからリソースを削除します。自動復旧やスナップショットからのリストアは実装していません。
サンドボックスを停止しても、API の会話は削除されません。また、会話を削除してもサンドボックスは停止しません。両方のクリーンアップ操作を実行し、失敗した場合はそれぞれ報告してください。
障害に対処する
障害を調査する際は、次のガイダンスを参考にしてください。- エグゼキューター が接続しない: 環境キーの所有者、アウトバウンドのネットワーク アクセス、エグゼキューター の互換性、および OpenAI から返されたリモート URL が正確かどうかを確認します。
- OpenAI が使用量または請求の上限を報告する: 再試行する前に、OpenAI の組織と project の請求制限を確認します。エグゼキューター が接続できても、それだけでモデルのターンを 実行できるとは限りません。
- ストリームが切断される、またはクライアントがタイムアウトする: 入力を再試行する前に、セッションの状態と保存済みの イベントを確認します。タイムアウトが発生しても、クラウド上の処理自体はキャンセルされません。
- 委譲や処理の並行実行が確認できない: 保存済みのアクティビティの記録を確認します。 report の内容が正しいというだけでは、マルチエージェントの run が並列実行された証拠としては不十分です。
- OpenAI の環境が期限切れになる: 再試行する前に環境の状態を確認します。レシピは 即座に失敗せず、処理の期限まで待機する場合があります。
- サンドボックスが期限切れになる: 可能であれば、保存済みのアーティファクトを復元します。代替の サンドボックスを使用するには、ファイル復元ポリシーを明示的に指定する必要があります。
- アプリケーションが中断される: レシピで保存されたリソースジャーナルと クリーンアップコマンドを使用します。サンドボックスの最大有効期間はあくまでフォールバックであり、 API セッションを削除する代わりにはなりません。