Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/opensandbox-group/OpenSandbox/llms.txt

Use this file to discover all available pages before exploring further.

AI coding CLIs are powerful, but running them directly on a developer machine or production server introduces real risks: unconstrained filesystem access, network egress, and accidental side effects from agent-generated commands. OpenSandbox solves this by giving each CLI its own isolated container. API keys are injected as environment variables at sandbox creation time and never written to disk, and the sandbox is terminated after the task completes. The code-interpreter image is the recommended base because it ships with Node.js and Python 3.12+ pre-installed, which all five CLIs below require.

Prerequisites

Pull the image and start the server before running any example:
docker pull sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.1.0

uv pip install opensandbox-server
opensandbox-server init-config ~/.sandbox.toml --example docker
opensandbox-server
Install the Python SDK in a separate terminal:
uv pip install opensandbox
Claude Code is Anthropic’s agentic coding assistant. The CLI is installed at runtime via npm; the auth token is passed through the container environment so it is never written to the repository.

Environment variables

VariableDefaultDescription
SANDBOX_DOMAINlocalhost:8080Sandbox service address
SANDBOX_API_KEY(optional)API key if your server requires authentication
SANDBOX_IMAGEsandbox-registry…/code-interpreter:v1.1.0Sandbox image
ANTHROPIC_AUTH_TOKEN(required)Your Anthropic auth token
ANTHROPIC_BASE_URL(optional)API endpoint override
ANTHROPIC_MODELclaude_sonnet4Model name

Example

import asyncio
import os
from datetime import timedelta

from opensandbox import Sandbox
from opensandbox.config import ConnectionConfig


def _required_env(name: str) -> str:
    value = os.getenv(name)
    if not value:
        raise RuntimeError(f"{name} is required")
    return value


async def _print_execution_logs(execution) -> None:
    for msg in execution.logs.stdout:
        print(f"[stdout] {msg.text}")
    for msg in execution.logs.stderr:
        print(f"[stderr] {msg.text}")
    if execution.error:
        print(f"[error] {execution.error.name}: {execution.error.value}")


async def main() -> None:
    domain = os.getenv("SANDBOX_DOMAIN", "localhost:8080")
    api_key = os.getenv("SANDBOX_API_KEY")
    claude_auth_token = _required_env("ANTHROPIC_AUTH_TOKEN")
    claude_base_url = os.getenv("ANTHROPIC_BASE_URL")
    claude_model_name = os.getenv("ANTHROPIC_MODEL", "claude_sonnet4")
    image = os.getenv(
        "SANDBOX_IMAGE",
        "sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/code-interpreter:v1.1.0",
    )

    config = ConnectionConfig(
        domain=domain,
        api_key=api_key,
        request_timeout=timedelta(seconds=60),
    )

    # Inject Claude settings into container environment for CLI access
    env = {
        "ANTHROPIC_AUTH_TOKEN": claude_auth_token,
        "ANTHROPIC_BASE_URL": claude_base_url,
        "ANTHROPIC_MODEL": claude_model_name,
        "IS_SANDBOX": "1",
    }
    env = {k: v for k, v in env.items() if v is not None}

    sandbox = await Sandbox.create(
        image,
        connection_config=config,
        env=env,
    )

    async with sandbox:
        # Install Claude CLI (Node.js is already in the code-interpreter image)
        install_exec = await sandbox.commands.run(
            "npm i -g @anthropic-ai/claude-code@latest"
        )
        await _print_execution_logs(install_exec)

        # Use Claude CLI to send a message
        run_exec = await sandbox.commands.run(
            'claude "Compute 1+1=?."'
        )
        await _print_execution_logs(run_exec)

        await sandbox.kill()


if __name__ == "__main__":
    asyncio.run(main())
Run the example:
ANTHROPIC_AUTH_TOKEN=your-token uv run python examples/claude-code/main.py

References

Build docs developers (and LLMs) love