Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
5958362
fix(inference): contain shared gateway routes
ericksoa Jul 6, 2026
75aa5e0
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
2f578e9
test(onboard): keep route fixture within budget
ericksoa Jul 6, 2026
fa6991d
fix(connect): guard routes before endpoint probes
ericksoa Jul 6, 2026
ecd6b63
refactor(onboard): keep route guard wiring focused
ericksoa Jul 6, 2026
e9b9658
test(inference): keep route matrix linear
ericksoa Jul 6, 2026
bdc0c6e
test(onboard): preserve recovered route API metadata
ericksoa Jul 6, 2026
de3b246
fix(inference): close shared gateway route guard gaps
ericksoa Jul 6, 2026
6dd3c1c
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
35cf64f
refactor(cli): share inference set flag guidance
ericksoa Jul 6, 2026
6f5f2b5
test(inference): exercise incomplete registry route
ericksoa Jul 6, 2026
4b882a3
refactor(onboard): keep entrypoint net neutral
ericksoa Jul 6, 2026
2a32eb7
test(connect): expect gateway-scoped route repair
ericksoa Jul 6, 2026
c0984f6
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
20114a8
fix(onboard): scope inference setup to target gateway
ericksoa Jul 6, 2026
48f5c5e
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
1fe81be
fix(onboard): bind resume gateway before lifecycle
ericksoa Jul 6, 2026
1319818
fix(inference): reject gateway endpoint overrides
ericksoa Jul 6, 2026
0ed48aa
fix(onboard): reject gateway endpoint override early
ericksoa Jul 6, 2026
8ca48a8
fix(inference): refresh route peers before mutation
ericksoa Jul 6, 2026
8b06fa4
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
ffa44a5
fix(onboard): contain shared gateway route discovery
ericksoa Jul 6, 2026
2ae1e6b
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 6, 2026
cbaf622
test(onboard): reuse shared value guard
ericksoa Jul 6, 2026
38f7e04
fix(inference): serialize shared gateway route mutations
ericksoa Jul 7, 2026
081cace
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
1f1fa61
refactor(onboard): keep gateway wiring net neutral
ericksoa Jul 7, 2026
c0c13a2
test(inference): pin DNS finalization coverage
ericksoa Jul 7, 2026
a878d6c
test(onboard): align route reservation fixtures
ericksoa Jul 7, 2026
0b57570
fix(registry): preserve recovered route identity
ericksoa Jul 7, 2026
8515bdf
fix(onboard): harden recovered route handoff
ericksoa Jul 7, 2026
93ece1a
fix(rebuild): reserve resumed inference route
ericksoa Jul 7, 2026
5656817
chore(onboard): preserve growth budget
ericksoa Jul 7, 2026
e62a031
test(onboard): avoid using void return
ericksoa Jul 7, 2026
1da464c
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
12b65a5
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
b019f25
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
7c326dc
test(inference): cover queued gateway rebinding
ericksoa Jul 7, 2026
a7468ab
fix(inference): fail closed on incomplete recovered routes
ericksoa Jul 7, 2026
83aca32
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
81f9e39
test(inference): complete Hermes alias route fixtures
ericksoa Jul 7, 2026
775569e
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
7877498
Merge remote-tracking branch 'origin/main' into fix/6315-gateway-rout…
ericksoa Jul 7, 2026
022393f
merge(main): preserve inference route containment
cv Jul 7, 2026
7df7274
docs(inference): clarify reusable custom routes
cv Jul 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bin/lib/nim-images.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
},
{
"name": "nvidia/nemotron-3-nano-30b-a3b",
"servedModel": "nvidia/nemotron-3-nano",
"image": "nvcr.io/nim/nvidia/nemotron-3-nano:latest",
"minGpuMemoryMB": 8192
},
Expand Down
2 changes: 1 addition & 1 deletion ci/test-file-size-budget.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"test/nemoclaw-start.test.ts": 4827,
"test/onboard-messaging.test.ts": 2062,
"test/onboard-selection.test.ts": 5835,
"test/onboard.test.ts": 4057,
"test/onboard.test.ts": 4043,
"test/policies.test.ts": 2279
}
}
17 changes: 17 additions & 0 deletions docs/about/release-notes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,23 @@ NemoClaw v0.0.74 upgrades the OpenShell policy boundary, adds managed MCP and pr
The selected mode persists through resume and transactional rebuilds, and model-specific compatibility safeguards can keep an incompatible model on direct disclosure.
Sandbox-first `inference get` and `inference set` commands now provide the same route controls as their global forms.
For more information, refer to [Tool Calling Reliability](../inference/tool-calling-reliability), [Model Capability Audit](../inference/model-capability-audit), and [NemoClaw CLI Commands Reference](../reference/commands).
- Shared OpenShell gateways now enforce a single compatible inference route across every registered sandbox, including stopped sandboxes.
Onboarding, connect-time repair, and `inference set` reject provider/model conflicts; custom routes must also match the normalized endpoint and API family.
As a migration requirement, custom switches must provide `--endpoint-url` and an unambiguous API family, and incomplete legacy custom-route metadata fails closed until the sandbox is removed and re-onboarded with complete metadata.
After backing up an affected workspace, an OpenAI-compatible route can be re-onboarded with complete metadata as follows (replace the example endpoint, model, and sandbox name):

