
    AHjj             +       f   U d dl Z 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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%Z0 d dl1m%Z2 d dl3m%Z4 d dl5m%Z6 d dl7m%Z8 d dl9m:Z; d dl9m%Z< d dl=m%Z> d dl?m@Z@ d dlAmBZC d dlAm%ZD d dlAmEZF d dlGm%ZH d dlImJZJ d dlKmLZL d dlMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZU d dlVmWZWmXZX d dlYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZc d dldmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZo erd dlpmqZr neZr eseej                  j                  eej                  j                  h      Zw eseej                  j                  eej                  j                  eej                  j                  eej                  j                  h      Z| eseej                  j                  eej                  j                  h      Z eseej                   j                  eej                  j                  h      Z eseej                  j                  eej                  j                  h      Z eseej                  j                  eej                  j                  h      Zeej                  j                  Zeej                  j                  Z	 	 	 	 	 d{dedede	e   de	ef   de	e   de	e
eef      fdZd ed!e	e   dedede	e   f
d"Zd#e	eb   defd$Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d|d ededede	e   d!e	e   d&e	e   d'e	e   d(e	e   d)e	e   de	ef   de	e   d*e	e   d+e	eb   d,e	eW   d-eZd.ed/e	e   d0e	e   d1e	e   de
eef   f(d2Z%d}d3efd4Zd5edefd6Z	 d~d e	e   d!e	e   de	e   fd7Z	 	 	 	 dd e	e   d3e	e   d8e	e   d9e	e   d!e	e   d:e	e   de	e   fd;Z ee<      d edefd=       Zd3ede	e   fd>Zd?d@d@ddAZeedB<   dCe	e   de	e   fdDZd3ede	eb   fdEZdF Zd-e	eZ   d3ede	eZ   fdGZdHed!e	e   de
eeef   fdIZdHed!e	e   de
eeeef   fdJZ	 	 	 	 	 	 	 ddKe	er   dLedMedNedOedPe	e   dQe	e   dRe	e   dSe	e   dTe	e   dUe	e   dVe	e   ddfdWZddd%g d%dddddddddddddddddfd e	e   dXedYe	e   d-e	eZ   dZe	e   d[e	e   d\e	e   de	ef   de	e   d]e	e   d9e	e   d8e	e   d^e	e_   d_e	e   d:e	e   dKe	er   d/e	e   def$d`Zdaeeef   de	e   fdbZ	 	 	 	 	 	 	 	 	 ddceeiegehemeleNeXeUe[ePee,f   d ed!e	e   d-edd   d]edee	e   d8e	e   d9e	e   dfed^e	e_   d_e	e   d:e	e   dKe	er   d/e	e   defdgZ	 d~d ed!e	e   d0e	e   de
eef   fdhZd e	e   d!ed0ecde
eef   fdiZ	 d~d ed!e	e   dje	eW   de
eef   fdkZd ed!e	e   dlede
eef   fdmZ	 	 	 	 	 dd ed!e	e   d[e	e   d\e	e   dZe	e   d]e	e   defdnZ	 	 dd edoed!e	e   dpe	e^   def
dqZ	 	 ddrebd ed!e	e   dpe	e^   de
eef   f
dsZ G dt du      Z G dv dwe      ZdxeQdyebd!ed_edef
dzZy)    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_get_service_tier_cost_key_parse_prompt_tokens_detailscalculate_cost_componentgeneric_cost_per_tokenget_billable_input_tokensselect_cost_metric_for_modelcost_per_token)SearchResponse)cost_per_second)get_model_params_and_category)cost_per_character)cost_router)ResponseAPILoggingUtils)LiteLLMSendMessageResponse)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ModelResponseStream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    )rE   rF   rG   rH   rI   
input_costoutput_costs          O/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/cost_calculator.py%_cost_per_token_custom_pricing_helperrS      sh     $)?)G(*+AB]R
+,CDGXX;&&		+,/??$F+~    modelcustom_llm_providerc                     |sy	 d}|dk(  rddl m} |j                  |       }|r t        |d      r|j	                  | ||      S y# t
        $ r"}t        j                  d|        Y d}~yd}~ww xY w)a  
    Calculate additional costs beyond standard token costs.

    This function delegates to provider-specific config classes to calculate
    any additional costs like routing fees, infrastructure costs, etc.

    Args:
        model: The model name
        custom_llm_provider: The provider name (optional)
        prompt_tokens: Number of prompt tokens
        completion_tokens: Number of completion tokens

    Returns:
        Optional dictionary with cost names and amounts, or None if no additional costs
    Nazure_air   )AzureFoundryModelInfocalculate_additional_costs)rU   rE   rF   z$Error calculating additional costs: )"litellm.llms.azure_ai.common_utilsrY   get_azure_ai_config_for_modelhasattrrZ   	Exceptionr   debug)rU   rV   rE   rF   config_classrY   es          rR   _get_additional_costsrb      s    * I*,P0NNuUL
 GL2NO::+"3 ;     ICA3GHHIs   ?A 	A1A,,A1usage_blockc                     | yt        | dd      xs d}t        | dd      xs d}t        | dd       }|-t        |dd      xs d}t        |dd      xs d}|dkD  s|dkD  ry|dkD  xs |dkD  S )	NFrE   r   rF   prompt_tokens_detailsaudio_tokenstext_tokensT)getattr)rc   prompt_tokens_valcompletion_tokens_valprompt_detailsaudio_token_counttext_token_counts         rR   &_transcription_usage_has_token_detailsrn      s     _a@EA#K1DaHMA[*A4HN!#NNAFK!">=!DIq $4q$8!A'<q'@ArT    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responserequest_modelc           
      B	   | 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't/        |      rt1        |||       S t3        |||!      S |d"k(  s|d#k(  r5dd$lm}$  |$| ||xs d|rt9        |d%      r|j:                  &      S d&      S |d'k(  r8t=        |||(      }%|%dk(  rt?        |||||)      S |%dk(  rtA        ||||*      S y|d+k(  rtC        | |,      S |d-k(  rtE        | ||       S |d.k(  rt1        | ||       S |d/k(  rtG        | |,      S |d0k(  rtI        | |,      S |d1k(  rtK        | ||2      S |d3k(  rtM        | ||       S |d4k(  rtO        | |,      S |d5k(  rtQ        | |,      S |d6k(  rtS        | |,      S |d7k(  rtU        | |,      S |d8k(  rdd9l+m,}&  |&| |,      S |d:k(  rt[        | |||;      S t]        | |      }'|'j_                  d<d      dkD  s|'j_                  d=d      dkD  rt        | |||      S |'j_                  d>d      5|3ta        jb                  d?| |'j_                  d>d      |       |'d>   |z  d@z  }|'j_                  dAd      5|3ta        jb                  dB| |'j_                  dAd      |       |'dA   |z  d@z  }ta        jb                  dC| ||       ||fS )Dar  
    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.)rE   rF   total_tokensrr   rs   )rE   rF   rG   rI   rH   r      /rU   speechaspeechrU   rV   rD   r    zvprompt_characters must be provided for tts calls. prompt_characters={}, model={}, custom_llm_provider={}, call_type={})rU   rV   rp   rq   custom_prompt_costcustom_completion_costzcost for tts call is None. prompt_cost={}, completion_cost={}, model={}, custom_llm_provider={}, prompt_characters={}, completion_characters={}r   )rU   usagerV   ry   arerankrerank)rU   rV   billed_unitsavector_store_searchvector_store_search)rU   rV   rz   ocraocraretrieve_batchretrieve_batch)r   rU   rV   atranscriptiontranscription)rU   r   ry   rU   rV   durationsearchasearchsearch_provider_cost_per_query_hidden_paramsrU   rV   rt   optional_params	vertex_ai)rU   rV   rw   )rU   rV   rp   rq   r   )rU   rV   r   ry   	anthropic)rU   r   bedrockopenai
databricksfireworks_aiazure)rU   r   rG   geminideepseek
perplexityxailemonade	dashscoper   rX   )rU   r   rG   r{   rL   rM   input_cost_per_secondz;For model=%s - input_cost_per_second: %s; response time: %srN   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)2r^   r6   rS   litellm
model_costget_llm_providersplitlenget_model_infor   
ValueErrorformatr   r   rerank_costvector_store_search_costr   r7   ocr_costr8   r   r   batch_cost_calculatorrn   openai_cost_per_tokenopenai_cost_per_secondlitellm.searchr   r]   r   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   azure_ai_cost_per_tokenrA   getr   r_   )(rU   rE   rF   rG   rV   region_namerp   rq   rr   rs   rH   rI   rt   ru   rv   rw   rx   ry   rz   r{   rc   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_costr   r!   dashscope_cost_per_token
model_infos(                                           rR   r   r     s   d }<== "'/&)::(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1+>(*!)  && 36
 	

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


 NN1159~~5q9A=)!$7)	  NN2D9E ,  M6= 	 236FFM *
 NN3T:F ,  N7> 	 347GG$N . 	z)-		
 -.OOOrT   completion_responsec                     t         }|dk(  rH| j                  dt        j                               }t        | dt        j                               }||z
  }||z  dz  S )NrD   createdendedrN   )r   r   timerh   )r   
total_time!a100_80gb_price_per_second_public
start_timeend_times        rR    get_replicate_completion_pricingr   U  sZ     )O%S(,,Y		D
.E
*
,z9D@@rT   objc                     t        | d      S )Nr   )r]   )r   s    rR   has_hidden_paramsr   a  s    3())rT   c                     ||S | y 	 t        j                  |       \  }}}}|S # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY w)Nr   zblitellm.cost_calculator.py::_get_provider_for_cost_calc() - Error inferring custom_llm_provider - )r   r   r^   r   r_   str)rU   rV   r   ra   s       rR   _get_provider_for_cost_calcr   e  sv     &""}'.'?'?e'L$1   pqtuvqwpxy	
 	s   & 	A!AA
base_modelcustom_pricingrouter_model_idc                    d}d}t        | |      }d}|@t        |t              rt        |dd      }n"t        |t              r|j                  dd      }t        |dd      }	|du rR|M|t        j                  v r;t        j                  |   }
|
j                  d      |
j                  d      |}nk| }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
    Nr   rU   r   TrL   r   r   r   r   )
r   
isinstancer   rh   dictr   r   r   r   "_model_contains_known_llm_provider)rU   r   r   r   rV   r   return_modelr   completion_response_modelhidden_paramsentrys              rR    _select_model_name_for_cost_calcr   x  s    #'L!%K5)< 04&)95(/0CWd(S%+T2(;(?(?(N%$+,?AQSW$XM&?g>P>P+P&&7E		01=9945A.$ 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rT   )maxsizec                 :    | j                  d      d   }|t        v S )z:
    Check if the model contains a known llm provider
    r   r   )r   r1   )rU   _provider_prefixs     rR   r   r     s#    
 {{3'*..rT   c                     | yt        | t              rt        | dd      S t        | t              r| j	                  dd      S y)z
    Extract the model name from a completion response object.

    Used as a fallback for cost calculation when the input model name
    doesn't exist in model_cost (e.g., Azure Model Router).
    NrU   )r   r   rh   r   r   r   s    rR   _get_response_modelr     sI     "%y1*GT::	'	."&&w55rT   priorityflex)ON_DEMAND_PRIORITYFLEXBATCH	ON_DEMAND$_GEMINI_TRAFFIC_TYPE_TO_SERVICE_TIERtraffic_typec                 d    | yt         j                  t        |       j                               }|S )a  
    Map a Gemini usageMetadata.trafficType value to a LiteLLM service_tier string.

    This allows the same `_priority` / `_flex` cost-key suffix logic used for
    OpenAI/Azure to work for Gemini and Vertex AI models.

    trafficType values seen in practice
    ------------------------------------
    ON_DEMAND          -> standard pricing  (service_tier = None)
    ON_DEMAND_PRIORITY -> priority pricing  (service_tier = "priority")
    FLEX / BATCH       -> batch/flex pricing (service_tier = "flex")
    N)r  r   r   upper)r  ry   s     rR   !_map_traffic_type_to_service_tierr    s1     7;;C<M<S<S<UVLrT   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 )Nr   r   c                      y NrO   )xs    rR   <lambda>z#_get_usage_object.<locals>.<lambda>  s    rT   zUnknown usage object type: z, usage_obj: rO   )r   r
   r6   r*   r   r   r   r   rh   r"   _is_response_api_usage+_transform_response_api_usage_to_chat_usager   is_transcription_usage_object$transform_transcription_usage_objectr4   r5   
model_dumpr   r_   type)r   	usage_objs     rR   _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	
 rT   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   r6   r*   r   r  r  s    rR   _is_known_usage_objectsr  ,  s=     	9gmm, 	
i!12	
1OO
rT   c                 D   | | S |y t        |t              s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t        |t              ry| S )	N
completion	embeddingr   r   r   image_generationtext_completionsend_message)
r   r<   r=   r:   r@   r$   r-   r;   r?   r#   )rw   r   s     rR   _infer_call_typer  7  s     "%}50: 	'):	;	')>	?	')C	D	'	8	'	7!	')?	@ 	')C	DrT   	base_costc                     | }d}d}|r|t         j                  v rpt         j                  |   }||z  }||z
  }t        j                  t        j
                        r+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)
    rD   zApplied d   z% discount to : $.6f -> $z	 (saved $))r   cost_discount_configr   isEnabledForloggingDEBUGr_   )r  rV   original_costdiscount_percentdiscount_amount
final_costs         rR   _apply_cost_discountr.  V  s     MO2g6R6RR"778KL'*::"_4
&&w}}5  +C/0?R>S T!#&eJs+;9_UXDYYZ\
 +_<<&77rT   c                    | }d}d}d}d}|rd|t         j                  v rRt         j                  |   }t        j                  t        j
                        rt        j                  d| d|        ndt         j                  v rOt         j                  d   }t        j                  t        j
                        r|t        j                  d|        nct        j                  t        j
                        r@t        j                  d| dt        t         j                  j                                       |t        |t        t        f      rt        |      }||z  }nAt        |t              r1d	|v rt        |d	         }|||z  z  }d
|v rt        |d
         }||z  }||z   }t        j                  t        j
                        r:t        j                  d|xs d d|dd|dd|dkD  r|dz  nd d|dd|dd       ||||fS | |||fS )aC  
    Apply provider-specific or global cost margin from module-level config.

    Args:
        base_cost: The base cost before margin (after discount if applicable)
        custom_llm_provider: The LLM provider name

    Returns:
        Tuple of (final_cost, margin_percent, margin_fixed_amount, margin_total_amount)
    rD   Nz*Found provider-specific margin config for z: globalzUsing global margin config: z"No margin config found. Provider: z, Available configs: 
percentagefixed_amountzApplied margin to r"  r#  r$  z
 (margin: r   r!  z% + $z = $r%  )r   cost_margin_configr   r'  r(  r)  r_   listkeysr   intfloatr   )r  rV   r*  margin_percentmargin_fixed_amountmargin_total_amountmargin_configr-  s           rR   _apply_cost_marginr<  x  sL    MN M2g6P6PP223FG&&w}}5  <=P<QQSTaSbc 
W//	/228<&&w}}5  #?!OP&&w}}5  45H4I J&&*7+E+E+J+J+L&M%NP
  mc5\2"=1N"/."@t,},!&}\'B!C#}~'EE#.&+M.,I&J##'::#"%88
&&w}}5  $%8%DH$E F!#&eJs+; <2@12DN3.!LERefiQjjn  pC  DG  oH  HIJ >+>@SSSn&9;NNNrT   litellm_logging_objr   r   'cost_for_built_in_tools_cost_usd_dollartotal_cost_usd_dollaradditional_costsr*  r+  r,  r8  r9  r:  c                     | y	 | j                  |||||||||	|
|       y# t        $ r+}t        j                  dt	        |              Y d}~yd}~ww xY w)ar  
    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
        additional_costs: Free-form additional costs dict (e.g., {"azure_model_router_flat_cost": 0.00014})
        original_cost: Cost before discount
        discount_percent: Discount percentage applied (0.05 = 5%)
        discount_amount: Discount amount in USD
        margin_percent: Margin percentage applied (0.10 = 10%)
        margin_fixed_amount: Fixed margin amount in USD
        margin_total_amount: Total margin added in USD
    N)rP   rQ   
total_costr>  r@  r*  r+  r,  r8  r9  r:  zError storing cost breakdown: )set_cost_breakdownr^   r   r_   r   )r=  r   r   r>  r?  r@  r*  r+  r,  r8  r9  r:  breakdown_errors                rR   $_store_cost_breakdown_in_logging_objrE    sw    > "..49,4[-'-+) 3 3 	/ 	
  =c/>R=STUs   " 	A!AAmessagesr   sizequalitynr   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
      }|A| ?t        | t              rt        | d
d      }n!t        | t              r| j                  d
      }|A|?t        |t              rt        |d
d      }n!t        |t              r|j                  d
      }t        || ||||      }|t        |       g} || j                  |       t        |       D ]  \  }!}	 t        j                  t        j                         rt        j"                  d|        | Pt        | t              st        | t              r/t        | t              r| j                  di       }"nt        | di       }"t        |"t              r:t%        |"      s.t'        | dt)        j*                  dZi |"j-                                |"i }#n#t        |"t              r|"j-                         }#n|"}#t/        j0                  |#      r$t/        j2                  |#      j-                         }#nZt5        j6                  |#      rCt5        j8                  t;        t<        t>        t@        f   |#            }$|$|$j-                         }#n|#}#|#j                  dd      }|#j                  dd      }|#j                  dd      }|#j                  dd      }d|#v r4|#d   i k7  r,|#d   r'|#j                  d      xs i }%|%j                  dd      }t        | dd      }t        | dd      }&|&|&j                  d|xs d      }|&j                  d|      }||&j                  d      xs i }'|'j                  d      }(|(rctC        |(      }nW|tE        d|  d|       t        |      dkD  rtG        ||      }nt        |      dkD  rtG        ||      }tG        ||      }|tH        v rddl%m&}) |)jO                  |       c S |tE        d|  d|       |	 t)        jP                  |!      \  }}}*}*tW        jX                  |      r/t        | tZ              rtW        j\                  ||| |
||	||#      c S |t^        v rd},|r9|7t        |d$d      }-|-(|-j                  d%i       xs i }.|.j                  d&d      },t        | dd      }"| H|"rFt        |"t              r|"j                  d'd      }/nt        |"d'd      }/|/dd(l0m1}0  |0||/||,)      c S te        |d||,)      c S |tf        v r"t(        jh                  jk                  |*      }n|tl        v r0t        | di       xs i }1|1j                  d+t        | d,d            }n|tn        v r| t        | tp              r| jr                  }2|2|2j                  d-i       xs i }3ni }3tu        |3j                  d.      |3j                  d/      0      }|3j                  d.      xs d1}4|4}n|tv        v rdd2l<m=}5 d1}6|1|j                  d3      }7t        |7t|              rt        |7      }6n|7d1}6|xs d4}8|r	d5|8vr| d6}8 |5|8||6|7      \  }9}:|9|:z   };|;}<t        |;|8      \  };}=}>t        |;|8      \  };}?}@}At        ||9|:d|;|<|=|>|?|@|A9       |;c S |t        k(  rJt        | t              r:||tE        d:jU                  ||            t        | j                  |||;      c S |t        k(  rdd<lGmH}B |Bj                  |       c S d=|v s	d>|v s|d>k(  rt        |t        |      ?      }n6|t(        j                  v sd@|v r |t(        j                  vrt        | |      c S |tE        d|  d|       ||dAk(  rt        |      dkD  rCt(        jh                  j                  dB|idC      }Ct(        jh                  jk                  |C*      }| Pt        | t              r@t(        jh                  j                  | D      }Dt(        jh                  jk                  |D*      }d}E||j                  }Et        dZi dE|d|xs dd|xs dd|dF|d|dG|dH|dI|dJ|d|d|dK|dL|dM|dN|d
|dO| dPE\  }F}G|dQk(  rE}H| jt        | dd      xs i }&|&j                  dE      xs |&j                  dR      }I|Ir/dSIxs d4j                         v sdTIxs d4j                         v rI}HnHI}HH|}Ht        H||xs d|xs dU      }Jnd}JFGz   };t        j                  || |||V      }K|;|Kz  };Jr|;t        Jj                               z  };|;}<t(        j                  rt        |;|8      \  };}=}>nd}=d}>t(        j                  rt        |;|8      \  };}?}@}And}?d}@d}A|t        |FGK|;|<J|=|>|?@AW       |;c S  tS        dYjU                  |             # tR        $ r8}+t        j"                  d"jU                  t        |+                   Y d}+~+d}+~+ww xY w# tR        $ rL}+t        j"                  dXjU                  |t        |+                   |!t        |       d1z
  k(  r|+Y d}+~+	d}+~+ww xY w# tR        $ r}+|+d}+~+ww xY w)[a  
    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-2rD   r   ry   )rU   r   rV   r   r   r   z*selected model name for cost calculation: r   r  rE   rF   rr   rs   re   cached_tokens_response_msr   rV   r   provider_specific_fieldsr  z[Model is None and does not exist in passed completion_response. Passed completion_response=z, model=)rU   rF  )rU   text)A2ACostCalculator)r=  r   zXlitellm.cost_calculator.py::completion_cost() - Error inferring custom_llm_provider - {})rU   rV   r   rH  rI  rG  r   rw   litellm_paramsmetadatar   duration_seconds)video_generation_cost)rU   rU  rV   r   )rQ  audio_transcription_durationr   r   search_unitsr}   )rX  r}   r~   r   queryro   r   z/searchr   )r  rV   )r=  r   r   r>  r?  r*  r+  r,  r8  r9  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_objectrV   rK  )MCPCostCalculatortogethercomputertogether_ai)rw   	replicater   rF  )datarw   )response_objrU   rG   rI   rH   rp   rq   ru   rw   rx   rv   rz   r{   rX   rK  model_routerzmodel-router)rU   rV   rE   rF   )rU   response_objectr   rJ  rV   )r=  r   r   r>  r?  r*  r@  r+  r,  r8  r9  r:  zXlitellm.cost_calculator.py::completion_cost() - Error calculating cost for model={} - {}z?Unable to calculat cost for received potential model names - {}rO   )\r  r   r   r   r  r   r   rh   r   r   r   append	enumerater   r'  r(  r)  r_   r  setattrr   r6   r  r"   r  r  r   r  r  r   r
   r4   r5   r  r   rB   _A2A_CALL_TYPES$litellm.a2a_protocol.cost_calculatorrR  calculate_a2a_costr   r^   r   r   _call_type_has_image_responser;   &route_image_generation_cost_calculator_VIDEO_CALL_TYPES$litellm.llms.openai.cost_calculationrV  default_video_cost_calculator_SPEECH_CALL_TYPESutils_count_characters_TRANSCRIPTION_CALL_TYPES_RERANK_CALL_TYPESr-   metar,   _SEARCH_CALL_TYPESr   r   r4  r.  r<  rE  _AREALTIME_CALL_TYPEr/   'handle_realtime_stream_cost_calculationrZ  _MCP_CALL_TYPE6litellm.proxy._experimental.mcp_server.cost_calculatorr\  calculate_mcp_tool_call_costr   r8   replicate_modelsr   r   get_formatted_promptr<   get_response_stringrU   r   lowerrb   r   get_cost_for_built_in_toolssumvaluesr&  r3  )Lr   rU   promptrF  r  r   rw   rV   r   rG  rH  rI  rH   rI   r   r   r   rJ  rK  r   r=  ry   rE   rp   rF   rq   rr   rs   rx   cost_per_token_usage_objectrv   selected_modelpotential_model_namesidxr  _usagetr_usagere   r   provider_specificraw_traffic_typerR  r   ra   _video_model_info_litellm_params	_metadatarU  rV  _hiddenmeta_objr   rX  r   rt   rY  search_modelr   completion_cost_result_final_costr*  r+  r,  r8  r9  r:  r\  prompt_stringcompletion_stringrequest_model_for_costr   r   model_for_additional_costshidden_modelr@  cost_for_built_in_toolssL                                                                               rR   r   r     s6   pk$Y0CDT	 -->P1P!5#&E
a#w.E+//359#1536)7H 38
# <@ O$?*..~>L $7$C-y9&':NDQ/6266~F $?$K5yA&/  7>:>>~N9 3 3)!+
  34!
 !((/#$9: h	JCg!..w}}="((DUGL '22I>!"5t<!"5t< 0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"#:; #JJ'>?E2 . 3H2K2K+Q3/ "))<na!PJ$+,?AQSW$XM$0.;.?.?13F3N$/+ '4&7&7{&S (/ - 1 12L M SQS . 0A/D/D^/T,//P$40" }(y  {N  zO  OW  X]  W^  _  8}q((5EH(UVq(5E(O(5E
(S% /V,??,? @   =$u  wJ  vK  KS  TY  SZ  [  '.	;B;S;S"'<82Aq 'DD !4mD.UU#,?,? '!(7"+	 	 "33 >B%%*=*I*1/1A4+ +6(7(;(;J(K(QrI09lD0Q- '(;Wd KI*69%i6/8}}=OQU/V,/6 )+=t0, ,7 $9&+1A4G+<	$  9#),,?#4	  "44(/(G(GV(G(T%";;
 &&9;KRPVTVG8?6 3ZE95 "44*6:+^< $7#;#;#/+3<<+K+QrL+-L.?)5)9)9.)I)5)9)9.)I/+ ),,^<A % -9)"44M )*%&2 / 3 3G <%eT203E
-".01-#(;BL*s,/F*=)>g'F
 7*,?*;(7	#. #.0F"FK %0M
 -"-,?	#(' +"-,?#&++ 9,?6A:P@C.9&3)9(7'5,?,? '&"66:')K< 4;.6( u  |  | ; 3  C 3 ; ;.I,?+0	  .0 -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-
 *.&&2-@-F-F*
 # "/"41 '8&<1 )<	
 &0 !, ,B +@ '8 +@ 1L -D "= ( 7X  )<!" ".#$ 1%& #9'150 '*41G.*6#$79I4PVTV & (5'8'8'A (]EVEV0F (*|/Ar.H.H.JJ-,2D"1K1K1MM9E67?9E6195:2'<8,?&3&8q*;*@q	($ (,$ 24UU  4OO#(;97U,? ( 66#3'7'>'>'@#AAK +//
 -"-,?	#(' (+$&)O -- +"-,?#&++ &)N*-'*-' '28,?6S:[@W.9&3)9)9(7'5,?,? #"Ah	R MTT%
 	
_ % &,,v}} #A N  $$nuus1v
 #34q88G 9  s   D;k >Ljk jh=6Aj7k :Bjk j$k 'Fj4k 7Ajk 
 j*k -Ajk Ijk "k =	i>-i93j9i>>j	k
Akk kk 	k)"k$$k)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   r7  )r   _hidden_params_dictr  r   s       rR   $get_response_cost_from_hidden_paramsr  Y  sl     -++668+,001ErJ26HH*+QR '(NOPPrT   rc  )r  
aembeddingr  acompletionatext_completionr  r  rM  
moderationamoderationr   r   r   r   r   r   r   r   	cache_hitr  c                     	 d}||du rd}|S t        | t              r4t        | d      r(|| j                  d<   t	        | j                        }||S t        | ||||||||	|
|||      }|S # t        $ r}|d}~ww xY w)z7
    Returns
    - float or None: cost of response
    rD   NTr   r   )r   rU   rw   rV   r   r   r   r  rJ  rK  r   r=  ry   )r   r   r]   r   r  r   r^   )rc  rU   rV   rw   r   r  r   r   r  rJ  rK  r   r=  ry   r   provider_response_costra   s                    rR   response_cost_calculatorr  m  s    j" Y$%6M4 1 /95?,<=HWO223DE-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 Noner   rD   ocr_cost_per_page)(litellm.llms.base_llm.ocr.transformationr  r   r   r  
usage_infopages_processedr   r   r^   r   )rU   rV   rz   r  r  r   r  total_ocr_processing_costs           rR   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   r   )providerapi_typez)Vector store search is not supported for rD   rD   )rz   )r   r   r>   !get_provider_vector_stores_configr0   r   r_   calculate_vector_store_cost)rU   rV   rz   r  r   configs         rR   r   r     s     #H"&SE\.5.F.F/
+%q! #DD12F
 ~78K7LM	
 -- .  rT   r   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.
    r   N)rU   api_basepresent_version_paramsr  )rU   rV   r   r   )r   r   r>   get_provider_rerank_configr0   r   r^   calculate_rerank_cost)rU   rV   r   r   r  r   ra   s          rR   r   r     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r   c                     t        | ||      S )Nr   )r   r   s      rR   transcription_costr  <  s     ")<x rT   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|v r|d   |d   |z  S d|v r|d   |d   |z  |z  |z  S t        d|  d|       )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, z,Model not found in cost map. Tried checking input_cost_per_imageinput_cost_per_pixelz'No pricing information found for model z. Tried checking )replacemapr6  r   
startswithr%   HIGHvaluer   r_   r   r   r^   )rU   rV   rH  rI  rG  r   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                     rR   default_image_cost_calculatorr  D  sK   2 )MH (?uH4 	e$  X^^E23MFE "
!E7+O<@*u//3F2Gq0IJ16"#1%r2
. ##1XJa0V/WX 	 +27)1_%&  )--33
4Ao5FG  
&'>&?r/ARS !)z5;;s+;B+?*@A187)1+,->T (
 !%I"+.,O " &G,>,>">**62I :?:KL
 	
 	)+,-9/0144 	)+,-9/069EAAEE5eW<MoM^_
 	
rT   rU  r   c                 h   d}|t        |      }n| }d}|r0| j                  | d      r| j                  | dd      }| d| }t        j                  d|        | j                  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)aN  
    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
        model_info (Optional[ModelInfo]): Deployment-level model info containing
            custom video pricing. When provided, used before falling back to
            the global litellm.model_cost lookup.

    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: r  z&Model not found in cost map for model= output_cost_per_video_per_secondr   z*No cost information found for video model z<. Please add pricing to model_prices_and_context_window.jsonrD   )r   r  r  r   r_   r   r   r   r^   r   info)rU   rU  rV   r   r  r  r  r  r  r  prefixed_modelvideo_cost_per_secondr   s                rR   rn  rn    s   0 !%I$	  @D.5#3#37J6K14M#N5:]]&'q)262 ''q)O(PQ  	@@QRS!&S!1"!5 "2	0
 & 	F!f0B0B&B#..v6		 !4 34AeW=N!3!33#..~>	@HII &MM*LM($'777 ']]+CD)%(888 
4UG;wx rT   r   c                 V   t        j                  ||      \  }}}}t        j                  d||       |	 t        j                  ||      }|sy|j                  d      }|j                  d      }|j                  d      }|j                  d      }d	}	d	}
|r| j                  |z  }	nB|r@t        |       |z  d
z  }	t        |       }|d   }t        dd      }|	t        |||      d
z  z  }	|r| j                  |z  }
|	|
fS |r| j                  |z  d
z  }
|	|
fS # t
        $ r d}Y w xY w)aF  
    Calculate the cost of a batch job.

    Args:
        model_info: Optional deployment-level model info containing custom
            batch pricing (e.g. input_cost_per_token_batches). When provided,
            skips the global litellm.get_model_info() lookup so that
            deployment-specific pricing is used.
    r   zBCalculating batch cost per token. model=%s, custom_llm_provider=%sNr  input_cost_per_token_batchesrL   output_cost_per_token_batchesrM   rD      cache_hit_tokenscache_read_input_token_cost)r   r   r   r_   r   r^   r   rE   r   r   r   r   rF   )r   rU   rV   r   r   r  rL   r  rM   total_prompt_costtotal_completion_costdetailscache_read_tokenscache_read_cost_keys                 rR   r   r     s     $+#;#;)<$ AAq L 	 //1DJ #->>2P#Q %>>*@A$.NN3R$S!&NN+BC#!//2NN	 &e,0DEI 	
 /u5#$678)4
 	$Z1DFWX	
 % % 7 7:W W 333 
##'<=A 	 333M  	J	s   D D('D(c                   ,    e Zd Zedee   defd       Zy)BaseTokenUsageProcessorusage_objectsrJ   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PromptTokensDetailsWrapperr6   r   re   completion_tokens_details)litellm.types.utilsr  r  r6   dirr  callablerh   r   r6  r7  rf  r]   re   r  model_fieldsr  )	r  r  r  r6   combinedr   attrcurrent_valnew_vals	            rR   combine_usage_objectsz-BaseTokenUsageProcessor.combine_usage_objectsC  sx   
	
 	
 7 # D	EE
 	Gs+HWUD=Q4R")(D!"<K%eT15G+&we=&{S%LA$g0EF	G u565;V;V*AB#995O5QH2 !!<!<=JJ D ; ;TB $ 4 (1L1Ld)S T $H$B$BD!LQPQ $ #*%*E*EtQ"O"TST".:gU|3T# ( > > $ +g 5& :;33  *EF#== 78 6 !!@!@ANN D??3/ ? ?F9 '.$>>a' #*%*I*I4QR"S".;3J# ( B B $ +g 5mD	L rT   N)__name__
__module____qualname__staticmethodr   r6   r  rO   rT   rR   r  r  B  s*    ST%[ SU S SrT   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)RealtimeAPITokenUsageProcessorrZ  rJ   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.donerz   r   )r   r   r(   r"   r  r   rd  )rZ  resultresponse_done_eventsr  ru   s        rR   *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  )rZ  collected_usage_objectsr[  s      rR   6collect_and_combine_usage_from_realtime_stream_resultszURealtimeAPITokenUsageProcessor.collect_and_combine_usage_from_realtime_stream_results  s8     +UU 	 
 !? T T#!
 %$rT   r   c                     t        | |      S )Nr   rZ  )r/   r   s     rR   create_logging_realtime_objectz=RealtimeAPITokenUsageProcessor.create_logging_realtime_object  s     2
 	
rT   N)r  r  r  r  r'   r   r6   r  r  r/   r  rO   rT   rR   r  r    sx    )	e ( %)%	% %  

7
	+
 
rT   r  rZ  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sessionrU   rD   )rU   r   rV   )r   r)   r   rd  r   r^   )rZ  r[  rV   rK  received_modelr  r  rL   rM   
model_name_input_cost_per_token_output_cost_per_tokenrB  s                rR   rw  rw    s     N 9&>..!"CVLc'4   "((89   !34+ 
		!<R +$7=9!#9 	 55!77 &(==J  		s   $B'B	BB)r   r   rD   NN)ro   r   r   rD   NNNNr   r   NNNNNr  rD   NNN)rD   r
  )NNNN)NNNNNNN)	NNNro   NNNNN)NNr~   r  N)NN)r(  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   r   r   r   r   'litellm.llms.anthropic.cost_calculationr   r   #litellm.llms.azure.cost_calculationr   %litellm.llms.azure_ai.cost_calculatorr   +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   rm  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.agentsr#   litellm.types.llms.openair$   r%   r&   r'   r(   r)   r*   r+   litellm.types.rerankr,   r-   r  r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   litellm.utilsr8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   *litellm.litellm_core_utils.litellm_loggingrC   LitellmLoggingObject	frozensetasend_messager  r  rg  create_videoacreate_videovideo_remixavideo_remixrl  r   r   ro  r   r   rr  r   r   rs  r   r   ru  	arealtimerv  call_mcp_toolrx  r7  rS   r   r6  r   rb   boolrn   r   r   r   r   r   r   r  __annotations__r  r  r  r  r.  r<  rE  r   r  r  r   r   r   r  r  rn  r   r  r  rw  rO   rT   rR   <module>r0     sA      R R R     "	 	 	 G X Y S U Q ; ;	 	 	 C        %%$$ $$%%##$$	    &  &&%%      !**00 ((..  (+48.2 uo
 $L1 %UO eE5L!".++!#+ + 	+
 d^+\B%B	B( (+)-'++/12-.48.2'+$(7;"./2"&"#';OPOPOP OP uo	OP
 "#OP  }OP $C=OP "*#OP &c]OP $L1OP %UOOP"  }#OP& 5/'OP* ""34+OP.  /OP0 (-1OP4 3-5OP6 sm7OP: C=;OP< 5%<=OPd
	A$ 	A*3 *4 * *.C=!# c], !%%))-%)HC=H!#H H TN	H
 "#H c]H c]HV -./c /d / //S Xc] ( %. $d HSM hsm &--e_-`()@C>88!#8 5%8D@O@O!#@O 5%%&@OR (,%)(,'+&*+/+/5!"675#(5 (-5 .3	5
 !5 tn5 E?5 uo5 e_5 UO5 "%5 "%5 
5r "%,0!48.2&*%) $KO(,%):>"&5c	C=c	 	c	 c	 ()c	 3-c	 c]c	 }c	  $L1!c	" %UO#c	$ d^%c	& TN'c	( )c	* %--G$H+c	, !-c	. c]/c	0 ""671c	4 3-5c	6 7c	Ly)e_t !% $%)KO(,%):>"&_T"* 	T T  "#!T" 	#TJ KTL ~MTN OTP TNQTR STT %--G$HUTV !WTX c]YTZ ""67[T^ 3-_T` aTt #-*-*!#-* sm-* 5%<	-*`C= ( 5%<	J 15##!## ,-# 5%<	#L%-c]>C
5%< *.!'&*b
b
!#b
 c]b
 }	b

 3-b
 d^b
 b
P *.&*	NNN "#N #	N
 Nh *.&*	E4E4E4 "#E4 #	E4
 5%<E4PU Up.
%< .
b+%+ + + 	+
 +rT   