0Pricing
AI Agents · レッスン

E2B とクラウドサンドボックスサービス

コードインタープリターエージェント向けの E2B SDK、Daytona、マネージドサンドボックス API を扱います。

「E2B とクラウドサンドボックスサービス」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。

E2Bとは何ですか

E2B(Environments to Build)は、AIコードエージェント向けに特化して設計されたクラウドサンドボックスサービスです。DockerやVMを自分で管理することなく、シンプルなPython/JS SDKから安全で隔離された環境を利用できます。

各サンドボックスは、E2Bのクラウド上にあるFirecracker microVMです。

# Install the SDK
# pip install e2b-code-interpreter

from e2b_code_interpreter import Sandbox

sandbox = Sandbox()  # creates a new cloud sandbox
print('Sandbox ID:', sandbox.sandbox_id)

サンドボックスでのコード実行

Sandboxオブジェクトにはrun_code()メソッドがあり、Pythonを実行して、標準出力、標準エラー出力、リッチな表示オブジェクト(プロット、データフレーム)を含む構造化された出力を返します。

from e2b_code_interpreter import Sandbox

with Sandbox() as sandbox:
    result = sandbox.run_code('print(2 ** 10)')
    print(result.logs.stdout)   # ['1024']
    print(result.error)         # None if no error

エラーと例外の処理

コードで例外が発生すると、result.errorにトレースバックが格納されます。サンドボックス自体は実行を続けるため、後続のコードを送信してエラーを修正できます。

from e2b_code_interpreter import Sandbox

with Sandbox() as sandbox:
    result = sandbox.run_code('1 / 0')

    if result.error:
        print('Error name:', result.error.name)    # ZeroDivisionError
        print('Traceback:', result.error.traceback)
    else:
        print(result.logs.stdout)

サンドボックスへのファイルのアップロード

sandbox.files.write()を使用すると、分析コードを実行する前に、データファイル(CSV、JSON、画像)をサンドボックスのファイルシステムにアップロードできます。

from e2b_code_interpreter import Sandbox

csv_content = 'name,score\nAlice,95\nBob,87\nCarol,92'

with Sandbox() as sandbox:
    sandbox.files.write('/home/user/data.csv', csv_content.encode())

    result = sandbox.run_code(
        'import csv\n'
        'rows = list(csv.DictReader(open("/home/user/data.csv")))\n'
        'print([r["name"] for r in rows])'
    )
    print(result.logs.stdout)   # ["['Alice', 'Bob', 'Carol']"]

サンドボックスからのファイルのダウンロード

計算後に、sandbox.files.read()を使用して出力ファイル(レポート、グラフ、処理済みデータ)を取得します。ファイルはバイト列として返されます。

from e2b_code_interpreter import Sandbox
import json

with Sandbox() as sandbox:
    sandbox.run_code(
        'import json\n'
        'result = {"mean": 91.3, "max": 95}\n'
        'json.dump(result, open("/home/user/output.json", "w"))'
    )
    data = sandbox.files.read('/home/user/output.json')
    parsed = json.loads(data)
    print(parsed)  # {'mean': 91.3, 'max': 95}

実行時のパッケージインストール

E2BのサンドボックスにはPythonがあらかじめインストールされています。run_code()でpipコマンドを実行して追加のパッケージをインストールし、同じサンドボックスセッション内の後続の呼び出しでそのパッケージを使用できます。

from e2b_code_interpreter import Sandbox

with Sandbox() as sandbox:
    # Install pandas inside the sandbox
    sandbox.run_code('import subprocess; subprocess.run(["pip", "install", "pandas", "-q"])')

    # Now use pandas
    result = sandbox.run_code(
        'import pandas as pd\n'
        'df = pd.DataFrame({"x": [1,2,3], "y": [4,5,6]})\n'
        'print(df.describe())'
    )
    print(result.logs.stdout)

永続サンドボックスと一時サンドボックス

E2Bは、サンドボックスのライフサイクルを2つのモードでサポートしています。

  • Ephemeral:withブロックを抜けるとサンドボックスが破棄されます。1回限りのコード実行に使用します
  • Persistent:複数のリクエストにわたってサンドボックスが起動し続けます。エージェントのターンをまたいで状態を蓄積する必要がある場合に使用します
from e2b_code_interpreter import Sandbox

# Ephemeral (default context manager)
with Sandbox() as sb:
    sb.run_code('x = 42')
# Sandbox destroyed here

# Persistent: keep alive for N seconds
sb = Sandbox(timeout=300)  # keep alive 5 minutes
try:
    sb.run_code('import numpy as np')  # expensive import cached
    sb.run_code('arr = np.arange(1000)')
    result = sb.run_code('print(arr.mean())')
    print(result.logs.stdout)
finally:
    sb.kill()  # explicit cleanup

