diff --git a/nemoclaw-blueprint/router/pool-config.yaml b/nemoclaw-blueprint/router/pool-config.yaml index 231a85493a..ddd9af5300 100644 --- a/nemoclaw-blueprint/router/pool-config.yaml +++ b/nemoclaw-blueprint/router/pool-config.yaml @@ -23,14 +23,14 @@ routing: models: - name: nemotron-3-nano-reasoning display_name: "Nemotron 3 Nano (Reasoning)" - litellm_model: "openai/nvidia/nvidia/Nemotron-3-Nano-30B-A3B" + litellm_model: "openai/nvidia/nemotron-3-nano-30b-a3b" cost_per_m_input_tokens: 0.05 cost_per_m_output_tokens: 0.20 - api_base: "https://inference-api.nvidia.com" + api_base: "https://integrate.api.nvidia.com/v1" - name: nemotron-3-super display_name: "Nemotron 3 Super 120B" - litellm_model: "openai/nvidia/nvidia/nemotron-3-super-v3" + litellm_model: "openai/nvidia/nemotron-3-super-120b-a12b" cost_per_m_input_tokens: 0.10 cost_per_m_output_tokens: 0.40 - api_base: "https://inference-api.nvidia.com" + api_base: "https://integrate.api.nvidia.com/v1" diff --git a/test/validate-blueprint.test.ts b/test/validate-blueprint.test.ts index 398e95518a..ef2b059d20 100644 --- a/test/validate-blueprint.test.ts +++ b/test/validate-blueprint.test.ts @@ -13,6 +13,10 @@ import { describe, it, expect } from "vitest"; import YAML from "yaml"; const BLUEPRINT_PATH = new URL("../nemoclaw-blueprint/blueprint.yaml", import.meta.url); +const ROUTER_POOL_CONFIG_PATH = new URL( + "../nemoclaw-blueprint/router/pool-config.yaml", + import.meta.url, +); const BASE_POLICY_PATH = new URL( "../nemoclaw-blueprint/policies/openclaw-sandbox.yaml", import.meta.url, @@ -42,6 +46,16 @@ type Blueprint = { }; }; +type RouterPoolModel = { + name?: string; + litellm_model?: string; + api_base?: string; +}; + +type RouterPoolConfig = { + models?: RouterPoolModel[]; +}; + type Rule = { allow?: { method?: string; path?: string } }; type Endpoint = { host?: string; @@ -163,6 +177,32 @@ describe("blueprint.yaml", () => { } }); +describe("Model Router pool config", () => { + const pool = loadYaml(ROUTER_POOL_CONFIG_PATH); + + it("regression #3255: routes NVIDIA API keys to the public NVIDIA Build endpoint", () => { + const apiBases = new Set((pool.models ?? []).map((model) => model.api_base)); + expect(apiBases).toEqual(new Set(["https://integrate.api.nvidia.com/v1"])); + }); + + it("regression #3255: uses valid LiteLLM NVIDIA model identifiers", () => { + const modelsByName = new Map( + (pool.models ?? []).map((model) => [model.name, model.litellm_model]), + ); + expect(modelsByName.get("nemotron-3-nano-reasoning")).toBe( + "openai/nvidia/nemotron-3-nano-30b-a3b", + ); + expect(modelsByName.get("nemotron-3-super")).toBe( + "openai/nvidia/nemotron-3-super-120b-a12b", + ); + for (const litellmModel of modelsByName.values()) { + expect(litellmModel).not.toMatch(/nvidia\/nvidia\//); + expect(litellmModel).not.toContain("Nemotron-3-Nano-30B-A3B"); + expect(litellmModel).not.toContain("nemotron-3-super-v3"); + } + }); +}); + describe("base sandbox policy", () => { const policy = loadYaml(BASE_POLICY_PATH);