From 20e6078c40356901eaa87a7b190f3b7cdd84e41e Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sat, 5 Sep 2026 13:45:36 +0300 Subject: [PATCH 1/5] feat(providers): add Hubris as a JSON-configured OpenAI-compatible provider Hubris (https://hubris.pw) is an OpenAI-compatible LLM gateway billed in Russian rubles. Registered via providers.json with HUBRIS_API_KEY / HUBRIS_API_BASE and chat completions, responses and messages endpoints; model ids keep the gateway's vendor/model form (hubris/anthropic/claude-sonnet-5). --- litellm/llms/openai_like/providers.json | 6 + provider_endpoints_support.json | 18 ++ .../llms/openai_like/test_hubris_provider.py | 193 ++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 tests/test_litellm/llms/openai_like/test_hubris_provider.py diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index a458a209ea9..78cfde357d3 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -200,5 +200,11 @@ "temperature_max": 1.99 }, "supported_endpoints": ["/v1/chat/completions"] + }, + "hubris": { + "base_url": "https://api.hubris.pw/v1", + "api_key_env": "HUBRIS_API_KEY", + "api_base_env": "HUBRIS_API_BASE", + "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/messages"] } } diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index 41ed8e1d975..aa23af2815e 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -1335,6 +1335,24 @@ "interactions": true } }, + "hubris": { + "display_name": "Hubris (`hubris`)", + "url": "https://hubris.pw/docs", + "endpoints": { + "chat_completions": true, + "messages": true, + "responses": true, + "embeddings": false, + "image_generations": false, + "audio_transcriptions": false, + "audio_speech": false, + "moderations": false, + "batches": false, + "rerank": false, + "a2a": true, + "interactions": true + } + }, "hyperbolic": { "display_name": "Hyperbolic (`hyperbolic`)", "url": "https://docs.litellm.ai/docs/providers/hyperbolic", diff --git a/tests/test_litellm/llms/openai_like/test_hubris_provider.py b/tests/test_litellm/llms/openai_like/test_hubris_provider.py new file mode 100644 index 00000000000..c963285ecda --- /dev/null +++ b/tests/test_litellm/llms/openai_like/test_hubris_provider.py @@ -0,0 +1,193 @@ +""" +Tests for the Hubris provider. + +Hubris (https://hubris.pw) is an OpenAI-compatible LLM gateway registered purely +via the JSON provider registry (``litellm/llms/openai_like/providers.json``); +it has no hand-written transformation class. Model ids on Hubris always use the +full ``vendor/model`` form (e.g. ``anthropic/claude-sonnet-5``), which LiteLLM +passes through verbatim after stripping the ``hubris/`` prefix. +""" + +import json + +import pytest + +import litellm +from litellm import completion +from litellm.llms.openai_like.dynamic_config import create_config_class +from litellm.llms.openai_like.json_loader import JSONProviderRegistry + +API_BASE = "https://api.hubris.pw/v1" +CHAT_URL = f"{API_BASE}/chat/completions" +MODEL = "hubris/anthropic/claude-sonnet-5" +BARE_MODEL = "anthropic/claude-sonnet-5" + + +def _new_config(): + return create_config_class(JSONProviderRegistry.get("hubris"))() + + +def _completion_payload(content="Hi from Hubris!"): + return { + "id": "chatcmpl-123", + "object": "chat.completion", + "created": 1677652288, + "model": BARE_MODEL, + "choices": [ + { + "index": 0, + "message": {"role": "assistant", "content": content}, + "finish_reason": "stop", + } + ], + "usage": {"prompt_tokens": 9, "completion_tokens": 12, "total_tokens": 21}, + } + + +class TestHubrisProviderRegistration: + def test_hubris_registered_in_json_registry(self): + assert JSONProviderRegistry.exists("hubris") + + config = JSONProviderRegistry.get("hubris") + assert config is not None + assert config.base_url == API_BASE + assert config.api_key_env == "HUBRIS_API_KEY" + assert config.api_base_env == "HUBRIS_API_BASE" + + def test_hubris_listed(self): + assert "hubris" in JSONProviderRegistry.list_providers() + + def test_hubris_config_defaults(self): + config = JSONProviderRegistry.get("hubris") + assert config.base_class == "openai_gpt" + assert config.param_mappings == {} + assert config.constraints == {} + assert config.special_handling == {} + + def test_hubris_advertises_responses_api(self): + assert JSONProviderRegistry.supports_responses_api("hubris") is True + + +class TestHubrisProviderResolution: + def test_get_llm_provider_resolves_hubris(self, monkeypatch): + monkeypatch.setenv("HUBRIS_API_KEY", "sk-gw-test") + + model, custom_llm_provider, dynamic_api_key, api_base = ( + litellm.get_llm_provider(model=MODEL) + ) + + # Only the leading "hubris/" is stripped; the vendor prefix stays. + assert model == BARE_MODEL + assert custom_llm_provider == "hubris" + assert dynamic_api_key == "sk-gw-test" + assert api_base == API_BASE + + def test_get_llm_provider_uses_explicit_api_key(self, monkeypatch): + monkeypatch.setenv("HUBRIS_API_KEY", "env-key") + + _, _, dynamic_api_key, _ = litellm.get_llm_provider( + model=MODEL, api_key="sk-explicit" + ) + assert dynamic_api_key == "sk-explicit" + + def test_get_llm_provider_honors_api_base_override(self): + _, custom_llm_provider, _, api_base = litellm.get_llm_provider( + model=MODEL, api_base="https://custom.example/v1" + ) + assert custom_llm_provider == "hubris" + assert api_base == "https://custom.example/v1" + + def test_get_llm_provider_honors_api_base_env(self, monkeypatch): + monkeypatch.setenv("HUBRIS_API_BASE", "https://env.example/v1") + monkeypatch.setenv("HUBRIS_API_KEY", "env-key") + + _, custom_llm_provider, _, api_base = litellm.get_llm_provider(model=MODEL) + assert custom_llm_provider == "hubris" + assert api_base == "https://env.example/v1" + +class TestHubrisDynamicConfig: + def test_custom_llm_provider(self): + assert _new_config().custom_llm_provider == "hubris" + + def test_get_complete_url_appends_chat_completions(self): + url = _new_config().get_complete_url( + api_base=API_BASE, + api_key="k", + model=BARE_MODEL, + optional_params={}, + litellm_params={}, + ) + assert url == CHAT_URL + + def test_get_complete_url_falls_back_to_base_url(self): + url = _new_config().get_complete_url( + api_base=None, + api_key="k", + model=BARE_MODEL, + optional_params={}, + litellm_params={}, + ) + assert url == CHAT_URL + + def test_provider_info_resolves_from_env(self, monkeypatch): + monkeypatch.setenv("HUBRIS_API_KEY", "env-key") + base, key = _new_config()._get_openai_compatible_provider_info(None, None) + assert base == API_BASE + assert key == "env-key" + + def test_standard_sampling_params_pass_through(self): + out = _new_config().map_openai_params( + non_default_params={"temperature": 0.6, "top_p": 0.9}, + optional_params={}, + model=BARE_MODEL, + drop_params=False, + ) + assert out == {"temperature": 0.6, "top_p": 0.9} + + +class TestHubrisCompletion: + @pytest.fixture(autouse=True) + def _disable_aiohttp(self): + original = getattr(litellm, "disable_aiohttp_transport", False) + litellm.disable_aiohttp_transport = True + yield + litellm.disable_aiohttp_transport = original + + @pytest.mark.respx() + def test_completion_sends_correct_url_and_body(self, respx_mock): + route = respx_mock.post(CHAT_URL).respond( + json=_completion_payload(), status_code=200 + ) + + response = completion( + model=MODEL, + messages=[{"role": "user", "content": "say hi"}], + api_key="sk-gw-test", + api_base=API_BASE, + temperature=0.6, + ) + + assert route.called + request = route.calls.last.request + assert str(request.url) == CHAT_URL + assert request.headers["authorization"] == "Bearer sk-gw-test" + body = json.loads(request.content) + assert body["model"] == BARE_MODEL + assert body["messages"] == [{"role": "user", "content": "say hi"}] + assert body["temperature"] == 0.6 + assert response.choices[0].message.content == "Hi from Hubris!" + assert response.usage.total_tokens == 21 + + def test_streaming_yields_content_chunks(self): + chunks = list( + completion( + model=MODEL, + messages=[{"role": "user", "content": "hi"}], + api_key="sk-gw-test", + stream=True, + mock_response="Hello from Hubris", + ) + ) + assert len(chunks) > 0 + text = "".join((c.choices[0].delta.content or "") for c in chunks) + assert "Hello from Hubris" in text From ef3ec4f6bc60995002996e71af352db8639df91c Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sat, 5 Sep 2026 17:48:51 +0300 Subject: [PATCH 2/5] test(hubris): use monkeypatch for disable_aiohttp_transport (TQ005) --- .../test_litellm/llms/openai_like/test_hubris_provider.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_litellm/llms/openai_like/test_hubris_provider.py b/tests/test_litellm/llms/openai_like/test_hubris_provider.py index c963285ecda..4f1d792abb7 100644 --- a/tests/test_litellm/llms/openai_like/test_hubris_provider.py +++ b/tests/test_litellm/llms/openai_like/test_hubris_provider.py @@ -147,11 +147,9 @@ class TestHubrisDynamicConfig: class TestHubrisCompletion: @pytest.fixture(autouse=True) - def _disable_aiohttp(self): - original = getattr(litellm, "disable_aiohttp_transport", False) - litellm.disable_aiohttp_transport = True - yield - litellm.disable_aiohttp_transport = original + def _disable_aiohttp(self, monkeypatch): + # respx mocks the httpx transport, so the aiohttp transport must be off. + monkeypatch.setattr(litellm, "disable_aiohttp_transport", True) @pytest.mark.respx() def test_completion_sends_correct_url_and_body(self, respx_mock): From 692226e334d00174473a974ad886fe2099449572 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Mon, 7 Sep 2026 18:51:58 +0300 Subject: [PATCH 3/5] feat(hubris): complete the provider to match a merged JSON provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first version of this PR carried three files. Comparing it against #34752 (SCX.ai), the last JSON-configured provider merged here, showed it was missing most of what a provider needs: litellm/constants.py base URL + provider name litellm/types/utils.py LlmProviders.HUBRIS model_prices_and_context_window.json 14 models litellm/model_prices_and_context_window_backup.json litellm/provider_endpoints_support_backup.json litellm/proxy/public_endpoints/provider_create_fields.json ui/litellm-dashboard/public/assets/logos/hubris.svg Model entries deliberately carry no cost fields. Hubris bills in rubles at a rate that moves with the cost of buying dollars, so a hardcoded USD-per-token figure would be wrong within weeks. 118 chat entries already in this file are priced the same way, dashscope's whole catalogue among them. Context windows, output limits and capability flags come from the gateway's own catalogue. The endpoint support entry is corrected against the live API. Six of its twelve flags were wrong: embeddings, image_generations, audio_transcriptions and audio_speech were declared unsupported when the routes exist, and a2a and interactions were declared supported when they return 404. Every flag was re-checked by hitting the route: 401 means it exists and wants a key, 404 means it does not exist. The two overstated flags were the bad ones — LiteLLM would have promised users endpoints that are not there. Verified: check_provider_folders_documented.py passes (29 openai_like providers, 178 provider entries, ours among them), all touched JSON parses, LlmProviders.HUBRIS resolves. --- litellm/constants.py | 2 + ...odel_prices_and_context_window_backup.json | 182 ++++++++++++++++++ .../provider_endpoints_support_backup.json | 18 ++ .../provider_create_fields.json | 28 +++ litellm/types/utils.py | 1 + model_prices_and_context_window.json | 182 ++++++++++++++++++ provider_endpoints_support.json | 12 +- .../public/assets/logos/hubris.svg | 25 +++ 8 files changed, 444 insertions(+), 6 deletions(-) create mode 100644 ui/litellm-dashboard/public/assets/logos/hubris.svg diff --git a/litellm/constants.py b/litellm/constants.py index da731cb5eb2..126baa123fc 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -869,6 +869,7 @@ openai_compatible_endpoints: Final[list] = [ "https://pinstripes.io/v1", "https://api.meta.ai/v1", "https://api.cognition.ai/v1", + "https://api.hubris.pw/v1", "https://api.scx.ai/v1", "https://gigachat.devices.sberbank.ru/api/v1", ] @@ -941,6 +942,7 @@ openai_compatible_providers: Final[list] = [ "darkbloom", "meta", # Meta Model API (Muse Spark) - JSON-configured provider "cognition", + "hubris", "scx-ai", ] openai_text_completion_compatible_providers: Final[list] = [ # providers that support `/v1/completions` diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 2459ed940e0..e295d563dfc 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -59144,6 +59144,188 @@ "supports_tool_choice": true, "supports_vision": true }, + "hubris/anthropic/claude-haiku-4.5": { + "litellm_provider": "hubris", + "max_input_tokens": 200000, + "max_output_tokens": 64000, + "max_tokens": 64000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/anthropic/claude-opus-5": { + "litellm_provider": "hubris", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/anthropic/claude-sonnet-5": { + "litellm_provider": "hubris", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/deepseek/deepseek-v4-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "hubris/deepseek/deepseek-v4-pro": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "hubris/google/gemini-3.7-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/google/gemini-3.8-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/minimax/minimax-m3": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 512000, + "max_tokens": 512000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/moonshotai/kimi-k3": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 943718, + "max_tokens": 943718, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-5.4-mini": { + "litellm_provider": "hubris", + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-5.6-luna": { + "litellm_provider": "hubris", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-6-astra": { + "litellm_provider": "hubris", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/x-ai/grok-4.6": { + "litellm_provider": "hubris", + "max_input_tokens": 500000, + "max_output_tokens": 450000, + "max_tokens": 450000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/z-ai/glm-5.3": { + "litellm_provider": "hubris", + "max_input_tokens": 1310720, + "max_output_tokens": 943718, + "max_tokens": 943718, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, "mistral/mistral-medium-3.5": { "cache_read_input_token_cost": 1.5e-07, "input_cost_per_token": 1.5e-06, diff --git a/litellm/provider_endpoints_support_backup.json b/litellm/provider_endpoints_support_backup.json index 9d6b1e18f59..0e4466df384 100644 --- a/litellm/provider_endpoints_support_backup.json +++ b/litellm/provider_endpoints_support_backup.json @@ -1238,6 +1238,24 @@ "interactions": true } }, + "hubris": { + "display_name": "Hubris (`hubris`)", + "url": "https://hubris.pw/docs", + "endpoints": { + "chat_completions": true, + "messages": true, + "responses": true, + "embeddings": true, + "image_generations": true, + "audio_transcriptions": true, + "audio_speech": true, + "moderations": false, + "batches": false, + "rerank": false, + "a2a": false, + "interactions": false + } + }, "hyperbolic": { "display_name": "Hyperbolic (`hyperbolic`)", "url": "https://docs.litellm.ai/docs/providers/hyperbolic", diff --git a/litellm/proxy/public_endpoints/provider_create_fields.json b/litellm/proxy/public_endpoints/provider_create_fields.json index 66f8c2ea36f..0fe18ed0548 100644 --- a/litellm/proxy/public_endpoints/provider_create_fields.json +++ b/litellm/proxy/public_endpoints/provider_create_fields.json @@ -2844,6 +2844,34 @@ ], "default_model_placeholder": "sap/gpt-4" }, + { + "provider": "HUBRIS", + "provider_display_name": "Hubris", + "litellm_provider": "hubris", + "credential_fields": [ + { + "key": "api_base", + "label": "API Base", + "placeholder": "https://api.hubris.pw/v1", + "tooltip": null, + "required": false, + "field_type": "text", + "options": null, + "default_value": null + }, + { + "key": "api_key", + "label": "API Key", + "placeholder": null, + "tooltip": null, + "required": true, + "field_type": "password", + "options": null, + "default_value": null + } + ], + "default_model_placeholder": "hubris/anthropic/claude-sonnet-5" + }, { "provider": "SCX_AI", "provider_display_name": "SCX.ai", diff --git a/litellm/types/utils.py b/litellm/types/utils.py index 5052cd6ef48..d8da2eb0e8d 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -3968,6 +3968,7 @@ class LlmProviders(str, Enum): LIBERTAI = "libertai" PINSTRIPES = "pinstripes" COGNITION = "cognition" + HUBRIS = "hubris" SCX_AI = "scx-ai" DARKBLOOM = "darkbloom" META = "meta" diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 2459ed940e0..e295d563dfc 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -59144,6 +59144,188 @@ "supports_tool_choice": true, "supports_vision": true }, + "hubris/anthropic/claude-haiku-4.5": { + "litellm_provider": "hubris", + "max_input_tokens": 200000, + "max_output_tokens": 64000, + "max_tokens": 64000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/anthropic/claude-opus-5": { + "litellm_provider": "hubris", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/anthropic/claude-sonnet-5": { + "litellm_provider": "hubris", + "max_input_tokens": 1000000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/deepseek/deepseek-v4-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "hubris/deepseek/deepseek-v4-pro": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 384000, + "max_tokens": 384000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, + "hubris/google/gemini-3.7-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/google/gemini-3.8-flash": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 65536, + "max_tokens": 65536, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/minimax/minimax-m3": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 512000, + "max_tokens": 512000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/moonshotai/kimi-k3": { + "litellm_provider": "hubris", + "max_input_tokens": 1048576, + "max_output_tokens": 943718, + "max_tokens": 943718, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-5.4-mini": { + "litellm_provider": "hubris", + "max_input_tokens": 400000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-5.6-luna": { + "litellm_provider": "hubris", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/openai/gpt-6-astra": { + "litellm_provider": "hubris", + "max_input_tokens": 1050000, + "max_output_tokens": 128000, + "max_tokens": 128000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/x-ai/grok-4.6": { + "litellm_provider": "hubris", + "max_input_tokens": 500000, + "max_output_tokens": 450000, + "max_tokens": 450000, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": true + }, + "hubris/z-ai/glm-5.3": { + "litellm_provider": "hubris", + "max_input_tokens": 1310720, + "max_output_tokens": 943718, + "max_tokens": 943718, + "mode": "chat", + "source": "https://hubris.pw/models", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_response_schema": true, + "supports_tool_choice": true, + "supports_vision": false + }, "mistral/mistral-medium-3.5": { "cache_read_input_token_cost": 1.5e-07, "input_cost_per_token": 1.5e-06, diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index aa23af2815e..9100520e045 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -1342,15 +1342,15 @@ "chat_completions": true, "messages": true, "responses": true, - "embeddings": false, - "image_generations": false, - "audio_transcriptions": false, - "audio_speech": false, + "embeddings": true, + "image_generations": true, + "audio_transcriptions": true, + "audio_speech": true, "moderations": false, "batches": false, "rerank": false, - "a2a": true, - "interactions": true + "a2a": false, + "interactions": false } }, "hyperbolic": { diff --git a/ui/litellm-dashboard/public/assets/logos/hubris.svg b/ui/litellm-dashboard/public/assets/logos/hubris.svg new file mode 100644 index 00000000000..5f1bbc2553f --- /dev/null +++ b/ui/litellm-dashboard/public/assets/logos/hubris.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From c56f43006afd17048f6ad3001d4e42f17e78518f Mon Sep 17 00:00:00 2001 From: Konstantin Date: Mon, 7 Sep 2026 20:19:16 +0300 Subject: [PATCH 4/5] fix(hubris): carry the behaviour flags each model's canonical entry declares MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI caught this and was right to. Three tests failed on six parametrisations: test_opus_5_all_variants_carry_adaptive_thinking_flag, test_opus_5_all_variants_carry_512_token_cache_minimum and test_sonnet_5_all_variants_carry_adaptive_thinking_flag. They select variants by substring, so hubris/anthropic/claude-opus-5 and hubris/anthropic/claude-sonnet-5 are swept in, and mine carried none of the flags. This is not a formality. The opus-5 test says so in as many words: adaptive thinking detection is cost-map driven, and a variant missing the flag silently sends the legacy thinking.type='enabled' shape, which the model rejects with a 400. Shipping those entries as they were would have broken exactly the users this PR is meant to serve. Rather than patch the three assertions, every Hubris entry now carries the supports_* flags and prompt_cache_min_tokens from its model's canonical vendor-native entry — the same models are behind the gateway, so the same behaviour applies. Twelve of the fourteen have such an entry; minimax-m3 and grok-4.6 have no vendor-native entry in the map (only fireworks_ai and azure_ai ones), so they are left alone rather than given another provider's claims. Cost fields, deprecation_date, provider_specific_entry and source are not copied: those are the canonical provider's, not ours. Context windows and output limits stay as they were, from the gateway's own catalogue. Verified by replaying the three assertions against both files: opus-5, 15 variants, none missing the flag, none with the wrong cache minimum; sonnet-5, 18 variants, none missing the flag. No Hubris entry matches the claude-fable-5 or claude-opus-4-8 filters. --- ...odel_prices_and_context_window_backup.json | 110 ++++++++++++++++-- model_prices_and_context_window.json | 110 ++++++++++++++++-- 2 files changed, 206 insertions(+), 14 deletions(-) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index e295d563dfc..9124b795fd0 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -59150,8 +59150,14 @@ "max_output_tokens": 64000, "max_tokens": 64000, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, + "supports_computer_use": true, "supports_function_calling": true, + "supports_native_structured_output": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, @@ -59163,12 +59169,25 @@ "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", + "prompt_cache_min_tokens": 512, "source": "https://hubris.pw/models", + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_mid_conversation_system": true, + "supports_native_structured_output": true, + "supports_output_config": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_sampling_params": false, + "supports_speed": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_xhigh_reasoning_effort": true }, "hubris/anthropic/claude-sonnet-5": { "litellm_provider": "hubris", @@ -59176,12 +59195,24 @@ "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", + "prompt_cache_min_tokens": 1024, "source": "https://hubris.pw/models", + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_mid_conversation_system": true, + "supports_native_structured_output": true, + "supports_output_config": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_sampling_params": false, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_xhigh_reasoning_effort": true }, "hubris/deepseek/deepseek-v4-flash": { "litellm_provider": "hubris", @@ -59190,9 +59221,14 @@ "max_tokens": 384000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -59203,9 +59239,14 @@ "max_tokens": 384000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -59215,12 +59256,23 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true }, "hubris/google/gemini-3.8-flash": { "litellm_provider": "hubris", @@ -59228,12 +59280,23 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true }, "hubris/minimax/minimax-m3": { "litellm_provider": "hubris", @@ -59259,6 +59322,7 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, + "supports_video_input": true, "supports_vision": true }, "hubris/openai/gpt-5.4-mini": { @@ -59269,10 +59333,19 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-5.6-luna": { "litellm_provider": "hubris", @@ -59282,10 +59355,20 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_cache_breakpoint": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-6-astra": { "litellm_provider": "hubris", @@ -59294,11 +59377,23 @@ "max_tokens": 128000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": false, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_cache_breakpoint": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/x-ai/grok-4.6": { "litellm_provider": "hubris", @@ -59321,6 +59416,7 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index e295d563dfc..9124b795fd0 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -59150,8 +59150,14 @@ "max_output_tokens": 64000, "max_tokens": 64000, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, + "supports_computer_use": true, "supports_function_calling": true, + "supports_native_structured_output": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, @@ -59163,12 +59169,25 @@ "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", + "prompt_cache_min_tokens": 512, "source": "https://hubris.pw/models", + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_mid_conversation_system": true, + "supports_native_structured_output": true, + "supports_output_config": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_sampling_params": false, + "supports_speed": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_xhigh_reasoning_effort": true }, "hubris/anthropic/claude-sonnet-5": { "litellm_provider": "hubris", @@ -59176,12 +59195,24 @@ "max_output_tokens": 128000, "max_tokens": 128000, "mode": "chat", + "prompt_cache_min_tokens": 1024, "source": "https://hubris.pw/models", + "supports_adaptive_thinking": true, + "supports_assistant_prefill": false, + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_mid_conversation_system": true, + "supports_native_structured_output": true, + "supports_output_config": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_sampling_params": false, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_xhigh_reasoning_effort": true }, "hubris/deepseek/deepseek-v4-flash": { "litellm_provider": "hubris", @@ -59190,9 +59221,14 @@ "max_tokens": 384000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -59203,9 +59239,14 @@ "max_tokens": 384000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_assistant_prefill": true, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, "supports_vision": false }, @@ -59215,12 +59256,23 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true }, "hubris/google/gemini-3.8-flash": { "litellm_provider": "hubris", @@ -59228,12 +59280,23 @@ "max_output_tokens": 65536, "max_tokens": 65536, "mode": "chat", + "prompt_cache_min_tokens": 4096, "source": "https://hubris.pw/models", + "supports_audio_input": true, + "supports_audio_output": false, "supports_function_calling": true, + "supports_native_streaming": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_url_context": true, + "supports_video_input": true, + "supports_vision": true, + "supports_web_search": true }, "hubris/minimax/minimax-m3": { "litellm_provider": "hubris", @@ -59259,6 +59322,7 @@ "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, + "supports_video_input": true, "supports_vision": true }, "hubris/openai/gpt-5.4-mini": { @@ -59269,10 +59333,19 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-5.6-luna": { "litellm_provider": "hubris", @@ -59282,10 +59355,20 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": true, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_cache_breakpoint": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-6-astra": { "litellm_provider": "hubris", @@ -59294,11 +59377,23 @@ "max_tokens": 128000, "mode": "chat", "source": "https://hubris.pw/models", + "supports_computer_use": true, "supports_function_calling": true, + "supports_max_reasoning_effort": true, + "supports_minimal_reasoning_effort": false, + "supports_native_streaming": true, + "supports_none_reasoning_effort": false, + "supports_parallel_function_calling": true, + "supports_pdf_input": true, + "supports_prompt_cache_breakpoint": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, + "supports_system_messages": true, "supports_tool_choice": true, - "supports_vision": true + "supports_vision": true, + "supports_web_search": true, + "supports_xhigh_reasoning_effort": true }, "hubris/x-ai/grok-4.6": { "litellm_provider": "hubris", @@ -59321,6 +59416,7 @@ "mode": "chat", "source": "https://hubris.pw/models", "supports_function_calling": true, + "supports_prompt_caching": true, "supports_reasoning": true, "supports_response_schema": true, "supports_tool_choice": true, From c77ac8622b95525602d874c2cea31e6bd8e343e2 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Tue, 8 Sep 2026 18:47:23 +0300 Subject: [PATCH 5/5] =?UTF-8?q?fix(hubris):=20price=20the=20models=20?= =?UTF-8?q?=E2=80=94=20unpriced=20entries=20defeat=20spend=20limits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The review is right and my earlier reasoning was wrong. I left cost fields off because Hubris bills in rubles at a rate that moves, so any USD figure would drift. What I failed to weigh is what zero costs actually do in this codebase: usage on these models records as no spend, so an authenticated user can call billable models without touching spend-based limits. A stale price is a much smaller problem than a limit that does not apply. The drift argument was weak anyway. Every entry in this file is a snapshot that ages between updates; Hubris is not special in that respect. The numbers are derived, not invented: they are the ruble prices this gateway publishes on its own open catalogue (GET https://api.hubris.pw/v1/models, no key required), converted at the Bank of Russia reference rate of 86.473 RUB/USD for 2026-09-09. Anyone can recompute them from those two public sources, and points at the catalogue page. Verified: both files parse, all 14 Hubris entries carry input and output costs, no other entry touched. --- ...odel_prices_and_context_window_backup.json | 28 +++++++++++++++++++ model_prices_and_context_window.json | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 9124b795fd0..301ad75c698 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -59145,6 +59145,8 @@ "supports_vision": true }, "hubris/anthropic/claude-haiku-4.5": { + "input_cost_per_token": 1.46138e-06, + "output_cost_per_token": 7.30644e-06, "litellm_provider": "hubris", "max_input_tokens": 200000, "max_output_tokens": 64000, @@ -59164,6 +59166,8 @@ "supports_vision": true }, "hubris/anthropic/claude-opus-5": { + "input_cost_per_token": 7.30644e-06, + "output_cost_per_token": 3.6532e-05, "litellm_provider": "hubris", "max_input_tokens": 1000000, "max_output_tokens": 128000, @@ -59190,6 +59194,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/anthropic/claude-sonnet-5": { + "input_cost_per_token": 2.92265e-06, + "output_cost_per_token": 1.46128e-05, "litellm_provider": "hubris", "max_input_tokens": 1000000, "max_output_tokens": 128000, @@ -59215,6 +59221,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/deepseek/deepseek-v4-flash": { + "input_cost_per_token": 1.2952e-07, + "output_cost_per_token": 2.5904e-07, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 384000, @@ -59233,6 +59241,8 @@ "supports_vision": false }, "hubris/deepseek/deepseek-v4-pro": { + "input_cost_per_token": 1.39593e-06, + "output_cost_per_token": 2.79185e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 384000, @@ -59251,6 +59261,8 @@ "supports_vision": false }, "hubris/google/gemini-3.7-flash": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 5.47986e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -59275,6 +59287,8 @@ "supports_web_search": true }, "hubris/google/gemini-3.8-flash": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 5.47986e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -59299,6 +59313,8 @@ "supports_web_search": true }, "hubris/minimax/minimax-m3": { + "input_cost_per_token": 4.38403e-07, + "output_cost_per_token": 1.75361e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 512000, @@ -59312,6 +59328,8 @@ "supports_vision": true }, "hubris/moonshotai/kimi-k3": { + "input_cost_per_token": 4.38391e-06, + "output_cost_per_token": 2.19192e-05, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 943718, @@ -59326,6 +59344,8 @@ "supports_vision": true }, "hubris/openai/gpt-5.4-mini": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 6.57581e-06, "litellm_provider": "hubris", "max_input_tokens": 400000, "max_output_tokens": 128000, @@ -59348,6 +59368,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-5.6-luna": { + "input_cost_per_token": 2.92346e-07, + "output_cost_per_token": 1.75361e-06, "litellm_provider": "hubris", "max_input_tokens": 1050000, "max_output_tokens": 128000, @@ -59371,6 +59393,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-6-astra": { + "input_cost_per_token": 1.46128e-05, + "output_cost_per_token": 7.30638e-05, "litellm_provider": "hubris", "max_input_tokens": 1050000, "max_output_tokens": 128000, @@ -59396,6 +59420,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/x-ai/grok-4.6": { + "input_cost_per_token": 2.92265e-06, + "output_cost_per_token": 8.76771e-06, "litellm_provider": "hubris", "max_input_tokens": 500000, "max_output_tokens": 450000, @@ -59409,6 +59435,8 @@ "supports_vision": true }, "hubris/z-ai/glm-5.3": { + "input_cost_per_token": 2.04584e-06, + "output_cost_per_token": 6.42964e-06, "litellm_provider": "hubris", "max_input_tokens": 1310720, "max_output_tokens": 943718, diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 9124b795fd0..301ad75c698 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -59145,6 +59145,8 @@ "supports_vision": true }, "hubris/anthropic/claude-haiku-4.5": { + "input_cost_per_token": 1.46138e-06, + "output_cost_per_token": 7.30644e-06, "litellm_provider": "hubris", "max_input_tokens": 200000, "max_output_tokens": 64000, @@ -59164,6 +59166,8 @@ "supports_vision": true }, "hubris/anthropic/claude-opus-5": { + "input_cost_per_token": 7.30644e-06, + "output_cost_per_token": 3.6532e-05, "litellm_provider": "hubris", "max_input_tokens": 1000000, "max_output_tokens": 128000, @@ -59190,6 +59194,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/anthropic/claude-sonnet-5": { + "input_cost_per_token": 2.92265e-06, + "output_cost_per_token": 1.46128e-05, "litellm_provider": "hubris", "max_input_tokens": 1000000, "max_output_tokens": 128000, @@ -59215,6 +59221,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/deepseek/deepseek-v4-flash": { + "input_cost_per_token": 1.2952e-07, + "output_cost_per_token": 2.5904e-07, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 384000, @@ -59233,6 +59241,8 @@ "supports_vision": false }, "hubris/deepseek/deepseek-v4-pro": { + "input_cost_per_token": 1.39593e-06, + "output_cost_per_token": 2.79185e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 384000, @@ -59251,6 +59261,8 @@ "supports_vision": false }, "hubris/google/gemini-3.7-flash": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 5.47986e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -59275,6 +59287,8 @@ "supports_web_search": true }, "hubris/google/gemini-3.8-flash": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 5.47986e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 65536, @@ -59299,6 +59313,8 @@ "supports_web_search": true }, "hubris/minimax/minimax-m3": { + "input_cost_per_token": 4.38403e-07, + "output_cost_per_token": 1.75361e-06, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 512000, @@ -59312,6 +59328,8 @@ "supports_vision": true }, "hubris/moonshotai/kimi-k3": { + "input_cost_per_token": 4.38391e-06, + "output_cost_per_token": 2.19192e-05, "litellm_provider": "hubris", "max_input_tokens": 1048576, "max_output_tokens": 943718, @@ -59326,6 +59344,8 @@ "supports_vision": true }, "hubris/openai/gpt-5.4-mini": { + "input_cost_per_token": 1.09607e-06, + "output_cost_per_token": 6.57581e-06, "litellm_provider": "hubris", "max_input_tokens": 400000, "max_output_tokens": 128000, @@ -59348,6 +59368,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-5.6-luna": { + "input_cost_per_token": 2.92346e-07, + "output_cost_per_token": 1.75361e-06, "litellm_provider": "hubris", "max_input_tokens": 1050000, "max_output_tokens": 128000, @@ -59371,6 +59393,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/openai/gpt-6-astra": { + "input_cost_per_token": 1.46128e-05, + "output_cost_per_token": 7.30638e-05, "litellm_provider": "hubris", "max_input_tokens": 1050000, "max_output_tokens": 128000, @@ -59396,6 +59420,8 @@ "supports_xhigh_reasoning_effort": true }, "hubris/x-ai/grok-4.6": { + "input_cost_per_token": 2.92265e-06, + "output_cost_per_token": 8.76771e-06, "litellm_provider": "hubris", "max_input_tokens": 500000, "max_output_tokens": 450000, @@ -59409,6 +59435,8 @@ "supports_vision": true }, "hubris/z-ai/glm-5.3": { + "input_cost_per_token": 2.04584e-06, + "output_cost_per_token": 6.42964e-06, "litellm_provider": "hubris", "max_input_tokens": 1310720, "max_output_tokens": 943718,