```bash
$$nemoclaw legacy-sandbox destroy
NEMOCLAW_PROVIDER=custom \
NEMOCLAW_ENDPOINT_URL=https://endpoint.example/v1 \
NEMOCLAW_MODEL=your-model-id \
NEMOCLAW_PREFERRED_API=openai-completions \
$$nemoclaw onboard --name legacy-sandbox
```

Hermes deterministically selects `openai-completions` for `compatible-anthropic-endpoint`, so that one route may omit `--inference-api`; explicit incompatible values are rejected.
Use a different `NEMOCLAW_GATEWAY_PORT` when sandboxes need independent routes.
For more information, refer to [Switch Inference Providers](../inference/switch-inference-providers), [NemoClaw CLI Commands Reference](../reference/commands), and [Troubleshooting](../reference/troubleshooting).
- LangChain Deep Agents Code now provides managed `status`, `whoami`, and `identity` commands without launching the interactive UI, validates the installed agent version during onboarding, and keeps credential-shaped or tracing configuration out of persisted runtime metadata.
Its rebuild path validates recreation before destructive handoff and preserves the managed proxy, tool-disclosure, and MCP boundaries.
For more information, refer to [Quickstart with LangChain Deep Agents Code](../../openclaw/get-started/quickstart-langchain-deepagents-code), [NemoClaw CLI Commands Reference](../reference/commands), and [Security Best Practices](../security/best-practices).
Expand Down
12 changes: 12 additions & 0 deletions docs/inference/switch-inference-providers.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@ If you run `$$nemoclaw inference set` before NemoClaw has a selected sandbox, th
Run `$$nemoclaw onboard` first, then retry the switch.
</Note>

<Warning>
OpenShell currently exposes one inference route per gateway, not one route per sandbox.
All registered sandboxes on the same gateway must use the same provider and model.
Custom compatible routes must also use the same endpoint and API family.
An OpenClaw native-Anthropic route and a Hermes OpenAI-frontend route therefore cannot share a gateway, even when their custom endpoint and model are otherwise identical.
NemoClaw checks stopped sandboxes because they depend on that route when restarted.
When a route conflicts, onboarding, runtime switching, and connect-time repair exit non-zero before changing the gateway and name the affected sandboxes.
Align the routes, remove the conflicting sandbox, or onboard it with another `NEMOCLAW_GATEWAY_PORT`.
</Warning>

## Find the Provider Name

The `--provider` value must match a provider already configured on the sandbox.
Expand Down Expand Up @@ -131,6 +141,7 @@ $$nemoclaw <sandbox-name> rebuild

Resuming onboarding also detects and repairs a stale route.
`inference set` can select this provider after it has been registered on the verified OpenAI surface, but it fails before mutation for a legacy Anthropic registration because that command cannot change a gateway provider's protocol type.
When supplying new custom metadata, Hermes may omit `--inference-api` for this provider because NemoClaw deterministically selects `openai-completions`; an explicit non-OpenAI value is rejected.
</AgentOnly>

