From 6c948f1de7354e0ed0cc701842bb34cc91276b03 Mon Sep 17 00:00:00 2001 From: jacko06v Date: Tue, 9 Jun 2026 10:34:52 +0200 Subject: [PATCH] Add UOMI provider support --- litellm/constants.py | 3 + .../get_llm_provider_logic.py | 3 + litellm/llms/openai_like/providers.json | 8 + ...odel_prices_and_context_window_backup.json | 275 +++++++++++++++++- .../provider_endpoints_support_backup.json | 17 ++ litellm/types/utils.py | 1 + model_prices_and_context_window.json | 273 +++++++++++++++++ provider_endpoints_support.json | 17 ++ tests/test_litellm/llms/uomi/test_uomi.py | 106 +++++++ 9 files changed, 702 insertions(+), 1 deletion(-) create mode 100644 tests/test_litellm/llms/uomi/test_uomi.py diff --git a/litellm/constants.py b/litellm/constants.py index f10cec034f0..1d5d6c3841a 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -789,6 +789,7 @@ openai_compatible_endpoints: List = [ "https://ai-gateway.vercel.sh/v1", "https://api.inference.wandb.ai/v1", "https://api.clarifai.com/v2/ext/openai/v1", + "https://gateway.uomi.ai/v1", ] @@ -832,6 +833,7 @@ openai_compatible_providers: List = [ "poe", # Poe - JSON-configured provider "chutes", # Chutes - JSON-configured provider "parasail", # Parasail - JSON-configured provider + "uomi", # UOMI - JSON-configured provider "featherless_ai", "nscale", "nebius", @@ -873,6 +875,7 @@ openai_text_completion_compatible_providers: List = ( "lambda_ai", "hyperbolic", "wandb", + "uomi", ] ) _openai_like_providers: List = [ diff --git a/litellm/litellm_core_utils/get_llm_provider_logic.py b/litellm/litellm_core_utils/get_llm_provider_logic.py index de65ed93312..19c1bc6815b 100644 --- a/litellm/litellm_core_utils/get_llm_provider_logic.py +++ b/litellm/litellm_core_utils/get_llm_provider_logic.py @@ -385,6 +385,9 @@ def get_llm_provider( # noqa: PLR0915 elif endpoint == "https://api.inference.wandb.ai/v1": custom_llm_provider = "wandb" dynamic_api_key = get_secret_str("WANDB_API_KEY") + elif endpoint == "https://gateway.uomi.ai/v1": + custom_llm_provider = "uomi" + dynamic_api_key = get_secret_str("UOMI_API_KEY") if api_base is not None and not isinstance(api_base, str): raise Exception( diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index 13d22488838..41ca4457146 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -141,5 +141,13 @@ "special_handling": { "force_store_false": true } + }, + "uomi": { + "base_url": "https://gateway.uomi.ai/v1", + "api_key_env": "UOMI_API_KEY", + "api_base_env": "UOMI_API_BASE", + "param_mappings": { + "max_completion_tokens": "max_tokens" + } } } diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 282a292ab17..2e64799bd3b 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -29661,6 +29661,279 @@ "supports_tool_choice": true, "supports_reasoning": true }, + "uomi/deepseek/deepseek-chat-v3-0324": { + "input_cost_per_token": 2.69325e-7, + "litellm_provider": "uomi", + "max_input_tokens": 163840, + "max_output_tokens": 8192, + "max_tokens": 163840, + "mode": "chat", + "output_cost_per_token": 0.00000108675, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v3.2": { + "input_cost_per_token": 2.772e-7, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.2588e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v4-flash": { + "input_cost_per_token": 7.864e-8, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 1.5728e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v4-pro": { + "input_cost_per_token": 0.000001535187, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 0.0000030625, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/google/gemma-4-26b-a4b-it": { + "input_cost_per_token": 9.975e-8, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 3.885e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/google/gemma-4-31B-it": { + "input_cost_per_token": 1.435e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4.13e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/minimax/minimax-m2.5": { + "input_cost_per_token": 2.93563e-7, + "litellm_provider": "uomi", + "max_input_tokens": 204800, + "max_output_tokens": 8192, + "max_tokens": 204800, + "mode": "chat", + "output_cost_per_token": 0.0000013195, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/minimax/minimax-m2.7": { + "input_cost_per_token": 3.9375e-7, + "litellm_provider": "uomi", + "max_input_tokens": 204800, + "max_output_tokens": 8192, + "max_tokens": 204800, + "mode": "chat", + "output_cost_per_token": 0.000001575, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/mistralai/mistral-nemo": { + "input_cost_per_token": 2.8e-8, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 8.4e-8, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/nvidia/nemotron-3-super-120b-a12b": { + "input_cost_per_token": 9.45e-8, + "litellm_provider": "uomi", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 1000000, + "mode": "chat", + "output_cost_per_token": 4.725e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/openai/gpt-oss-120b": { + "input_cost_per_token": 5.25e-8, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.725e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3-235b-a22b-2507": { + "input_cost_per_token": 1.365e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 6.195e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.5-397b-a17b": { + "input_cost_per_token": 5.355e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.000003507, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.6-27b": { + "input_cost_per_token": 2.3120000000000003e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.00000192, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.6-35b-a3b": { + "input_cost_per_token": 1.1200000000000002e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 8e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/xiaomi/mimo-v2-flash": { + "input_cost_per_token": 1.05e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 3.15e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/xiaomi/mimo-v2.5": { + "input_cost_per_token": 1.47e-7, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 2.94e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-4.5-air": { + "input_cost_per_token": 1.6275e-7, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 9.835e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-4.7": { + "input_cost_per_token": 5.145e-7, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000002134125, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-5": { + "input_cost_per_token": 9.38437e-7, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000002888812, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-5.1": { + "input_cost_per_token": 0.000001379318, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000004373727, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, "qwen.qwen3-coder-480b-a35b-v1:0": { "input_cost_per_token": 2.2e-07, "litellm_provider": "bedrock_converse", @@ -41691,4 +41964,4 @@ ], "supports_audio_input": true } -} \ No newline at end of file +} diff --git a/litellm/provider_endpoints_support_backup.json b/litellm/provider_endpoints_support_backup.json index e0eeb014c51..2a07ad4d28f 100644 --- a/litellm/provider_endpoints_support_backup.json +++ b/litellm/provider_endpoints_support_backup.json @@ -1818,6 +1818,23 @@ "interactions": true } }, + "uomi": { + "display_name": "UOMI (`uomi`)", + "url": "https://docs.litellm.ai/docs/providers/uomi", + "endpoints": { + "chat_completions": true, + "messages": false, + "responses": false, + "embeddings": false, + "image_generations": false, + "audio_transcriptions": false, + "audio_speech": false, + "moderations": false, + "batches": false, + "rerank": false, + "a2a": false + } + }, "predibase": { "display_name": "Predibase (`predibase`)", "url": "https://docs.litellm.ai/docs/providers/predibase", diff --git a/litellm/types/utils.py b/litellm/types/utils.py index c3ea605dd9e..4125c2a471f 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -3401,6 +3401,7 @@ class LlmProviders(str, Enum): CHUTES = "chutes" NEOSANTARA = "neosantara" PARASAIL = "parasail" + UOMI = "uomi" XIAOMI_MIMO = "xiaomi_mimo" TENSORMESH = "tensormesh" LITELLM_AGENT = "litellm_agent" diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index b0ffc66d03b..4e9c69fab8a 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -29661,6 +29661,279 @@ "supports_tool_choice": true, "supports_reasoning": true }, + "uomi/deepseek/deepseek-chat-v3-0324": { + "input_cost_per_token": 2.69325e-7, + "litellm_provider": "uomi", + "max_input_tokens": 163840, + "max_output_tokens": 8192, + "max_tokens": 163840, + "mode": "chat", + "output_cost_per_token": 0.00000108675, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v3.2": { + "input_cost_per_token": 2.772e-7, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.2588e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v4-flash": { + "input_cost_per_token": 7.864e-8, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 1.5728e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/deepseek/deepseek-v4-pro": { + "input_cost_per_token": 0.000001535187, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 0.0000030625, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/google/gemma-4-26b-a4b-it": { + "input_cost_per_token": 9.975e-8, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 3.885e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/google/gemma-4-31B-it": { + "input_cost_per_token": 1.435e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4.13e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/minimax/minimax-m2.5": { + "input_cost_per_token": 2.93563e-7, + "litellm_provider": "uomi", + "max_input_tokens": 204800, + "max_output_tokens": 8192, + "max_tokens": 204800, + "mode": "chat", + "output_cost_per_token": 0.0000013195, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/minimax/minimax-m2.7": { + "input_cost_per_token": 3.9375e-7, + "litellm_provider": "uomi", + "max_input_tokens": 204800, + "max_output_tokens": 8192, + "max_tokens": 204800, + "mode": "chat", + "output_cost_per_token": 0.000001575, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/mistralai/mistral-nemo": { + "input_cost_per_token": 2.8e-8, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 8.4e-8, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/nvidia/nemotron-3-super-120b-a12b": { + "input_cost_per_token": 9.45e-8, + "litellm_provider": "uomi", + "max_input_tokens": 1000000, + "max_output_tokens": 8192, + "max_tokens": 1000000, + "mode": "chat", + "output_cost_per_token": 4.725e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/openai/gpt-oss-120b": { + "input_cost_per_token": 5.25e-8, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 4.725e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3-235b-a22b-2507": { + "input_cost_per_token": 1.365e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 6.195e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.5-397b-a17b": { + "input_cost_per_token": 5.355e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.000003507, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.6-27b": { + "input_cost_per_token": 2.3120000000000003e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 0.00000192, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/qwen/qwen3.6-35b-a3b": { + "input_cost_per_token": 1.1200000000000002e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 8e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/xiaomi/mimo-v2-flash": { + "input_cost_per_token": 1.05e-7, + "litellm_provider": "uomi", + "max_input_tokens": 262144, + "max_output_tokens": 8192, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 3.15e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/xiaomi/mimo-v2.5": { + "input_cost_per_token": 1.47e-7, + "litellm_provider": "uomi", + "max_input_tokens": 1048576, + "max_output_tokens": 8192, + "max_tokens": 1048576, + "mode": "chat", + "output_cost_per_token": 2.94e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-4.5-air": { + "input_cost_per_token": 1.6275e-7, + "litellm_provider": "uomi", + "max_input_tokens": 131072, + "max_output_tokens": 8192, + "max_tokens": 131072, + "mode": "chat", + "output_cost_per_token": 9.835e-7, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-4.7": { + "input_cost_per_token": 5.145e-7, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000002134125, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-5": { + "input_cost_per_token": 9.38437e-7, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000002888812, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, + "uomi/z-ai/glm-5.1": { + "input_cost_per_token": 0.000001379318, + "litellm_provider": "uomi", + "max_input_tokens": 202752, + "max_output_tokens": 8192, + "max_tokens": 202752, + "mode": "chat", + "output_cost_per_token": 0.000004373727, + "source": "https://gateway.uomi.ai/v1/models", + "supports_function_calling": false, + "supports_system_messages": true, + "supports_tool_choice": false + }, "qwen.qwen3-coder-480b-a35b-v1:0": { "input_cost_per_token": 2.2e-07, "litellm_provider": "bedrock_converse", diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index 6caab585ac9..0b7d0f3847c 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -1922,6 +1922,23 @@ "interactions": true } }, + "uomi": { + "display_name": "UOMI (`uomi`)", + "url": "https://docs.litellm.ai/docs/providers/uomi", + "endpoints": { + "chat_completions": true, + "messages": false, + "responses": false, + "embeddings": false, + "image_generations": false, + "audio_transcriptions": false, + "audio_speech": false, + "moderations": false, + "batches": false, + "rerank": false, + "a2a": false + } + }, "predibase": { "display_name": "Predibase (`predibase`)", "url": "https://docs.litellm.ai/docs/providers/predibase", diff --git a/tests/test_litellm/llms/uomi/test_uomi.py b/tests/test_litellm/llms/uomi/test_uomi.py new file mode 100644 index 00000000000..f06cc2c206a --- /dev/null +++ b/tests/test_litellm/llms/uomi/test_uomi.py @@ -0,0 +1,106 @@ +import json +import os +from pathlib import Path +from unittest.mock import patch + +UOMI_API_BASE = "https://gateway.uomi.ai/v1" +UOMI_MODEL = "deepseek/deepseek-v4-flash" + + +def test_uomi_json_registry(): + import litellm + from litellm.llms.openai_like.json_loader import JSONProviderRegistry + + assert litellm.LlmProviders.UOMI.value == "uomi" + assert litellm.LlmProviders("uomi") == litellm.LlmProviders.UOMI + assert JSONProviderRegistry.exists("uomi") + + config = JSONProviderRegistry.get("uomi") + assert config is not None + assert config.base_url == UOMI_API_BASE + assert config.api_key_env == "UOMI_API_KEY" + assert config.api_base_env == "UOMI_API_BASE" + assert config.param_mappings.get("max_completion_tokens") == "max_tokens" + + +def test_uomi_listed_in_openai_compatible_providers(): + from litellm.constants import ( + openai_compatible_providers, + openai_text_completion_compatible_providers, + ) + + assert "uomi" in openai_compatible_providers + assert "uomi" in openai_text_completion_compatible_providers + + +def test_uomi_dynamic_config_env_vars(): + from litellm.llms.openai_like.dynamic_config import create_config_class + from litellm.llms.openai_like.json_loader import JSONProviderRegistry + + config = create_config_class(JSONProviderRegistry.get("uomi"))() + + with patch.dict( + os.environ, + { + "UOMI_API_KEY": "test-key", + "UOMI_API_BASE": "https://custom.uomi.test/v1", + }, + ): + api_base, api_key = config._get_openai_compatible_provider_info(None, None) + + assert api_base == "https://custom.uomi.test/v1" + assert api_key == "test-key" + + +def test_uomi_provider_detection_by_prefix(): + from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider + + model, provider, _, api_base = get_llm_provider(f"uomi/{UOMI_MODEL}") + + assert model == UOMI_MODEL + assert provider == "uomi" + assert api_base == UOMI_API_BASE + + +def test_uomi_provider_detection_by_api_base(): + from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider + + model, provider, _, api_base = get_llm_provider( + model="custom-uomi-model", + api_base=UOMI_API_BASE, + ) + + assert model == "custom-uomi-model" + assert provider == "uomi" + assert api_base == UOMI_API_BASE + + +def test_uomi_chat_complete_url(): + from litellm.llms.openai_like.dynamic_config import create_config_class + from litellm.llms.openai_like.json_loader import JSONProviderRegistry + + config = create_config_class(JSONProviderRegistry.get("uomi"))() + + assert ( + config.get_complete_url( + api_base=None, + api_key=None, + model=UOMI_MODEL, + optional_params={}, + litellm_params={}, + ) + == f"{UOMI_API_BASE}/chat/completions" + ) + + +def test_uomi_model_info_contains_catalog_pricing(): + repo_root = Path(__file__).parents[4] + model_prices_path = repo_root / "model_prices_and_context_window.json" + model_prices = json.loads(model_prices_path.read_text()) + model_info = model_prices[f"uomi/{UOMI_MODEL}"] + + assert model_info["litellm_provider"] == "uomi" + assert model_info["max_input_tokens"] == 1048576 + assert model_info["max_output_tokens"] == 8192 + assert model_info["input_cost_per_token"] == 7.864e-8 + assert model_info["output_cost_per_token"] == 1.5728e-7