mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-25 05:54:53 +00:00
fix(greenpt): enable embeddings and rerank cost tracking
This commit is contained in:
parent
015a2f24b4
commit
5288ceaca5
5 changed files with 88 additions and 4 deletions
|
|
@ -1,5 +1,7 @@
|
|||
from litellm.llms.hosted_vllm.rerank.transformation import HostedVLLMRerankConfig
|
||||
from litellm.secret_managers.main import get_secret_str
|
||||
from litellm.types.rerank import RerankBilledUnits
|
||||
from litellm.types.utils import ModelInfo
|
||||
|
||||
|
||||
class GreenPTRerankConfig(HostedVLLMRerankConfig):
|
||||
|
|
@ -38,3 +40,20 @@ class GreenPTRerankConfig(HostedVLLMRerankConfig):
|
|||
)
|
||||
request.setdefault("top_n", len(request["documents"]))
|
||||
return request
|
||||
|
||||
def calculate_rerank_cost(
|
||||
self,
|
||||
model: str,
|
||||
custom_llm_provider: str | None = None,
|
||||
billed_units: RerankBilledUnits | None = None,
|
||||
model_info: ModelInfo | None = None,
|
||||
) -> tuple[float, float]:
|
||||
if model_info is None or billed_units is None:
|
||||
return 0.0, 0.0
|
||||
input_cost_per_token = model_info.get("input_cost_per_token")
|
||||
if input_cost_per_token is None:
|
||||
return 0.0, 0.0
|
||||
total_tokens = billed_units.get("total_tokens")
|
||||
if total_tokens is None:
|
||||
return 0.0, 0.0
|
||||
return input_cost_per_token * total_tokens, 0.0
|
||||
|
|
|
|||
|
|
@ -73,6 +73,13 @@ class JSONProviderRegistry:
|
|||
return False
|
||||
return "/v1/responses" in provider.supported_endpoints
|
||||
|
||||
@classmethod
|
||||
def supports_embeddings_api(cls, slug: str) -> bool:
|
||||
provider = cls._providers.get(slug)
|
||||
if provider is None:
|
||||
return False
|
||||
return "/v1/embeddings" in provider.supported_endpoints
|
||||
|
||||
@classmethod
|
||||
def list_providers(cls) -> list:
|
||||
"""List all registered provider slugs"""
|
||||
|
|
|
|||
|
|
@ -6213,6 +6213,7 @@ def embedding(
|
|||
custom_llm_provider == "openai_like"
|
||||
or custom_llm_provider == "llamafile"
|
||||
or custom_llm_provider == "lm_studio"
|
||||
or JSONProviderRegistry.supports_embeddings_api(custom_llm_provider)
|
||||
):
|
||||
api_base = api_base or litellm.api_base or get_secret_str("OPENAI_LIKE_API_BASE")
|
||||
|
||||
|
|
|
|||
|
|
@ -64,3 +64,29 @@ def test_transform_rerank_request_preserves_top_n():
|
|||
headers={},
|
||||
)
|
||||
assert request["top_n"] == 1
|
||||
|
||||
|
||||
def test_calculate_rerank_cost():
|
||||
prompt_cost, completion_cost = GreenPTRerankConfig().calculate_rerank_cost(
|
||||
model="green-rerank",
|
||||
billed_units={"total_tokens": 1000},
|
||||
model_info={"input_cost_per_token": 1.36524e-07},
|
||||
)
|
||||
assert prompt_cost == pytest.approx(0.000136524)
|
||||
assert completion_cost == 0.0
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("billed_units", "model_info"),
|
||||
[
|
||||
(None, None),
|
||||
({}, {"input_cost_per_token": 1.36524e-07}),
|
||||
({"total_tokens": 1000}, {}),
|
||||
],
|
||||
)
|
||||
def test_calculate_rerank_cost_missing_usage_or_pricing(billed_units, model_info):
|
||||
assert GreenPTRerankConfig().calculate_rerank_cost(
|
||||
model="green-rerank",
|
||||
billed_units=billed_units,
|
||||
model_info=model_info,
|
||||
) == (0.0, 0.0)
|
||||
|
|
@ -1,8 +1,12 @@
|
|||
import json
|
||||
import os
|
||||
import sys
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../..")))
|
||||
|
||||
import litellm
|
||||
from litellm.llms.custom_httpx.http_handler import HTTPHandler
|
||||
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
|
||||
|
|
@ -39,7 +43,7 @@ def test_greenpt_maps_max_completion_tokens():
|
|||
params = config.map_openai_params(
|
||||
non_default_params={"max_completion_tokens": 256},
|
||||
optional_params={},
|
||||
model="greenpt/gemma4",
|
||||
model="greenpt/glm-5.2",
|
||||
drop_params=False,
|
||||
)
|
||||
assert params == {"max_tokens": 256}
|
||||
|
|
@ -50,7 +54,7 @@ def test_greenpt_complete_url_appends_endpoint():
|
|||
url = config.get_complete_url(
|
||||
api_base=GREENPT_BASE_URL,
|
||||
api_key="test-key",
|
||||
model="greenpt/gemma4",
|
||||
model="greenpt/glm-5.2",
|
||||
optional_params={},
|
||||
litellm_params={},
|
||||
stream=False,
|
||||
|
|
@ -62,17 +66,44 @@ def test_greenpt_provider_resolution():
|
|||
from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider
|
||||
|
||||
model, provider, _, api_base = get_llm_provider(
|
||||
model="greenpt/gemma4",
|
||||
model="greenpt/glm-5.2",
|
||||
custom_llm_provider=None,
|
||||
api_base=None,
|
||||
api_key=None,
|
||||
)
|
||||
|
||||
assert model == "gemma4"
|
||||
assert model == "glm-5.2"
|
||||
assert provider == "greenpt"
|
||||
assert api_base == GREENPT_BASE_URL
|
||||
|
||||
|
||||
def test_greenpt_embedding_dispatches():
|
||||
response = Mock()
|
||||
response.raise_for_status = Mock()
|
||||
response.json.return_value = {
|
||||
"object": "list",
|
||||
"data": [{"object": "embedding", "embedding": [0.1, 0.2], "index": 0}],
|
||||
"model": "green-embedding",
|
||||
"usage": {"prompt_tokens": 2, "total_tokens": 2},
|
||||
}
|
||||
client = HTTPHandler()
|
||||
|
||||
with patch.object(HTTPHandler, "post", return_value=response) as mock_post:
|
||||
result = litellm.embedding(
|
||||
model="greenpt/green-embedding",
|
||||
input=["renewable inference"],
|
||||
api_key="test-key",
|
||||
client=client,
|
||||
)
|
||||
|
||||
assert result.data[0]["embedding"] == [0.1, 0.2]
|
||||
assert mock_post.call_args.args[0] == f"{GREENPT_BASE_URL}/embeddings"
|
||||
assert json.loads(mock_post.call_args.kwargs["data"]) == {
|
||||
"model": "green-embedding",
|
||||
"input": ["renewable inference"],
|
||||
}
|
||||
|
||||
|
||||
def test_greenpt_rerank_config():
|
||||
config = ProviderConfigManager.get_provider_rerank_config(
|
||||
model="green-rerank",
|
||||
Loading…
Add table
Reference in a new issue