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