diff --git a/litellm/llms/greenpt/__init__.py b/litellm/llms/greenpt/__init__.py new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/litellm/llms/greenpt/__init__.py @@ -0,0 +1 @@ + diff --git a/litellm/llms/greenpt/rerank/__init__.py b/litellm/llms/greenpt/rerank/__init__.py new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/litellm/llms/greenpt/rerank/__init__.py @@ -0,0 +1 @@ + diff --git a/litellm/llms/greenpt/rerank/transformation.py b/litellm/llms/greenpt/rerank/transformation.py new file mode 100644 index 00000000000..8e2744ba537 --- /dev/null +++ b/litellm/llms/greenpt/rerank/transformation.py @@ -0,0 +1,42 @@ +from typing import Dict + +from litellm.llms.hosted_vllm.rerank.transformation import HostedVLLMRerankConfig +from litellm.secret_managers.main import get_secret_str + + +class GreenPTRerankConfig(HostedVLLMRerankConfig): + def get_supported_cohere_rerank_params(self, model: str) -> list: + return ["query", "documents", "top_n", "return_documents"] + + def validate_environment( + self, + headers: dict, + model: str, + api_key: str | None = None, + optional_params: dict | None = None, + ) -> dict: + api_key = api_key or get_secret_str("GREENPT_API_KEY") + if api_key is None: + raise ValueError("GreenPT API key is required. Set GREENPT_API_KEY.") + return super().validate_environment( + headers=headers, + model=model, + api_key=api_key, + optional_params=optional_params, + ) + + def transform_rerank_request( + self, + model: str, + optional_rerank_params: Dict, + headers: dict, + litellm_params: dict | None = None, + ) -> dict: + request = super().transform_rerank_request( + model=model, + optional_rerank_params=optional_rerank_params, + headers=headers, + litellm_params=litellm_params, + ) + request.setdefault("top_n", len(request["documents"])) + return request diff --git a/litellm/rerank_api/main.py b/litellm/rerank_api/main.py index b6ebf5589b7..63c0df3c48e 100644 --- a/litellm/rerank_api/main.py +++ b/litellm/rerank_api/main.py @@ -31,7 +31,7 @@ async def arerank( query: str, documents: List[Union[str, Dict[str, Any]]], custom_llm_provider: ( - Literal["cohere", "together_ai", "deepinfra", "fireworks_ai", "voyage", "watsonx"] | None + Literal["cohere", "together_ai", "deepinfra", "fireworks_ai", "voyage", "watsonx", "greenpt"] | None ) = None, top_n: int | None = None, rank_fields: List[str] | None = None, @@ -89,6 +89,7 @@ def rerank( "fireworks_ai", "voyage", "watsonx", + "greenpt", ] | None ) = None, diff --git a/litellm/utils.py b/litellm/utils.py index a11c5500503..7776eec6698 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -8008,6 +8008,10 @@ class ProviderConfigManager: ) return DashScopeRerankConfig() + elif litellm.LlmProviders.GREENPT == provider: + from litellm.llms.greenpt.rerank.transformation import GreenPTRerankConfig + + return GreenPTRerankConfig() return litellm.CohereRerankConfig() @staticmethod diff --git a/model_prices_and_context_window.json b/model_prices_and_context_window.json index 2ac7b06c43d..00061889e35 100644 --- a/model_prices_and_context_window.json +++ b/model_prices_and_context_window.json @@ -46295,6 +46295,14 @@ "output_cost_per_token": 0, "source": "https://docs.greenpt.ai/pricing" }, + "greenpt/green-rerank": { + "input_cost_per_token": 1.36524e-07, + "litellm_provider": "greenpt", + "max_input_tokens": 32768, + "max_tokens": 32768, + "mode": "rerank", + "source": "https://docs.greenpt.ai/pricing" + }, "greenpt/green-l": { "input_cost_per_token": 2.84425e-07, "litellm_provider": "greenpt", @@ -46370,6 +46378,19 @@ "supports_tool_choice": true, "supports_vision": true }, + "greenpt/kimi-k2.7-code": { + "input_cost_per_token": 9.44291e-07, + "litellm_provider": "greenpt", + "max_input_tokens": 262144, + "max_output_tokens": 262144, + "max_tokens": 262144, + "mode": "chat", + "output_cost_per_token": 4.380145e-06, + "source": "https://docs.greenpt.ai/pricing", + "supports_function_calling": true, + "supports_reasoning": true, + "supports_tool_choice": true + }, "greenpt/minimax-m2.5": { "input_cost_per_token": 1.93409e-07, "litellm_provider": "greenpt", @@ -46383,6 +46404,16 @@ "supports_reasoning": true, "supports_tool_choice": true }, + "greenpt/qwen3-embedding-8b": { + "input_cost_per_token": 2.84425e-07, + "litellm_provider": "greenpt", + "max_input_tokens": 32768, + "max_output_tokens": 4096, + "max_tokens": 32768, + "mode": "embedding", + "output_cost_per_token": 0, + "source": "https://docs.greenpt.ai/pricing" + }, "fallback_generalizations": { "rules": [ { diff --git a/provider_endpoints_support.json b/provider_endpoints_support.json index ec1baed2292..ce52bbde3f8 100644 --- a/provider_endpoints_support.json +++ b/provider_endpoints_support.json @@ -2955,7 +2955,7 @@ "audio_speech": false, "moderations": false, "batches": false, - "rerank": false, + "rerank": true, "a2a": false } } diff --git a/tests/litellm/llms/openai_like/test_greenpt_provider.py b/tests/litellm/llms/openai_like/test_greenpt_provider.py index 648f6f2d90b..21a794657e7 100644 --- a/tests/litellm/llms/openai_like/test_greenpt_provider.py +++ b/tests/litellm/llms/openai_like/test_greenpt_provider.py @@ -5,6 +5,8 @@ sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../. from litellm.llms.openai_like.dynamic_config import create_config_class from litellm.llms.openai_like.json_loader import JSONProviderRegistry +from litellm.types.utils import LlmProviders +from litellm.utils import ProviderConfigManager GREENPT_BASE_URL = "https://api.greenpt.ai/v1" @@ -69,3 +71,28 @@ def test_greenpt_provider_resolution(): assert model == "gemma4" assert provider == "greenpt" assert api_base == GREENPT_BASE_URL + + +def test_greenpt_rerank_config(): + config = ProviderConfigManager.get_provider_rerank_config( + model="green-rerank", + provider=LlmProviders.GREENPT, + api_base=GREENPT_BASE_URL, + present_version_params=[], + ) + assert config.get_complete_url(GREENPT_BASE_URL, "green-rerank") == (f"{GREENPT_BASE_URL}/rerank") + assert config.transform_rerank_request( + model="green-rerank", + optional_rerank_params={ + "query": "low-carbon inference", + "documents": ["GreenPT", "Other provider"], + "return_documents": False, + }, + headers={}, + ) == { + "model": "green-rerank", + "query": "low-carbon inference", + "documents": ["GreenPT", "Other provider"], + "top_n": 2, + "return_documents": False, + }