Skip to content

Commit 778811d

Browse files
authored
fix(inference): retire unavailable Kimi K2.6 endpoint (#6475)
<!-- markdownlint-disable MD041 --> ## Summary Removes `moonshotai/kimi-k2.6` from NVIDIA Endpoints onboarding because its Chat Completions route now returns HTTP 404 even though NVIDIA's public featured feed and authenticated `/v1/models` catalog still advertise it. This PR does not add K2.7 or another replacement; a new Kimi model can be added after its production model ID and runtime route are live. ## Changes - Remove Kimi K2.6 from the bundled NVIDIA Endpoints fallback and filter the stale live-catalog entry. - Preserve the independent Hermes Provider K2.6 choice and existing/custom-route OpenClaw compatibility. - Keep Kimi compatibility coverage hermetic while the public NVIDIA K2.6 route is unavailable. - Update onboarding and capability documentation to distinguish catalog metadata from runtime availability. - Update picker, catalog, provider-boundary, documentation, and workflow coverage for the retired choice. ## Runtime Evidence - Public featured feed: still advertises `moonshotai/kimi-k2.6`. - Authenticated `https://integrate.api.nvidia.com/v1/models`: still advertises `moonshotai/kimi-k2.6` and no other Kimi model. - Actual `moonshotai/kimi-k2.6` Chat Completions request: HTTP 404. - Exact-main Kimi job: [run 28953873907 / job 85907646487](https://github.com/NVIDIA/NemoClaw/actions/runs/28953873907/job/85907646487) failed onboarding with `Chat Completions API: HTTP 404`. - `moonshotai/kimi-k2.7-code` is absent from `/v1/models` and its candidate route also returns HTTP 404, so replacement support remains out of scope. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes sample changes) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [x] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Advisor Follow-up Rationale - **Connect reconciliation (`PRA-1` / `PRA-7`):** This PR changes future NVIDIA Endpoints choices only; it deliberately preserves existing sandbox and custom-route compatibility and does not alter reconciliation semantics. Generic model divergence is covered in `src/lib/inference/config.test.ts`, and caller-level warning plus realignment is covered in `src/lib/actions/sandbox/connect-route-lifecycle.test.ts`. - **Manual `Other...` entry (`PRA-2`):** NVIDIA `/v1/models` still advertises K2.6, so the generic catalog validator cannot truthfully reject that ID. The retired-model policy removes K2.6 from advertised and fallback choices while retaining the generic manual path. Actual Kimi availability is checked by the model-aware Chat Completions probe; the linked exact-main run demonstrates the resulting HTTP 404 before successful onboarding. - **Open PR overlap (`PRA-3`):** #6461 is still open and this head is currently mergeable against live `main`. If #6461 lands first, normal merge-order conflict resolution and exact-head revalidation apply. - **Deny-list authority (`PRA-5`):** `src/lib/inference/nvidia-featured-models.ts` already documents why repository retirement policy overrides stale catalog metadata while preserving the independent Hermes Provider catalog. - **Hermes Provider warning:** Hermes Provider is an independent, pre-existing route and model catalog that this NVIDIA Endpoints retirement intentionally leaves unchanged. The advisor identified no evidence that its K2.6 route is unavailable; adding a new provider-level runtime validation contract belongs in separate provider work. - **Numeric picker tests:** The production prompt accepts numeric menu input, so the tests intentionally exercise that user contract. Each affected test immediately asserts the exact selected model and probe target, preventing an index change from silently validating the wrong model. - **Runtime test follow-ups:** The exact-head Kimi E2E proves secret-free mock routing plus the split tool trajectory; existing health tests prove model-aware Chat Completions failures are unhealthy. The linked exact-main public run supplies the stale-catalog-success / Chat-Completions-404 negative-path evidence without adding live-secret dependency to this PR. - **Runtime follow-up:** Exact-head E2E run [28957983313](https://github.com/NVIDIA/NemoClaw/actions/runs/28957983313) passes `inference-routing`, `cloud-onboard`, and the repaired hermetic `kimi-inference-compat` lane. The public negative-path evidence remains the linked exact-main HTTP 404 run. ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed - [x] Targeted behavior tests pass for the current change set: 164 focused config, model-prompt, featured-catalog, docs-contract, and onboarding tests - [x] E2E workflow boundary tests pass: 17 tests - [x] Exact-head advisor-required E2E run [28957983313](https://github.com/NVIDIA/NemoClaw/actions/runs/28957983313) passes `inference-routing`, `cloud-onboard`, and `kimi-inference-compat` - [x] `npm run typecheck:cli`, `npm run source-shape:check`, `npm run test-size:check`, and `npm run validate:configs` pass - [x] Applicable broad gate passed — all exact-head required contexts and the standard matrix are green - [ ] Quality Gates section completed with required justifications or waivers — sensitive-path review remains on the normal approval path - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings — 0 errors and 2 pre-existing warnings - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) - [ ] New doc pages include SPDX header and frontmatter — no new pages --- Signed-off-by: Aaron Erickson <aerickson@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Updated model availability filtering so retired/unavailable compatibility options (including Kimi K2.6) no longer appear in onboarding prompts, improving default selection reliability. * Adjusted the live compatibility testing setup and mode-dependent classification to run consistently in mock mode. * Improved mock streaming behavior so tool calls are emitted as separate `exec` calls with distinct arguments. * **Documentation** * Refreshed inference onboarding/model task-fit guidance to clarify that runtime route validation determines current availability. * Updated curated model lists and platform reference links to match the latest availability rules. * **Tests / CI** * Updated and expanded coverage to reflect the revised availability and selection behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
1 parent 7b0b318 commit 778811d

15 files changed

Lines changed: 114 additions & 48 deletions

.github/workflows/e2e.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,7 @@ jobs:
11441144
NEMOCLAW_NON_INTERACTIVE: "1"
11451145
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE: "1"
11461146
NEMOCLAW_SANDBOX_NAME: "e2e-kimi-compat"
1147-
NEMOCLAW_E2E_INFERENCE_MODE: "public-nvidia"
1147+
NEMOCLAW_E2E_INFERENCE_MODE: "mock"
11481148
OPENSHELL_GATEWAY: "nemoclaw"
11491149
steps:
11501150
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
@@ -1157,8 +1157,6 @@ jobs:
11571157
- name: Install OpenShell CLI
11581158
run: bash scripts/install-openshell.sh
11591159
- name: Run Kimi compatibility live Vitest test
1160-
env:
1161-
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
11621160
run: |
11631161
set -euo pipefail
11641162
export PATH="$HOME/.local/bin:$HOME/.npm-global/bin:$PATH"

ci/platform-matrix.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
"name": "Other OpenAI-compatible endpoint",
9494
"status": "caveated",
9595
"endpoint_type": "Custom OpenAI-compatible",
96-
"notes": "Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:120`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints."
96+
"notes": "Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:208`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints."
9797
},
9898
{
9999
"name": "Anthropic",

docs/inference/inference-options.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ The managed `dcode` runtime uses Chat Completions through OpenShell even when a
5151
|----------|--------|---------------|-------|
5252
| NVIDIA Endpoints | Tested | OpenAI-compatible | Hosted models on integrate.api.nvidia.com |
5353
| OpenAI | Tested | Native OpenAI-compatible | Uses OpenAI model IDs |
54-
| Other OpenAI-compatible endpoint | Tested with limitations | Custom OpenAI-compatible | Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:120`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints. |
54+
| Other OpenAI-compatible endpoint | Tested with limitations | Custom OpenAI-compatible | Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:208`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints. |
5555
| Anthropic | Tested | Native Anthropic | Uses anthropic-messages |
5656
| Other Anthropic-compatible endpoint | Tested with limitations | Custom Anthropic-compatible | Adapter path validated with AWS Bedrock (`src/lib/onboard/bedrock-runtime.ts`). Behavior on other Anthropic-compatible proxies and gateways may vary; this row claims the adapter, not the universe of compatible endpoints. |
5757
| Google Gemini | Tested | OpenAI-compatible | Uses Google's OpenAI-compatible endpoint |
@@ -81,7 +81,7 @@ NemoClaw neither displays nor accepts an unsafe `NEMOCLAW_MODEL` value as the ma
8181

8282
| Option | Description | Curated models |
8383
|--------|-------------|----------------|
84-
| NVIDIA Endpoints | Routes to models hosted on [build.nvidia.com](https://build.nvidia.com). You can also enter any model ID from the catalog. Set `NVIDIA_INFERENCE_API_KEY`. | Nemotron 3 Ultra 550B, Nemotron 3 Super 120B, Kimi K2.6, Minimax M3 |
84+
| NVIDIA Endpoints | Routes to models hosted on [build.nvidia.com](https://build.nvidia.com). You can also enter any model ID from the catalog. Set `NVIDIA_INFERENCE_API_KEY`. | Nemotron 3 Ultra 550B, Nemotron 3 Super 120B, Minimax M3 |
8585
| OpenAI | Routes to the OpenAI API. Set `OPENAI_API_KEY`. | `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.4-nano`, `gpt-5.4-pro-2026-03-05` |
8686
| Other OpenAI-compatible endpoint | Routes to any server that implements `/v1/chat/completions`. NemoClaw uses `/v1/chat/completions` at runtime by default; set `NEMOCLAW_PREFERRED_API=openai-responses` to allow `/v1/responses` for proxies that implement it, such as some llama.cpp builds. The wizard prompts for a base URL and model name. The adapter is validated against OpenRouter (refer to the status table above); behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations such as LocalAI or llama.cpp may vary. When you enable Telegram messaging, onboarding also runs a bounded sandbox-side smoke check through `https://inference.local/v1/chat/completions`. Set `COMPATIBLE_API_KEY`. | You provide the model name. |
8787
| Anthropic | Routes to the Anthropic Messages API. Set `ANTHROPIC_API_KEY`. | `claude-sonnet-4-6`, `claude-haiku-4-5`, `claude-opus-4-6` |
@@ -110,7 +110,8 @@ Use [Switch Inference Providers](switch-inference-providers) to move an existing
110110
## Model Task-Fit Guide
111111

112112
Use this table as starter guidance when selecting a curated cloud model during onboarding.
113-
The provider catalog remains authoritative for exact context-window limits, availability, and current pricing.
113+
The provider catalog remains authoritative for exact context-window limits and current pricing.
114+
Successful runtime route validation determines current availability because catalog entries can outlive their backing endpoints.
114115
For NVIDIA Endpoints, the table covers the bundled fallback choices.
115116
The live featured model catalog can include additional models.
116117
The relative labels below are qualitative and compare models within the curated onboarding choices, not across every model a provider offers.
@@ -119,7 +120,6 @@ The relative labels below are qualitative and compare models within the curated
119120
|---|---|---|---|---|---|
120121
| `nvidia/nemotron-3-ultra-550b-a55b` | Quality-sensitive reasoning, careful synthesis, and complex reviews | Higher | Strong for complex tool plans | Large agent context | Higher |
121122
| `nvidia/nemotron-3-super-120b-a12b` | Default hosted agent work, multi-step planning, and tool-heavy shell workflows | Medium | Strong default for OpenClaw tool loops | Large agent context | Medium |
122-
| `moonshotai/kimi-k2.6` | Coding tasks and shell-heavy agent trajectories | Medium | Strong with NemoClaw's Kimi tool-call compatibility path | Large-context friendly | Medium |
123123
| `minimaxai/minimax-m3` | Long-form writing, multi-turn assistant work, and broad instruction following | Medium | Good for structured assistant turns | Large agent context | Medium |
124124
| `gpt-5.4` | Default OpenAI-backed agent work and general high-quality reasoning | Medium | Strong | Large agent context | Medium-to-high |
125125
| `gpt-5.4-mini` | Latency-sensitive routine automation and repeated helper calls | Low | Good | Medium-to-large context | Low |

docs/inference/model-capability-audit.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ When importing a completed row from an issue comment, preserve the exact commit
8181
| Agent surface | Provider class | Model or route | API path | State | Evidence | Required affordance | Follow-up | Source |
8282
|---|---|---|---|---|---|---|---|---|
8383
| OpenClaw primary agent | NVIDIA Endpoints | `nvidia/nemotron-3-super-120b-a12b` | Managed `inference.local` OpenAI-compatible completions | `not-yet-run` | Add trajectory and session evidence before changing state. | Existing setup keeps Tool Search disabled and preserves direct structured tool calls, overriding the generated `tools.toolSearch.mode: tools` default for this route. | Verify `tool_search`, `tool_describe`, `tool_call`, and final execution before replacing the safeguard. | `scripts/generate-openclaw-config.mts`, `nemoclaw-blueprint/model-specific-setup/openclaw/nemotron-3-super-120b-managed-inference.json`. |
84-
| OpenClaw primary agent | NVIDIA Endpoints | `moonshotai/kimi-k2.6` | Managed `inference.local` OpenAI-compatible completions | `not-yet-run` | Add trajectory and session evidence before changing state. | Existing OpenClaw setup manifest applies Kimi compatibility and plugin loading. | Verify Kimi regression evidence before changing state. | `src/lib/inference/config.ts`, `nemoclaw-blueprint/model-specific-setup/openclaw/kimi-k2.6-managed-inference.json`. |
84+
| OpenClaw existing configuration | NVIDIA Endpoints (retired route) | `moonshotai/kimi-k2.6` | Managed `inference.local` OpenAI-compatible completions | `unsupported` | NVIDIA's catalogs still advertised K2.6 while the [live Kimi compatibility job](https://github.com/NVIDIA/NemoClaw/actions/runs/28953873907/job/85907646487) failed route validation with HTTP 404. | The OpenClaw setup manifest remains for existing or custom compatible routes that still serve K2.6. | Select a supported NVIDIA Endpoints model; do not promote K2.7 until its production model ID and chat route are live. | `nemoclaw-blueprint/model-specific-setup/openclaw/kimi-k2.6-managed-inference.json`. |
8585
| OpenClaw primary agent | NVIDIA Endpoints | Any model from `CLOUD_MODEL_OPTIONS` | Managed `inference.local` OpenAI-compatible completions unless config selects another API. | `not-yet-run` | Add one evidence row per model before changing state. | Record `none`, model-specific setup, or provider-class transport behavior. | Expand into per-model rows as evidence lands. | `src/lib/inference/config.ts`. |
8686
| OpenClaw primary agent | OpenAI | Any model from `REMOTE_MODEL_OPTIONS.openai` | `openai` provider through `https://inference.local/v1`. | `not-yet-run` | Add one evidence row per model before changing state. | Record Responses or Chat Completions behavior explicitly. | Expand into per-model rows as evidence lands. | `src/lib/inference/model-prompts.ts`, `src/lib/inference/config.ts`. |
8787
| OpenClaw primary agent | Anthropic | Any model from `REMOTE_MODEL_OPTIONS.anthropic` | `anthropic` provider through `https://inference.local` with `anthropic-messages`. | `not-yet-run` | Add one evidence row per model before changing state. | Record native Anthropic Messages behavior explicitly. | Expand into per-model rows as evidence lands. | `src/lib/inference/model-prompts.ts`, `src/lib/inference/config.ts`. |

docs/reference/platform-support.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ NemoClaw routes inference through the OpenShell gateway. Each row below is a pro
9595
|----------|--------|---------------|-------|
9696
| NVIDIA Endpoints | Tested | OpenAI-compatible | Hosted models on integrate.api.nvidia.com |
9797
| OpenAI | Tested | Native OpenAI-compatible | Uses OpenAI model IDs |
98-
| Other OpenAI-compatible endpoint | Tested with limitations | Custom OpenAI-compatible | Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:120`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints. |
98+
| Other OpenAI-compatible endpoint | Tested with limitations | Custom OpenAI-compatible | Adapter path validated against OpenRouter as the `compatible-endpoint` provider with `openrouter/auto` (see `src/lib/inference/config.test.ts:208`); the onboarding prompt that surfaces OpenRouter as the worked example is in `handleRemoteProviderSelection` in `src/lib/onboard.ts`. Behavior on other OpenAI-compatible proxies, gateways, and self-hosted implementations may vary; this row claims the adapter, not the universe of compatible endpoints. |
9999
| Anthropic | Tested | Native Anthropic | Uses anthropic-messages |
100100
| Other Anthropic-compatible endpoint | Tested with limitations | Custom Anthropic-compatible | Adapter path validated with AWS Bedrock (`src/lib/onboard/bedrock-runtime.ts`). Behavior on other Anthropic-compatible proxies and gateways may vary; this row claims the adapter, not the universe of compatible endpoints. |
101101
| Google Gemini | Tested | OpenAI-compatible | Uses Google's OpenAI-compatible endpoint |

src/lib/inference/config.test.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ describe("inference selection config", () => {
9898
expect(CLOUD_MODEL_OPTIONS).toEqual([
9999
{ id: "nvidia/nemotron-3-ultra-550b-a55b", label: "Nemotron 3 Ultra 550B" },
100100
{ id: "nvidia/nemotron-3-super-120b-a12b", label: "Nemotron 3 Super 120B" },
101-
{ id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" },
102101
{ id: "minimaxai/minimax-m3", label: "Minimax M3" },
103102
]);
104103
expect(CLOUD_MODEL_OPTIONS.map((option: { id: string }) => option.id)).not.toContain(
@@ -136,9 +135,12 @@ describe("inference selection config", () => {
136135
expect(HERMES_PROVIDER_MODEL_OPTIONS.length).toBeGreaterThan(10);
137136
});
138137

139-
it("retires GLM 5.1 only from the NVIDIA Endpoints picker", () => {
140-
expect(CLOUD_MODEL_OPTIONS.map((option) => option.id)).not.toContain("z-ai/glm-5.1");
141-
expect(HERMES_PROVIDER_MODEL_OPTIONS).toContain("z-ai/glm-5.1");
138+
it.each([
139+
"z-ai/glm-5.1",
140+
"moonshotai/kimi-k2.6",
141+
])("retires %s only from the NVIDIA Endpoints picker", (model) => {
142+
expect(CLOUD_MODEL_OPTIONS.map((option) => option.id)).not.toContain(model);
143+
expect(HERMES_PROVIDER_MODEL_OPTIONS).toContain(model);
142144
});
143145

144146
it("maps ollama-local to the sandbox inference route and default model", () => {

src/lib/inference/config.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ export const DEFAULT_HERMES_PROVIDER_MODEL = HERMES_PROVIDER_MODEL_OPTIONS[0];
5555
export const CLOUD_MODEL_OPTIONS = [
5656
{ id: "nvidia/nemotron-3-ultra-550b-a55b", label: "Nemotron 3 Ultra 550B" },
5757
{ id: "nvidia/nemotron-3-super-120b-a12b", label: "Nemotron 3 Super 120B" },
58-
{ id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" },
5958
{ id: "minimaxai/minimax-m3", label: "Minimax M3" },
6059
];
6160
export const DEFAULT_ROUTE_PROFILE = "inference-local";

src/lib/inference/model-prompts.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe("model prompt helpers", () => {
3434
});
3535

3636
it("returns Minimax M3 from the default cloud model menu", async () => {
37-
const promptFn = promptSequence(["4"]);
37+
const promptFn = promptSequence(["3"]);
3838
const result = await promptCloudModel({
3939
promptFn,
4040
writeLine: vi.fn(),

src/lib/inference/nvidia-featured-models.test.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,21 @@ describe("NVIDIA featured model catalog", () => {
4141
).toEqual([{ id: "minimaxai/minimax-m3", label: "Minimax M3" }]);
4242
});
4343

44-
it("filters GLM 5.1 while it is retired from NVIDIA Endpoints (#6069)", () => {
44+
it("filters models whose catalogs outlive their NVIDIA Endpoints routes", () => {
4545
expect(
4646
parseNvidiaFeaturedModels(
4747
JSON.stringify({
4848
"featured-models": [
4949
{ model: "z-ai/glm-5.1", "model-name": "GLM 5.1" },
5050
{ model: "moonshotai/kimi-k2.6", "model-name": "Kimi K2.6" },
51+
{
52+
model: "nvidia/nemotron-3-super-120b-a12b",
53+
"model-name": "Nemotron 3 Super 120B",
54+
},
5155
],
5256
}),
5357
),
54-
).toEqual([{ id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" }]);
58+
).toEqual([{ id: "nvidia/nemotron-3-super-120b-a12b", label: "Nemotron 3 Super 120B" }]);
5559
});
5660

5761
it("sanitizes untrusted catalog labels and bounds the rendered menu", () => {
@@ -91,7 +95,7 @@ describe("NVIDIA featured model catalog", () => {
9195
httpStatus: 200,
9296
curlStatus: 0,
9397
body: JSON.stringify({
94-
"featured-models": [{ model: "moonshotai/kimi-k2.6", "model-name": "Kimi K2.6" }],
98+
"featured-models": [{ model: "minimaxai/minimax-m3", "model-name": "Minimax M3" }],
9599
}),
96100
stderr: "",
97101
message: "",
@@ -101,7 +105,7 @@ describe("NVIDIA featured model catalog", () => {
101105

102106
expect(result).toEqual({
103107
ok: true,
104-
models: [{ id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" }],
108+
models: [{ id: "minimaxai/minimax-m3", label: "Minimax M3" }],
105109
});
106110
});
107111

@@ -122,7 +126,6 @@ describe("NVIDIA featured model catalog", () => {
122126
expect(models.map((model) => model.id)).toEqual([
123127
"nvidia/nemotron-3-ultra-550b-a55b",
124128
"nvidia/nemotron-3-super-120b-a12b",
125-
"moonshotai/kimi-k2.6",
126129
"minimaxai/minimax-m3",
127130
]);
128131
expect(warnings).toEqual([
@@ -183,6 +186,7 @@ describe("NVIDIA featured model catalog", () => {
183186
"featured-models": [
184187
{ model: "unsafe model id", "model-name": "Unsafe" },
185188
{ model: "z-ai/glm-5.1", "model-name": "Retired" },
189+
{ model: "moonshotai/kimi-k2.6", "model-name": "Also retired" },
186190
],
187191
}),
188192
stderr: "",
@@ -257,6 +261,9 @@ describe("NVIDIA featured model catalog", () => {
257261
});
258262

259263
expect(options.defaultModelId).toBe("nvidia/nemotron-3-super-120b-a12b");
264+
expect(options.cloudModelOptions.map((option) => option.id)).not.toContain(
265+
"moonshotai/kimi-k2.6",
266+
);
260267
});
261268

262269
it("reuses one featured catalog lookup but recomputes defaults across onboarding retries", () => {
@@ -283,11 +290,11 @@ describe("NVIDIA featured model catalog", () => {
283290
},
284291
});
285292

286-
const kimiDefault = loadOptions("moonshotai/kimi-k2.6");
293+
const retiredDefault = loadOptions("moonshotai/kimi-k2.6");
287294
const ultraDefault = loadOptions("nvidia/nemotron-3-ultra-550b-a55b");
288-
expect(kimiDefault.defaultModelId).toBe("moonshotai/kimi-k2.6");
295+
expect(retiredDefault.defaultModelId).toBe("nvidia/nemotron-3-ultra-550b-a55b");
289296
expect(ultraDefault.defaultModelId).toBe("nvidia/nemotron-3-ultra-550b-a55b");
290-
expect(kimiDefault.cloudModelOptions).toBe(ultraDefault.cloudModelOptions);
297+
expect(retiredDefault.cloudModelOptions).toBe(ultraDefault.cloudModelOptions);
291298
expect(probeCount).toBe(1);
292299
});
293300
});

src/lib/inference/nvidia-featured-models.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ import { CLOUD_MODEL_OPTIONS, DEFAULT_CLOUD_MODEL } from "./config";
88

99
export const NVIDIA_FEATURED_MODELS_URL =
1010
"https://assets.ngc.nvidia.com/products/api-catalog/featured-models.json";
11-
// GLM 5.1 retirement contract (#6069): the external featured feed may lag an
12-
// NVIDIA Endpoints retirement. The repository authority is CLOUD_MODEL_OPTIONS
13-
// plus the provider-boundary assertion in test/inference-options-docs.test.ts,
14-
// which retain GLM 5.1 only for Hermes. Keep this policy deny-list until a
15-
// deliberate product change reverses #6069; a transient feed omission alone is
16-
// not a removal signal.
17-
const RETIRED_NVIDIA_FEATURED_MODEL_IDS = new Set(["z-ai/glm-5.1"]);
11+
// NVIDIA Endpoints retirement contract: the public featured feed and
12+
// authenticated /models catalog can lag a runtime retirement. The repository
13+
// authority is CLOUD_MODEL_OPTIONS plus the provider-boundary assertion in
14+
// test/inference-options-docs.test.ts, which keeps independently available
15+
// Hermes Provider models separate from NVIDIA Endpoints choices. Keep entries
16+
// in this policy deny-list until a deliberate product change confirms that the
17+
// NVIDIA chat-completions route is available again or names a live successor.
18+
const RETIRED_NVIDIA_FEATURED_MODEL_IDS = new Set([
19+
"z-ai/glm-5.1", // Retired from NVIDIA Endpoints in #6069.
20+
"moonshotai/kimi-k2.6", // Catalogs still list it after its backing route was removed.
21+
]);
1822
const MAX_NVIDIA_FEATURED_CATALOG_BYTES = 1024 * 1024;
1923
const MAX_NVIDIA_FEATURED_MODELS = 100;
2024
const MAX_NVIDIA_FEATURED_MODEL_ID_LENGTH = 256;

0 commit comments

Comments
 (0)