
    jO             )          d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlZd dlZd dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlm Z! d dl"m Z# d dl$m%Z% d dl&m Z' d dl(m Z) d dl*m Z+ d dl,m Z- d dl.m Z/ d dl0m Z1 d dl2m3Z4 d dl2m Z5 d dl6m Z7 d dl8m9Z9 d dl:m;Z< d dl:m Z= d dl:m>Z? d dl@m ZA d dlBmCZC d dlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL d dlMmNZNmOZO d dlPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ d dl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZe erd dlfmgZh neZh	 	 	 	 	 dideideideei   dee]   deei   dee	eieif      fdZj	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 djd ekdeldeldeei   d!eek   d"eel   d#eel   d$eel   d%eel   dee]   deei   d&eel   d'eeY   d(eeN   d)eQd*eid+eek   d,ee   de	eieif   f&d-Z dkd.emfd/Znd0edeofd1Zp	 dld eek   d!eek   deek   fd2Zq	 	 	 	 dmd eek   d.ee   d3eek   d4eeo   d!eek   d5eek   deek   fd6Zr ee7      d ekdeofd8       Zsd.edeeY   fd9Ztd: Zud)eeQ   d.edeeQ   fd;Zvd<eid!eek   de	eieieif   fd=Zw	 	 	 dnd>eeh   d?eid@eidAeidBeidCeei   dDeei   dEeei   ddfdFZxdddg ddddddddddddddddddfd eek   dGedHeei   d)eeQ   dIeek   dJeek   dKeel   dee]   deei   dLeem   d4eeo   d3eek   dMeeV   dNeek   d5eek   d>eeh   d+eek   deif$dOZydPe
emef   deei   fdQZz	 	 	 	 	 	 	 	 	 dodRe
e`e^e_ecebeEeOeLeReGee%f   d ekd!eek   d)edS   dLemdTeeo   d3eek   d4eeo   dUekdMeeV   dNeek   d5eek   d>eeh   d+eek   deifdVZ{	 dld ekd!eek   d,ee   de	eieif   fdWZ|d eek   d!ekd,eZde	eieif   fdXZ}	 dld ekd!eek   dYeeN   de	eieif   fdZZ~d ekd!eek   d[eide	eieif   fd\Z	 	 	 	 	 dpd ekd!eek   dJeek   dKeel   dIeek   dLeem   deifd]Z	 dld ekd^eid!eek   deifd_Z	 dld`eYd ekd!eek   de	eieif   fdaZ G db dc      Z G dd dee      ZdfeHdgeYd!ekdNekdeif
dhZy)q    N)	lru_cache)TYPE_CHECKINGAnyListLiteralOptionalTupleUnioncast)Response)	BaseModel)verbose_logger)DEFAULT_MAX_LRU_CACHE_SIZE&DEFAULT_REPLICATE_GPU_PRICE_PER_SECOND)StandardBuiltInToolCostTracking)&TranscriptionUsageObjectTransformation)CostCalculatorUtils_generic_cost_per_charactergeneric_cost_per_tokenselect_cost_metric_for_modelcost_per_token)SearchResponse)cost_per_second)get_model_params_and_category)cost_per_character)cost_router)ResponseAPILoggingUtils)HttpxBinaryResponseContentImageGenerationRequestQualityOpenAIModerationResponseOpenAIRealtimeStreamList&OpenAIRealtimeStreamResponseBaseObject!OpenAIRealtimeStreamSessionEventsResponseAPIUsageResponsesAPIResponse)RerankBilledUnitsRerankResponse)
CallTypesLiteral"LiteLLMRealtimeStreamLoggingObjectLlmProvidersLlmProvidersSet	ModelInfoStandardBuiltInToolsParams TranscriptionUsageDurationObjectTranscriptionUsageTokensObjectUsageVectorStoreSearchResponse)
	CallTypesCostPerTokenEmbeddingResponseImageResponseModelResponseProviderConfigManagerTextCompletionResponseTranscriptionResponse_cached_get_model_info_helpertoken_counter)Logging        prompt_tokenscompletion_tokensresponse_time_mscustom_cost_per_tokencustom_cost_per_secondreturnc                 V    ||y||d   | z  }|d   |z  }||fS |||z  dz  }d|fS y)zFInternal helper function for calculating cost, if custom pricing givenNinput_cost_per_tokenoutput_cost_per_token  r    )r?   r@   rA   rB   rC   
input_costoutput_costs          p/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/cost_calculator.py%_cost_per_token_custom_pricing_helperrM   q   sh     $)?)G(*+AB]R
+,CDGXX;&&		+,/??$F+~     modelcustom_llm_providerprompt_characterscompletion_characterscache_creation_input_tokenscache_read_input_tokensnumber_of_queriesusage_objectrerank_billed_units	call_type!audio_transcription_file_durationservice_tierresponsec           
         | t        d      ||}nt        ||||z   ||	      }t        |||||
      }|
