Skip to main content

A distributed, scalable filesystem backend for deep AI agents, backed by blob storage

Project description

Python Client Library

Python implementation of the agent-backend package. See the main README for an overview, quick start, and core usage.

Package Info

Field Value
Package agent-backend
Registry PyPI
Manager uv / pip
Test runner pytest
Build python -m build
Linter ruff
Type checker mypy
Source python/agent_backend/
Tests python/tests/

Advanced Features

Environment Variables

Scoped backends support custom environment variables that apply to all commands:

from agent_backend import ScopeConfig

scoped_backend = backend.scope("projects/my-app", ScopeConfig(
    env={
        "PYTHONPATH": "/workspace/lib",
        "API_KEY": "secret",
        "DATABASE_URL": "postgres://...",
    }
))

await scoped_backend.exec("python -m build")  # uses custom env

Operations Logging

from agent_backend import ConsoleOperationsLogger, ScopeConfig

scoped_backend = backend.scope("project", ScopeConfig(
    operations_logger=ConsoleOperationsLogger()
))

await scoped_backend.exec("pip install -r requirements.txt")
# Logs: [AgentBackend] exec: pip install -r requirements.txt

Binary Data

from agent_backend import ReadOptions

image_data = await backend.read("logo.png", ReadOptions(encoding="buffer"))
tarball = await backend.exec("tar -czf - .", ExecOptions(encoding="buffer"))

Timeouts

from agent_backend import RemoteFilesystemBackend, RemoteFilesystemBackendConfig

backend = RemoteFilesystemBackend(RemoteFilesystemBackendConfig(
    root_dir="/tmp/agentbe-workspace",
    host="server.com",
    auth_token="...",
    operation_timeout_ms=300_000,  # 5 minutes
    max_output_length=10 * 1024 * 1024,  # 10MB
))

Backend Connection Pooling

See docs/connection-pooling.md for BackendPoolManager usage, key-based pooling, idle cleanup, and graceful shutdown.

Examples

Code Execution Sandbox

from agent_backend import LocalFilesystemBackend, LocalFilesystemBackendConfig, IsolationMode

sandbox = LocalFilesystemBackend(LocalFilesystemBackendConfig(
    root_dir="/tmp/agentbe-workspace",
    isolation=IsolationMode.AUTO,
))

user_code_backend = sandbox.scope(f"users/{user_id}")
await user_code_backend.write("script.py", untrusted_code)
result = await user_code_backend.exec("python script.py")

Multi-tenant SaaS

from agent_backend import RemoteFilesystemBackend, RemoteFilesystemBackendConfig

# Separate backend per organization
org1_backend = RemoteFilesystemBackend(RemoteFilesystemBackendConfig(
    root_dir="/var/saas/org1",
    host="org1-server.example.com",
    auth_token="...",
))

org2_backend = RemoteFilesystemBackend(RemoteFilesystemBackendConfig(
    root_dir="/var/saas/org2",
    host="org2-server.example.com",
    auth_token="...",
))

# Scoped backends per user within each org
org1_user1 = org1_backend.scope("users/user1")
org1_user2 = org1_backend.scope("users/user2")

Agent State Management

from agent_backend import MemoryBackend

state = MemoryBackend()

await state.write("agents/agent1/current-task", "building")
await state.write("agents/agent1/progress", "50%")

all_agents = await state.list_keys("agents/")

Error Handling

from agent_backend import BackendError, DangerousOperationError, PathEscapeError

try:
    await backend.exec("rm -rf /")
except DangerousOperationError as e:
    # Command blocked by safety validation
    print("Blocked:", e.operation)
except PathEscapeError:
    # Path attempted to escape scope
    pass
except BackendError as e:
    # General backend error (check e.code)
    print("Error:", e.code, str(e))

Development

Commands

All commands can be run from the monorepo root via Make or from the python/ directory via uv.

Task Make (root) uv (python/)
Build make build-python uv build
Test make test-python uv run pytest
Test (cov) -- uv run pytest --cov=agent_backend --cov-fail-under=80
Lint make lint-python uv run ruff check .
Lint (fix) make lint-fix uv run ruff check --fix .
Typecheck make typecheck-python uv run ty check

