Open4

AIエージェントのためのコード実行環境を提供するe2bを試してみる

Naoto ShibataNaoto Shibata

LLMを使ったAIエージェントやAIアプリで安全にコードを実行するサンドボックス環境を提供するe2bを触ってみる。
Node.jsやPythonをAIに生成させたとしても、生成されたコードを実行する環境としてローカル環境を活用すると本番運用には耐えれないため、彼らがDockerベースで実行環境を用意してくれている感じ。

https://e2b.dev/

ChatGPTのCode interpreterに対してもカスタマイズしたコードの実行環境としてプラグインを提供していたこともあるらしい。

Naoto ShibataNaoto Shibata

ダッシュボードはとてもシンプルだった。

  • Keys: API作成・管理
  • Sandboxes: 稼働中のサンドボックス環境
  • Templates: カスタマイズしたDockerコンテナのテンプレート
  • Usages: サンドボックスの実行予算についてアラートや上限の設定

サンドボックスはNode.jsやPython上からSDKを呼び出すことで実行ができる。その際にテンプレートのIDを指定すれば事前にカスタマイズしたDockerコンテナベースのサンドボックス環境を使用することができる。予算のアラートや上限設定ができるところはAIに書かせたコードを実行させることを前提にしていて気が利いている感じがする。

Dashboard

Naoto ShibataNaoto Shibata

チュートリアルにあるように実際に実行をしてみる。

  1. API Keyを取得
    ダッシュボードのKeysから新しいAPI Keyを作成してコピーをする。

  2. 新しいプロジェクトを作成して .envを作成してセットする。
    今回は、OpenAIのAPIを使ってPythonコードを書かせてみるので、OPENAI_API_KEYもセットする。

E2B_API_KEY=e2b_**************
OPENAI_API_KEY=***************
  1. 必要なライブラリをインストールする
pip install e2b-code-interpreter openai
  1. main.pyを作成する
├ .env
└ main.py

ここでは、チュートリアルにあるようにOpenAIのAPIに"strawberry"という単語に含まれるrの数を数えるコードを書かせている。
Sandboxというインスタンスから

from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
from e2b_code_interpreter import Sandbox

# Create OpenAI client
client = OpenAI()
system = "You are a helpful assistant that can execute python code in a Jupyter notebook. Only respond with the code to be executed and nothing else. Strip backticks in code blocks."
prompt = "Calculate how many r's are in the word 'strawberry'"

# Send messages to OpenAI API
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": system},
        {"role": "user", "content": prompt}
    ]
)

# Extract the code from the response
code = response.choices[0].message.content
print(f"""Code generated:

{code}""")

# Execute code in E2B Sandbox
if code:
    sandbox = Sandbox()
    execution = sandbox.run_code(code)
    result = execution.text
    print(f"""Result: {result}""")
  1. 実行結果
$ python main.py
Code generated:

word = "strawberry"
count_r = word.count('r')
count_r
Result: 3

ダッシュボードに戻るとリアルタイムにサンドボックスが起動していることが確認できた。

Sandbox running

このサンドボックスはデフォルトでは5分生き続けるみたいだが、設定で帰ることができるらしい。

from e2b_code_interpreter import Sandbox

# Create sandbox with and keep it running for 60 seconds.
# 🚨 Note: The units are seconds.
sandbox = Sandbox(
  timeout=60, 
)

https://e2b.dev/docs/sandbox

ちなみに、コンテキストマネージャを使った書き方をすると自動的にインスタンス終了時にサンドボックスを終了してくれるみたいでした。(Sandboxesに表示が残らなかった)

with Sandbox() as sandbox:
    execution = sandbox.run_code(code)
    result = execution.text
Naoto ShibataNaoto Shibata

自作のAIアプリ上でLLMにコードを書かせてデータ分析をさせたりするような時に使うにはとても良さそう。
AIが使うかもしれないライブラリを見越して元のAIアプリ側のサーバーにライブラリをインストールをしておくと、サーバー全体が重くなってしまったりライブラリのバージョンの不整合なども出てくる。
そういう意味では、LLMに使ってもらう環境をアウトソースするアイデアはとても良さそう。

以前自分でText to Plotlyで可視化をする処理を書いた時も以下のようにローカル環境で無理やり実装していたので、e2bを使った形で一度作り直してブログにしてみたい。

code_ = compile(code, "<string>", "exec")
namespace = {}
exec(code_, namespace)
func = namespace["main"]
fig = func(df)

☝️当時の実装
https://www.morph-data.io/ja/tools/snippets/item/text-to-plotly-the-easiest-way-to-create-a-chart-interactively