|d   |d   fS d}d}t        j                  }| }||dz   | z   }|,| d| d|  }||v r|}nt        j
                  |       \  }}}}| }| j                  dd      }t        |      dkD  r|d   }n| }	 ||v r|} n| |v r| } n||v r|} |d	k(  s|d
k(  rt        j                  ||      }t        |      }d}d} |dk(  r^|t        dj                  || ||            t        |||ddd      \  }!}"|!|"t        dj                  |!|"||||            |!}|"} || fS |dk(  rt        ||||      \  }} || fS |dk(  s|dk(  rt        | ||      S |dk(  s|dk(  rt        | |t!        t"        |            S |dk(  s|dk(  rt%        | ||      S |dk(  s+|dk(  s&|t&        j(                  k(  s|t&        j*                  k(  rt-        || |      S |dk(  s|dk(  r!| d k(  rt/        | ||!      S t1        | ||"      S |d#k(  s|d$k(  r5dd%lm}#  |#| ||xs d|rt7        |d&      r|j8                  '      S d'      S |d(k(  r7t;        |||)      }$|$dk(  rt=        |||||*      S |$dk(  rt?        |||+      S y|d,k(  rtA        | |-      S |d.k(  rtC        | |-      S |d/k(  rt/        | ||!      S |d0k(  rtE        | |-      S |d1k(  rtG        | |-      S |d2k(  rtI        | ||3      S |d4k(  rtK        | |-      S |d5k(  rtM        | |-      S |d6k(  rtO        | |-      S |d7k(  rtQ        | |-      S |d8k(  rtS        | |-      S |d9k(  rdd:l*m+}%  |%| |-      S tY        | |      }&|&d;   dkD  r	|&d;   |z  }nG|&j[                  d<d      5|3t]        j^                  d=| |&j[                  d<d      |       |&d<   |z  d>z  }|&d?   dkD  r	|&d?   |z  }nG|&j[                  d@d      5|3t]        j^                  dA| |&j[                  d@d      |       |&d@   |z  d>z  }t]        j^                  dB| ||       ||fS )Car  
    Calculates the cost per token for a given model, prompt tokens, and completion tokens.

    Parameters:
        model (str): The name of the model to use. Default is ""
        prompt_tokens (int): The number of tokens in the prompt.
        completion_tokens (int): The number of tokens in the completion.
        response_time (float): The amount of time, in milliseconds, it took the call to complete.
        prompt_characters (float): The number of characters in the prompt. Used for vertex ai cost calculation.
        completion_characters (float): The number of characters in the completion response. Used for vertex ai cost calculation.
        custom_llm_provider (str): The llm provider to whom the call was made (see init.py for full list)
        custom_cost_per_token: Optional[CostPerToken]: the cost per input + output token for the llm api call.
        custom_cost_per_second: Optional[float]: the cost per second for the llm api call.
        call_type: Optional[str]: the call type

    Returns:
        tuple: A tuple containing the cost in USD dollars for prompt tokens and completion tokens, respectively.
    Nz"Invalid arg. Model cannot be none.)r?   r@   total_tokensrT   rU   )r?   r@   rA   rC   rB   r      /rP   speechaspeechrP   rQ   r>   r   zvprompt_characters must be provided for tts calls. prompt_characters={}, model={}, custom_llm_provider={}, call_type={})rP   rQ   rR   rS   custom_prompt_costcustom_completion_costzcost for tts call is None. prompt_cost={}, completion_cost={}, model={}, custom_llm_provider={}, prompt_characters={}, completion_characters={}r   )rP   usagerQ   r[   arerankrerank)rP   rQ   billed_unitsavector_store_searchvector_store_search)rP   rQ   r\   ocraocraretrieve_batchretrieve_batch)rg   rP   rQ   atranscriptiontranscriptionzgpt-4o-mini-transcribe)rP   rg   r[   rP   rQ   durationsearchasearch)search_provider_cost_per_query_hidden_params)rP   rQ   rV   optional_params	vertex_ai)rP   rQ   rY   )rP   rQ   rR   rS   rg   )rP   rQ   rg   	anthropic)rP   rg   bedrockopenai
databricksfireworks_aiazure)rP   rg   rA   geminideepseek
perplexityxailemonade	dashscoper   rF   input_cost_per_secondz;For model=%s - input_cost_per_second: %s; response time: %srH   rG   output_cost_per_secondz<For model=%s - output_cost_per_second: %s; response time: %szlReturned custom cost for model=%s - prompt_tokens_cost_usd_dollar: %s, completion_tokens_cost_usd_dollar: %s)0	Exceptionr1   rM   litellm
model_costget_llm_providersplitlenget_model_infor   
ValueErrorformatr   r   rerank_costvector_store_search_costr   r2   ocr_costr3   ro   rp   batch_cost_calculatoropenai_cost_per_tokenopenai_cost_per_secondlitellm.searchrw   hasattrrx   google_cost_routergoogle_cost_per_charactergoogle_cost_per_tokenanthropic_cost_per_tokenbedrock_cost_per_tokendatabricks_cost_per_tokenfireworks_ai_cost_per_tokenazure_openai_cost_per_tokengemini_cost_per_tokendeepseek_cost_per_tokenperplexity_cost_per_tokenxai_cost_per_tokenlemonade_cost_per_token&litellm.llms.dashscope.cost_calculatorr   r;   getr   debug)'rP   r?   r@   rA   rQ   region_namerR   rS   rT   rU   rB   rC   rV   rW   rX   rY   rZ   r[   r\   usage_blockresponse_costprompt_tokens_cost_usd_dollar!completion_tokens_cost_usd_dollarmodel_cost_refmodel_with_providermodel_with_provider_and_region_model_without_prefixmodel_partsspeech_model_infocost_metricprompt_costcompletion_cost_prompt_cost_completion_costrw   r   dashscope_cost_per_token
model_infos'                                          rL   r   r      s   ` }<== "'/&)::(C$;
 :#+)53M  Qq!111 ,-!/0%''N&1C7%?"&'qQug> + /.@&D#'.'?'?e'L$1 ++c1%K
;!*1~$ 	~-#	.	 .$ H	Y 6#22&<O
 33DE !$.. (  M  T  T)+!	  .I*$7"3&'#''(.*L* #'7'?  f  m  m$(,+)-	 	 'K.O O++ ,,+A*!$7)	,(K O++	i	9#8 3,
 	

 
,	,	=R0R' 33X>
 	

 
e	yF2 3
 	
 	&&((	111	000$U@S
 	
 
&	&)*F,,(!)  *$7: 
 
h	)y"8A- 3/41 2B C ''	
 		
 	
 		
 
	+(& 3

 ..,*$7"3&;!  ,,(*$7!  - 
	+'e;GG			)%EEE		(${
 	
 
	,(uKHH		.*kJJ		'*{=M
 	
 
	($5DD	
	*&U+FF		,(uKHH		%![AA	
	*&U+FF		+	
 (e;GG2-@

 ,-1 12]B * NN2D9E ,  M6= 	 236FFM * -.2236GG . NN3T:F ,  N7> 	 347GG$N . 	z)-		
 -.OOOrN   completion_responsec                     t         }|dk(  rH| j                  dt        j                               }t        | dt        j                               }||z
  }||z  dz  S )Nr>   createdendedrH   )r   r   timegetattr)r   
