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
This commit is contained in:
kiranchilledout 2026-01-30 07:14:26 +05:30
parent 84a1994890
commit 062ce60bfa
3 changed files with 48 additions and 0 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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");
});
});