Skip to content

Nvidia provider sends bare model id to integrate.api.nvidia.com → HTTP 404 (vendor prefix dropped in normalizeStaticProviderModelId) #71552

@rosshuartt-cpu

Description

@rosshuartt-cpu

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

  1. npm i -g openclaw@2026.4.23 (Node 22)
  2. 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
  3. Set agents.defaults.model.primary to nvidia/nemotron-3-super-120b-a12b
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions