Bug type
Regression (worked before, now fails)
Beta release blocker
No
Summary
When agents.defaults.model.primary is set to a Nvidia NIM model id like nvidia/nemotron-3-super-120b-a12b, the gateway strips the nvidia/ prefix before the outbound request reaches integrate.api.nvidia.com/v1/chat/completions, causing HTTP 404 model_not_found. The Nvidia NIM API expects the full vendor-prefixed model id on the wire (same convention as OpenRouter, which is already handled correctly).
Root cause is in dist/model-ref-shared-DxJ4s7gE.js: parseStaticModelRef() splits the configured ref on the first / into provider + modelRaw, then calls normalizeStaticProviderModelId(provider, modelRaw). That function has a re-prefixing case for openrouter but no equivalent for nvidia, so the bare suffix becomes the runtime model.id and is what reaches pi-ai's openai-completions request body.
Steps to reproduce
npm i -g openclaw@2026.4.23 (Node 22)
- Configure a provider entry under
models.providers.nvidia:
baseUrl: https://integrate.api.nvidia.com/v1
api: openai-completions
models: [{ id: "nvidia/nemotron-3-super-120b-a12b", ... }]
- valid
nvapi-… key
- Set
agents.defaults.model.primary to nvidia/nemotron-3-super-120b-a12b
- Trigger any agent run, e.g.
openclaw agent --agent main -m "ping"
A direct curl https://integrate.api.nvidia.com/v1/chat/completions -H "Authorization: Bearer $NVAPI_KEY" -d '{"model":"nvidia/nemotron-3-super-120b-a12b","messages":[...]}' succeeds with the same key, confirming the API expects the full prefix.
Expected behavior
Agent completes successfully. Outbound request to integrate.api.nvidia.com carries "model": "nvidia/nemotron-3-super-120b-a12b" — matching the catalog entry's id and the documented Nvidia NIM model identifier.
Actual behavior
HTTP 404: 404 page not found, failoverReason: model_not_found. Gateway log shows the runtime/agent layer with model: "nemotron-3-super-120b-a12b" and sourceModel: "nemotron-3-super-120b-a12b" — both stripped of the nvidia/ prefix before pi-ai constructs the request body.
OpenClaw version
2026.4.23
Operating system
macOS 14
Install method
npm i -g openclaw (Node 22.22.2 via nvm)
Model
nvidia/nemotron-3-super-120b-a12b
Provider / routing chain
openclaw -> nvidia (integrate.api.nvidia.com/v1, openai-completions API)
Additional provider/model setup details
No response
Logs, screenshots, and evidence
{"event":"embedded_run_agent_end","isError":true,"error":"HTTP 404: 404 page not found","failoverReason":"model_not_found","model":"nemotron-3-super-120b-a12b","provider":"nvidia","sourceModel":"nemotron-3-super-120b-a12b","providerRuntimeFailureKind":"unknown"}
After applying the proposed fix locally, `openclaw agent --agent main -m "ping"` returns `status: ok` in ~17s with metadata showing `provider: "nvidia"`, `model: "nvidia/nemotron-3-super-120b-a12b"` — full prefix preserved end-to-end.
Impact and severity
Nvidia NIM provider is unusable out of the box for any model whose catalog id starts with nvidia/ (Nemotron variants in the bundled catalog). Catalog entries with non-nvidia/ vendor prefixes in the same provider (moonshotai/kimi-k2.5, minimaxai/minimax-m2.5, z-ai/glm5) happen to work because the inner slash survives the split. So the breakage is silent and partial — users may assume "only Nemotron is broken" rather than recognizing the underlying normalize-table gap.
Additional information
Suggested one-line fix (mirrors the existing OpenRouter case):
// dist/model-ref-shared-DxJ4s7gE.js, in normalizeStaticProviderModelId
if (provider === "openrouter" && !model.includes("/")) return `openrouter/${model}`;
if (provider === "nvidia" && !model.includes("/")) return `nvidia/${model}`; // ← add
if (provider === "xai") return normalizeNativeXaiModelId(model);
The !model.includes("/") guard preserves correct behavior for already-prefixed catalog entries like moonshotai/kimi-k2.5 (which after the parser's split becomes moonshotai/kimi-k2.5 with the slash intact, so re-prefixing is skipped).
Cosmetic follow-up (separate, pre-existing): dist/server-startup-log-DMedWp7m.js builds the displayed model ref via naive ${provider}/${model} interpolation rather than the modelKey() helper that other call sites use. After applying the fix, the startup banner shows agent model: nvidia/nvidia/nemotron-3-super-120b-a12b — purely a display issue (runtime is correct), but worth swapping to modelKey() for consistency.
Bug type
Regression (worked before, now fails)
Beta release blocker
No
Summary
When
agents.defaults.model.primaryis set to a Nvidia NIM model id likenvidia/nemotron-3-super-120b-a12b, the gateway strips thenvidia/prefix before the outbound request reachesintegrate.api.nvidia.com/v1/chat/completions, causing HTTP 404model_not_found. The Nvidia NIM API expects the full vendor-prefixed model id on the wire (same convention as OpenRouter, which is already handled correctly).Root cause is in
dist/model-ref-shared-DxJ4s7gE.js:parseStaticModelRef()splits the configured ref on the first/intoprovider+modelRaw, then callsnormalizeStaticProviderModelId(provider, modelRaw). That function has a re-prefixing case foropenrouterbut no equivalent fornvidia, so the bare suffix becomes the runtimemodel.idand is what reaches pi-ai's openai-completions request body.Steps to reproduce
npm i -g openclaw@2026.4.23(Node 22)models.providers.nvidia:baseUrl: https://integrate.api.nvidia.com/v1api: openai-completionsmodels: [{ id: "nvidia/nemotron-3-super-120b-a12b", ... }]nvapi-…keyagents.defaults.model.primarytonvidia/nemotron-3-super-120b-a12bopenclaw agent --agent main -m "ping"A direct
curl https://integrate.api.nvidia.com/v1/chat/completions -H "Authorization: Bearer $NVAPI_KEY" -d '{"model":"nvidia/nemotron-3-super-120b-a12b","messages":[...]}'succeeds with the same key, confirming the API expects the full prefix.Expected behavior
Agent completes successfully. Outbound request to integrate.api.nvidia.com carries
"model": "nvidia/nemotron-3-super-120b-a12b"— matching the catalog entry'sidand the documented Nvidia NIM model identifier.Actual behavior
HTTP 404: 404 page not found,failoverReason: model_not_found. Gateway log shows the runtime/agent layer withmodel: "nemotron-3-super-120b-a12b"andsourceModel: "nemotron-3-super-120b-a12b"— both stripped of thenvidia/prefix before pi-ai constructs the request body.OpenClaw version
2026.4.23
Operating system
macOS 14
Install method
npm i -g openclaw (Node 22.22.2 via nvm)
Model
nvidia/nemotron-3-super-120b-a12b
Provider / routing chain
openclaw -> nvidia (integrate.api.nvidia.com/v1, openai-completions API)
Additional provider/model setup details
No response
Logs, screenshots, and evidence
{"event":"embedded_run_agent_end","isError":true,"error":"HTTP 404: 404 page not found","failoverReason":"model_not_found","model":"nemotron-3-super-120b-a12b","provider":"nvidia","sourceModel":"nemotron-3-super-120b-a12b","providerRuntimeFailureKind":"unknown"} After applying the proposed fix locally, `openclaw agent --agent main -m "ping"` returns `status: ok` in ~17s with metadata showing `provider: "nvidia"`, `model: "nvidia/nemotron-3-super-120b-a12b"` — full prefix preserved end-to-end.Impact and severity
Nvidia NIM provider is unusable out of the box for any model whose catalog
idstarts withnvidia/(Nemotron variants in the bundled catalog). Catalog entries with non-nvidia/vendor prefixes in the same provider (moonshotai/kimi-k2.5,minimaxai/minimax-m2.5,z-ai/glm5) happen to work because the inner slash survives the split. So the breakage is silent and partial — users may assume "only Nemotron is broken" rather than recognizing the underlying normalize-table gap.Additional information
Suggested one-line fix (mirrors the existing OpenRouter case):
The
!model.includes("/")guard preserves correct behavior for already-prefixed catalog entries likemoonshotai/kimi-k2.5(which after the parser's split becomesmoonshotai/kimi-k2.5with the slash intact, so re-prefixing is skipped).Cosmetic follow-up (separate, pre-existing):
dist/server-startup-log-DMedWp7m.jsbuilds the displayed model ref via naive${provider}/${model}interpolation rather than themodelKey()helper that other call sites use. After applying the fix, the startup banner showsagent model: nvidia/nvidia/nemotron-3-super-120b-a12b— purely a display issue (runtime is correct), but worth swapping tomodelKey()for consistency.