ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #35 - LangChain Sandbox」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
LangChain Sandbox
今回は、セキュアなPythonコード実行環境「LangChain Sandbox」について、実際に動かしたりソースコードを読んだりしました。
LangChain SandboxのGitHubリポジトリはこちらです。
今回のポイント
LangChain Sandboxとは
LangChain Sandboxは、信頼できないPythonコードを安全に実行するためのサンドボックス環境です。
Pyodideという、WebAssemblyで動作するブラウザやNode.js環境のPythonディストーションを使用して、LLMが生成したコードやユーザーが作成したコードを安全に実行できます。
LangChain Sandboxの主な特徴としては、以下の3つが挙げられています。
- セキュリティ - 権限を設定可能な隔離された実行環境
- ローカル実行 - リモート実行やDockerコンテナが不要
- セッションサポート - 複数のコード実行間で状態を維持
LangChain Sandboxの基本的な使い方
LangChain Sandboxを使用する際は、DenoとPythonのlangchain-sandboxパッケージをインストールします。
基本的な使い方は以下のようになります。
from langchain_sandbox import PyodideSandbox sandbox = PyodideSandbox( sessions_dir="sessions", allow_net=True, ) code = """\ import numpy as np x = np.array([1, 2, 3]) print(x) """ async def main() -> None: result = await sandbox.execute(code) pprint.pprint(result)
※記事内のコードはlangchain-sandbox==0.0.4を使用しています。より新しいバージョンでは多少実装方法が異なります。
上記のコードの実行結果は以下のようになります。
CodeExecutionResult(result=None,
stdout='Loading numpyLoaded numpy[1 2 3]',
stderr=None,
status='success',
execution_time=1.7986226081848145)
stdoutの箇所の末尾に、[1 2 3]というコード内でprintした値が含まれていることが分かります。
Statefulな実行
LangChain Sandboxでは、実行時の変数を次の実行に保持することもできます。
たとえば以下のコードでは、一度目の実行で定義したaという変数を、2度目の実行で使用しています。
async def main() -> None: result = await sandbox.execute("a = 1", session_id="123") pprint.pprint(result) result2 = await sandbox.execute("print(a)", session_id="123") pprint.pprint(result2)
LangChainツールとしての活用
LangChain Sandboxは、LangChainのツールとして使用することもできます。
LangGraphのcreate_react_agentでLangChain Sandboxをツールとして使用する例は、以下のようになります。
from langchain_sandbox import PyodideSandboxTool from langgraph.prebuilt import create_react_agent agent = create_react_agent( "openai:gpt-4.1", tools=[PyodideSandboxTool()], )
たとえば「5 + 7は?Pythonで計算してください。」という入力で実行すると、Sandbox環境でコードを実行しながら回答してくれます。
Sandbox環境を使う様子はLangSmithでも確認できます。

langgraph-codeact
LangChain Sandboxを使用するサンプルとしては、「langgraph-codeact」もあります。
langgraph-codeactは、「CodeAct」というアーキテクチャをLangGraphで実装したものです。
LangChain Sandboxとlanggraph-codeactを組み合わせるサンプルが、以下のURLで公開されています。
https://github.com/langchain-ai/langchain-sandbox/blob/main/examples/codeact_agent.py
このサンプルでは、以下のようにPython上で実装した関数を、Sandbox環境で利用可能にしています。
def add(a: float, b: float) -> float: """Add two numbers together.""" return a + b def multiply(a: float, b: float) -> float: """Multiply two numbers together.""" return a * b
Python標準ライブラリの「inspect」を使用して、Pythonの関数を文字列に変換してプロンプトやコードに埋め込む実装となっています。
LangChain Sandboxのしくみ
LangChain Sandbox自体の実装も確認しました。
ステップ1. Denoの実行
LangChain SandboxのPyodideSandboxを実行(execute)すると、subprocessでdeno runコマンドが実行されます。
その際、--allow-netなどのオプションにより、ネットワークやファイルへのアクセスが制限されます。
ステップ2. Pyodideを使ったPythonの実行
deno runコマンドでは、Pyodideを使ってPythonが実行されます。
その際、Pyodideの機能を活用して、セッション間での変数の保持などが実限されています。
参考: https://github.com/langchain-ai/langchain-sandbox/blob/main/libs/pyodide-sandbox-js/main.ts
Denoを使用することで、コンテナ等を使わずにセキュアな実行環境を実現していることが大きな特徴ですね。
次回のご案内
以上、今回は「LangChain Sandbox」をキャッチアップしました。
次回は「AIエージェントキャッチアップ #36 - Claude Code Action」ということで、Claude CodeをGitHub Actionsで動かす「Claude Code Action」がテーマです!
generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!