概要
Jinba Toolboxは、隔離されたSandbox環境でToolコードを実行します。Sandboxシステムはプロバイダー非依存のアーキテクチャで設計されています。共有インターフェースパッケージ(@jinba-toolbox/sandbox-core)がコントラクトを定義し、個別のプロバイダーパッケージ(sandbox-e2b、sandbox-daytona)がそれを実装します。
この分離により、ビジネスロジックを変更することなく、プロバイダーの切り替えや新規追加が可能になります。
アーキテクチャ
コアインターフェース
@jinba-toolbox/sandbox-core パッケージにはインターフェースと型のみが含まれ、具体的な実装はありません。すべてのプロバイダーはこれらのコントラクトに準拠する必要があります。
SandboxProvider
Sandboxインスタンスを作成・再開するファクトリ:SandboxInstance
コード実行、シェルコマンド、ファイルシステムアクセスを備えた実行中のSandbox環境:SandboxCommands
Sandbox内でのシェルコマンド実行:SandboxFilesystem
Sandbox内でのファイル操作:主要な型
E2Bプロバイダー
@jinba-toolbox/sandbox-e2b パッケージは、E2B Code Interpreter SDKを使用してSandboxインターフェースを実装しています。
設定
動作の仕組み
- Sandboxの作成: プロバイダーがE2B Sandboxを作成します。オプションでカスタムテンプレートを使用できます。組織でegressプロキシが有効な場合、Toolの実行ではegressテンプレートが使用され、ユーザーコードの実行前にハードニングされます。
- パッケージのインストール: パッケージが指定されている場合、Sandbox内で
pip install(Python)またはnpm install(TypeScript)が実行されます。Python標準ライブラリのモジュールは除外され、TypeScriptではzodとtsxが常に追加されます。 - Egressロックダウン(組織でegressプロキシが有効な場合のみ): Sandboxからの外向きネットワークトラフィックはJinbaのegressプロキシ経由にルーティングされます。プロキシの認証情報がToolの環境に入ることはありません。
- コードの実行: Python Toolのコードはファイルに書き込まれ、E2Bの
runCodeAPIを介してJupyterライクなカーネルで実行されます。Egressロックダウン時は代わりにSandboxユーザーとして通常のpython3 <file>プロセスで実行されます。TypeScript Toolのコードは.mtsファイルに書き込まれ、通常のNode.jsプロセスとしてnpx tsxで実行されるため、npmパッケージは通常通り解決されます。 - ライフサイクル: Sandboxは実行が終了するとすぐに終了(kill)されます。
Toolコードのラッピング
APIは実行前にコードをラップします。入力JSONはエントリーポイント(デフォルトrun)に、Pythonでは Input(**data)、TypeScriptではプレーンオブジェクトとして渡され、戻り値はstdoutの最終行にJSONとして出力されます。これがRunの output になります。
Daytonaプロバイダー
@jinba-toolbox/sandbox-daytona パッケージは、Daytona SDKを使用してSandboxインターフェースを実装しています。
設定
動作の仕組み
- Sandboxの作成: プロバイダーがDaytona SDKを初期化し、指定された言語でSandboxを作成します。
- パッケージのインストール: パッケージが指定されている場合、プロバイダーがSandbox内で
pip installまたはnpm installを実行します。 - コードの実行: ToolコードはDaytonaの
process.codeRunAPIを介して実行されます。 - ライフサイクル: Sandboxは起動、停止、削除が可能です。
daytona はAPI経由で選択できます。
ToolSetのSandbox設定
ToolSetを作成する際に、使用するSandboxプロバイダーと設定を指定します:resources.timeout のみです(Sandboxの作成とToolの実行時間を制限します)。cpu と memory は受け付けられて保存されますが、プロバイダーには適用されません。
各ToolSetに保存される SandboxConfig:
エラーハンドリング
すべてのSandboxパッケージは統一されたSandboxError 型を使用します:
新しいプロバイダーの追加
アーキテクチャは拡張性を考慮して設計されています。新しいSandboxプロバイダーを追加するには:1
新しいパッケージを作成する
標準的なパッケージ構成で
packages/sandbox-<provider> を作成します。2
SandboxProviderインターフェースを実装する
SandboxInstance を返す create() と resume() メソッドを実装します。3
プロバイダーを登録する
APIサーバーの
getSandboxProvider 関数にプロバイダーのケースを追加します。sandbox-core やビジネスロジックの変更は不要です。関連ドキュメント
- REST API — ToolSetの管理とToolの実行に関するエンドポイント
- バージョニングと公開 — VersionにSandbox設定がどのように凍結されるか
- セキュリティとアクセス制御 — 隔離とテナント境界