SANDBOX deployment profile¶
Nexus's sandbox profile is the lightweight runtime for running one Nexus inside each AI-agent sandbox. It boots with zero external services (SQLite + in-process LRU + BM25S; no PostgreSQL, Dragonfly, or Zoekt).
Target: ~300-400 MB RSS, <5 s warm boot.
When to use¶
- You want per-agent isolation: one Nexus instance per sandbox, with its own storage and policy boundary.
- The sandbox's outer orchestrator (e.g. agentenv) provisions the sandbox and injects
NEXUS_URL/NEXUS_API_KEYso the sandbox can federate to a peer Nexus or hub. - You don't want to operate PostgreSQL + Dragonfly inside every sandbox.
Use the full profile for a shared Nexus hub; use sandbox for the per-sandbox clients that talk to it.
What you get¶
| Surface | SANDBOX | FULL |
|---|---|---|
| Storage (metastore + records) | SQLite | PostgreSQL |
| Cache | In-process LRU | Dragonfly / Redis |
| Keyword search | BM25S mmap | BM25S + Zoekt |
| Semantic search | Local (sqlite-vec) or federated (peers); BM25S fallback | Local txtai + federation |
| HTTP surface | /health, /api/v2/features | Full /api/v2/* |
| MCP | Yes | Yes |
| Target RSS | <400 MB | Multi-GB |
| Boot time | <5 s (warm) | 15-60 s |
Running¶
From pip¶
pip install 'nexus-ai-fs[sandbox]'
nexusd --profile sandbox --data-dir ~/.nexus/sandbox --port 8000 --host 127.0.0.1
The long-running server entrypoint is
nexusd. The workspacenexusCLI does not expose aservesubcommand.NEXUS_PROFILE=sandboxworks as an equivalent env-var override if you prefer.
From Docker¶
docker run --rm \
-e NEXUS_PROFILE=sandbox \
-e NEXUS_DATA_DIR=/data \
-v sandbox-data:/data \
-p 8000:8000 \
ghcr.io/nexi-lab/nexus:sandbox
Config file¶
profile: sandbox
# SANDBOX defaults fill these in automatically; override only if needed:
# backend: path_local
# data_dir: ~/.nexus/sandbox
# db_path: ~/.nexus/sandbox/nexus.db
# cache_size_mb: 64
# Opt in to local vector search (requires an embedding API key, see below):
# enable_vector_search: true
features:
# Everything off by default except SANDBOX's required set.
# Re-enable specific bricks:
# workflows: true
Local vector search (opt-in)¶
SANDBOX can do real vector search locally, without federation, using:
sqlite-vec— a tiny (~3 MB) SQLite extension that adds avec0virtual table with KNN. The vector data lives in the samenexus.dbfile as the rest of SANDBOX state; nothing new to operate.litellm— provider-agnostic embeddings. Bring your own API key for OpenAI / Cohere / Anthropic / Azure / etc. Default model istext-embedding-3-small(1536 dim). Override withNEXUS_EMBEDDING_MODEL.
Both are bundled with the [sandbox] extra:
It's off by default so SANDBOX still boots without an embedding key. To enable, opt in via the config or env:
# any provider supported by litellm
export OPENAI_API_KEY=sk-...
# (optional) override the embedding model
# export NEXUS_EMBEDDING_MODEL=text-embedding-3-large
NEXUS_ENABLE_VECTOR_SEARCH=true nexusd --profile sandbox \
--data-dir ~/.nexus/sandbox --port 8000 --host 127.0.0.1
When enabled, the SANDBOX semantic search path becomes:
- Primary — local sqlite-vec KNN inside the active zone. Hits come back without any degraded flag.
- Secondary — federation to configured peer zones (if any).
- Tertiary — BM25S keyword search with
semantic_degraded=truestamped on every result.
When the [sandbox] extra isn't installed (or no API key is set), the factory logs a single WARNING naming the missing package and falls through to steps 2 and 3 transparently — boot does not fail.
Federation¶
SANDBOX delegates semantic search to configured peer zones. Point it at a hub zone via the federation config:
When all peers are unreachable, search returns BM25S keyword results stamped with semantic_degraded=true on each result. The MCP client can surface this to the agent so it knows the results are keyword-only for that request.
What's off by default in SANDBOX¶
The following bricks are NOT enabled in SANDBOX. Re-enable individually with features.<brick>: true:
pay, llm, workflows, sandbox (the sandbox-provisioning brick, distinct from this profile), observability, uploads, resiliency, access_manifest, catalog, delegation, identity, share_link, versioning, workspace, portability, snapshot, task_manager, acp, discovery, memory, skills.
Enabled in SANDBOX (10 bricks = LITE + SEARCH + MCP + PARSERS): eventlog, namespace, permissions, cache, ipc, scheduler, agent_runtime, search, mcp, parsers.
Note: federation is auto-detected from ZoneManager / peer config; it does not require a brick flag.
Troubleshooting¶
- Boot fails with
'PyKernel' object has no attribute 'agent_registry': the loaded Rust extension predates theagent_registrygetter. Rebuild withmaturin develop -m rust/nexus-cdylib/Cargo.toml --features full(running from a freshgit pullonmainrequires this when the kernel ABI moves). - Boot fails with
ModuleNotFoundError: bm25s: install the extras withpip install 'nexus-ai-fs[sandbox]'. - Boot tries to connect to Postgres/Redis: you have a leftover
NEXUS_DATABASE_URLorNEXUS_DRAGONFLY_URLin your env. Unset them or explicitly setNEXUS_CACHE_BACKEND=inmem. - Semantic search returns
semantic_degraded=true: no peer is reachable. Checkfederation.peersin your config + network access. - Boot slower than 5 s: Python interpreter cold-start on first run. Subsequent boots (warm) should hit target.