#### Switching from Responses API to Chat Completions
Expand Down Expand Up @@ -189,6 +200,7 @@ The error includes a redacted OpenShell detail, lists the registered providers w
Run `$$nemoclaw onboard` to register the provider, then retry `$$nemoclaw inference set`.

Use `--no-verify` only when OpenShell cannot verify the provider at switch time but you have already confirmed the provider and credential.
`--no-verify` does not bypass the one-route-per-gateway compatibility check.

## Tune Model Metadata

Expand Down
22 changes: 16 additions & 6 deletions docs/reference/commands-nemohermes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -537,8 +537,10 @@ If another terminal is already connected to the sandbox, `connect` prints a note
An unknown model slug, malformed extra-args JSON, or a gated model (for example `deepseek-r1-distill-70b`) with no `HF_TOKEN` or `HUGGING_FACE_HUB_TOKEN` exits non-zero with the same error the installer would emit, before any sandbox readiness probe or SSH attach.
Unset the managed-vLLM variable, or fix the value, before retrying.

When the live OpenShell gateway inference route differs from the route recorded in the NemoClaw registry, `connect` prints an explicit warning and realigns the shared gateway to the recorded route.
Use `nemohermes inference set --provider <provider> --model <model>` to make an intentional route change.
When the live OpenShell gateway inference route differs from the route recorded in the NemoClaw registry, `connect` checks every registered sandbox on that gateway before attempting a repair.
It realigns the route only when those registry entries are compatible with the requested provider and model.
If another sandbox records a conflicting route, `connect` exits non-zero without changing the gateway and names the affected sandboxes.
Use `nemohermes inference set --provider <provider> --model <model>` to make an intentional compatible route change.
If the sandbox is registered locally but missing from a healthy gateway, `connect` preserves the registry entry and points you to `rebuild --yes`, `onboard`, or `destroy` instead of deleting the metadata needed for recovery.

After a host reboot, the OpenShell gateway rotates its SSH host keys.
Expand Down Expand Up @@ -1886,6 +1888,12 @@ By default, the command syncs the default registered sandbox.
The command refuses before changing the OpenShell route when the selected sandbox has shields up.
Run `nemohermes <name> shields down`, apply the inference change, then run `nemohermes <name> shields up` again.

Each OpenShell gateway exposes one inference route to every sandbox registered on that gateway.
Before changing the route, NemoClaw compares the requested provider and model with every same-gateway registry entry, including stopped sandboxes.
Custom compatible routes must also have matching normalized endpoint URLs and API families.
If a route conflicts or a legacy custom route lacks enough endpoint or API-family metadata to prove compatibility, the command exits non-zero before changing the OpenShell route, agent config, or host registry and names the conflicting sandboxes.
Align those sandboxes to the same route, remove the conflicting sandbox, or onboard it with another `NEMOCLAW_GATEWAY_PORT`.

