From 3495455a78e2cfacca81e33d4af11c80c54ee2b1 Mon Sep 17 00:00:00 2001 From: Kai Shao Cheng Date: Sat, 6 Jun 2026 17:50:00 +0800 Subject: [PATCH 1/2] feat(provider): add AGIone provider --- litellm/constants.py | 1 + litellm/llms/openai_like/providers.json | 6 + .../provider_endpoints_support_backup.json | 17 +++ litellm/types/utils.py | 1 + provider_endpoints_support.json | 17 +++ .../llms/openai_like/test_agione_provider.py | 115 ++++++++++++++++++ 6 files changed, 157 insertions(+) create mode 100644 tests/test_litellm/llms/openai_like/test_agione_provider.py diff --git a/litellm/constants.py b/litellm/constants.py index 36e578bd323..be55dd5f175 100644 --- a/litellm/constants.py +++ b/litellm/constants.py @@ -825,6 +825,7 @@ openai_compatible_providers: List = [ "novita", "meta_llama", "publicai", # PublicAI - JSON-configured provider + "agione", # AGIone - JSON-configured provider "synthetic", # Synthetic - JSON-configured provider "tensormesh", # Tensormesh - JSON-configured provider "apertis", # Apertis - JSON-configured provider diff --git a/litellm/llms/openai_like/providers.json b/litellm/llms/openai_like/providers.json index 49b3801c82f..58adb457808 100644 --- a/litellm/llms/openai_like/providers.json +++ b/litellm/llms/openai_like/providers.json @@ -107,6 +107,12 @@ "api_key_env": "AIHUBMIX_API_KEY", "api_base_env": "AIHUBMIX_API_BASE" }, + "agione": { + "base_url": "https://agione.pro/hyperone/xapi/api/v1", + "api_key_env": "AGIONE_API_KEY", + "api_base_env": "AGIONE_API_BASE", + "supported_endpoints": ["/v1/chat/completions", "/v1/messages", "/v1/responses"] + }, "crusoe": { "base_url": "https://managed-inference-api-proxy.crusoecloud.com/v1", "api_key_env": "CRUSOE_API_KEY", diff --git a/litellm/provider_endpoints_support_backup.json b/litellm/provider_endpoints_support_backup.json index e0eeb014c51..6946e2182f1 100644 --- a/litellm/provider_endpoints_support_backup.json +++ b/litellm/provider_endpoints_support_backup.json @@ -66,6 +66,23 @@ "a2a": false } }, + "agione": { + "display_name": "AGIone (`agione`)", + "url": "https://agione.pro", + "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": false + } + }, "aiml": { "display_name": "AI/ML API (`aiml`)", "url": "https://docs.litellm.ai/docs/providers/aiml", diff --git a/litellm/types/utils.py b/litellm/types/utils.py index a7a0b0f6238..de362970bd9 100644 --- a/litellm/types/utils.py +++ b/litellm/types/utils.py @@ -3299,6 +3299,7 @@ class LlmProviders(str, Enum): DASHSCOPE = "dashscope" MOONSHOT = "moonshot" PUBLICAI = "publicai" + AGIONE = "agione" V0 = "v0" MORPH = "morph" LAMBDA_AI = "lambda_ai" diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index a1ad20fffd1..81b0df6524a 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -66,6 +66,23 @@ "a2a": false } }, + "agione": { + "display_name": "AGIone (`agione`)", + "url": "https://agione.pro", + "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": false + } + }, "aiml": { "display_name": "AI/ML API (`aiml`)", "url": "https://docs.litellm.ai/docs/providers/aiml", diff --git a/tests/test_litellm/llms/openai_like/test_agione_provider.py b/tests/test_litellm/llms/openai_like/test_agione_provider.py new file mode 100644 index 00000000000..304ec7205a0 --- /dev/null +++ b/tests/test_litellm/llms/openai_like/test_agione_provider.py @@ -0,0 +1,115 @@ +"""Tests for AGIone provider configuration and integration.""" + +import os + +import pytest + +import litellm + + +class TestAGIoneProviderConfig: + """Test AGIone provider configuration.""" + + def test_agione_in_provider_list(self): + from litellm import LlmProviders + + assert hasattr(LlmProviders, "AGIONE") + assert LlmProviders.AGIONE.value == "agione" + assert "agione" in litellm.provider_list + + def test_agione_json_config_exists(self): + from litellm.llms.openai_like.json_loader import JSONProviderRegistry + + assert JSONProviderRegistry.exists("agione") + + agione = JSONProviderRegistry.get("agione") + assert agione is not None + assert agione.base_url == "https://agione.pro/hyperone/xapi/api/v1" + assert agione.api_key_env == "AGIONE_API_KEY" + assert agione.api_base_env == "AGIONE_API_BASE" + assert agione.supported_endpoints == [ + "/v1/chat/completions", + "/v1/messages", + "/v1/responses", + ] + assert JSONProviderRegistry.supports_responses_api("agione") is True + + def test_agione_responses_url(self): + from litellm.llms.openai_like.dynamic_config import create_responses_config_class + from litellm.llms.openai_like.json_loader import JSONProviderRegistry + + agione = JSONProviderRegistry.get("agione") + assert agione is not None + + config_cls = create_responses_config_class(agione) + config = config_cls() + + assert config.get_complete_url(api_base=None, litellm_params={}) == "https://agione.pro/hyperone/xapi/api/v1/responses" + + def test_agione_provider_resolution(self): + from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider + + model, provider, api_key, api_base = get_llm_provider( + model="agione/deepseek/deepseek-v3.2/0000n", + custom_llm_provider=None, + api_base=None, + api_key=None, + ) + + assert model == "deepseek/deepseek-v3.2/0000n" + assert provider == "agione" + assert api_base == "https://agione.pro/hyperone/xapi/api/v1" + + def test_agione_api_base_override(self): + from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider + + model, provider, api_key, api_base = get_llm_provider( + model="agione/deepseek/deepseek-v3.2/0000n", + custom_llm_provider=None, + api_base="https://custom.example.com/v1", + api_key="test-key", + ) + + assert provider == "agione" + assert api_base == "https://custom.example.com/v1" + assert api_key == "test-key" + + def test_agione_router_config(self): + from litellm import Router + + router = Router( + model_list=[ + { + "model_name": "agione-chat", + "litellm_params": { + "model": "agione/deepseek/deepseek-v3.2/0000n", + "api_key": "test-key", + }, + } + ] + ) + + assert len(router.model_list) == 1 + assert router.model_list[0]["model_name"] == "agione-chat" + + +def test_agione_completion_live(): + """Optional live smoke test. Runs only when AGIONE_API_KEY is set.""" + api_key = os.environ.get("AGIONE_API_KEY") + if not api_key or api_key == "PASTE_YOUR_NEW_KEY_HERE": + pytest.skip("AGIONE_API_KEY not set") + + response = litellm.completion( + model="agione/deepseek/deepseek-v3.2/0000n", + messages=[ + { + "role": "user", + "content": "Reply exactly: litellm-agione-ok", + } + ], + max_tokens=20, + ) + + assert response is not None + assert response.choices + assert response.choices[0].message.content is not None From 3427f4462c2142dfe8d086ab2c7f29ae2b21f2e5 Mon Sep 17 00:00:00 2001 From: Kai Shao Cheng Date: Sat, 6 Jun 2026 19:14:56 +0800 Subject: [PATCH 2/2] test: remove AGIone live network test --- .../llms/openai_like/test_agione_provider.py | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/tests/test_litellm/llms/openai_like/test_agione_provider.py b/tests/test_litellm/llms/openai_like/test_agione_provider.py index 304ec7205a0..aad0968c347 100644 --- a/tests/test_litellm/llms/openai_like/test_agione_provider.py +++ b/tests/test_litellm/llms/openai_like/test_agione_provider.py @@ -1,9 +1,5 @@ """Tests for AGIone provider configuration and integration.""" -import os - -import pytest - import litellm @@ -91,25 +87,3 @@ class TestAGIoneProviderConfig: assert len(router.model_list) == 1 assert router.model_list[0]["model_name"] == "agione-chat" - - -def test_agione_completion_live(): - """Optional live smoke test. Runs only when AGIONE_API_KEY is set.""" - api_key = os.environ.get("AGIONE_API_KEY") - if not api_key or api_key == "PASTE_YOUR_NEW_KEY_HERE": - pytest.skip("AGIONE_API_KEY not set") - - response = litellm.completion( - model="agione/deepseek/deepseek-v3.2/0000n", - messages=[ - { - "role": "user", - "content": "Reply exactly: litellm-agione-ok", - } - ], - max_tokens=20, - ) - - assert response is not None - assert response.choices - assert response.choices[0].message.content is not None