メインコンテンツへスキップ

概要

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インターフェースを実装しています。

設定

動作の仕組み

  1. Sandboxの作成: プロバイダーがE2B Sandboxを作成します。オプションでカスタムテンプレートを使用できます。組織でegressプロキシが有効な場合、Toolの実行ではegressテンプレートが使用され、ユーザーコードの実行前にハードニングされます。
  2. パッケージのインストール: パッケージが指定されている場合、Sandbox内で pip install(Python)または npm install(TypeScript)が実行されます。Python標準ライブラリのモジュールは除外され、TypeScriptでは zod と tsx が常に追加されます。
  3. Egressロックダウン(組織でegressプロキシが有効な場合のみ): Sandboxからの外向きネットワークトラフィックはJinbaのegressプロキシ経由にルーティングされます。プロキシの認証情報がToolの環境に入ることはありません。
  4. コードの実行: Python Toolのコードはファイルに書き込まれ、E2Bの runCode APIを介してJupyterライクなカーネルで実行されます。Egressロックダウン時は代わりにSandboxユーザーとして通常の python3 <file> プロセスで実行されます。TypeScript Toolのコードは .mts ファイルに書き込まれ、通常のNode.jsプロセスとして npx tsx で実行されるため、npmパッケージは通常通り解決されます。
  5. ライフサイクル: Sandboxは実行が終了するとすぐに終了(kill)されます。

Toolコードのラッピング

APIは実行前にコードをラップします。入力JSONはエントリーポイント(デフォルト run)に、Pythonでは Input(**data)、TypeScriptではプレーンオブジェクトとして渡され、戻り値はstdoutの最終行にJSONとして出力されます。これがRunの output になります。

Daytonaプロバイダー

@jinba-toolbox/sandbox-daytona パッケージは、Daytona SDKを使用してSandboxインターフェースを実装しています。

設定

動作の仕組み

  1. Sandboxの作成: プロバイダーがDaytona SDKを初期化し、指定された言語でSandboxを作成します。
  2. パッケージのインストール: パッケージが指定されている場合、プロバイダーがSandbox内で pip install または npm install を実行します。
  3. コードの実行: ToolコードはDaytonaの process.codeRun APIを介して実行されます。
  4. ライフサイクル: Sandboxは起動、停止、削除が可能です。
Daytonaプロバイダーはegressプロキシのロックダウンを実装しておらず、egress制限付きの実行を拒否します。コンソールでToolSetを作成する際に選択できるのはE2Bのみで、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 やビジネスロジックの変更は不要です。

関連ドキュメント