total_time!a100_80gb_price_per_second_public
start_timeend_times        rL    get_replicate_completion_pricingr     sZ     )O%S(,,Y		D
.E
*
,z9D@@rN   objc                     t        | d      S )Nrx   )r   )r   s    rL   has_hidden_paramsr     s    3())rN   c                     ||S | y 	 t        j                  |       \  }}}}|S # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY w)Nra   zblitellm.cost_calculator.py::_get_provider_for_cost_calc() - Error inferring custom_llm_provider - )r   r   r   r   r   str)rP   rQ   r   es       rL   _get_provider_for_cost_calcr     sv     &""}'.'?'?e'L$1   pqtuvqwpxy	
 	s   & 	A!AA
base_modelcustom_pricingrouter_model_idc                 0   d}d}t        | |      }d}|@t        |t              rt        |dd      }n"t        |t              r|j                  dd      }t        |dd      }	|du r||t        j                  v r|}nh| }ne||}n`|8|	6|	j                  dd      Jt        |	d         dkD  r9|	j                  d|       }n&|	$|	j                  dd      |	j                  dd      }|||}|| | }|"| t        |      s|| d| d| }|S | d| }|S )	z
    1. If custom pricing is true, return received model name
    2. If base_model is set (e.g. for azure models), return that
    3. If completion response has model set return that
    4. Check if model is passed in return that
    Nrd   rP   rx   Tr   r   r`   )
r   
isinstancer   r   dictr   r   r   r   "_model_contains_known_llm_provider)
rP   r   r   r   rQ   r   return_modelr   completion_response_modelhidden_paramss
             rL    _select_model_name_for_cost_calcr     s    #'L!%K5)< 04&)95(/0CWd(S%+T2(;(?(?(N%$+,?AQSW$XM&?g>P>P+P*L L		!	"	*}/Hgt,8M'*+a/(,,We<L!m&7&7t&L&X#''t< 9 E0 1 	 +2<@"12!K=,PL  22!L>BLrN   )maxsizec                 :    | j                  d      d   }|t        v S )z:
    Check if the model contains a known llm provider
    r`   r   )r   r,   )rP   _provider_prefixs     rL   r   r   2  s#    
 {{3'*..rN   c           	         t        t        t        t        t        t
        f   t        | t              r| j                  d      n t        | dd       d            }|y t        |t              r|S |Jt        |t              st        |t              r*t        j                  |      rt        j                  |      S t        j                  |      r0t        j                  t        t        t        t         f   |            S t        |t              rt        di |S t        |t
              rt        di |j#                         S t%        j&                  dt)        |       d|        y )Nrg   r   c                      y NrI   )xs    rL   <lambda>z#_get_usage_object.<locals>.<lambda>C  s    trN   zUnknown usage object type: z, usage_obj: rI   )r   r
   r1   r%   r   r   r   r   r   r   _is_response_api_usage+_transform_response_api_usage_to_chat_usager   is_transcription_usage_object$transform_transcription_usage_objectr/   r0   
model_dumpr   r   type)r   	usage_objs     rL   _get_usage_objectr   ;  sS    e%tY67 -t4  ##G,D,e^DWMI )U#	4(JyBR,S#::9E&RR
 	
 
0	M	M
 3WW8:XX 			
 
It	$!y!!	Iy	).y++-..)$y/):-	{S	
 rN   c                     t        | t        j                        xs' t        | t              xs t	        j
                  |       S )z3Returns True if the usage obj is a known Usage type)r   r   r1   r%   r   r   r   s    rL   _is_known_usage_objectsr   k  s=     	9gmm, 	
i!12	
1OO
rN   c                    | | S |y t        |t              ryt        |t              ryt        |t              ryt        |t              ryt        |t
              ryt        |t              ryt        |t              ry| S )N
completion	embeddingrr   rb   ri   image_generationtext_completion)r   r7   r5   r:   r   r(   r6   r9   )rY   r   s     rL   _infer_call_typer   v  s     "%}5	'):	;	')>	?	')C	D	'	8	'	7!	')?	@ rN   	base_costc                     | }d}d}|r_|t         j                  v rMt         j                  |   }||z  }||z
  }t        j                  d|dz   d| d|dd|dd|dd	       |||fS | ||fS )
a  
    Apply provider-specific cost discount from module-level config.

    Args:
        base_cost: The base cost before discount
        custom_llm_provider: The LLM provider name

    Returns:
        Tuple of (final_cost, discount_percent, discount_amount)
    r>   zApplied d   z% discount to z: $z.6fz -> $z	 (saved $))r   cost_discount_configr   r   )r   rQ   original_costdiscount_percentdiscount_amount
