Skip to main content

Architecture

NemoClaw has two main components: a TypeScript plugin that integrates with the OpenClaw CLI, and a Python blueprint that orchestrates OpenShell resources.

NemoClaw plugin

The plugin is a thin TypeScript package that registers commands under openclaw nemoclaw. It runs in-process with the OpenClaw gateway and handles user-facing CLI interactions.

Plugin config schema

The plugin manifest openclaw.plugin.json defines the configuration schema for the NemoClaw plugin:
openclaw.plugin.json

NemoClaw blueprint

The blueprint is a versioned Python artifact with its own release stream. The plugin resolves, verifies, and executes the blueprint as a subprocess. The blueprint drives all interactions with the OpenShell CLI.

Blueprint manifest

The blueprint.yaml manifest declares the blueprint version, version constraints, available profiles, and component configuration:
blueprint.yaml

Blueprint lifecycle

Every launch, migrate, or apply operation follows this five-step lifecycle:
1

Resolve

The plugin locates the blueprint artifact and checks the version against min_openshell_version and min_openclaw_version constraints in blueprint.yaml. If blueprintVersion is latest, the most recent published artifact is fetched from the configured OCI registry (blueprintRegistry).
2

Verify digest

The plugin checks the artifact digest against the expected value stored in blueprint.yaml. This ensures the blueprint has not been tampered with between download and execution.
3

Plan

The runner (orchestrator/runner.py) determines what OpenShell resources to create or update: the gateway, inference providers, sandbox, inference route, and network policy. The plan is emitted as JSON and stored under ~/.nemoclaw/state/runs/<run-id>/plan.json.
4

Apply

The runner executes the plan by calling openshell CLI commands: openshell sandbox create, openshell provider create, and openshell inference set. Progress is reported over stdout as PROGRESS:<0-100>:<label> lines.
5

Status

The runner reports current state from the persisted plan. The run identifier (e.g., nc-20260318-143012-a1b2c3d4) is emitted as a RUN_ID: line and stored in the plugin’s local state for future reference by logs and eject.

Blueprint runner protocol

The TypeScript plugin communicates with the Python runner via stdout lines:

Sandbox environment

The sandbox runs the ghcr.io/nvidia/openshell-community/sandboxes/openclaw container image. Inside the sandbox:
  • OpenClaw runs with the NemoClaw plugin pre-installed.
  • Inference calls are routed through the OpenShell gateway to the configured provider.
  • Network egress is restricted by the baseline policy in openclaw-sandbox.yaml.
  • Filesystem access is confined to /sandbox and /tmp for read-write, with system paths read-only.
  • Port 18789 is forwarded from the host to support tool integrations.
When openclaw nemoclaw status runs inside an active sandbox, it detects the sandbox context by checking for /sandbox/.openclaw or /sandbox/.nemoclaw. Host-level openshell sandbox status commands are not available from within the sandbox.

Inference routing

Inference requests from the agent never leave the sandbox directly. OpenShell intercepts them and routes to the configured provider:
For other provider types, the routing target changes but the path through the OpenShell gateway remains the same: See Inference Profiles for provider configuration details.