From ced51ed62f58a05913e3a9747d203bb0146b0d13 Mon Sep 17 00:00:00 2001 From: decolua Date: Fri, 3 Jul 2026 12:15:58 +0700 Subject: [PATCH] feat(nvidia): add new models and capabilities for NVIDIA provider - Updated capabilities for NVIDIA models to enforce OpenAI-compatible reasoning formats. - Added new models: MiniMax M3, GLM 5.2, DeepSeek V4 Pro, DeepSeek V4 Flash, Kimi K2.6, and Nemotron 3 Ultra to the NVIDIA registry. This enhances the provider's functionality and aligns with OpenAI standards. --- open-sse/providers/capabilities.js | 9 +++ open-sse/providers/registry/nvidia.js | 9 ++- public/providers/clinepass.png | Bin 0 -> 15547 bytes .../real/nvidia-thinking.e2e.test.js | 58 ++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 public/providers/clinepass.png create mode 100644 tests/translator/real/nvidia-thinking.e2e.test.js diff --git a/open-sse/providers/capabilities.js b/open-sse/providers/capabilities.js index 98f4ed47..c73a4bc8 100644 --- a/open-sse/providers/capabilities.js +++ b/open-sse/providers/capabilities.js @@ -102,6 +102,15 @@ export const MODEL_CAPABILITIES = { * Provider-specific capability overrides. Keyed by provider alias/id. */ export const PROVIDER_CAPABILITIES = { + // NVIDIA NIM is OpenAI-compatible → rejects MiniMax/GLM native `thinking` field. + // Force openai reasoning_effort format for its reasoning models. #issue + "nvidia": { + "minimaxai/minimax-m2.7": { reasoning: true, thinkingFormat: "openai", thinkingCanDisable: false, contextWindow: 200000, maxOutput: 131072 }, + "minimaxai/minimax-m3": { vision: true, reasoning: true, thinkingFormat: "openai", thinkingCanDisable: false, contextWindow: 512000, maxOutput: 131072 }, + "z-ai/glm-5.2": { reasoning: true, thinkingFormat: "openai", contextWindow: 200000, maxOutput: 128000 }, + "deepseek-ai/deepseek-v4-pro": { reasoning: true, thinkingFormat: "openai", contextWindow: 1000000, maxOutput: 65536 }, + "deepseek-ai/deepseek-v4-flash": { reasoning: true, thinkingFormat: "openai", contextWindow: 1000000, maxOutput: 65536 }, + }, // CodeBuddy.cn — authoritative per-model metadata from the gateway's model // config (contextWindow=maxInputTokens, maxOutput=maxOutputTokens, vision= // supportsImages). Every model reasons via OpenAI-style reasoning_effort diff --git a/open-sse/providers/registry/nvidia.js b/open-sse/providers/registry/nvidia.js index 35a1f768..9522611a 100644 --- a/open-sse/providers/registry/nvidia.js +++ b/open-sse/providers/registry/nvidia.js @@ -20,8 +20,13 @@ export default { validateUrl: "https://integrate.api.nvidia.com/v1/models", }, models: [ - { id: "minimaxai/minimax-m2.7", name: "Minimax M2.7" }, - { id: "z-ai/glm4.7", name: "GLM 4.7" }, + { id: "minimaxai/minimax-m2.7", name: "MiniMax M2.7" }, + { id: "minimaxai/minimax-m3", name: "MiniMax M3" }, + { id: "z-ai/glm-5.2", name: "GLM 5.2" }, + { id: "deepseek-ai/deepseek-v4-pro", name: "DeepSeek V4 Pro" }, + { id: "deepseek-ai/deepseek-v4-flash", name: "DeepSeek V4 Flash" }, + { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6" }, + { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra" }, { id: "nvidia/nv-embedqa-e5-v5", name: "NV EmbedQA E5 v5", kind: "embedding" }, { id: "nvidia/parakeet-ctc-1.1b-asr", name: "Parakeet CTC 1.1B", params: ["language"], kind: "stt" }, { id: "fastpitch", name: "FastPitch", kind: "tts" }, diff --git a/public/providers/clinepass.png b/public/providers/clinepass.png new file mode 100644 index 0000000000000000000000000000000000000000..be2418999f3d06e90ce66918013bd768247ada7e GIT binary patch literal 15547 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 P&sSDbNuox~DER*YOT_ga literal 0 HcmV?d00001 diff --git a/tests/translator/real/nvidia-thinking.e2e.test.js b/tests/translator/real/nvidia-thinking.e2e.test.js new file mode 100644 index 00000000..2e2f67e9 --- /dev/null +++ b/tests/translator/real/nvidia-thinking.e2e.test.js @@ -0,0 +1,58 @@ +// E2E: hit live local proxy → verify nvidia MiniMax M2.7 doesn't 400 on +// unsupported "thinking" param (nvidia NIM is OpenAI-compatible). +// Requires dev server running on NV_E2E_PORT + an active router API key in DB. +// RUN_E2E=1 npx vitest run --config tests/vitest.config.js tests/translator/real/nvidia-thinking.e2e.test.js +import { describe, it, expect, beforeAll } from "vitest"; +import { getApiKeys } from "../../../src/lib/db/repos/apiKeysRepo.js"; + +const PORT = process.env.NV_E2E_PORT || "20127"; +const BASE = `http://localhost:${PORT}`; +const MODELS = [ + "nvidia/minimaxai/minimax-m2.7", + "nvidia/minimaxai/minimax-m3", + "nvidia/z-ai/glm-5.2", + "nvidia/deepseek-ai/deepseek-v4-pro", + "nvidia/deepseek-ai/deepseek-v4-flash", + "nvidia/moonshotai/kimi-k2.6", + "nvidia/nvidia/nemotron-3-ultra-550b-a55b", +]; +const RUN = process.env.RUN_E2E === "1"; +const maybe = RUN ? describe : describe.skip; + +async function drain(res) { + const reader = res.body.getReader(); + const decoder = new TextDecoder(); + let out = ""; + while (true) { + const { done, value } = await reader.read(); + if (done) break; + out += decoder.decode(value, { stream: true }); + } + return out; +} + +maybe("nvidia thinking e2e", () => { + let apiKey = ""; + beforeAll(async () => { + const keys = await getApiKeys(); + apiKey = keys.find((k) => k.isActive)?.key || process.env.NV_E2E_KEY || ""; + }); + + it.each(MODELS)("%s with reasoning_effort -> no 'thinking' 400", async (model) => { + if (!apiKey) return expect(true).toBe(true); + const res = await fetch(`${BASE}/v1/chat/completions`, { + method: "POST", + headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` }, + body: JSON.stringify({ + model, + stream: true, + max_tokens: 64, + reasoning_effort: "low", + messages: [{ role: "user", content: "Reply with the single word: hi" }], + }), + }); + const raw = await drain(res); + expect(/Unsupported parameter.*thinking/i.test(raw), `${model} rejected 'thinking'`).toBe(false); + expect(res.status, `${model} bad status ${res.status}`).toBeLessThan(400); + }, 90000); +});