final_costs         rL   _apply_cost_discountr     s     MO2g6R6RR"778KL'*::"_4
'+,N;N:O Pc"%
3'7yQT@UUVX	

 +_<<&77rN   litellm_logging_objr   r   'cost_for_built_in_tools_cost_usd_dollartotal_cost_usd_dollarr   r   r   c           	          | y	 | j                  |||||||       y# t        $ r+}t        j                  dt	        |              Y d}~yd}~ww xY w)aX  
    Helper function to store cost breakdown in the logging object.

    Args:
        litellm_logging_obj: The logging object to store breakdown in
        prompt_tokens_cost_usd_dollar: Cost of input tokens
        completion_tokens_cost_usd_dollar: Cost of completion tokens (includes reasoning if applicable)
        cost_for_built_in_tools_cost_usd_dollar: Cost of built-in tools
        total_cost_usd_dollar: Total cost of request
        original_cost: Cost before discount
        discount_percent: Discount percentage applied (0.05 = 5%)
        discount_amount: Discount amount in USD
    N)rJ   rK   
total_costr   r   r   r   zError storing cost breakdown: )set_cost_breakdownr   r   r   r   )	r   r   r   r   r   r   r   r   breakdown_errors	            rL   $_store_cost_breakdown_in_logging_objr    sk    . "..49,4['-+ 	/ 	
  =c/>R=STUs    	A!AAmessagesr   sizequalitynry   standard_built_in_tools_paramslitellm_model_namec                    	 t        ||       xs d}|dk(  s|dk(  r'|%t        |t              rt        |      dk(  r|dk(  rd}d}d}d}d}d}d}d}t	        | 	      }d}|||j                  d
      }t        || ||||      }|g} || j                  |       t        |       D ]  \  }!}	 t        j                  d|        | t        | t              st        | t              rt        | t              r| j                  di       }"nt        | di       }"t        |"t              r:t        |"      s.t        | dt!        j"                  dFi |"j%                                |"i }#n#t        |"t              r|"j%                         }#n|"}#t'        j(                  |#      r$t'        j*                  |#      j%                         }#nZt-        j.                  |#      rCt-        j0                  t3        t4        t6        t8        f   |#            }$|$|$j%                         }#n|#}#|#j                  dd      }|#j                  dd      }|#j                  dd      }|#j                  dd      }d|#v r1|#d   i k7  r)|#d   r$|#j                  di       }%|%j                  dd      }t        | dd      }t        | dd      }&|&|&j                  d|xs d      }|&j                  d|      }nW|t;        d|  d|       t        |      dkD  rt=        ||      }nt        |      dkD  rt=        ||      }t=        ||      }|t;        d|  d|       |	 t!        j>                  |      \  }}}'}'tE        jF                  |      r/t        | tH              rtE        jJ                  ||| |
