This commit is contained in:
Doedja 2026-08-27 17:30:25 -05:00 committed by GitHub
commit 06bbaf36f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 107 additions and 0 deletions

View file

@ -132,6 +132,12 @@
},
"supported_endpoints": ["/v1/chat/completions", "/v1/responses"]
},
"kenari": {
"base_url": "https://kenari.id/v1",
"api_key_env": "KENARI_API_KEY",
"api_base_env": "KENARI_API_BASE",
"supported_endpoints": ["/v1/chat/completions"]
},
"tensormesh": {
"base_url": "https://serverless.tensormesh.ai/v1",
"api_key_env": "TENSORMESH_INFERENCE_API_KEY",

View file

@ -1269,6 +1269,23 @@
"rerank": false
}
},
"kenari": {
"display_name": "Kenari (`kenari`)",
"url": "https://docs.litellm.ai/docs/providers/kenari",
"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
}
},
"lambda_ai": {
"display_name": "Lambda AI (`lambda_ai`)",
"url": "https://docs.litellm.ai/docs/providers/lambda_ai",

View file

@ -3827,6 +3827,7 @@ class LlmProviders(str, Enum):
POE = "poe"
CHUTES = "chutes"
NEOSANTARA = "neosantara"
KENARI = "kenari"
PARASAIL = "parasail"
XIAOMI_MIMO = "xiaomi_mimo"
TENSORMESH = "tensormesh"

View file

@ -1384,6 +1384,23 @@
"rerank": false
}
},
"kenari": {
"display_name": "Kenari (`kenari`)",
"url": "https://docs.litellm.ai/docs/providers/kenari",
"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
}
},
"lambda_ai": {
"display_name": "Lambda AI (`lambda_ai`)",
"url": "https://docs.litellm.ai/docs/providers/lambda_ai",

View file

@ -0,0 +1,66 @@
import os
from unittest.mock import patch
KENARI_API_BASE = "https://kenari.id/v1"
def test_kenari_json_registry():
import litellm
from litellm.llms.openai_like.json_loader import JSONProviderRegistry
assert litellm.LlmProviders.KENARI.value == "kenari"
assert litellm.LlmProviders("kenari") == litellm.LlmProviders.KENARI
assert JSONProviderRegistry.exists("kenari")
config = JSONProviderRegistry.get("kenari")
assert config is not None
assert config.base_url == KENARI_API_BASE
assert config.api_key_env == "KENARI_API_KEY"
assert config.api_base_env == "KENARI_API_BASE"
assert config.supported_endpoints == ["/v1/chat/completions"]
def test_kenari_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("kenari"))()
with patch.dict(
os.environ,
{
"KENARI_API_KEY": "test-key",
"KENARI_API_BASE": "https://custom.kenari.example/v1",
},
):
api_base, api_key = config._get_openai_compatible_provider_info(None, None)
assert api_base == "https://custom.kenari.example/v1"
assert api_key == "test-key"
def test_kenari_provider_detection_by_prefix():
from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider
model, provider, _, api_base = get_llm_provider("kenari/deepseek-v4-pro")
assert model == "deepseek-v4-pro"
assert provider == "kenari"
assert api_base == KENARI_API_BASE
def test_kenari_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("kenari"))()
assert (
config.get_complete_url(
api_base=None,
api_key=None,
model="deepseek-v4-pro",
optional_params={},
litellm_params={},
)
== "https://kenari.id/v1/chat/completions"
)