```bash
nemohermes inference set --provider <provider> --model <model> [--sandbox <name>] [--no-verify] [--endpoint-url <url>] [--credential-env <ENV>] [--inference-api <api>]
```
Expand All @@ -1898,19 +1906,21 @@ nemohermes my-assistant inference set --provider nvidia-prod --model nvidia/nemo
```

Pass both `--provider` and `--model` when you want NemoClaw to update the OpenShell inference route and sync the selected sandbox's agent config.
If you only want the lower-level OpenShell route operation, run `openshell inference set -g nemoclaw --model <model> --provider <provider>` directly.
When either flag is missing, `nemohermes inference set` prints that OpenShell command instead of an oclif flag-validation error.
NemoClaw resolves the OpenShell gateway from the target sandbox's recorded gateway binding, including non-default `NEMOCLAW_GATEWAY_PORT` deployments.
Do not run `openshell inference set` directly on a shared NemoClaw gateway because that bypasses registry compatibility checks and can break other sandboxes.
When either flag is missing, `nemohermes inference set` reports both required flags without suggesting a raw OpenShell command.
The command updates the host registry immediately after the gateway route changes.
If the in-sandbox config sync fails, NemoClaw keeps the gateway and registry aligned, warns that the running image may still need a rebuild, and points you to `nemohermes <name> rebuild`.

Supported provider names are `nvidia-prod`, `nvidia-nim`, `nvidia-router`, `openai-api`, `anthropic-prod`, `compatible-anthropic-endpoint`, `gemini-api`, `compatible-endpoint`, `hermes-provider`, `ollama-local`, and `vllm-local`.
Use `--no-verify` only when OpenShell cannot verify the provider at switch time but you have already confirmed the provider and credential.
When switching to `compatible-endpoint` or `compatible-anthropic-endpoint` from a different provider family, pass `--endpoint-url` with the trusted custom provider URL so NemoClaw can persist durable rebuild metadata.
When switching to `compatible-endpoint` or `compatible-anthropic-endpoint` from a different provider family, pass `--endpoint-url` with the trusted custom provider URL and, except for the Hermes case below, `--inference-api` with its API family so NemoClaw can persist a complete route identity for rebuild and shared-gateway checks.
For a Hermes `compatible-anthropic-endpoint` target, `--inference-api` may be omitted because NemoClaw deterministically selects `openai-completions`; an explicit different API family is rejected.
NemoClaw rejects loopback, link-local, private, and internal endpoint addresses, including public hostnames that resolve to a private address.
For public HTTP URLs, NemoClaw stores the validated IP address to prevent DNS rebinding.
DNS-backed HTTPS URLs are rejected because NemoClaw cannot pin the downstream peer address while preserving TLS SNI and host validation across the OpenShell runtime boundary; HTTPS IP-literal URLs remain supported.
NemoClaw accepts `http://host.openshell.internal:<port>` only with an explicit port from `1024` through `65535`; this narrow exception supports NemoClaw's sandbox-to-host inference routes and is not a general private-endpoint bypass.
`--credential-env` and `--inference-api` may also be supplied for the compatible provider metadata; supported API values are `openai-completions`, `anthropic-messages`, and `openai-responses`.
`--credential-env` may also be supplied for compatible provider metadata; supported `--inference-api` values are `openai-completions`, `anthropic-messages`, and `openai-responses`.

### `nemohermes setup`

Expand Down
22 changes: 16 additions & 6 deletions docs/reference/commands.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -641,8 +641,10 @@ If another terminal is already connected to the sandbox, `connect` prints a note
An unknown model slug, malformed extra-args JSON, or a gated model (for example `deepseek-r1-distill-70b`) with no `HF_TOKEN` or `HUGGING_FACE_HUB_TOKEN` exits non-zero with the same error the installer would emit, before any sandbox readiness probe or SSH attach.
Unset the managed-vLLM variable, or fix the value, before retrying.

When the live OpenShell gateway inference route differs from the route recorded in the NemoClaw registry, `connect` prints an explicit warning and realigns the shared gateway to the recorded route.
Use `$$nemoclaw inference set --provider <provider> --model <model>` to make an intentional route change.
When the live OpenShell gateway inference route differs from the route recorded in the NemoClaw registry, `connect` checks every registered sandbox on that gateway before attempting a repair.
It realigns the route only when those registry entries are compatible with the requested provider and model.
If another sandbox records a conflicting route, `connect` exits non-zero without changing the gateway and names the affected sandboxes.
Use `$$nemoclaw inference set --provider <provider> --model <model>` to make an intentional compatible route change.
If the sandbox is registered locally but missing from a healthy gateway, `connect` preserves the registry entry and points you to `rebuild --yes`, `onboard`, or `destroy` instead of deleting the metadata needed for recovery.

After a host reboot, the OpenShell gateway rotates its SSH host keys.
Expand Down Expand Up @@ -2314,6 +2316,12 @@ By default, the command syncs the default registered sandbox.
The command refuses before changing the OpenShell route when the selected sandbox has shields up.
Run `$$nemoclaw <name> shields down`, apply the inference change, then run `$$nemoclaw <name> shields up` again.