||	||      c S |tL        jN                  jP                  k(  sW|tL        jR                  jP                  k(  s:|tL        jT                  jP                  k(  s|tL        jV                  jP                  k(  rft        | dd      }"| G|"rEt        |"t              r|"j                  d d      })nt        |"d d      })|)dd!l,m-}*  |*||)|"      c S t]        |d|"      c S |tL        j^                  jP                  k(  s|tL        j`                  jP                  k(  r"t         jb                  je                  |#      }n|tL        jf                  jP                  k(  s|tL        jh                  jP                  k(  rt        | d$d      }nV|tL        jj                  jP                  k(  s|tL        jl                  jP                  k(  r~| t        | tn              r| jp                  }+|+|+j                  d%i       xs i },ni },ts        |,j                  d&      |,j                  d'      (      }|,j                  d&      xs d)}-|-}n|tL        jt                  jP                  k(  rJt        | tv              r:||t;        d*jC                  ||            ty        | jz                  |||+      c S |tL        j|                  jP                  k(  rdd,l?m@}. |.j                  |-      c S d.|v s	d/|v s|d/k(  rt        |tM        |      0      }n6|t         j                  v sd1|v r |t         j                  vrt        | |      c S |t;        d|  d|       ||d2k(  rt        |      dkD  rCt         jb                  j                  d3|id4      }/t         jb                  je                  |/#      }| Pt        | t              r@t         jb                  j                  | 5      }0t         jb                  je                  |0#      }t        dFi d6|d|d|d|d7|d|d8|d9|d:|d;|d|d|d<|d=t3        t        |      d>|d?|d
|d@| \  }1}2|1|2z   }3t        j                  || |||A      }4|3|4z  }3|3}5t        |3|B      \  }3}6}7t        ||1|2|4|3|5|6|7C       |3c S  tA        dEjC                  |             # t@        $ r8}(t        j                  djC                  t        |(                   Y d}(~(%d}(~(ww xY w# t@        $ rL}(t        j                  dDjC                  |t        |(                   |!t        |       d)z
  k(  r|(Y d}(~(@d}(~(ww xY w# t@        $ r}(|(d}(~(ww xY w)Ga  
    Calculate the cost of a given completion call fot GPT-3.5-turbo, llama2, any litellm supported llm.

    Parameters:
        completion_response (litellm.ModelResponses): [Required] The response received from a LiteLLM completion request.

        [OPTIONAL PARAMS]
        model (str): Optional. The name of the language model used in the completion calls
        prompt (str): Optional. The input prompt passed to the llm
        completion (str): Optional. The output completion text from the llm
        total_time (float, int): Optional. (Only used for Replicate LLMs) The total time used for the request in seconds
        custom_cost_per_token: Optional[CostPerToken]: the cost per input + output token for the llm api call.
        custom_cost_per_second: Optional[float]: the cost per second for the llm api call.

    Returns:
        float: The cost in USD dollars for the completion based on the provided parameters.

    Exceptions:
        Raises exception if model not in the litellm model cost map. Register model, via custom pricing or PR - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json


    Note:
        - If completion_response is provided, the function extracts token information and the model name from it.
        - If completion_response is not provided, the function calculates token counts based on the model and input text.
        - The cost is calculated based on the model, prompt tokens, and completion tokens.
        - For certain models containing "togethercomputer" in the name, prices are based on the model size.
        - For un-mapped Replicate models, the cost is calculated based on the total time used for the request.
    r   aimage_generationr   Nr   r   zdall-e-2r>   )r   r[   )rP   r   rQ   r   r   r   z*selected model name for cost calculation: rg   r   r?   r@   rT   rU   prompt_tokens_detailscached_tokens_response_msrx   rQ   r   z[Model is None and does not exist in passed completion_response. Passed completion_response=z, model=)rP   r  )rP   textra   zXlitellm.cost_calculator.py::completion_cost() - Error inferring custom_llm_provider - {})rP   rQ   r   r  r  r  ry   rY   duration_seconds)video_generation_cost)rP   r  rQ   )r  rt   rj   search_unitsr^   )r  r^   r_   zusage object and custom_llm_provider must be provided for realtime stream cost calculation. Got cost_per_token_usage_object={}, custom_llm_provider={})resultscombined_usage_objectrQ   r
  )MCPCostCalculator)r   togethercomputertogether_ai)rY   	replicaterz   r  )datarY   )response_objrP   rA   rC   rB   rR   rS   rW   rY   rZ   rX   r\   )rP   response_objectrg   r	  rQ   )r   rQ   )r   r   r   r   r   r   r   r   zXlitellm.cost_calculator.py::completion_cost() - Error calculating cost for model={} - {}z?Unable to calculat cost for received potential model names - {}rI   )Or   r   r   r   r   r   r   append	enumerater   r   r   r   r   r   setattrr   r1   r   r   r   r   r   r   r   r   r
   r/   r0   r   r<   r   r   r   r   _call_type_has_image_responser6   &route_image_generation_cost_calculatorr3   create_videovalueacreate_videovideo_remixavideo_remix$litellm.llms.openai.cost_calculationr  default_video_cost_calculatorrb   rc   utils_count_charactersrq   rr   ri   rh   r(   metar'   	arealtimer*   'handle_realtime_stream_cost_calculationr  call_mcp_tool6litellm.proxy._experimental.mcp_server.cost_calculatorr  calculate_mcp_tool_call_costr   replicate_modelsr   r   get_formatted_promptr7   get_response_stringr   r)   r   get_cost_for_built_in_toolsr   r  )8r   rP   promptr  r   r   rY   rQ   r   r  r  r  rB   rC   ry   r   r   r	  r
  r   r   r[   r?   rR   r@   rS   rT   rU   rZ   cost_per_token_usage_objectrX   selected_modelpotential_model_namesidxr   _usagetr_usager  r   r   r   r  r  meta_objrj   r  r  prompt_stringcompletion_stringr   r   _final_costcost_for_built_in_toolsr   r   r   s8                                                           rL   r   r     s
   pu$Y0CDT	 -->P1P!5#&E
a#w.E+//359#1536)7H 38
# <@ O$?*..~>L9 3 3)!+
 "0 0!((/#$9:JCD$$@H '22I>!"5t<!"5t</33GR@ " %,,?"$M	!)Y7@W"+A  /##MMCI,@,@,BC
 !(!##Iy9!*!5!5!7!*.EEfM!8!d!d""$*,  @]] $J#n#n  %$D$B%D!" !'$ $/%-%8%8%:F!' %+JJ$BM(.

3F(J%28**5q3/ /5jj9RTU.V+/69"#:;rA"#:;06

;RTV0W-2G2K2K+Q3/ "))<na!PJ$+,?AQSW$XM$0.;.?.?13F3N$/+ '4&7&7{&S}(y  {N  zO  OW  X]  W^  _  8}q((5EH(UVq(5E(O(5E
(S%=$u  wJ  vK  KS  TY  SZ  [  '.	;B;S;S"'<82Aq 'DD !4mD.UU#,?,? '!(7"+	 	 !7!7!=!== I$;$;$A$AA I$9$9$?$?? I$:$:$@$@@ !((;Wd KI*69%i6/8}}=OQU/V,/6 )+=t0, ,7 $9&+1A4G$  9#),,?  !1!1!7!77 I$5$5$;$;;(/(G(GV(G(T%!9!9!?!?? I$;$;$A$AA8?+Z95 !1!1!7!77 I$5$5$;$;;*6:+^< $7#;#;#/+3<<+K+QrL+-L.?)5)9)9.)I)5)9)9.)I/+ ),,^<A % -9))"5"5";";;
')KA 4;.6( u  |  | ; 3  C 3 ; ;.I,?+0	  )"9"9"?"?? -II,? J  
 '%/$-*m;
 :9)=E W5559M7#5#55;<OQ[\\=$u  wJ  vK  KS  TY  SZ  [ 
 (3+{: 8}q((/(J(J",h!7< )K ) -4MM,K,K!. -L -) +6:+]< -4MM,M,M)< -N -) 180O0O!2 1P 1- # "/ '8 )<	
 &0 !, ,B +@ '8 +@ 1L -D "= ##3Y? 7X  )<!" ".#$ 1%15, 24UU  4OO#(;97U,? ( 66 !,AU)(;B>- 5(;2O6W<S*5"/%5$3	 #"{	 ;L
 MTT%
 	
K % &,,v}} #A z  $$nuus1v
 #34q88G 9  s   B+c. .Jba)Ab*c. -Cb4c. 7bc. Gbc. 4b?c. Abc. Eb4c. 7c. 	b-bbbb	c+Ac& c. &c++c. .	c>7c99c>r   c                     t        | t              r| j                         }n| }|j                  di       }|rd|v r|d   }|y t	        |d         S y )Nadditional_headersz$llm_provider-x-litellm-response-cost)r   r   r   r   float)r   _hidden_params_dictrB  r   s       rL   $get_response_cost_from_hidden_paramsrE    sl     -++668+,001ErJ26HH*+QR '(NOPPrN   r  )r   
aembeddingr   acompletionatext_completionr   r   r  
moderationamoderationrq   rr   rc   rb   ri   rh   ru   rv   	cache_hitr5  c                     	 d}||du rd}|S t        | t              r4|| j                  d<   t        | d      rt	        | j                        }||S t        | ||||||||	|
|||      }|S # t        $ r}|d}~ww xY w)z7
    Returns
    - float or None: cost of response
    r>   NTry   rx   )r   rP   rY   rQ   ry   r   r   r5  r	  r
  r   r   r[   )r   r   rx   r   rE  r   r   )r  rP   rQ   rY   ry   rK  r   r   r5  r	  r
  r   r   r[   r   provider_response_costr   s                    rL   response_cost_calculatorrN    s    j " Y$%6M6 3 /95DS../@A?,<=-Q'66.* .955+$3#$7 /-%/M#5 /$7)M  s#   A, AA, A, ,	A<5A77A<c                 b   ddl m} |t        ||      st        dt	        |             |j
                  t        d      |j
                  j                  }|t        d      	 t        j                  | |      }d}||j                  d	      xs d}||z  }|dfS # t        $ r d}Y /w xY w)
