OpenAI Agents SDK ↗ は、マルチエージェントワークフロー向けの軽量な Python フレームワークです。Cloudflare Sandbox 連携は最初から用意されており、SDK に第一級の Cloudflare バックエンドが入ります。エージェントは分離コンテナーでコード実行、パッケージインストール、ファイル管理ができます。
このチュートリアルでは、サンドボックスブリッジ Worker をデプロイし、コーディングタスクを受け取り、Cloudflare Sandbox 内で実行し、出力ファイルをローカルマシンへコピーする Python エージェントを構築します。
所要時間: 20 分
- Containers / Sandbox ベータが有効な Cloudflare アカウント ↗ に登録します。
- Python 3.12+ ↗ と uv ↗ をインストールします。
- OpenAI API キー ↗ を取得します。
サンドボックスブリッジ は、Sandbox API を HTTP で公開する Cloudflare Worker です。OpenAI Agents SDK を使う Python スクリプトなど、Worker 以外のクライアントからサンドボックスを作成し、制御できます。
Sandbox 環境は Node.js と Python 開発向けに事前設定されています。エージェントはすぐにコードの作成と実行を始められます。
ブリッジを Cloudflare アカウントにデプロイします。
ボタンは Worker をデプロイし、認証用の SANDBOX_API_KEY シークレットを生成します。デプロイが終わったら、Worker URL と API キーを控えます。次の手順で使います。
手動デプロイ
手順を追ってデプロイする場合:
-
ブリッジプロジェクトを作成します。
npm create cloudflare sandbox-bridge --template=cloudflare/sandbox-sdk/bridge/worker cd sandbox-bridge -
Cloudflare に認証します。
npx wrangler login -
API キーシークレットを設定します。
openssl rand -hex 32 | tee /dev/stderr | npx wrangler secret put SANDBOX_API_KEYキーはターミナルに表示され、Wrangler へパイプされます。保存してください。API リクエストの認証に使います。
-
Worker をデプロイします。
npx wrangler deploy -
デプロイを確認します。
curl https://cloudflare-sandbox-bridge.<your-subdomain>.workers.dev/health{"ok":true}が表示されます。
エージェント用の新しいディレクトリを作成します。
mkdir openai-sandbox-agent && cd openai-sandbox-agent認証情報を .env ファイルに書きます。
OPENAI_API_KEY=sk-your-openai-key
CLOUDFLARE_SANDBOX_API_KEY=your-bridge-token
CLOUDFLARE_SANDBOX_WORKER_URL=https://cloudflare-sandbox-bridge.your-subdomain.workers.dev次の内容で main.py を作成します。インラインのスクリプトメタデータが uv にインストールする依存関係を伝えるため、すべてが 1 ファイルに収まります。
# /// script
# requires-python = ">=3.12"
# dependencies = ["openai-agents[cloudflare]"]
# ///
"""One-shot coding agent backed by a Cloudflare Sandbox."""
from __future__ import annotations
import asyncio
import os
import sys
from pathlib import Path
from agents import Runner
from agents.extensions.sandbox.cloudflare import (
CloudflareSandboxClient,
CloudflareSandboxClientOptions,
)
from agents.run import RunConfig
from agents.sandbox import SandboxAgent, SandboxRunConfig
from agents.sandbox.capabilities import Shell
MODEL = "gpt-5.4"
INSTRUCTIONS = """\
You are an expert developer working inside a sandbox.
The sandbox has bun, node, npm, and python available on the PATH.
Implement the user's task in /workspace, test it, then copy deliverable files to /workspace/output/.
""".strip()
async def copy_output(session, dest: Path) -> list[Path]:
"""Download files from /workspace/output/ in the sandbox to a local directory."""
dest.mkdir(parents=True, exist_ok=True)
ls = await session.exec("find", "/workspace/output", "-maxdepth", "1", "-type", "f", shell=False)
if not ls.ok():
return []
copied: list[Path] = []
for name in (l.strip() for l in ls.stdout.decode().splitlines() if l.strip()):
handle = await session.read(Path(name))
local = dest / Path(name).name
payload = handle.read(); handle.close()
local.write_bytes(payload if isinstance(payload, bytes) else payload.encode())
copied.append(local)
return copied
async def run(prompt: str, output_dir: Path) -> None:
worker_url = os.environ.get("CLOUDFLARE_SANDBOX_WORKER_URL", "")
if not worker_url:
sys.exit("Error: CLOUDFLARE_SANDBOX_WORKER_URL is not set.")
agent = SandboxAgent(
name="Developer",
model=MODEL,
instructions=INSTRUCTIONS,
capabilities=[Shell()],
)
client = CloudflareSandboxClient()
options = CloudflareSandboxClientOptions(worker_url=worker_url)
session = await client.create(manifest=agent.default_manifest, options=options)
try:
async with session:
run_config = RunConfig(
sandbox=SandboxRunConfig(session=session),
tracing_disabled=True,
)
# Stream tool calls so the user can follow progress.
result = Runner.run_streamed(agent, prompt, run_config=run_config)
async for ev in result.stream_events():
if ev.type == "run_item_stream_event" and ev.name == "tool_called":
print(f" [tool] {getattr(ev.item.raw_item, 'name', '')}")
elif ev.type == "run_item_stream_event" and ev.name == "tool_output":
print(f" [output] {str(getattr(ev.item, 'output', ''))[:200]}")
# Copy output files from the sandbox to the local machine.
copied = await copy_output(session, output_dir)
if copied:
print(f"\nCopied {len(copied)} file(s) to {output_dir}:")
for p in copied:
print(f" {p}")
else:
print("\nAgent did not produce any output files.")
finally:
await client.delete(session)
if __name__ == "__main__":
prompt = sys.argv[1] if len(sys.argv) > 1 else "Create a hello world HTTP server using Bun.serve"
asyncio.run(run(prompt, Path("output")))主要な部分の役割は次のとおりです。
| コンポーネント | 役割 |
|---|---|
SandboxAgent |
サンドボックス固有の設定(capabilities を含む)を受け取る Agent のサブクラスです。 |
Shell() |
LLM にシェルツールを公開する capability です。サンドボックス内でコマンドを実行できます。 |
CloudflareSandboxClient |
ブリッジ Worker 経由でサンドボックスセッションを作成し、管理します。認証には環境の CLOUDFLARE_SANDBOX_API_KEY を読みます。 |
CloudflareSandboxClientOptions |
クライアントをブリッジ Worker の URL に向けます。 |
Runner.run_streamed() |
エージェントを実行し、ツール呼び出しとテキスト出力のストリーミングイベントを返します。 |
SandboxRunConfig |
実行中のサンドボックスセッションを run に結び付け、エージェントのツールがコンテナー内で動くようにします。 |
uv run --env-file .env main.py "Create a hello world HTTP server using Bun.serve"ツール呼び出しと出力がコンソールにストリーミングされます。
Sending task to sandbox agent (gpt-5.4)...
[tool] exec_command
[output] exit_code=0 stdout: mkdir: created directory '/workspace/output'
[tool] exec_command
[output] exit_code=0 stdout: Listening on http://localhost:3000
Copied 1 file(s) to output:
output/server.tsエージェントはコードを書き、サンドボックス内でテストし、成果物をローカルマシンへコピーしました。
次の Python コーディングエージェントを構築しました。
- 自然言語のコーディングタスクを受け取る
- 分離された Cloudflare Sandbox コンテナーでコードを実行する
- パッケージのインストール、テスト実行、タスク完了まで反復する
- 成果物ファイルをローカルマシンへコピーする
ブリッジ Worker の Dockerfile は用途に合わせてカスタマイズできます。追加の言語、システムパッケージ、ツールをインストールできます。
Cloudflare Sandbox には、エージェントへ組み込める機能がほかにもあります。
- PTY セッション — WebSocket でサンドボックスに対話型ターミナルセッションを開き、リアルタイム I/O を行います。
- バケットマウント — R2 または S3 互換バケットをサンドボックス内のローカルディレクトリとしてマウントし、データを永続化します。
- ワークスペースのバックアップと復元 —
persist_workspace()とhydrate_workspace()でワークスペース状態を保持し、サンドボックスのライフサイクルをまたいで作業を再開します。 - ファイル操作 — サンドボックス内のファイルをプログラムから読み書きし、管理します。
- Workspace chat の例 ↗ — OpenAI Agents SDK と Cloudflare Sandbox で構築した、ファイルブラウザーサイドバー付きのフルスタックチャットアプリです。
- OpenAI Agents SDK のドキュメント ↗ — マルチエージェントのハンドオフ、ガードレール、トレーシングなどを学べます。
- サンドボックスブリッジ — ブリッジ Worker の概要、使用例、設定です。
- HTTP API リファレンス — ブリッジ API のルート一覧です。
- Sandbox チュートリアル — コード実行、データ分析、CI/CD パイプラインなどのチュートリアルです。