From 062ce60bfa7951edeb452e44fc320bcae5c8269a Mon Sep 17 00:00:00 2001 From: kiranchilledout Date: Fri, 30 Jan 2026 07:14:26 +0530 Subject: [PATCH] feat: add Nebius Token Factory provider - Provider configuration with 11 models (Qwen, DeepSeek, Llama, GLM families) - Credential handling and onboarding flow - Complete documentation (nebius.md, config examples, provider list) - Test coverage for config functions - Changelog entry --- CHANGELOG.md | 1 + ...s-writing-models-json-no-env-token.test.ts | 4 ++ src/commands/onboard-auth.test.ts | 43 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a134359f5..74ba4082a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Status: beta. ### Changes - Providers: add Venice AI integration; update Moonshot Kimi references to kimi-k2.5; update MiniMax API endpoint/format. (#2762, #3064) +- Providers: add Nebius Token Factory integration with onboarding flow (Qwen, DeepSeek, Llama, GLM families). - Providers: add Xiaomi MiMo (mimo-v2-flash) support and onboarding flow. (#3454) Thanks @WqyJh. - Telegram: quote replies, edit-message action, silent sends, sticker support + vision caching, linkPreview toggle, plugin sendPayload support. (#2900, #2394, #2382, #2548, #1700, #1917) - Discord: configurable privileged gateway intents for presences/members. (#2266) Thanks @kentaro. diff --git a/src/agents/models-config.skips-writing-models-json-no-env-token.test.ts b/src/agents/models-config.skips-writing-models-json-no-env-token.test.ts index 08a66469f..730a71e9c 100644 --- a/src/agents/models-config.skips-writing-models-json-no-env-token.test.ts +++ b/src/agents/models-config.skips-writing-models-json-no-env-token.test.ts @@ -53,6 +53,7 @@ describe("models-config", () => { const previousMoonshot = process.env.MOONSHOT_API_KEY; const previousSynthetic = process.env.SYNTHETIC_API_KEY; const previousVenice = process.env.VENICE_API_KEY; + const previousNebius = process.env.NEBIUS_API_KEY; const previousXiaomi = process.env.XIAOMI_API_KEY; delete process.env.COPILOT_GITHUB_TOKEN; delete process.env.GH_TOKEN; @@ -62,6 +63,7 @@ describe("models-config", () => { delete process.env.MOONSHOT_API_KEY; delete process.env.SYNTHETIC_API_KEY; delete process.env.VENICE_API_KEY; + delete process.env.NEBIUS_API_KEY; delete process.env.XIAOMI_API_KEY; try { @@ -95,6 +97,8 @@ describe("models-config", () => { else process.env.SYNTHETIC_API_KEY = previousSynthetic; if (previousVenice === undefined) delete process.env.VENICE_API_KEY; else process.env.VENICE_API_KEY = previousVenice; + if (previousNebius === undefined) delete process.env.NEBIUS_API_KEY; + else process.env.NEBIUS_API_KEY = previousNebius; if (previousXiaomi === undefined) delete process.env.XIAOMI_API_KEY; else process.env.XIAOMI_API_KEY = previousXiaomi; } diff --git a/src/commands/onboard-auth.test.ts b/src/commands/onboard-auth.test.ts index 80d71852c..62f30d8bb 100644 --- a/src/commands/onboard-auth.test.ts +++ b/src/commands/onboard-auth.test.ts @@ -17,6 +17,8 @@ import { applySyntheticProviderConfig, applyXiaomiConfig, applyXiaomiProviderConfig, + applyNebiusConfig, + applyNebiusProviderConfig, OPENROUTER_DEFAULT_MODEL_REF, SYNTHETIC_DEFAULT_MODEL_ID, SYNTHETIC_DEFAULT_MODEL_REF, @@ -466,3 +468,44 @@ describe("applyOpenrouterConfig", () => { expect(cfg.agents?.defaults?.model?.fallbacks).toEqual(["anthropic/claude-opus-4-5"]); }); }); +describe("applyNebiusConfig", () => { + it("adds Nebius provider with correct settings", () => { + const cfg = applyNebiusConfig({}); + expect(cfg.models?.providers?.nebius).toMatchObject({ + baseUrl: "https://api.tokenfactory.nebius.com/v1", + api: "openai-completions", + }); + expect(cfg.agents?.defaults?.model?.primary).toBe("nebius/zai-org/GLM-4.7-FP8"); + }); + + it("merges Nebius models and keeps existing provider overrides", () => { + const cfg = applyNebiusProviderConfig({ + models: { + providers: { + nebius: { + baseUrl: "https://old.example.com", + apiKey: "old-key", + api: "openai-completions", + models: [ + { + id: "custom-model", + name: "Custom", + reasoning: false, + input: ["text"], + cost: { input: 1, output: 2, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 1000, + maxTokens: 100, + }, + ], + }, + }, + }, + }); + + expect(cfg.models?.providers?.nebius?.baseUrl).toBe("https://api.tokenfactory.nebius.com/v1"); + expect(cfg.models?.providers?.nebius?.api).toBe("openai-completions"); + expect(cfg.models?.providers?.nebius?.apiKey).toBe("old-key"); + expect(cfg.models?.providers?.nebius?.models.map((m) => m.id)).toContain("custom-model"); + expect(cfg.models?.providers?.nebius?.models.map((m) => m.id)).toContain("zai-org/GLM-4.7-FP8"); + }); +});