diff --git a/ci/test-file-size-budget.json b/ci/test-file-size-budget.json index 09eb8615124..e7497fb34cc 100644 --- a/ci/test-file-size-budget.json +++ b/ci/test-file-size-budget.json @@ -10,7 +10,7 @@ "test/install-preflight.test.ts": 4006, "test/nemoclaw-start.test.ts": 4947, "test/onboard-messaging.test.ts": 2062, - "test/onboard-selection.test.ts": 6867, + "test/onboard-selection.test.ts": 6865, "test/onboard.test.ts": 4774, "test/policies.test.ts": 2489 } diff --git a/docs/inference/inference-options.mdx b/docs/inference/inference-options.mdx index bec130876a5..82811d2c05e 100644 --- a/docs/inference/inference-options.mdx +++ b/docs/inference/inference-options.mdx @@ -64,7 +64,7 @@ The managed install/start vLLM entry appears by default on DGX Spark and DGX Sta | Option | Description | Curated models | |--------|-------------|----------------| -| 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 Super 120B, Nemotron 3 Ultra 550B, MiniMax M2.7, GPT-OSS 120B, DeepSeek V4 Pro | +| 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 M2.7 | | 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` | | 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. | | Anthropic | Routes to the Anthropic Messages API. Set `ANTHROPIC_API_KEY`. | `claude-sonnet-4-6`, `claude-haiku-4-5`, `claude-opus-4-6` | @@ -90,11 +90,8 @@ The relative labels below are qualitative and compare models within the curated |---|---|---|---|---|---| | `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 | | `nvidia/nemotron-3-ultra-550b-a55b` | Quality-sensitive reasoning, careful synthesis, and complex reviews | Higher | Strong for complex tool plans | Large agent context | Higher | -| `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning` | Reasoning-first and multimodal experiments where a compact hosted model is enough | Medium | Good after the smoke probe confirms final-answer content | Large agent context | Medium | -| `minimaxai/minimax-m2.7` | Long-form writing, multi-turn assistant work, and broad instruction following | Medium | Good for structured assistant turns | Large agent context | Medium | | `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 | -| `openai/gpt-oss-120b` | Hosted open-weight style experimentation and cost-aware general agents | Medium | Good when provider-side tool calling is enabled | Large agent context | Medium | -| `deepseek-ai/deepseek-v4-pro` | Code, math, and reasoning-heavy problem solving | Medium-to-high | Strong when the endpoint supports tool calls | Large agent context | Medium-to-high | +| `minimaxai/minimax-m2.7` | Long-form writing, multi-turn assistant work, and broad instruction following | Medium | Good for structured assistant turns | Large agent context | Medium | | `gpt-5.4` | Default OpenAI-backed agent work and general high-quality reasoning | Medium | Strong | Large agent context | Medium-to-high | | `gpt-5.4-mini` | Latency-sensitive routine automation and repeated helper calls | Low | Good | Medium-to-large context | Low | | `gpt-5.4-nano` | Very low-latency classification, routing, extraction, and small helper tasks | Very low | Basic to good for simple tool loops | Medium context | Very low | diff --git a/src/lib/inference/config.test.ts b/src/lib/inference/config.test.ts index 532b5dc8877..123ae9f3903 100644 --- a/src/lib/inference/config.test.ts +++ b/src/lib/inference/config.test.ts @@ -25,14 +25,11 @@ import { describe("inference selection config", () => { it("exposes the curated cloud model picker options", () => { - expect(CLOUD_MODEL_OPTIONS.map((option: { id: string }) => option.id)).toEqual([ - "nvidia/nemotron-3-super-120b-a12b", - "nvidia/nemotron-3-ultra-550b-a55b", - "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", - "minimaxai/minimax-m2.7", - "moonshotai/kimi-k2.6", - "openai/gpt-oss-120b", - "deepseek-ai/deepseek-v4-pro", + expect(CLOUD_MODEL_OPTIONS).toEqual([ + { id: "nvidia/nemotron-3-super-120b-a12b", label: "Nemotron 3 Super 120B" }, + { id: "nvidia/nemotron-3-ultra-550b-a55b", label: "Nemotron 3 Ultra 550B" }, + { id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" }, + { id: "minimaxai/minimax-m2.7", label: "Minimax M2.7" }, ]); }); diff --git a/src/lib/inference/config.ts b/src/lib/inference/config.ts index 8e986438db0..aaaec7c8317 100644 --- a/src/lib/inference/config.ts +++ b/src/lib/inference/config.ts @@ -55,11 +55,8 @@ export const DEFAULT_HERMES_PROVIDER_MODEL = HERMES_PROVIDER_MODEL_OPTIONS[0]; export const CLOUD_MODEL_OPTIONS = [ { id: "nvidia/nemotron-3-super-120b-a12b", label: "Nemotron 3 Super 120B" }, { id: "nvidia/nemotron-3-ultra-550b-a55b", label: "Nemotron 3 Ultra 550B" }, - { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", label: "Nemotron 3 Nano Omni 30B" }, - { id: "minimaxai/minimax-m2.7", label: "MiniMax M2.7" }, { id: "moonshotai/kimi-k2.6", label: "Kimi K2.6" }, - { id: "openai/gpt-oss-120b", label: "GPT-OSS 120B" }, - { id: "deepseek-ai/deepseek-v4-pro", label: "DeepSeek V4 Pro" }, + { id: "minimaxai/minimax-m2.7", label: "Minimax M2.7" }, ]; export const DEFAULT_ROUTE_PROFILE = "inference-local"; export const DEFAULT_ROUTE_CREDENTIAL_ENV = "OPENAI_API_KEY"; diff --git a/src/lib/inference/model-prompts.test.ts b/src/lib/inference/model-prompts.test.ts index 46d38ab4da8..53913eba10e 100644 --- a/src/lib/inference/model-prompts.test.ts +++ b/src/lib/inference/model-prompts.test.ts @@ -33,14 +33,14 @@ describe("model prompt helpers", () => { expect(result).toBe("llama"); }); - it("returns DeepSeek V4 Pro from the default cloud model menu", async () => { - const promptFn = promptSequence(["7"]); + it("returns Minimax M2.7 from the default cloud model menu", async () => { + const promptFn = promptSequence(["4"]); const result = await promptCloudModel({ promptFn, writeLine: vi.fn(), }); - expect(result).toBe("deepseek-ai/deepseek-v4-pro"); + expect(result).toBe("minimaxai/minimax-m2.7"); }); it("validates manual cloud model ids against the saved NVIDIA key", async () => { diff --git a/test/onboard-selection.test.ts b/test/onboard-selection.test.ts index d1d4eb4b27a..e439a1131ec 100644 --- a/test/onboard-selection.test.ts +++ b/test/onboard-selection.test.ts @@ -508,14 +508,12 @@ const { setupNim } = require(${onboardPath}); ); }); - it("selects DeepSeek V4 Pro from the NVIDIA Endpoints model list", () => { + it("selects Kimi K2.6 from the NVIDIA Endpoints model list", () => { const repoRoot = path.join(import.meta.dirname, ".."); - const tmpDir = fs.mkdtempSync( - path.join(os.tmpdir(), "nemoclaw-onboard-build-deepseek-selection-"), - ); + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "nemoclaw-onboard-build-kimi-selection-")); const fakeBin = path.join(tmpDir, "bin"); - const scriptPath = path.join(tmpDir, "build-deepseek-selection-check.js"); - const curlArgsLog = path.join(tmpDir, "deepseek-curl-args.log"); + const scriptPath = path.join(tmpDir, "build-kimi-selection-check.js"); + const curlArgsLog = path.join(tmpDir, "kimi-curl-args.log"); const onboardPath = JSON.stringify(path.join(repoRoot, "src", "lib", "onboard.ts")); const credentialsPath = JSON.stringify( path.join(repoRoot, "src", "lib", "credentials", "store.ts"), @@ -553,7 +551,7 @@ printf '%s' "$status" const credentials = require(${credentialsPath}); const runner = require(${runnerPath}); -const answers = ["1", "7"]; +const answers = ["1", "3"]; const messages = []; credentials.prompt = async (message) => { @@ -604,16 +602,16 @@ const { setupNim } = require(${onboardPath}); assert.equal(result.status, 0, result.stderr); const payload = JSON.parse(result.stdout.trim()); assert.equal(payload.result.provider, "nvidia-prod"); - assert.equal(payload.result.model, "deepseek-ai/deepseek-v4-pro"); + assert.equal(payload.result.model, "moonshotai/kimi-k2.6"); assert.equal(payload.result.preferredInferenceApi, "openai-completions"); assert.match(payload.messages[1], /Choose model \[1\]/); - assert.ok(payload.lines.some((line: string) => line.includes("DeepSeek V4 Pro"))); + assert.ok(payload.lines.some((line: string) => line.includes("Kimi K2.6"))); assert.ok( payload.lines.some((line: string) => line.includes("Chat Completions API available")), ); const curlInvocations = fs.readFileSync(curlArgsLog, "utf-8"); assert.match(curlInvocations, /chat\/completions/); - assert.match(curlInvocations, /(^|\s)-N(\s|$)/); + assert.doesNotMatch(curlInvocations, /(^|\s)-N(\s|$)/); }); it("accepts a manually entered NVIDIA Endpoints model after validating it against /models", () => {