Skip to main content

Overview

Jinba Toolbox executes tool code in isolated sandbox environments. The sandbox system is designed around a provider-agnostic architecture: a shared interface package (@jinba-toolbox/sandbox-core) defines the contract, and individual provider packages (sandbox-e2b, sandbox-daytona) implement it. This separation means you can switch providers or add new ones without modifying any business logic.

Architecture

Core Interface

The @jinba-toolbox/sandbox-core package contains only interfaces and types — no concrete implementations. All providers must conform to these contracts.

SandboxProvider

The factory that creates and resumes sandbox instances:

SandboxInstance

A running sandbox environment with code execution, shell commands, and filesystem access:

SandboxCommands

Shell command execution within the sandbox:

SandboxFilesystem

File operations within the sandbox:

Key Types

E2B Provider

The @jinba-toolbox/sandbox-e2b package implements the sandbox interface using the E2B Code Interpreter SDK.

Configuration

How It Works

  1. Sandbox creation: The provider creates an E2B Code Interpreter sandbox, optionally using a custom template.
  2. Package installation: If packages are specified, pip install (Python) or npm install (TypeScript) runs inside the sandbox.
  3. Code execution: Tool code is executed via E2B’s runCode API in a Jupyter-like kernel.
  4. Lifecycle: Sandboxes can be paused, resumed, or terminated.

TypeScript Note

E2B’s Code Interpreter executes TypeScript in a Jupyter kernel that does not support ESM file imports. For this reason, TypeScript tool code is inlined rather than loaded from files. Python tools can use filesystem imports normally.

Daytona Provider

The @jinba-toolbox/sandbox-daytona package implements the sandbox interface using the Daytona SDK.

Configuration

How It Works

  1. Sandbox creation: The provider initializes the Daytona SDK and creates a sandbox with the specified language.
  2. Package installation: If packages are specified, the provider runs pip install or npm install inside the sandbox.
  3. Code execution: Tool code is executed via Daytona’s process.codeRun API.
  4. Lifecycle: Sandboxes can be started, stopped, and deleted.

ToolSet Sandbox Configuration

When creating a toolset, you specify which sandbox provider and settings to use:
The SandboxConfig stored on each toolset:

Error Handling

All sandbox packages use a unified SandboxError type:

Adding a New Provider

The architecture is designed for extensibility. To add a new sandbox provider:
1

Create a new package

Create packages/sandbox-<provider> with the standard package structure.
2

Implement the SandboxProvider interface

Implement create() and resume() methods that return a SandboxInstance.
3

Register the provider

Add the provider case to the API server’s getSandboxProvider function. No changes to sandbox-core or business logic are needed.