実行中のサンドボックスへの再接続

エージェントのプロセスが再起動した場合や、sandbox_idが別のサービスに渡された場合でも、IDを使用して既存のサンドボックスに再接続できるため、状態は失われません。

from e2b_code_interpreter import Sandbox

# First session
sb1 = Sandbox(timeout=300)
sb1.run_code('accumulated_data = []')
sandbox_id = sb1.sandbox_id
print('Created:', sandbox_id)

# Later — different process, same sandbox
sb2 = Sandbox.connect(sandbox_id)
result = sb2.run_code('accumulated_data.append(1); print(accumulated_data)')
print(result.logs.stdout)  # '[1]' — state preserved

sb2.kill()

E2Bの料金モデル

E2Bの料金はsandbox-seconds(コードの実行中だけでなく、サンドボックスが起動している時間)に基づきます。主な料金要因は次のとおりです。

  • サンドボックスが永続的な場合、アイドル時間にも料金が発生します
  • 一時サンドボックスには、作成から破棄までの時間に対して課金されます
  • ネットワークのエグレスには別途料金が発生する場合があります
  • timeoutを使用して自動終了の期限を設定します
# Cost-optimization patterns:

# 1. Use short timeouts for one-shot executions
with Sandbox(timeout=60) as sb:
    result = sb.run_code('print("done")')
    # Auto-kills after 60s if not killed first

# 2. Kill immediately after use
sb = Sandbox()
try:
    sb.run_code('process_data()')
finally:
    sb.kill()   # don't wait for timeout

# 3. Share one sandbox across multiple agent steps
#    instead of creating a new one per step

エージェントループでのE2Bの使用

マルチターンエージェントでは、サンドボックスを一度だけ作成し、そのIDをループ内で渡します。LLMが生成した各コードスニペットが同じセッションで実行されるため、変数とインストール済みパッケージがターンをまたいで保持されます。

from e2b_code_interpreter import Sandbox
import openai

client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')

def run_agent(user_question: str):
    with Sandbox(timeout=120) as sb:
        messages = [{'role': 'user', 'content': user_question}]

        for _ in range(5):  # max 5 turns
            resp = client.chat.completions.create(
                model='gpt-4o', messages=messages,
                tools=[{'type': 'function', 'function': {
                    'name': 'run_python',
                    'description': 'Execute Python in a secure sandbox',
                    'parameters': {'type': 'object',
                                   'properties': {'code': {'type': 'string'}},
                                   'required': ['code']}
                }}]
            )
            msg = resp.choices[0].message
            if msg.tool_calls:
                code = eval(msg.tool_calls[0].function.arguments)['code']
                result = sb.run_code(code)
                messages.append({'role': 'tool',
                                  'tool_call_id': msg.tool_calls[0].id,
                                  'content': str(result.logs.stdout)})
            else:
                return msg.content

代替クラウドサンドボックスサービス

E2Bだけが選択肢ではありません。その他のクラウドサンドボックスサービスには次のものがあります。

  • Modal:サーバーレスのGPU/CPUサンドボックス、カスタムDockerイメージ
  • AWS Lambda:呼び出しごとの実行分離(内部ではFirecrackerを使用)
  • Code Interpreter API:ChatGPTツール向けのOpenAI組み込みサンドボックス
  • Daytona:Git統合に対応した開発用サンドボックス

一時E2Bサンドボックスがコンテキストマネージャーを抜けると変数はどうなりますか

サンドボックスのライフサイクルを理解することは、マルチターンのエージェント対話で一時サンドボックスと永続サンドボックスのどちらを使用するか判断するうえで重要です。

E2Bクラウドサンドボックスのまとめ

E2Bは、クラウド上でホストされるFirecracker microVMサンドボックス向けに、シンプルなSDKを提供します。主なパターンは、1回限りのコード実行に一時サンドボックス、マルチターンエージェントに永続サンドボックス、データの入出力にファイルのアップロードとダウンロード、サービス間のワークフローにIDによる再接続を使用することです。

不要な課金を避けるため、サンドボックスは必ず明示的に終了してください。

よくある質問

「E2B とクラウドサンドボックスサービス」レッスンは無料ですか?

はい。「E2B とクラウドサンドボックスサービス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。

「E2B とクラウドサンドボックスサービス」で何を学びますか?

コードインタープリターエージェント向けの E2B SDK、Daytona、マネージドサンドボックス API を扱います。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Agentsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「E2B とクラウドサンドボックスサービス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Agentsレッスンでコードを書いて実行できますか?

はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Docker ベースのエージェントサンドボックス
  2. 高セキュリティなコードエージェントのための VM 分離
  3. E2B とクラウドサンドボックスサービス
  4. コード実行のセキュリティポリシー
← AI Agentsに戻る