aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are hereHEADmaster
Diffstat (limited to '.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py')
-rw-r--r--.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py242
1 files changed, 242 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py b/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py
new file mode 100644
index 00000000..fd238860
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/cost_calculator.py
@@ -0,0 +1,242 @@
+# What is this?
+## Cost calculation for Google AI Studio / Vertex AI models
+from typing import Literal, Optional, Tuple, Union
+
+import litellm
+from litellm import verbose_logger
+from litellm.litellm_core_utils.llm_cost_calc.utils import _is_above_128k
+
+"""
+Gemini pricing covers:
+- token
+- image
+- audio
+- video
+"""
+
+"""
+Vertex AI -> character based pricing
+
+Google AI Studio -> token based pricing
+"""
+
+models_without_dynamic_pricing = ["gemini-1.0-pro", "gemini-pro"]
+
+
+def cost_router(
+ model: str,
+ custom_llm_provider: str,
+ call_type: Union[Literal["embedding", "aembedding"], str],
+) -> Literal["cost_per_character", "cost_per_token"]:
+ """
+ Route the cost calc to the right place, based on model/call_type/etc.
+
+ Returns
+ - str, the specific google cost calc function it should route to.
+ """
+ if custom_llm_provider == "vertex_ai" and (
+ "claude" in model
+ or "llama" in model
+ or "mistral" in model
+ or "jamba" in model
+ or "codestral" in model
+ ):
+ return "cost_per_token"
+ elif custom_llm_provider == "vertex_ai" and (
+ call_type == "embedding" or call_type == "aembedding"
+ ):
+ return "cost_per_token"
+ return "cost_per_character"
+
+
+def cost_per_character(
+ model: str,
+ custom_llm_provider: str,
+ prompt_tokens: float,
+ completion_tokens: float,
+ prompt_characters: Optional[float] = None,
+ completion_characters: Optional[float] = None,
+) -> Tuple[float, float]:
+ """
+ Calculates the cost per character for a given VertexAI model, input messages, and response object.
+
+ Input:
+ - model: str, the model name without provider prefix
+ - custom_llm_provider: str, "vertex_ai-*"
+ - prompt_characters: float, the number of input characters
+ - completion_characters: float, the number of output characters
+
+ Returns:
+ Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd
+
+ Raises:
+ Exception if model requires >128k pricing, but model cost not mapped
+ """
+ model_info = litellm.get_model_info(
+ model=model, custom_llm_provider=custom_llm_provider
+ )
+
+ ## GET MODEL INFO
+ model_info = litellm.get_model_info(
+ model=model, custom_llm_provider=custom_llm_provider
+ )
+
+ ## CALCULATE INPUT COST
+ if prompt_characters is None:
+ prompt_cost, _ = cost_per_token(
+ model=model,
+ custom_llm_provider=custom_llm_provider,
+ prompt_tokens=prompt_tokens,
+ completion_tokens=completion_tokens,
+ )
+ else:
+ try:
+ if (
+ _is_above_128k(tokens=prompt_characters * 4) # 1 token = 4 char
+ and model not in models_without_dynamic_pricing
+ ):
+ ## check if character pricing, else default to token pricing
+ assert (
+ "input_cost_per_character_above_128k_tokens" in model_info
+ and model_info["input_cost_per_character_above_128k_tokens"]
+ is not None
+ ), "model info for model={} does not have 'input_cost_per_character_above_128k_tokens'-pricing for > 128k tokens\nmodel_info={}".format(
+ model, model_info
+ )
+ prompt_cost = (
+ prompt_characters
+ * model_info["input_cost_per_character_above_128k_tokens"]
+ )
+ else:
+ assert (
+ "input_cost_per_character" in model_info
+ and model_info["input_cost_per_character"] is not None
+ ), "model info for model={} does not have 'input_cost_per_character'-pricing\nmodel_info={}".format(
+ model, model_info
+ )
+ prompt_cost = prompt_characters * model_info["input_cost_per_character"]
+ except Exception as e:
+ verbose_logger.debug(
+ "litellm.litellm_core_utils.llm_cost_calc.google.py::cost_per_character(): Exception occured - {}\nDefaulting to None".format(
+ str(e)
+ )
+ )
+ prompt_cost, _ = cost_per_token(
+ model=model,
+ custom_llm_provider=custom_llm_provider,
+ prompt_tokens=prompt_tokens,
+ completion_tokens=completion_tokens,
+ )
+
+ ## CALCULATE OUTPUT COST
+ if completion_characters is None:
+ _, completion_cost = cost_per_token(
+ model=model,
+ custom_llm_provider=custom_llm_provider,
+ prompt_tokens=prompt_tokens,
+ completion_tokens=completion_tokens,
+ )
+ else:
+ try:
+ if (
+ _is_above_128k(tokens=completion_characters * 4) # 1 token = 4 char
+ and model not in models_without_dynamic_pricing
+ ):
+ assert (
+ "output_cost_per_character_above_128k_tokens" in model_info
+ and model_info["output_cost_per_character_above_128k_tokens"]
+ is not None
+ ), "model info for model={} does not have 'output_cost_per_character_above_128k_tokens' pricing\nmodel_info={}".format(
+ model, model_info
+ )
+ completion_cost = (
+ completion_tokens
+ * model_info["output_cost_per_character_above_128k_tokens"]
+ )
+ else:
+ assert (
+ "output_cost_per_character" in model_info
+ and model_info["output_cost_per_character"] is not None
+ ), "model info for model={} does not have 'output_cost_per_character'-pricing\nmodel_info={}".format(
+ model, model_info
+ )
+ completion_cost = (
+ completion_characters * model_info["output_cost_per_character"]
+ )
+ except Exception as e:
+ verbose_logger.debug(
+ "litellm.litellm_core_utils.llm_cost_calc.google.py::cost_per_character(): Exception occured - {}\nDefaulting to None".format(
+ str(e)
+ )
+ )
+ _, completion_cost = cost_per_token(
+ model=model,
+ custom_llm_provider=custom_llm_provider,
+ prompt_tokens=prompt_tokens,
+ completion_tokens=completion_tokens,
+ )
+
+ return prompt_cost, completion_cost
+
+
+def cost_per_token(
+ model: str,
+ custom_llm_provider: str,
+ prompt_tokens: float,
+ completion_tokens: float,
+) -> Tuple[float, float]:
+ """
+ Calculates the cost per token for a given model, prompt tokens, and completion tokens.
+
+ Input:
+ - model: str, the model name without provider prefix
+ - custom_llm_provider: str, either "vertex_ai-*" or "gemini"
+ - prompt_tokens: float, the number of input tokens
+ - completion_tokens: float, the number of output tokens
+
+ Returns:
+ Tuple[float, float] - prompt_cost_in_usd, completion_cost_in_usd
+
+ Raises:
+ Exception if model requires >128k pricing, but model cost not mapped
+ """
+ ## GET MODEL INFO
+ model_info = litellm.get_model_info(
+ model=model, custom_llm_provider=custom_llm_provider
+ )
+
+ ## CALCULATE INPUT COST
+ if (
+ _is_above_128k(tokens=prompt_tokens)
+ and model not in models_without_dynamic_pricing
+ ):
+ assert (
+ "input_cost_per_token_above_128k_tokens" in model_info
+ and model_info["input_cost_per_token_above_128k_tokens"] is not None
+ ), "model info for model={} does not have pricing for > 128k tokens\nmodel_info={}".format(
+ model, model_info
+ )
+ prompt_cost = (
+ prompt_tokens * model_info["input_cost_per_token_above_128k_tokens"]
+ )
+ else:
+ prompt_cost = prompt_tokens * model_info["input_cost_per_token"]
+
+ ## CALCULATE OUTPUT COST
+ if (
+ _is_above_128k(tokens=completion_tokens)
+ and model not in models_without_dynamic_pricing
+ ):
+ assert (
+ "output_cost_per_token_above_128k_tokens" in model_info
+ and model_info["output_cost_per_token_above_128k_tokens"] is not None
+ ), "model info for model={} does not have pricing for > 128k tokens\nmodel_info={}".format(
+ model, model_info
+ )
+ completion_cost = (
+ completion_tokens * model_info["output_cost_per_token_above_128k_tokens"]
+ )
+ else:
+ completion_cost = completion_tokens * model_info["output_cost_per_token"]
+
+ return prompt_cost, completion_cost