RuntimeUse

Quickstart

Start the runtime, connect from Python, and run your first prompt.

1. Start the Runtime

npm install -g @anthropic-ai/claude-code
export ANTHROPIC_API_KEY=your_anthropic_api_key
npx -y runtimeuse@latest --agent claude

This starts the Claude Code agent on port 8080. To use OpenAI agent instead:

export OPENAI_API_KEY=your_openai_api_key
npx -y runtimeuse@latest
ws_url = "ws://localhost:8080"
pip install e2b
# Required env vars: E2B_API_KEY, ANTHROPIC_API_KEY
from e2b import Template, wait_for_port, Sandbox

template = (
    Template()
    .from_node_image("lts")
    .set_workdir("/runtimeuse")
    .npm_install(["@anthropic-ai/claude-code"], g=True)
    .set_envs(
        {
            "ANTHROPIC_API_KEY": anthropic_api_key,
            "IS_SANDBOX": "1",
            "CLAUDE_SKIP_ROOT_CHECK": "1",
        }
    )
    .set_start_cmd("npx -y runtimeuse@latest --agent claude", wait_for_port(8080))
)

sandbox = Sandbox.create(template="runtimeuse-quickstart-claude", api_key=e2b_api_key)
ws_url = f"wss://{sandbox.get_host(8080)}"

Full example: examples/e2b-quickstart.py

pip install daytona
# Required env vars: DAYTONA_API_KEY, ANTHROPIC_API_KEY
from daytona import (
    CreateSandboxFromImageParams,
    Daytona,
    DaytonaConfig,
    Image,
    SessionExecuteRequest,
)

image = Image.base("node:lts").run_commands(
    "apt-get update && apt-get install -y unzip",
    "npm install -g @anthropic-ai/claude-code",
)

daytona = Daytona(config=DaytonaConfig(api_key=daytona_api_key))

sandbox = daytona.create(
    CreateSandboxFromImageParams(
        image=image,
        env_vars={
            "ANTHROPIC_API_KEY": anthropic_api_key,
            "IS_SANDBOX": "1",
            "CLAUDE_SKIP_ROOT_CHECK": "1",
        },
        public=True,
    ),
    timeout=600,
)

sandbox.process.create_session("runtimeuse")
sandbox.process.execute_session_command(
    "runtimeuse",
    SessionExecuteRequest(
        command="npx -y runtimeuse@latest --agent claude",
        run_async=True,
    ),
)

preview = sandbox.create_signed_preview_url(8080, expires_in_seconds=3600)
ws_url = _http_to_ws(preview.url)

Full example: examples/daytona-quickstart.py

pip install vercel python-dotenv
# Required env vars: VERCEL_TOKEN, VERCEL_PROJECT_ID, VERCEL_TEAM_ID, ANTHROPIC_API_KEY
from vercel.sandbox import Sandbox

sandbox = Sandbox.create(
    runtime="node24",
    ports=[8081],
    env={
        "ANTHROPIC_API_KEY": anthropic_api_key,
        "IS_SANDBOX": "1",
        "CLAUDE_SKIP_ROOT_CHECK": "1",
    },
)

sandbox.run_command("sudo", ["dnf", "install", "-y", "unzip"])
sandbox.run_command("npm", ["install", "-g", "@anthropic-ai/claude-code"])
sandbox.run_command_detached(
    "npx",
    ["-y", "runtimeuse", "--agent", "claude", "--port", "8081"],
)

ws_url = _http_to_ws(sandbox.domain(8081))

Full example: examples/vercel-quickstart.py

pip install modal
# Required env vars: ANTHROPIC_API_KEY
# Authenticate with Modal: `modal token set` or set MODAL_TOKEN_ID + MODAL_TOKEN_SECRET
import modal

app = modal.App.lookup("runtimeuse-quickstart", create_if_missing=True)

image = modal.Image.from_registry("node:lts").run_commands(
    "apt-get update && apt-get install -y unzip",
    "npm install -g @anthropic-ai/claude-code",
)

secret = modal.Secret.from_dict(
    {
        "ANTHROPIC_API_KEY": anthropic_api_key,
        "IS_SANDBOX": "1",
        "CLAUDE_SKIP_ROOT_CHECK": "1",
    }
)

sandbox = modal.Sandbox.create(
    app=app,
    image=image,
    secrets=[secret],
    workdir="/runtimeuse",
    encrypted_ports=[8080],
    timeout=600,
)

sandbox.exec("npx", "-y", "runtimeuse", "--agent", "claude")
ws_url = _http_to_ws(sandbox.tunnels()[8080].url)

Full example: examples/modal-quickstart.py

2. Install the Client

pip install runtimeuse-client

3. Connect and Query

Once you have a ws_url, the client flow is the same across providers:

import asyncio

from runtimeuse_client import (
    QueryOptions,
    RuntimeEnvironmentDownloadableInterface,
    RuntimeUseClient,
    TextResult,
)


async def main(ws_url: str) -> None:
    client = RuntimeUseClient(ws_url=ws_url)

    result = await client.query(
        prompt="Summarize the contents of this repository and list your favorite file.",
        options=QueryOptions(
            system_prompt="You are a helpful assistant.",
            model="claude-sonnet-4-20250514", # gpt-5.4 for openai
            pre_agent_downloadables=[
                RuntimeEnvironmentDownloadableInterface(
                    download_url="https://github.com/openai/codex/archive/refs/heads/main.zip",
                    working_dir="/runtimeuse",
                )
            ],
        ),
    )

    assert isinstance(result.data, TextResult)
    print(result.data.text)


asyncio.run(main(ws_url))

On this page