Code Style

  • ruff enforces formatting (line-length = 100, target-version = "py311")
  • Type hints on all function signatures -- avoid Any
  • snake_case for functions and variables, PascalCase for classes
  • Dataclasses for all config objects (LocalFilesystemBackendConfig, ScopeConfig, etc.)
  • Custom error classes: BackendError, DangerousOperationError, PathEscapeError
  • Imports sorted with ruff (isort rules enabled)

Testing

Tests live in python/tests/ and use pytest with pytest-asyncio.

asyncio_mode = "auto" is configured in pyproject.toml, so async test functions are detected automatically -- no @pytest.mark.asyncio decorator needed.

Shared fixtures in conftest.py provide pre-configured backends:

@pytest.fixture
def local_backend(tmp_workspace):
    config = LocalFilesystemBackendConfig(
        root_dir=tmp_workspace,
        prevent_dangerous=True,
    )
    return LocalFilesystemBackend(config)

Use unittest.mock.AsyncMock for mocking async methods. Use the shared fixtures (local_backend, memory_backend, tmp_workspace) rather than building backends from scratch.

Running tests:

uv run pytest                            # All tests, single run
uv run pytest -k "safety"               # Filter by pattern
uv run pytest --cov=agent_backend       # With coverage report
uv run pytest -m "not integration"      # Skip integration tests

Gotchas

  • All backend methods are async -- always await them, including read, write, readdir, and exists.
  • MemoryBackend.exec() raises NotImplementedBackendError -- memory backends do not support command execution.
  • Use list_keys(prefix) on MemoryBackend, not list().
  • IsolationMode.AUTO and IsolationMode.NONE are enum members, not string literals.
  • BackendType enum values are "local-filesystem", "remote-filesystem", "memory".
  • Config objects are dataclasses, not dicts -- use keyword arguments (e.g., LocalFilesystemBackendConfig(root_dir=...)).
  • Scoped backends delegate track_closeable() to their parent, so resources are closed when the parent is destroyed.
  • destroy() closes all tracked closeables (MCP clients, transports) before tearing down the backend.
  • Coverage threshold is 80% (--cov-fail-under=80). Remote backend and transport modules are excluded from coverage.
  • ExecOptions and ReadOptions use encoding: Literal["utf8", "buffer"], not Python's standard encoding names.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

agent_backend-0.9.8.tar.gz (33.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

agent_backend-0.9.8-py3-none-any.whl (33.4 kB view details)

Uploaded Python 3

File details

Details for the file agent_backend-0.9.8.tar.gz.

File metadata

  • Download URL: agent_backend-0.9.8.tar.gz
  • Upload date:
  • Size: 33.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_backend-0.9.8.tar.gz
Algorithm Hash digest
SHA256 5b5b73856f6663b1bd774bff3d636ece889043875dd2146aa6cca43014c39730
MD5 871da66c3e21109c7f9abb7304ef664f
BLAKE2b-256 50797124e47a538ba234eed5664e2c539e2e27b4afa61bd33ede52bc20be6f02

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_backend-0.9.8.tar.gz:

Publisher: publish.yml on deepagents-ai/agent-backend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file agent_backend-0.9.8-py3-none-any.whl.

File metadata

  • Download URL: agent_backend-0.9.8-py3-none-any.whl
  • Upload date:
  • Size: 33.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for agent_backend-0.9.8-py3-none-any.whl
Algorithm Hash digest
SHA256 73b1a18df17b8d62b272e87a54e69153d22303099cdc9451d6324e185bf63d64
MD5 b15d085506942a6fb9633577a1d34a9f
BLAKE2b-256 76395a524eabe2f389954cf979da40dda9f0365ef1940a03429551f42dd7bd9a

See more details on using hashes here.

Provenance

The following attestation bundles were made for agent_backend-0.9.8-py3-none-any.whl:

Publisher: publish.yml on deepagents-ai/agent-backend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page