Add Nebius Token Factory provider

Register Nebius Token Factory as an OpenAI-compatible chat provider using the Token Factory API base URL and NEBIUS_API_KEY-derived provider id. Expose Nebius in onboarding metadata and add static coverage for the provider endpoint and UI listing.

Alessandro committed May 12, 2026 at 15:50 UTC 03cc91287eaa2c309163e8c96029ebc765a013dd
3 files changed +36
conf/model_providers.yaml
+7
@@ -93,6 +93,13 @@ chat:
93 litellm_provider: moonshot
94 models_list:
95 endpoint_url: "https://api.moonshot.cn/v1/models"
96 + nebius:
97 + name: Nebius Token Factory
98 + litellm_provider: openai
99 + models_list:
100 + endpoint_url: "/models"
101 + kwargs:
102 + api_base: https://api.tokenfactory.nebius.com/v1
103 ollama:
104 name: Ollama
105 litellm_provider: ollama
plugins/_onboarding/webui/onboarding-providers.js
+10
@@ -17,6 +17,7 @@ export const MORE_CLOUD_PROVIDER_IDS = [
17 "groq",
18 "xai",
19 "moonshot",
20 + "nebius",
21 "huggingface",
22 "github_copilot",
23 "sambanova",
@@ -143,6 +144,15 @@ export const ONBOARDING_PROVIDER_OVERRIDES = {
144 model_list_autoload: true,
145 short_description: "Kimi models with long-context strengths.",
146 },
147 + nebius: {
148 + logo: "https://nebius.com/favicon.ico",
149 + setup_url: "https://tokenfactory.nebius.com/",
150 + api_key_url: "https://tokenfactory.nebius.com/api-keys",
151 + docs_url: "https://docs.tokenfactory.nebius.com/api-reference/introduction",
152 + api_key_mode: "required",
153 + model_list_autoload: true,
154 + short_description: "OpenAI-compatible inference for open models.",
155 + },
156 ollama: {
157 logo: "https://ollama.com/public/ollama.png",
158 setup_url: "https://ollama.com/download",
tests/test_onboarding_static.py
+19
@@ -1,5 +1,7 @@
1 from pathlib import Path
2
3 +import yaml
4 +
5 PROJECT_ROOT = Path(__file__).resolve().parents[1]
6
7
@@ -43,18 +45,22 @@ def test_onboarding_provider_grid_names_are_present_in_metadata():
45 assert "TOP_CLOUD_PROVIDER_IDS" in provider_ui
46 assert '"venice"' in provider_ui
47 assert '"xai"' in provider_ui
48 + assert '"nebius"' in provider_ui
49 assert provider_ui.index('"venice"') < provider_ui.index('"zai"')
50 assert provider_ui.index('"xai"') > provider_ui.index("MORE_CLOUD_PROVIDER_IDS")
51 assert 'name: "Google"' in provider_ui
52 assert 'docs_url: "https://openrouter.ai/workspaces/default/keys"' in provider_ui
53 assert 'docs_url: "https://ai.google.dev/gemini-api/docs/api-key"' in provider_ui
54 assert 'docs_url: "https://docs.venice.ai/guides/getting-started/generating-api-key"' in provider_ui
55 + assert 'docs_url: "https://docs.tokenfactory.nebius.com/api-reference/introduction"' in provider_ui
56 assert 'docs_url: "https://lmstudio.ai/docs/developer/core/authentication"' in provider_ui
57 assert 'docs_url: ""' in provider_ui
58 assert "api_key_mode: none" in model_metadata
59 assert "api_key_mode: optional" in model_metadata
60 assert "Ollama Cloud" in provider_yaml
61 assert "https://ollama.com/v1" in provider_yaml
62 + assert "Nebius Token Factory" in provider_yaml
63 + assert "https://api.tokenfactory.nebius.com/v1" in provider_yaml
64 assert not (PROJECT_ROOT / "plugins/_model_config/conf/model_providers.yaml").exists()
65
66 for name in [
@@ -66,6 +72,7 @@ def test_onboarding_provider_grid_names_are_present_in_metadata():
72 "DeepSeek",
73 "xAI",
74 "Moonshot AI",
75 + "Nebius Token Factory",
76 "Z.AI",
77 "Mistral AI",
78 "Azure OpenAI",
@@ -102,6 +109,18 @@ def test_onboarding_provider_grid_names_are_present_in_metadata():
109 assert logo in provider_ui
110
111
112 +def test_nebius_provider_config_uses_openai_compatible_token_factory_endpoint():
113 + provider_path = PROJECT_ROOT / "conf/model_providers.yaml"
114 + provider_config = yaml.safe_load(provider_path.read_text(encoding="utf-8"))
115 + nebius = provider_config["chat"]["nebius"]
116 +
117 + assert nebius["name"] == "Nebius Token Factory"
118 + assert nebius["litellm_provider"] == "openai"
119 + assert nebius["kwargs"]["api_base"] == "https://api.tokenfactory.nebius.com/v1"
120 + assert nebius["models_list"]["endpoint_url"] == "/models"
121 + assert "api_key_mode" not in nebius
122 +
123 +
124 def test_discovery_auto_modal_extension_contains_required_guards():
125 content = (PROJECT_ROOT / "plugins/_discovery/extensions/webui/initFw_end/auto-modal.js").read_text(encoding="utf-8")
126