Each OpenShell gateway exposes one inference route to every sandbox registered on that gateway.
Before changing the route, NemoClaw compares the requested provider and model with every same-gateway registry entry, including stopped sandboxes.
Custom compatible routes must also have matching normalized endpoint URLs and API families.
If a route conflicts or a legacy custom route lacks enough endpoint or API-family metadata to prove compatibility, the command exits non-zero before changing the OpenShell route, agent config, or host registry and names the conflicting sandboxes.
Align those sandboxes to the same route, remove the conflicting sandbox, or onboard it with another `NEMOCLAW_GATEWAY_PORT`.

```bash
$$nemoclaw inference set --provider <provider> --model <model> [--sandbox <name>] [--no-verify] [--endpoint-url <url>] [--credential-env <ENV>] [--inference-api <api>]
```
Expand All @@ -2326,19 +2334,21 @@ $$nemoclaw my-assistant inference set --provider nvidia-prod --model nvidia/nemo
```

Pass both `--provider` and `--model` when you want NemoClaw to update the OpenShell inference route and sync the selected sandbox's agent config.
If you only want the lower-level OpenShell route operation, run `openshell inference set -g nemoclaw --model <model> --provider <provider>` directly.
When either flag is missing, `$$nemoclaw inference set` prints that OpenShell command instead of an oclif flag-validation error.
NemoClaw resolves the OpenShell gateway from the target sandbox's recorded gateway binding, including non-default `NEMOCLAW_GATEWAY_PORT` deployments.
Do not run `openshell inference set` directly on a shared NemoClaw gateway because that bypasses registry compatibility checks and can break other sandboxes.
When either flag is missing, `$$nemoclaw inference set` reports both required flags without suggesting a raw OpenShell command.
The command updates the host registry immediately after the gateway route changes.
If the in-sandbox config sync fails, NemoClaw keeps the gateway and registry aligned, warns that the running image may still need a rebuild, and points you to `$$nemoclaw <name> rebuild`.

Supported provider names are `nvidia-prod`, `nvidia-nim`, `nvidia-router`, `openai-api`, `anthropic-prod`, `compatible-anthropic-endpoint`, `gemini-api`, `compatible-endpoint`, `hermes-provider`, `ollama-local`, and `vllm-local`.
Use `--no-verify` only when OpenShell cannot verify the provider at switch time but you have already confirmed the provider and credential.
When switching to `compatible-endpoint` or `compatible-anthropic-endpoint` from a different provider family, pass `--endpoint-url` with the trusted custom provider URL so NemoClaw can persist durable rebuild metadata.
When switching to `compatible-endpoint` or `compatible-anthropic-endpoint` from a different provider family, pass `--endpoint-url` with the trusted custom provider URL and, except for the Hermes case below, `--inference-api` with its API family so NemoClaw can persist a complete route identity for rebuild and shared-gateway checks.
For a Hermes `compatible-anthropic-endpoint` target, `--inference-api` may be omitted because NemoClaw deterministically selects `openai-completions`; an explicit different API family is rejected.
NemoClaw rejects loopback, link-local, private, and internal endpoint addresses, including public hostnames that resolve to a private address.
For public HTTP URLs, NemoClaw stores the validated IP address to prevent DNS rebinding.
DNS-backed HTTPS URLs are rejected because NemoClaw cannot pin the downstream peer address while preserving TLS SNI and host validation across the OpenShell runtime boundary; HTTPS IP-literal URLs remain supported.
NemoClaw accepts `http://host.openshell.internal:<port>` only with an explicit port from `1024` through `65535`; this narrow exception supports NemoClaw's sandbox-to-host inference routes and is not a general private-endpoint bypass.
`--credential-env` and `--inference-api` may also be supplied for the compatible provider metadata; supported API values are `openai-completions`, `anthropic-messages`, and `openai-responses`.
`--credential-env` may also be supplied for compatible provider metadata; supported `--inference-api` values are `openai-completions`, `anthropic-messages`, and `openai-responses`.

### `$$nemoclaw setup`

Expand Down
Loading
Loading