aJ  
    Args:
        model: str - model name
        custom_llm_provider: Optional[str] - custom LLM provider
        response: Optional[Any] - response object

    Returns:
        Tuple[float, float]: cost of OCR processing

        (Parent function requires a tuple, so we return a tuple. Cost is only in the first element.)
    r   )OCRResponseNz.response must be of type OCRResponse got type=zOCR response usage_info is Nonez$OCR response pages_processed is Nonerd   r>   ocr_cost_per_page)(litellm.llms.base_llm.ocr.transformationrP  r   r   r   
usage_infopages_processedr   r   r   r   )rP   rQ   r\   rP  rT  r   rQ  total_ocr_processing_costs           rL   r   r     s      E
 z(K@<T(^<LM
 	
 ":;;))99O?@@*1*@*@-@+

  #&NN+>?F3'8?'J$c))  
s   'B   B.-B.c                     d}|d}| d| v rt        j                  |       \  }}}}t        j                  t	        |      |      }|t        j                  d|        y|j                  |      S )	zB
    Returns
    - float or None: cost of vector store search
    Nr}   r`   ra   )providerapi_typez)Vector store search is not supported for r>   r>   )r\   )r   r   r8   !get_provider_vector_stores_configr+   r   r   calculate_vector_store_cost)rP   rQ   r\   rX  r   configs         rL   r   r   *  s     #H"&SE\.5.F.F/
+%q! #DD12F
 ~78K7LM	
 -- .  rN   rj   c                 "   t        j                  | |      \  }}}}	 t        j                  | dg t	        |            }	 t        j
                  | |      }|j                  | |||      S # t        $ r d}Y "w xY w# t        $ r}|d}~ww xY w)zI
    Returns
    - float or None: cost of response OR none if error.
    rd   N)rP   api_basepresent_version_paramsrW  )rP   rQ   rj   r   )r   r   r8   get_provider_rerank_configr+   r   r   calculate_rerank_cost)rP   rQ   rj   r   r\  r   r   s          rL   r   r   L  s     $+#;#;)<$ AAq&AA#%!"56	
	.5.D.D1D/J ++ 3%!	 , 
 	
  	J	  s;   "A> A- A> -A;8A> :A;;A> >	BB		Brt   c                     t        | ||      S )Nrs   )r   rs   s      rL   transcription_costrc  r  s     ")<x rN   c                    |xs d}d|v rd|vr|j                  dd      n|}t        t        |j                  d            \  }}| d|  }	d}
|r3| j	                  | d      r| j                  | dd      }
| d| d|
 }	|r| d|	 n|	}t
        j                  j                   d|	 }t        j                  d| d|	        | d| j                  d      d	    }|r| d| n|}d}||	|||| |
g}|D ],  }||t        j                  v st        j                  |   } n |t        d
|       |d   |z  |z  |z  S )a  
    Default image cost calculator for image generation

    Args:
        model (str): Model name
        image_response (ImageResponse): Response from image generation
        quality (Optional[str]): Image quality setting
        n (Optional[int]): Number of images generated
        size (Optional[str]): Image size (e.g. "1024x1024" or "1024-x-1024")

    Returns:
        float: Cost in USD for the image generation

    Raises:
        Exception: If model pricing not found in cost map
    1024-x-1024r   z-x-r`   NrO   zLooking up cost for models: z, ,Model not found in cost map. Tried checking input_cost_per_pixel)replacemapintr   
