From be6a88defec582eecb965dc34655e3d1c423b13a Mon Sep 17 00:00:00 2001 From: Romulus Hill Date: Thu, 30 Jul 2026 09:22:02 +0000 Subject: [PATCH 1/5] feat: add scalattice openai-compatible provider Register Scalattice in the openai_like providers registry and document endpoint coverage for chat completions. --- litellm/llms/openai_like/providers.json | 44 +++++++++++++++++++++---- provider_endpoints_support.json | 17 ++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index a458a209ea9..e6215b3b33a 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -15,6 +15,14 @@ "base_url": "https://ai-gateway.helicone.ai/", "api_key_env": "HELICONE_API_KEY" }, + "scalattice": { + "base_url": "https://api.scalattice.cloud/v1", + "api_key_env": "SCALATTICE_API_KEY", + "api_base_env": "SCALATTICE_API_BASE", + "supported_endpoints": [ + "/v1/chat/completions" + ] + }, "veniceai": { "base_url": "https://api.venice.ai/api/v1", "api_key_env": "VENICE_AI_API_KEY" @@ -130,7 +138,10 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] }, "tensormesh": { "base_url": "https://serverless.tensormesh.ai/v1", @@ -140,13 +151,19 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] }, "parasail": { "base_url": "https://api.parasail.io/v1", "api_key_env": "PARASAIL_API_KEY", "api_base_env": "PARASAIL_API_BASE", - "supported_endpoints": ["/v1/chat/completions", "/v1/responses"], + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ], "special_handling": { "force_store_false": true } @@ -166,14 +183,21 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses" + ] }, "meta": { "base_url": "https://api.meta.ai/v1", "api_key_env": "META_API_KEY", "api_base_env": "META_API_BASE", "base_class": "openai_gpt", - "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/messages"] + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/messages" + ] }, "cognition": { "base_url": "https://api.cognition.ai/v1", @@ -187,7 +211,11 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/embeddings"] + "supported_endpoints": [ + "/v1/chat/completions", + "/v1/responses", + "/v1/embeddings" + ] }, "scx-ai": { "base_url": "https://api.scx.ai/v1", @@ -199,6 +227,8 @@ "constraints": { "temperature_max": 1.99 }, - "supported_endpoints": ["/v1/chat/completions"] + "supported_endpoints": [ + "/v1/chat/completions" + ] } } diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index 1d8d374c2c4..3cc8ab017b0 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -2243,6 +2243,23 @@ "interactions": true } }, + "scalattice": { + "display_name": "Scalattice (`scalattice`)", + "url": "https://docs.litellm.ai/docs/providers/scalattice", + "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 + } + }, "scaleway": { "display_name": "Scaleway (`scaleway`)", "url": "https://docs.litellm.ai/docs/providers/scaleway", From ec6bd1e4c6081c6fb8ae02c338f77caac71ccf28 Mon Sep 17 00:00:00 2001 From: Romulus Hill Date: Thu, 30 Jul 2026 09:26:40 +0000 Subject: [PATCH 2/5] chore: re-trigger CI against litellm_internal_staging From e3e9ea66376263572ae8d2c12f42e76c91368835 Mon Sep 17 00:00:00 2001 From: Romulus Hill Date: Thu, 30 Jul 2026 11:13:30 +0000 Subject: [PATCH 3/5] feat: add Scalattice logo, UI provider, and model pricing Register Scalattice in the dashboard provider map with the brand mark, and publish catalog model costs so spend tracking and docs pricing stay aligned. --- ...odel_prices_and_context_window_backup.json | 84 +++++++++++++++++++ .../out/assets/logos/scalattice.svg | 4 + model_prices_and_context_window.json | 84 +++++++++++++++++++ .../public/assets/logos/scalattice.svg | 4 + .../src/components/provider_info_helpers.tsx | 16 ++++ 5 files changed, 192 insertions(+) create mode 100644 litellm/proxy/_experimental/out/assets/logos/scalattice.svg create mode 100644 ui/litellm-dashboard/public/assets/logos/scalattice.svg diff --git a/litellm/model_prices_and_context_window_backup.json b/litellm/model_prices_and_context_window_backup.json index 3af7d9e5019..a83f924d373 100644 --- a/litellm/model_prices_and_context_window_backup.json +++ b/litellm/model_prices_and_context_window_backup.json @@ -50691,5 +50691,89 @@ "supports_response_schema": true, "supports_tool_choice": true, "supports_vision": true + }, + "scalattice/qwen-3-8b": { + "input_cost_per_token": 1e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/deepseek-r1-7b": { + "input_cost_per_token": 1.2e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 65536, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.6e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-2.5-coder-7b": { + "input_cost_per_token": 1.1e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 32768, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.3e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-3-14b": { + "input_cost_per_token": 1.2999999999999998e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.9e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/gemma-3-27b": { + "input_cost_per_token": 1.5e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 131072, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 4.499999999999999e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-3-32b": { + "input_cost_per_token": 1.6999999999999998e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 5.1e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/llama-3.3-70b": { + "input_cost_per_token": 2e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 131072, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 6e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true } } diff --git a/litellm/proxy/_experimental/out/assets/logos/scalattice.svg b/litellm/proxy/_experimental/out/assets/logos/scalattice.svg new file mode 100644 index 00000000000..959e99b251a --- /dev/null +++ b/litellm/proxy/_experimental/out/assets/logos/scalattice.svg @@ -0,0 +1,4 @@ + +Scalattice + + diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 3af7d9e5019..b6aea34530a 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -45963,6 +45963,90 @@ "supports_tool_choice": true, "supports_vision": true }, + "scalattice/qwen-3-8b": { + "input_cost_per_token": 1e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/deepseek-r1-7b": { + "input_cost_per_token": 1.2e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 65536, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.6e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-2.5-coder-7b": { + "input_cost_per_token": 1.1e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 32768, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.3e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-3-14b": { + "input_cost_per_token": 1.2999999999999998e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 3.9e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/gemma-3-27b": { + "input_cost_per_token": 1.5e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 131072, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 4.499999999999999e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/qwen-3-32b": { + "input_cost_per_token": 1.6999999999999998e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 40960, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 5.1e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, + "scalattice/llama-3.3-70b": { + "input_cost_per_token": 2e-06, + "litellm_provider": "scalattice", + "max_input_tokens": 131072, + "max_output_tokens": 2048, + "max_tokens": 2048, + "mode": "chat", + "output_cost_per_token": 6e-06, + "supports_function_calling": true, + "supports_system_messages": true, + "supports_tool_choice": true + }, "scaleway/qwen/qwen3.5-397b-a17b": { "input_cost_per_token": 6e-07, "litellm_provider": "scaleway", diff --git a/ui/litellm-dashboard/public/assets/logos/scalattice.svg b/ui/litellm-dashboard/public/assets/logos/scalattice.svg new file mode 100644 index 00000000000..959e99b251a --- /dev/null +++ b/ui/litellm-dashboard/public/assets/logos/scalattice.svg @@ -0,0 +1,4 @@ + +Scalattice + + diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx index c97bb8ede3d..6e7550c549b 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -50,7 +50,11 @@ import replicateLogo from "../../public/assets/logos/replicate.svg"; import runwayLogo from "../../public/assets/logos/runway.png"; import sambanovaLogo from "../../public/assets/logos/sambanova.svg"; import sapLogo from "../../public/assets/logos/sap.png"; +<<<<<<< HEAD import scxAiLogo from "../../public/assets/logos/scx_ai.svg"; +======= +import scalatticeLogo from "../../public/assets/logos/scalattice.svg"; +>>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) import snowflakeLogo from "../../public/assets/logos/snowflake.svg"; import sonioxLogo from "../../public/assets/logos/soniox.svg"; import togetheraiLogo from "../../public/assets/logos/togetherai.svg"; @@ -154,7 +158,11 @@ export enum Providers { SAGEMAKER_LEGACY = "Sagemaker", Sambanova = "Sambanova", SAP = "SAP Generative AI Hub", +<<<<<<< HEAD SCX_AI = "SCX.ai", +======= + SCALATTICE = "Scalattice", +>>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) Snowflake = "Snowflake", Soniox = "Soniox", TEXT_COMPLETION_CODESTRAL = "Text-Completion-Codestral", @@ -266,7 +274,11 @@ export const provider_map: Record = { SageMaker: "sagemaker_chat", Sambanova: "sambanova", SAP: "sap", +<<<<<<< HEAD SCX_AI: "scx-ai", +======= + SCALATTICE: "scalattice", +>>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) Snowflake: "snowflake", Soniox: "soniox", TEXT_COMPLETION_CODESTRAL: "text-completion-codestral", @@ -359,7 +371,11 @@ export const providerLogoMap: Partial> = { [Providers.SAGEMAKER_LEGACY]: bedrockLogo.src, [Providers.Sambanova]: sambanovaLogo.src, [Providers.SAP]: sapLogo.src, +<<<<<<< HEAD [Providers.SCX_AI]: scxAiLogo.src, +======= + [Providers.SCALATTICE]: scalatticeLogo.src, +>>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) [Providers.Snowflake]: snowflakeLogo.src, [Providers.Soniox]: sonioxLogo.src, [Providers.TEXT_COMPLETION_CODESTRAL]: mistralLogo.src, From 15b65c483fc4f6539c1ccd5f39289449c33e4abc Mon Sep 17 00:00:00 2001 From: Romulus Hill Date: Mon, 24 Aug 2026 05:41:44 +0000 Subject: [PATCH 4/5] fix: keep Scalattice dashboard provider alongside SCX.ai after rebase Resolve leftover conflict markers from the staging rebase and restore providers.json formatting so the PR only adds Scalattice. --- litellm/llms/openai_like/providers.json | 40 ++++--------------- .../src/components/provider_info_helpers.tsx | 20 ++-------- 2 files changed, 12 insertions(+), 48 deletions(-) diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index e6215b3b33a..609383fec60 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -19,9 +19,7 @@ "base_url": "https://api.scalattice.cloud/v1", "api_key_env": "SCALATTICE_API_KEY", "api_base_env": "SCALATTICE_API_BASE", - "supported_endpoints": [ - "/v1/chat/completions" - ] + "supported_endpoints": ["/v1/chat/completions"] }, "veniceai": { "base_url": "https://api.venice.ai/api/v1", @@ -138,10 +136,7 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses" - ] + "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] }, "tensormesh": { "base_url": "https://serverless.tensormesh.ai/v1", @@ -151,19 +146,13 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses" - ] + "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] }, "parasail": { "base_url": "https://api.parasail.io/v1", "api_key_env": "PARASAIL_API_KEY", "api_base_env": "PARASAIL_API_BASE", - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses" - ], + "supported_endpoints": ["/v1/chat/completions", "/v1/responses"], "special_handling": { "force_store_false": true } @@ -183,21 +172,14 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses" - ] + "supported_endpoints": ["/v1/chat/completions", "/v1/responses"] }, "meta": { "base_url": "https://api.meta.ai/v1", "api_key_env": "META_API_KEY", "api_base_env": "META_API_BASE", "base_class": "openai_gpt", - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses", - "/v1/messages" - ] + "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/messages"] }, "cognition": { "base_url": "https://api.cognition.ai/v1", @@ -211,11 +193,7 @@ "param_mappings": { "max_completion_tokens": "max_tokens" }, - "supported_endpoints": [ - "/v1/chat/completions", - "/v1/responses", - "/v1/embeddings" - ] + "supported_endpoints": ["/v1/chat/completions", "/v1/responses", "/v1/embeddings"] }, "scx-ai": { "base_url": "https://api.scx.ai/v1", @@ -227,8 +205,6 @@ "constraints": { "temperature_max": 1.99 }, - "supported_endpoints": [ - "/v1/chat/completions" - ] + "supported_endpoints": ["/v1/chat/completions"] } } diff --git a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx index 6e7550c549b..df260b07208 100644 --- a/ui/litellm-dashboard/src/components/provider_info_helpers.tsx +++ b/ui/litellm-dashboard/src/components/provider_info_helpers.tsx @@ -50,11 +50,8 @@ import replicateLogo from "../../public/assets/logos/replicate.svg"; import runwayLogo from "../../public/assets/logos/runway.png"; import sambanovaLogo from "../../public/assets/logos/sambanova.svg"; import sapLogo from "../../public/assets/logos/sap.png"; -<<<<<<< HEAD -import scxAiLogo from "../../public/assets/logos/scx_ai.svg"; -======= import scalatticeLogo from "../../public/assets/logos/scalattice.svg"; ->>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) +import scxAiLogo from "../../public/assets/logos/scx_ai.svg"; import snowflakeLogo from "../../public/assets/logos/snowflake.svg"; import sonioxLogo from "../../public/assets/logos/soniox.svg"; import togetheraiLogo from "../../public/assets/logos/togetherai.svg"; @@ -158,11 +155,8 @@ export enum Providers { SAGEMAKER_LEGACY = "Sagemaker", Sambanova = "Sambanova", SAP = "SAP Generative AI Hub", -<<<<<<< HEAD - SCX_AI = "SCX.ai", -======= SCALATTICE = "Scalattice", ->>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) + SCX_AI = "SCX.ai", Snowflake = "Snowflake", Soniox = "Soniox", TEXT_COMPLETION_CODESTRAL = "Text-Completion-Codestral", @@ -274,11 +268,8 @@ export const provider_map: Record = { SageMaker: "sagemaker_chat", Sambanova: "sambanova", SAP: "sap", -<<<<<<< HEAD - SCX_AI: "scx-ai", -======= SCALATTICE: "scalattice", ->>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) + SCX_AI: "scx-ai", Snowflake: "snowflake", Soniox: "soniox", TEXT_COMPLETION_CODESTRAL: "text-completion-codestral", @@ -371,11 +362,8 @@ export const providerLogoMap: Partial> = { [Providers.SAGEMAKER_LEGACY]: bedrockLogo.src, [Providers.Sambanova]: sambanovaLogo.src, [Providers.SAP]: sapLogo.src, -<<<<<<< HEAD - [Providers.SCX_AI]: scxAiLogo.src, -======= [Providers.SCALATTICE]: scalatticeLogo.src, ->>>>>>> fff29afb9b (feat: add Scalattice logo, UI provider, and model pricing) + [Providers.SCX_AI]: scxAiLogo.src, [Providers.Snowflake]: snowflakeLogo.src, [Providers.Soniox]: sonioxLogo.src, [Providers.TEXT_COMPLETION_CODESTRAL]: mistralLogo.src, From a3285d396de0369e6c7921cc110ecf770f48a9a1 Mon Sep 17 00:00:00 2001 From: Romulus Hill Date: Mon, 24 Aug 2026 06:03:07 +0000 Subject: [PATCH 5/5] ci: raise three unit shards to 60m job timeout Unblock check_workflow_startup_safety: caching-local, proxy-extras, and enterprise-package had pytest budgets that the 55m job cap would preempt. --- .github/workflows/test-unit.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index a7c67f2b35d..2dfca3d308f 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -211,7 +211,7 @@ jobs: workers: 2 reruns: 2 timeout-minutes: 20 - job-timeout-minutes: 55 + job-timeout-minutes: 60 - shard: proxy-extras artifact-name: proxy-extras @@ -219,7 +219,7 @@ jobs: workers: 2 reruns: 2 timeout-minutes: 20 - job-timeout-minutes: 55 + job-timeout-minutes: 60 - shard: enterprise-package artifact-name: enterprise-package @@ -227,7 +227,7 @@ jobs: workers: 4 reruns: 2 timeout-minutes: 20 - job-timeout-minutes: 55 + job-timeout-minutes: 60 - shard: responses-caching-types artifact-name: responses-caching-types