Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
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/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
}
Expand Down
7 changes: 2 additions & 5 deletions docs/inference/inference-options.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add GLM 5.1 to the NVIDIA Endpoints curated list.

The refreshed featured set in the PR objective includes GLM 5.1, but this row still lists only four NVIDIA Endpoints models. That leaves the onboarding docs out of sync with the menu you are shipping.

♻️ Proposed fix
-| 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 |
+| 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, GLM 5.1, Kimi K2.6, Minimax M2.7 |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| 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 |
| 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, GLM 5.1, Kimi K2.6, Minimax M2.7 |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/inference/inference-options.mdx` at line 67, Update the NVIDIA Endpoints
curated model list in the inference options table to include GLM 5.1 so the docs
match the featured set being shipped. Edit the existing NVIDIA Endpoints row in
the inference options content and add GLM 5.1 alongside the current curated
models, keeping the row format consistent with the surrounding table entries.

| 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` |
Expand All @@ -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 |
Expand Down
13 changes: 5 additions & 8 deletions src/lib/inference/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
]);
});

Expand Down
5 changes: 1 addition & 4 deletions src/lib/inference/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
6 changes: 3 additions & 3 deletions src/lib/inference/model-prompts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down
18 changes: 8 additions & 10 deletions test/onboard-selection.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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", () => {
Expand Down
Loading