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
| Option | Type | Default | Description |
|---|---|---|---|
apiKey | string | (required) | E2B API key |
templateId | string | undefined | Custom sandbox template ID |
timeoutMs | number | 300000 | Default timeout (5 minutes) |
How It Works
- Sandbox creation: The provider creates an E2B Code Interpreter sandbox, optionally using a custom template.
- Package installation: If packages are specified,
pip install(Python) ornpm install(TypeScript) runs inside the sandbox. - Code execution: Tool code is executed via E2B’s
runCodeAPI in a Jupyter-like kernel. - 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
| Option | Type | Default | Description |
|---|---|---|---|
apiKey | string | (required) | Daytona API key |
apiUrl | string | https://app.daytona.io/api | Daytona API URL |
target | string | us | Target region (us or eu) |
timeoutMs | number | 300000 | Default timeout (5 minutes) |
How It Works
- Sandbox creation: The provider initializes the Daytona SDK and creates a sandbox with the specified language.
- Package installation: If packages are specified, the provider runs
pip installornpm installinside the sandbox. - Code execution: Tool code is executed via Daytona’s
process.codeRunAPI. - Lifecycle: Sandboxes can be started, stopped, and deleted.
ToolSet Sandbox Configuration
When creating a toolset, you specify which sandbox provider and settings to use:SandboxConfig stored on each toolset:
Error Handling
All sandbox packages use a unifiedSandboxError type:
Adding a New Provider
The architecture is designed for extensibility. To add a new sandbox provider:Implement the SandboxProvider interface
Implement
create() and resume() methods that return a SandboxInstance.Related
- REST API — Endpoints for managing toolsets and running tools
- Versioning & Publishing — How sandbox config is frozen in versions
- Security & Access Control — Isolation and tenant boundaries
Jinba Toolbox