startswithr    MEDIUMr#  r   r   r   r   r   )rP   rQ   r  r  r  ry   size_strheightwidthbase_model_name&model_name_without_custom_llm_providermodel_name_with_qualitymodel_name_with_v2_qualitymodel_without_provider#model_with_quality_without_provider	cost_infomodels_to_check_models                     rL   default_image_cost_calculatorrz  z  s   2 )MH (?uH4 	e$  X^^E23MFE "
!E7+O<@*u//3F2Gq0IJ16"#1%r2
. ##1XJa0V/WX 	 +27)1_%&  )//55
6a7HI  
&'>&?r/ARS !)z5;;s+;B+?*@A187)1+,->T (
 !%I"+.,O "&G,>,>">**62I " :?:KL
 	
 +,v5=AArN   r  c                 L   | }d}|r0| j                  | d      r| j                  | dd      }| d| }t        j                  d|        | j	                  d      d   }d}|| ||g}|D ],  }||t
        j                  v st
        j                  |   } n |.|r,| d|  }	|	t
        j                  v rt
        j                  |	   }|t        d|       |j                  d      }
|
|
|z  S |j                  d      }|||z  S t        j                  d	|  d
       y)a~  
    Default video cost calculator for video generation

    Args:
        model (str): Model name
        duration_seconds (float): Duration of the generated video in seconds
        custom_llm_provider (Optional[str]): Custom LLM provider

    Returns:
        float: Cost in USD for the video generation

    Raises:
        Exception: If model pricing not found in cost map
    Nr`   rO   z!Looking up cost for video model: rf  rg   output_cost_per_video_per_secondr   z*No cost information found for video model z<. Please add pricing to model_prices_and_context_window.jsonr>   )
rl  ri  r   r   r   r   r   r   r   info)rP   r  rQ   rq  rr  ru  rw  rx  ry  prefixed_modelvideo_cost_per_secondr   s               rL   r(  r(    s   ( O<@*u//3F2Gq0IJ16"#1%r2
. ##1%K$LM 	 <_<MNO"[[-b1 !%I.	,O "&G,>,>">**62I " 0/0%9W///**>:I:?:KL
 	

 &MM*LM($'777 ']]+CD)%(888 
4UG;wx rN   rg   c                    t        j                  ||      \  }}}}t        j                  d||       	 t        j                  ||      }|sy|j                  d      }|j                  d      }|j                  d      }|j                  d      }d	}	d	}
|r| j                  |z  }	n|r| j                  |z  d
z  }	|r| j                  |z  }
|	|
fS |r| j                  |z  d
z  }
|	|
fS # t
        $ r d}Y w xY w)z+
    Calculate the cost of a batch job
    rd   zBCalculating batch cost per token. model=%s, custom_llm_provider=%sNrY  input_cost_per_token_batchesrF   output_cost_per_token_batchesrG   r>      )	r   r   r   r   r   r   r   r?   r@   )rg   rP   rQ   r   r   r  rF   r  rG   total_prompt_costtotal_completion_costs              rL   r   r     sD    $+#;#;)<$ AAq L*1*@*@-@+

 #->>2P#Q %>>*@A$.NN3R$S!&NN+BC#!//2NN	#781< 	 % % 7 7:W W 333 
##'<=A 	 3333  
s   C* *C87C8c                   ,    e Zd Zedee   defd       Zy)BaseTokenUsageProcessorusage_objectsrD   c                 P   ddl m}m}m}  |       }| D ]  }t	        |      D ]  }|j                  d      rt        t        ||            r+t        ||d      }t        ||d      }|Ht        |t        t        f      s_t        |t        t        f      svt        ||||z           t        |d      r|j                  rt        |d      r|j                  s |       |_        t        |j                        j                  D ]  }t        |j                  |      s|j                  d      r,t        t        |j                  |            rLt        |j                  |d      xs d}t        |j                  |d      xs d}|t        |t        t        f      st        |j                  |||z           t        |d      s|j                   st        |d      r|j                   s |       |_        t        |j                         j                  D ]  }|j                  d      rt        t        |j                   |            r5t        |j                   |d      }t        |j                   |d      }|f|it        |j                   |||z            |S )zs
        Combine multiple Usage objects into a single Usage object, checking model keys for nested values.
        r   )CompletionTokensDetailsWrapperPromptTokensDetailsWrapperr1   r   r  completion_tokens_details)litellm.types.utilsr  r  r1   dirrl  callabler   r   rk  rC  r  r   r  r   model_fieldsr  )	r  r  r  r1   combinedrg   attrcurrent_valnew_vals	            rL   combine_usage_objectsz-BaseTokenUsageProcessor.combine_usage_objectsN  sb   
	
 	
 7 #EE
s+HWUD=Q4R")(D!"<K%eT15G+&we=&{S%LA$g0EF # u565;V;V*AB#995O5QH2 !!<!<=JJD ; ;TB $ 4 (1L1Ld)S T $H$B$BD!LQPQ $ #*%*E*EtQ"O"TST".:gU|3T# ( > > $ +g 5 K& :;33  *EF#== 78 6 !!@!@ANND??3/ ? ?F9 '.$>>a' #*%*I*I4QR"S".;3J# ( B B $ +g 5 Om #L rN   N)__name__
__module____qualname__staticmethodr   r1   r  rI   rN   rL   r  r  M  s*    ST%[ SU S SrN   r  c                   d    e Zd Zededee   fd       Zededefd       Zededede	fd       Z
y)RealtimeAPITokenUsageProcessorr  rD   c                     t        t        t           | D cg c]  }|d   dk(  s| c}      }g }|D ];  }t        j                  |d   j                  di             }|j                  |       = |S c c}w )z<
        Collect usage from realtime stream results
        r   zresponse.doner\   rg   )r   r   r#   r   r   r   r  )r  resultresponse_done_eventsr  rW   s        rL   *collect_usage_from_realtime_stream_resultszIRealtimeAPITokenUsageProcessor.collect_usage_from_realtime_stream_results  s     NR78")O'VF^-NV'ON
 &(*F'SS:&**7B7 
   . +  Ps
   A3
A3
c                 Z    t         j                  |       }t         j                  |      }|S )zH
        Collect and combine usage from realtime stream results
        )r  r  r  )r  collected_usage_objectsr  s      rL   6collect_and_combine_usage_from_realtime_stream_resultszURealtimeAPITokenUsageProcessor.collect_and_combine_usage_from_realtime_stream_results  s8     +UU 	 
 !? T T#!
 %$rN   rg   c                     t        | |      S )Nrg   r  )r*   r  s     rL   create_logging_realtime_objectz=RealtimeAPITokenUsageProcessor.create_logging_realtime_object  s     2
 	
rN   N)r  r  r  r  r"   r   r1   r  r  r*   r  rI   rN   rL   r  r    sx    )	e ( %)%	% %  

7
	+
 
rN   r  r  r  c                 6   d}g }| D ]?  }|d   dk(  st        t        |      d   j                  dd      }|j                  |       A |j                  |       d}d}|D ]"  }		 |	t	        |	||      \  }
}||
z  }||z  } n ||z   }|S # t
        $ r Y 7w xY w)z
    Handles the cost calculation for realtime stream responses.

    Pick the 'response.done' events. Calculate total cost across all 'response.done' events.

    Args:
        results: A list of OpenAIRealtimeStreamBaseObject objects
    Nr   zsession.createdsessionrP   r>   )rP   rg   rQ   )r   r$   r   r  r   r   )r  r  rQ   r
  received_modelr8  r  rF   rG   
model_name_input_cost_per_token_output_cost_per_tokenr  s                rL   r-  r-    s     N&>..!"CVLc'4   "((8    !34+
		!<R +$7=9!#9 	 55!77 , &(==J  		s   $B'B	BB)r   r   r>   NN)rO   r   r   r>   NNNNr   r   NNNNNr   r>   NN)r>   r   )NNNN)NNN)	NNNrO   NNNNN)NNr_   re  N)r   	functoolsr   typingr   r   r   r   r   r	   r
   r   httpxr   pydanticr   r   litellm._loggingr   litellm.constantsr   r   @litellm.litellm_core_utils.llm_cost_calc.tool_call_cost_trackingr   Dlitellm.litellm_core_utils.llm_cost_calc.usage_object_transformationr   .litellm.litellm_core_utils.llm_cost_calc.utilsr   r   r   r   'litellm.llms.anthropic.cost_calculationr   r   #litellm.llms.azure.cost_calculationr   +litellm.llms.base_llm.search.transformationr   %litellm.llms.bedrock.cost_calculationr   'litellm.llms.databricks.cost_calculatorr   %litellm.llms.deepseek.cost_calculatorr   )litellm.llms.fireworks_ai.cost_calculatorr   #litellm.llms.gemini.cost_calculatorr   %litellm.llms.lemonade.cost_calculatorr   r'  r   r   r   'litellm.llms.perplexity.cost_calculatorr   (litellm.llms.together_ai.cost_calculatorr   &litellm.llms.vertex_ai.cost_calculatorr   r   r   r   r    litellm.llms.xai.cost_calculatorr   litellm.responses.utilsr   litellm.types.llms.openair   r    r!   r"   r#   r$   r%   r&   litellm.types.rerankr'   r(   r  r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   litellm.utilsr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   *litellm.litellm_core_utils.litellm_loggingr=   LitellmLoggingObjectrC  rM   r   rk  r   r   boolr   r   r   r   r   r   r   r   r  r   rE  rN  r   r   r   rc  rz  r(  r   r  r  r-  rI   rN   rL   <module>r     so	     R R R     "  G X Y S U Q ;	 	 	 C        (+48.2 uo
 $L1 %UO eE5L!"0 (+)-'++/12-.48.2'+$(7;"./2"&"7@P@P@P @P uo	@P
 "#@P  }@P $C=@P "*#@P &c]@P $L1@P %UO@P"  }#@P& 5/'@P* ""34+@P.  /@P0 (-1@P4 3-5@P6 sm7@P8 5%<9@PF
	A$ 	A*3 *4 * *.C=!# c], !%%))-%)AC=A!#A A TN	A
 "#A c]A c]AH -./c /d / //--e_-`()@C688!#8 5%8N &*(,'+)!"67)#() (-) .3	)
 !) E?) uo) e_) 
)Z "%,0!48.2&*%) $KO(,%):>"&5mC=m 	m m ()m 3-m c]m }m  $L1!m" %UO#m$ d^%m& TN'm( )m* %--G$H+m, !-m. c]/m0 ""671m4 3-5m6 7m`y)e_t !% $%)KO(,%):>"&_U"* 	U U  "#!U" 	#UJ KUL ~MUN OUP TNQUR SUT %--G$HUUV !WUX c]YUZ ""67[U^ 3-_U` aUv #-*-*!#-* sm-* 5%<	-*`C= ( 5%<	J 15##!## ,-# 5%<	#L%-c]>C
5%< *.!'&*SBSB!#SB c]SB }	SB
 3-SB d^SB SBr *.GGG "#G 	GZ *.040404 "#04 5%<	04fU Up.
%< .
b+%+ + + 	+
 +rN   