dynamo

davilu-nvidia/openclaw-dynamo-provider

Otheropenclawby davilu-nvidia

Summary

OpenClaw plugin exposing 0 skills.

Install to Claude Code

openclaw plugin add davilu-nvidia/openclaw-dynamo-provider

Run in Claude Code. Add the marketplace first with /plugin marketplace add davilu-nvidia/openclaw-dynamo-provider if you haven't already.

README.md

openclaw-dynamo-provider

An OpenClaw plugin that registers a dynamo provider backed by Dynamo's OpenAI-compatible endpoint, so OpenClaw can use Dynamo as a normal model:

openclaw --model dynamo/<model-id>

With one switch (DYN_AGENT_TRACE=1) it also tags every request for Dynamo's agent trace, gives each subagent its own isolated KV session, and relays tool events into the trace — all without patching OpenClaw core.

What it does

  • Model provider — registers dynamo, discovers models from /v1/models, and streams via OpenClaw's OpenAI-compatible path.
  • Agent context — injects nvext.agent_context (session/trajectory identity) so Dynamo can attribute each LLM request in its trace.
  • Subagent KV isolation — gives each OpenClaw subagent child its own Dynamo streaming session: opened on its first turn, pinned across turns, and freed deterministically when the agent ends.
  • Tool-event relay — pushes tool start/end events to Dynamo over ZMQ so one trace shows LLM spans and tool spans together.

Everything but the bare model provider is gated by the DYN_AGENT_TRACE master switch and is off by default.

Install

# From npm (when published)
# Add to openclaw config: "plugin": ["@nvidia/openclaw-dynamo-provider"]

# From a local checkout
cd openclaw-dynamo-provider && npm install && npm run build
# Then add to your openclaw.json:
# "plugin": ["./path/to/openclaw-dynamo-provider"]

Quick start

export DYNAMO_BASE_URL=http://127.0.0.1:8000/v1
export DYNAMO_API_KEY=dummy
export DYN_AGENT_TRACE=1

openclaw --model dynamo/<model-id> -p "Reply exactly ok."

Configuration

| Variable | Default | Purpose | | --- | --- | --- | | DYNAMO_BASE_URL | http://127.0.0.1:8000/v1 | Dynamo endpoint root (falls back to OPENAI_BASE_URL). | | DYNAMO_API_KEY | dynamo-local | Bearer token. | | DYN_AGENT_TRACE | off | Master switch for agent_context, session_control, and tool relay. | | DYN_AGENT_SESSION_TYPE_ID | openclaw_coding_agent | Session class in the trace. | | DYN_AGENT_SESSION_ID | OpenClaw session id | Top-level run id. | | DYN_AGENT_TRAJECTORY_ID | OpenClaw session id | Trajectory id. | | DYN_AGENT_PARENT_TRAJECTORY_ID | unset | Parent trajectory for linking. | | DYN_AGENT_SESSION_TIMEOUT | Dynamo default (300s) | Idle timeout for subagent sessions. | | DYN_AGENT_TOOL_EVENTS_ZMQ_ENDPOINT | unset | ZMQ PULL endpoint for tool relay. |

Subagent KV isolation

When DYN_AGENT_TRACE=1 and this process is a subagent child (detected via OPENCLAW_AGENT_ or PI_SUBAGENT_ env vars), the provider drives session lifecycle:

1. First turnsession_control: {action: "open"} — worker holds KV in a dedicated slot 2. Later turns — bare session_id — sticky routing, O(1) KV restore 3. agent_end — close request frees the KV deterministically

The lead agent is never pinned — only subagents get a session.

Requires Dynamo frontend in --router-mode kv and an SGLang worker with --enable-streaming-session.

Architecture: zero code invasiveness

This plugin uses OpenClaw's standard plugin SDK:

| Feature | OpenClaw API used | | --- | --- | | Model provider | api.registerProvider() | | Request body injection | wrapStreamFn hook | | Request headers | resolveTransportTurnState hook | | Session close on agent end | api.on("agent_end") | | Session close on shutdown | api.on("session_end") | | Tool event relay | api.on("tool_execution_start/end") |

No OpenClaw core changes required.

Development

npm install
npm run check   # tsc --noEmit
npm run test    # vitest
npm run build   # -> dist/

Scope

No OpenClaw core changes, no native Rust ABI. The nvext and agent_trace.v1 schemas are owned upstream by Dynamo.

Related plugins

Browse all →