Skip to main content

Layerbrain CLI

PyPI version Python 3.10+ License: MIT

The official Python SDK and CLI for the Layerbrain API.

Installation

pip install layerbrain

For a global CLI install with uv:

uv tool install layerbrain

For a uv-managed project dependency:

uv add layerbrain

For a one-off run without installing the tool globally:

uvx layerbrain --help

All of these give you the same package. layerbrain includes both:

  • the Python SDK via from layerbrain import Layerbrain
  • the layerbrain command-line interface

Quick Start

from layerbrain import Layerbrain

client = Layerbrain()

CLI

layerbrain login
layerbrain whoami
layerbrain models list
layerbrain machines list
layerbrain listen --events machine.created
layerbrain webhooks list
layerbrain networks list

You can also run the CLI via:

python -m layerbrain

To update a standalone install:

layerbrain upgrade

Or, if you installed it with uv tool:

uv tool upgrade layerbrain

If layerbrain is a dependency in a uv project:

uv add --upgrade-package layerbrain layerbrain

The client reads your API key from the LAYERBRAIN_API_KEY environment variable by default. You can also pass it explicitly:

client = Layerbrain(api_key="sk-...")

SDK

Chat Completions

response = client.chat.completions.create(
    model="meta-llama/llama-3.1-8b",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

Streaming

stream = client.chat.completions.create(
    model="meta-llama/llama-3.1-8b",
    messages=[{"role": "user", "content": "Count to 10"}],
    stream=True,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)

Machines

# List available compute
compute = client.compute.list()

# Create a machine
machine = client.machines.create(compute="na-us-ca-sfo_s.small", duration_minutes=60)
print(machine.id, machine.host)

# Get machine details
machine = client.machines.retrieve("mach_abc123")

# Delete
client.machines.delete("mach_abc123")

Connect to a Machine (WebSocket)

Open a live machine session over WebSocket for shell and filesystem access:

import asyncio
from layerbrain import Layerbrain

async def main():
    client = Layerbrain()

    # Open a live machine session over WebSocket
    async with await client.machines.connect("mach_abc123") as conn:
        # Shell - execute commands
        result = await conn.shell.execute("ls -la ~/brain")
        print(result["stdout"])

        result = await conn.shell.execute("pip install requests", cwd="/root")
        print(result["code"])  # 0 = success

        # Filesystem - list files
        files = await conn.filesystem.list("~/brain")
        for f in files:
            print(f["name"], f["kind"])  # "docs" "folder", "main.py" "file"

        # Filesystem - read/write files
        await conn.filesystem.write("~/brain/hello.txt", "Hello World")
        content = await conn.filesystem.read("~/brain/hello.txt")

        # Filesystem - directory operations
        await conn.filesystem.mkdir("~/brain/newdir")
        await conn.filesystem.move("~/brain/hello.txt", "~/brain/newdir/hello.txt")
        await conn.filesystem.copy("~/brain/newdir/hello.txt", "~/brain/backup.txt")
        await conn.filesystem.delete("~/brain/backup.txt")

        # Filesystem - search
        results = await conn.filesystem.search("*.py", path="~/brain")
        recents = await conn.filesystem.recents(limit=10, days=3)

asyncio.run(main())

Shell Operations

Method Description
conn.shell.execute(cmd, cwd=None, timeout=30) Execute command, returns {stdout, stderr, code}

Filesystem Operations

Method Description
conn.filesystem.list(path, show_all=False) List directory contents
conn.filesystem.stat(path) Get file/folder metadata
conn.filesystem.read(path) Read file (base64 encoded)
conn.filesystem.write(path, data, encoding="utf-8") Write file
conn.filesystem.mkdir(path) Create directory (recursive)
conn.filesystem.delete(path) Delete file or directory
conn.filesystem.move(src, dst) Move/rename
conn.filesystem.copy(src, dst) Copy
conn.filesystem.search(pattern, path, limit) Search by name
conn.filesystem.recents(path, limit, days) Recently modified files

Models

models = client.models.list()
for m in models.data:
    print(m["id"], m["type"])

model = client.models.retrieve("meta-llama/llama-3.1-8b")

Tools

# Web search
results = client.tools.web_search(query="python httpx tutorial", count=5)
for r in results["results"]:
    print(r["title"], r["url"])

Secrets

client.secrets.create(name="HF_TOKEN", value="hf_...")
secrets = client.secrets.list()

Async

The same client works in async contexts -- just await the calls:

import asyncio
from layerbrain import Layerbrain

async def main():
    async with Layerbrain() as client:
        response = await client.chat.completions.create(
            model="meta-llama/llama-3.1-8b",
            messages=[{"role": "user", "content": "Hello!"}],
        )
        print(response.choices[0].message.content)

asyncio.run(main())

Error Handling

from layerbrain import Layerbrain
from layerbrain.exceptions import (
    AuthenticationError,
    InsufficientFundsError,
    CapacityError,
    RateLimitError,
    APIError,
)

client = Layerbrain()

try:
    client.machines.create(compute="na-us-ca-sfo_s.small")
except AuthenticationError:
    print("Invalid API key")
except InsufficientFundsError:
    print("Not enough credits")
except CapacityError:
    print("No machines available")
except RateLimitError:
    print("Too many requests, back off")
except APIError as e:
    print(f"{e.status_code}: {e.message}")
Status Exception
400 ValidationError
401 AuthenticationError
402 InsufficientFundsError
403 PermissionDeniedError
404 NotFoundError
409 ConflictError
429 RateLimitError
500 InternalServerError
502 ProviderError
503 CapacityError
N/A ConnectionError
N/A TimeoutError

Configuration

The client reads configuration from (in priority order):

  1. Explicit arguments: Layerbrain(api_key="sk-...")
  2. Environment variables: LAYERBRAIN_API_KEY, LAYERBRAIN_BASE_URL
  3. Config files: ~/.layerbrain/credentials.toml, ~/.layerbrain/config.toml

Requirements

Python 3.10+

Metadata

Release files for layerbrain 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for layerbrain 0.3.0
File Size Uploaded
layerbrain-0.3.0.tar.gz 71.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for layerbrain 0.3.0
File Interpreter ABI Platform
layerbrain-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 156.3 kB

Release files / layerbrain-0.3.0.tar.gz

Download URL layerbrain-0.3.0.tar.gz
Size 71.9 kB
Tags Source
SHA-256 checksum
How to use checksums
9530264cf935063950eef8c8a2c02ea60c66c29d72d7b217a5bc376ec66467f2
BLAKE2b-256 checksum
How to use checksums
0a217b99d1f6e8014b92cba1c46d1f452cbc8bb094ced67e729728810caf8fc7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release files / layerbrain-0.3.0-py3-none-any.whl

Download URL layerbrain-0.3.0-py3-none-any.whl
Size 84.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
198413e2745e9c15176ad711502422cb8ee48838144d1b91bce64d1bdc064d48
BLAKE2b-256 checksum
How to use checksums
eb3443dfddbff1538954d662cc49007bfec615b6889cade7bdb3690bb0c432c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.12

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page