
    h͙                        U d Z ddlZddlZddlZddl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ZmZmZmZmZmZ dd
lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: e"jv                  e"jx                  e"jz                  e"jz                  dZ>ee?e"f   e@d<    G d de      ZAy)zJ
This file contains the transformation logic for the Gemini realtime API.
    N)AnyDictListOptionalUnioncast)verbose_logger)Logging)BaseRealtimeConfigVertexGeminiConfig) LiteLLMCompletionResponsesConfig)AutomaticActivityDetection BidiGenerateContentRealtimeInput&BidiGenerateContentRealtimeInputConfig BidiGenerateContentServerContent BidiGenerateContentServerMessageBidiGenerateContentSetup)OpenAIRealtimeContentPartDone%OpenAIRealtimeConversationItemCreatedOpenAIRealtimeDoneEventOpenAIRealtimeEventsOpenAIRealtimeEventTypesOpenAIRealtimeOutputItemDoneOpenAIRealtimeResponseAudioDone&OpenAIRealtimeResponseContentPartAddedOpenAIRealtimeResponseDelta OpenAIRealtimeResponseDoneObjectOpenAIRealtimeResponseTextDone&OpenAIRealtimeStreamResponseBaseObject+OpenAIRealtimeStreamResponseOutputItemAddedOpenAIRealtimeStreamSession!OpenAIRealtimeStreamSessionEventsOpenAIRealtimeTurnDetection)GeminiResponseModalitiesHttpxBlobTypeHttpxContentType)ALL_DELTA_TYPES'RealtimeModalityResponseTransformOutputRealtimeResponseTransformInputRealtimeResponseTypedDict)get_empty_usage   )encode_unserializable_types)setupCompletez serverContent.generationCompletezserverContent.turnCompletezserverContent.interrupted MAP_GEMINI_FIELD_TO_OPENAI_EVENTc                   H   e Zd Z	 d=dededee   defdZ	 d=dee   dedee   defdZd	ede	fd
Z
dee   de	fdZd>defdZdedefdZdedee   fdZdededefdZ	 d=dededee   dee   fdZ	 d=dededee   defdZ	 d=deee      defdZ	 d=dededededee   dee   fdZdededededef
d Zd!eee      d"ee   d#ee   dedeee f   f
d$Z!d"ee   d#ee   d%eee f   dedee   f
d&Z"e#d'ed(ede$fd)       Z%d*eeee   f   d+eee      deee      fd,Z&d*eeee   f   d-eee'      deee'      fd.Z(	 d=de)d#ee   d/ee   d0eee'      dee   de*fd1Z+d2e	d3ed4e,dede-f
d5Z.d6eded7ee   d3ede	f
d8Z/deee0f   ded9e1d4e,de2f
d:Z3defd;Z4dedefd<Z5y)?GeminiRealtimeConfigNheadersmodelapi_keyreturnc                     |S N )selfr3   r4   r5   s       g/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/gemini/realtime/transformation.pyvalidate_environmentz)GeminiRealtimeConfig.validate_environmentE   s	         api_basec                     |d}|t         j                  j                  d      }|t        d      |j	                  dd      }|j	                  dd      }| d| S )	z
        Example output:
        "BACKEND_WS_URL = "wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent"";
        z'wss://generativelanguage.googleapis.comGEMINI_API_KEYz(api_key is required for Gemini API callszhttps://zwss://zhttp://zws://zR/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=)osenvironget
ValueErrorreplace)r:   r>   r4   r5   s       r;   get_complete_urlz%GeminiRealtimeConfig.get_complete_urlJ   sp     @H?jjnn%56G?GHH##J9##Iw7mnumvwwr=   
model_turnc                    d|v rp|d   }t        |      dk7  r"t        j                  dt        |       d       |d   }d|v rt        j                  S d|v rt        j
                  S t        d|       t        d	|       )
aO  
        Map the model turn event to the OpenAI realtime events.

        Returns either:
        - response.text.delta - model_turn: {"parts": [{"text": "..."}]}
        - response.audio.delta - model_turn: {"parts": [{"inlineData": {"mimeType": "audio/pcm", "data": "..."}}]}

        Assumes parts is a single element list.
        parts   zRealtime: Expected 1 part, got z for Gemini model turn event.r   text
inlineDatazUnexpected part type: z-Unexpected model turn event, no 'parts' key: )lenr	   warningr   RESPONSE_TEXT_DELTARESPONSE_AUDIO_DELTArD   )r:   rG   rI   parts       r;   map_model_turn_eventz)GeminiRealtimeConfig.map_model_turn_event[   s     j w'E5zQ&&5c%j\A^_ 8D~/CCC%/DDD #9$!@AAHUVVr=   
delta_typec                 r    |dk(  rt         j                  S |dk(  rt         j                  S t        d|       )NrK   audiozUnexpected delta type: )r   RESPONSE_TEXT_DONERESPONSE_AUDIO_DONErD   )r:   rS   s     r;   map_generation_complete_eventz2GeminiRealtimeConfig.map_generation_complete_eventv   s?     +>>>7"+???6zlCDDr=   input_audio_formatc                 2    dddd}|j                  |d      S )Nz	audio/pcmz
audio/pcmuz
audio/pcma)pcm16	g711_ulaw	g711_alawzapplication/octet-stream)rC   )r:   rY   
mime_typess      r;   get_audio_mime_typez(GeminiRealtimeConfig.get_audio_mime_type   s'     %%

 ~~02LMMr=   valuec                     t               }d|v rt        |d   t              r
|d    |d<   nd|d<   d|v rt        |d   t              r|d   |d<   d|v rt        |d   t              r|d   |d<   |S )Ncreate_responsedisabledTprefix_padding_msprefixPaddingMssilence_duration_mssilenceDurationMs)r   
isinstanceboolint)r:   r`   automatic_activity_dections      r;   map_automatic_turn_detectionz1GeminiRealtimeConfig.map_automatic_turn_detection   s     &@%A"%*U;L5Mt*T9>?P9Q5Q&z259&z2%'Ju=P7QSV,W<ABU<V&'89 E)j'(#/
 ?D%?&':; *)r=   c                 
    g dS )N)instructionstemperaturemax_response_output_tokens
modalitiestoolsinput_audio_transcriptionturn_detectionr9   )r:   r4   s     r;   get_supported_openai_paramsz0GeminiRealtimeConfig.get_supported_openai_params   s    
 	
r=   optional_paramsnon_default_paramsc                    d|vri |d<   |j                         D ]  \  }}|dk(  rt        dd|ig      |d<    |dk(  r	||d   d<   .|dk(  r	||d   d	<   <|d
k(  r:t        t        t           |      D cg c]  }|j                          c}|d   d<   {|dk(  r6ddlm}  |       }|j                  |       |j                  |      |d   d<   |dk(  r|i |d<   |dk(  st        t        |      }| j                  |      }	t        |	      dkD  st        |	      |d<   
 t        |d         dk(  r|j                  d       |S c c}w )NgenerationConfigrn   userrK   )rolerI   systemInstructionro   rp   maxOutputTokensrq   responseModalitiesrr   r   r   rs   inputAudioTranscriptionrt   )automaticActivityDetectionrealtimeInputConfig)itemsr'   r   r   strupper@litellm.llms.vertex_ai.gemini.vertex_and_google_ai_studio_geminir   _map_functionr$   rl   rM   r   pop)
r:   rv   rw   keyr`   modalityr   vertex_gemini_configvalue_typed!transformed_audio_activity_configs
             r;   map_openai_paramsz&GeminiRealtimeConfig.map_openai_params   s    _424O./,224JCn$7G'88 34 %EJ 23MB44IN 234EF$59$s)U5KM)1HNN$M 234HI  (:';$$2259 )66u=   23 338I=? 9:(("#>F484U4U51 9:Q> ?3T $-C 5L 123q8 23=Ms   4E	messagesession_configuration_requestc           
         i }	 t        j                  |      }g }d|v rL|d   dk(  rD| j                  i |d         }d	| |d
<   |j                  t        j                  d|i             d|v r*|d   dk(  r"t        | j                         |d         |d<   n||d<   t        |      dk7  r1t        dt        |       dt        |j                                      t!        t"        t%        t!        t&        t        t(        f   |                  }|j                  t        j                  d|i             |S # t         j                  $ r> t        |t              r|j                  dd      }nt        |      }t        d|       w xY w)Nutf-8rE   errorsInvalid JSON message: typezsession.updatesession)rv   rw   models/r4   setupzinput_audio_buffer.appendrU   )mimeTypedatarK   rJ   z"Only one argument can be set, got z: realtime_input)jsonloadsJSONDecodeErrorrh   bytesdecoder   rD   r   appenddumpsr&   r_   rM   listkeysr   r   r.   r   object)	r:   r   r4   r   realtime_input_dictjson_messagemessage_strmessages$client_session_configuration_requests	            r;   transform_realtime_requestz/GeminiRealtimeConfig.transform_realtime_request   s    AC	E::g.L !\!l6&:>N&N373I3I "|I7N 4J 40 ?FeW<M09OO

!E l"V$(CC+8113,w:O,( +2'"#q(4S9L5M4N O,113457 
 #,'T#v+->@S(TU

 	

$46I#JKLc ## 	E'5)%nnWYnG!'l5k]CDD	Es   D9 9AF
logging_session_idc                 H   |r&t        j                  |      j                  di       }ni }|j                  d      xs |}|j                  di       xs i }|j                  ddg      }t        t        t
           |      D cg c]  }|j                          }	}|j                  d      }
t        ||	      }|
t        |
t
              r|
|d<   |$t        |t
              r|j                  d	      |d<   t        d
|t        t        j                                     S c c}w )Nr   r4   ry   r~   TEXTr|   )idrq   rn   r   zsession.created)r   r   event_id)r   r   rC   r   r   r   lowerr"   rh   stripr#   uuiduuid4)r:   r4   r   r   "session_configuration_request_dict_modelgeneration_configgemini_modalitiesr   _modalities_system_instructionr   s               r;   transform_session_created_eventz4GeminiRealtimeConfig.transform_session_created_event  s7    )KO::-Lc'2 / 24.377@IE.223ErJPb 	 .112FQ-1$s)=N-O
!)HNN
 
 ADD
 .!"
 *z:Ms/S&9GN#*VS"9%|| GG 1"&
 	
#
s   Dprevious_messagesc                 d    |t        |      dk(  ryd|d   v r|d   d   j                  d      ryy)Nr   Tr   deltaF)rM   endswith)r:   r   s     r;   _is_new_content_deltaz*GeminiRealtimeConfig._is_new_content_delta:  sK     $,=(>!(C&r**/@/DV/L/U/U0
 r=   response_idoutput_item_idconversation_idc                 z   |t        d      t        j                  |      j                  di       }|j                  di       }|j                  ddg      }t	        t
        t           |      D 	cg c]  }	|	j                          }
}	|j                  d      }|j                  d      }g }t        dd	j                  t        j                               d
|dg ||
||d      }|j                  |       t        d|d|ddddg d      }|j                  |       t        dd	j                  t        j                               |ddddg d      }|j                  |       t        dddd	j                  t        j                               ||dk(  rdddnddd|      }|j                  |       |S c c}	w )Nz>session_configuration_request is required for Gemini API callsr   ry   r~   r   ro   r}   zresponse.createdevent_{}realtime.responsein_progress)r   r   statusoutputr   rq   ro   max_output_tokensr   r   responsezresponse.output_item.addedr   realtime.itemr   	assistantr   r   r   r   r{   content)r   r   output_indexitemzconversation.item.created)r   r   r   zresponse.content_part.addedrK    r   rK   rU   r   
transcript)r   content_indexr   r   item_idrQ   r   )rD   r   r   rC   r   r   r   r   r    formatr   r   r   r!   r   r   )r:   r   r   r   rS   r   r   r   r   r   r   _temperature_max_output_tokensresponse_itemsresponse_createdresponse_output_item_addedconversation_item_createdresponse_content_part_addeds                     r;   return_new_content_delta_eventsz4GeminiRealtimeConfig.return_new_content_delta_eventsF  s    )0P  HLzz)H

#gr
 	+ ?BB
 .112FQ-1$s)=N-O
!)HNN
 
 ),,];.223DE57 B#&&tzz|4-!'#2)+%7	
 	./ &Q-#$)!'#	&
" 	89$I,&&tzz|4$)!'#%
! 	78&L.&&tzz|4"
 V#     $'
#" 	9:U
s   1F8c           	      *   d}	 d|v r1d|d   v r*|d   d   D ]  }d|v r	||d   z  }d|v s||d   d   z  }! t        |dk(  rd	nd
ddj                  t	        j
                               |d||      S # t         $ r}t        d| d|       d }~ww xY w)Nr   	modelTurnrI   rK   rL   r   z)Error transforming content delta events: z, got message: response.text.deltazresponse.audio.deltar   r   )r   r   r   r   r   r   r   )	ExceptionrD   r   r   r   r   )r:   r   r   r   rS   r   rQ   es           r;   transform_content_delta_eventsz3GeminiRealtimeConfig.transform_content_delta_events  s     
	g%'W[5I*I#K09D~f-%-l!3F!;;	 : +V# ''&&tzz|4"#

 
	
  	;A3ogYW 	s   'A3 A3 3	B<BBdelta_chunkscurrent_output_item_idcurrent_response_idc           	      X   |r#dj                  |D cg c]  }|d   	 c}      }nd}||t        d      |dk(  r3t        dddj                  t	        j
                               |d||      S |d	k(  r2t        d
ddj                  t	        j
                               |d|      S y c c}w )Nr   r   Qcurrent_output_item_id and current_response_id cannot be None for a 'done' event.rK   zresponse.text.doner   r   )r   r   r   r   r   r   rK   rU   zresponse.audio.done)r   r   r   r   r   r   )joinrD   r   r   r   r   r   )r:   r   r   r   rS   delta_chunkr   s          r;   transform_content_done_eventz1GeminiRealtimeConfig.transform_content_done_event  s     GG\Rk[1RSEE!)-@-Hc  1)#**4::<8./  7"2*#**4::<8./  ## Ss   B'delta_done_eventc                    ||t        d      g }t        t        t           |j	                  d            }t        dddj                  t        j                               |d|r
|dk(  rd|dnddd	|
      }|j                  |       t        ddj                  t        j                               d||dddd|r
|dk(  rd|dnddd	gd      }|j                  |       |S )z`
        - return response.content_part.done
        - return response.output_item.done
        r   rK   zresponse.content_part.doner   r   r   rU   r   r   )r   r   r   r   r   rQ   r   response.output_item.doner   r   	completedr   r   )r   r   r   r   r   )rD   r   r   r   rC   r   r   r   r   r   r   )	r:   r   r   r   rS   returned_itemsdelta_done_event_textresponse_content_part_doneresponse_output_item_dones	            r;   %return_additional_content_done_eventsz:GeminiRealtimeConfig.return_additional_content_done_events  s#    ")-@-Hc  68 $Xc]4D4H4H4P Q%B-&&tzz|4*$v)= !*?@    ,&
" 	89$@,&&tzz|4+,)!%# -v1E $-BC !(&(%
!* 	78r=   objpathc                 p    |j                  d      }| }|D ]  }t        |t              r
||v r||   } y  |S )N.)splitrh   dict)r   r   r   currentr   s        r;   get_nested_valuez%GeminiRealtimeConfig.get_nested_value&  sA    zz#C'4(SG^!#,	 
 r=   transformed_messagecurrent_delta_chunksc                 @   	 t        |t              r;g }d}|D ],  }|d   dk(  s|j                  t        t        |             d}. |sd }|S |d   dk(  r%|g }|j                  t        t        |             |S d }|S # t
        $ r}t        d| d|       d }~ww xY w)NFr   r   Tz%Error updating current delta chunks: , got transformed_message: )rh   r   r   r   r   r   rD   )r:   r  r  any_delta_chunkeventr   s         r;   update_current_delta_chunksz0GeminiRealtimeConfig.update_current_delta_chunks1  s    
	-t4')$"'0EV}(==,33 !<eD +/ 1 ' ) (' (/3HH+3/1,(//8:MN
 (' ,0('' 	7s:UViUjk 	(   !A> (A> ,A> :A> >	BBBcurrent_item_chunksc                 @   	 t        |t              r;g }d}|D ],  }|d   dk(  s|j                  t        t        |             d}. |sd }|S |d   dk(  r%|g }|j                  t        t        |             |S d }|S # t
        $ r}t        d| d|       d }~ww xY w)NFr   r   Tz$Error updating current item chunks: r  )rh   r   r   r   r   r   rD   )r:   r  r
  any_item_chunkr  r   s         r;   update_current_item_chunksz/GeminiRealtimeConfig.update_current_item_chunksU  s    
	-t4&(#!&0EV}(CC+22 !=uE *. 1 & ( '& 'v.2MM*2.0+'..9;NO
 '& +/'&& 	6qc9TUhTij 	r	  current_conversation_idoutput_itemsc                    ||t        d| d|       |r&t        j                  |      j                  di       }ni }|j                  di       }|j                  d      }|j                  d      }	|j                  ddg      }
t	        t
        t           |
      D cg c]  }|j                          }}d	|v rt        j                  |
      }n
t               }t        j                  |      }t        ddj                  t        j                                t#        d|d|r|D cg c]  }|d   	 c}ng |||j%                                     }|||d   d<   |	|	|d   d<   |S c c}w c c}w )Nzqcurrent_conversation_id and current_response_id must all be set for a 'done' event. Got=current_conversation_id: z, current_response_id: r   ry   ro   r   r~   r   usageMetadata)completion_responsezresponse.doner   r   r   r   )r   r   r   r   r   rq   usager   r   )rD   r   r   rC   r   r   r   r   r   _calculate_usager,   r   3_transform_chat_completion_usage_to_responses_usager   r   r   r   r   
model_dump)r:   r   r   r  r  r   r   r   ro   r   r   r   r   _chat_completion_usageresponses_api_usageoutput_itemresponse_done_events                    r;   transform_response_done_eventz2GeminiRealtimeConfig.transform_response_done_eventw  s    #*.A.I D  E\  D]  ]t  uH  tI  J  )KO::-Lc'2 / 24.>BB
 (++M:-112EF-112FQ-1$s)=N-O
!)HNN
 
 g%%7%H%H$+&" &5%6">rr"
 6 &&tzz|45*&" @LLF+L 7&)446

 "=H
+M:(CT
+,?@""C
( Ms    E+)E0openai_eventr   !realtime_response_transform_inputc                    |d   }|d   }|d   }|d   }|d   }	g }
|t         j                  k(  s|t         j                  k(  r|xs# dj                  t	        j
                               }|s`dj                  t	        j
                               }|xs# dj                  t	        j
                               }| j                  |	||||	      }
| j                  t        di |d
   |||      }|
j                  |       nd|t         j                  k(  s|t         j                  k(  r>| j                  ||||      }|g}
| j                  ||||      }|
j                  |       |
|||||dS )Nr   r   r  r  r   zresp_{}zitem_{}zconv_{})r   r   r   r   rS   serverContentrS   )r   r   r   rS   )r   r   r   rS   )returned_messager   r   r  r  current_delta_typer9   )r   rO   rP   r   r   r   r   r   r   r   rV   rW   r   r   extend)r:   r  r   r  rS   r   r   r  r  r   r!  r  transformed_content_done_eventadditional_itemss                 r;   handle_openai_modality_eventz1GeminiRealtimeConfig.handle_openai_modality_event  s    "C$"
 @@UV"C%#
  AAWX(I+)
% 8:4HHH7LLL"5"W9I9I$**,9W))2)9)9$**,)G&*A +YEUEUJJLF' $(#G#G2O 3#9$;) $H $  #'"E"E0Q<3PQ&#%	 #F # ##$784GGG7KKK-1-N-N'=$71%	 .O .* !??#II'=$7!?%	  J   ##$45 !1&<#6'>$8",
 	
r=   r   r"  c                 H   |j                  d      }|j                  d      }d }|r| j                  |      }nV|r| j                  |      }nAt        j	                         D ]*  \  }}||k(  sd|v st
        j                  ||      	 (|} n |t        d| d|       |S )Nr   generationCompleter   r   Unknown openai event: z	, value: )rC   rR   rX   r0   r   r2   r  rD   )	r:   r   r`   r"  r   model_turn_eventgeneration_complete_eventr  map_keys	            r;   map_openai_eventz%GeminiRealtimeConfig.map_openai_event   s     !99[1$)II.B$C!;?445EFL&==- > L
 *J)O)O)Q%c>7N,==lGT  $0L *R 5cU)E7KLLr=   logging_objc           	         	 t        j                  |      }|j                  }|d   }|d   }	|d   }
|d   }|d	   }|d
   }|d   }g }|j                         D ][  \  }}| j                  ||||      }|t        j                  k(  r=| j                  |||d	         }t        j                  |      }|j                  |       l|t        j                   k(  r1| j#                  t%        di ||	|
|d      }|j                  |       |t        j&                  k(  s9|t        j(                  k(  s&|t        j*                  k(  s|t        j,                  k(  rT| j/                  |||d|j0                  v rdnd      }|j3                  |d          |d   }|d   }	|d   }
|d   }|d   }Pt        d|        t5        |      dk(  r=t        |t              r|j                  dd      }nt        |      }t        d|       | j7                  ||      }| j9                  ||      }|||	||
|||dS # t         j                  $ r> t        |t              r|j                  dd      }nt        |      }t        d|       w xY w)z
        Keep this state less - leave the state management (e.g. tracking current_output_item_id, current_response_id, current_conversation_id, current_delta_chunks) to the caller.
        r   rE   r   r   r   r   r  r  r   r
  r"  )r   r`   r"  r   N)r   r   r  r   r  rK   rU   r   r!  r)  r   zUnknown message type: )r  r  )r  r
  )r   r   r   r  r  r
  r"  r   r9   )r   r   r   rh   r   r   r   rD   litellm_trace_idr   r-  r   SESSION_CREATEDr   r   r   RESPONSE_DONEr  r   rO   rV   rP   rW   r&  r`   r#  rM   r  r  )r:   r   r4   r.  r  r   r   r   r   r   r  r  r   r
  r"  r!  r   r`   r  r  transformed_response_done_event_returned_messages                         r;   transform_realtime_responsez0GeminiRealtimeConfig.transform_realtime_response  s:   	E::g.L )99!B$"
 @@UV"C%#
  AAWX(I+)
% @@UV ..BC 	 8:&,,.JC00#5)	 1 L 7GGG&*&J&J&56UV'#
 15

;N0O- ''(;<!9!G!GG262T2T<L|L(;,C2O!% 3U 3/ !''(GH 8 L LL#;#N#NN#;#P#PP#;#O#OO$($E$E  5)/<3E3E)Ev7	 %F %! !''(9:L(MN):;S)T&&78M&N#*;<U*V''89O'P$%67K%L" #9,!HII[ /\  A%'5)%nnWYnG!'l5k]CDD#?? 0!5  @  
 #== 0 3 > 

 )&<#6$8'>#6"4-J	
 		
o ## 	E'5)%nnWYnG!'l5k]CDD	Es   H3 3AJc                      y)NTr9   )r:   s    r;   requires_session_configurationz3GeminiRealtimeConfig.requires_session_configuration  s    r=   c                 \    dg}d}d| d|id}|ri |d<   t        j                  d|i      S )ac  

        ```
        {
            "model": string,
            "generationConfig": {
                "candidateCount": integer,
                "maxOutputTokens": integer,
                "temperature": number,
                "topP": number,
                "topK": integer,
                "presencePenalty": number,
                "frequencyPenalty": number,
                "responseModalities": [string],
                "speechConfig": object,
                "mediaResolution": object
            },
            "systemInstruction": string,
            "tools": [object]
        }
        ```
        AUDIOFr   r~   )r4   ry   outputAudioTranscriptionr   )r   r   )r:   r4   response_modalitiesoutput_audio_transcriptionsetup_configs        r;   r   z2GeminiRealtimeConfig.session_configuration_request  s[    0 @Gi%*"
 ug&!57J K2
 &79L34zz
 	
r=   r8   )r[   )6__name__
__module____qualname__r   r   r   r<   rF   r'   r   rR   r(   rX   r_   r$   r   rl   r   ru   r   r   r#   r   r   ri   r   r   r   r   r   r   r   r   r   r   staticmethodr   r  r  r   r  r   r   r  r*   r)   r&  r-  r   LiteLLMLoggingObjr+   r5  r7  r   r9   r=   r;   r2   r2   D   s   BF$'2:3-	 MQx x.1x<DSMx	x"W*W	!W6E"?3E	!ENc N*0*	#*$	
 	
c 	
-#-9=-	-f 8<	:: : (0}	:
 
c:@ 8<	'
'
  '
 (0}	'

 
+'
V CG
#D)=$>?
 

$ 8<^^ ^ 	^
 $^ (0}^ 
"	#^@
1
 
 	

 $
 
%
@!t$?@A! !)! &c]	!
 $! 
-/NN	O!F; (; &c];  *,KK
	; $; 
"	#;z d # #  ""#7>R9S#ST" 't,G'HI" 
$23	4	"H "#7>R9S#ST  &d+G&HI  
$34	5	 P 8<;#1;# &c];# "*#	;#
 t$@AB;# (0};# 
!;#zJ
.J
 J
 ,J	J

 $J
 
1J
X  %_5	
  
"<l
sEz"l
 l
 '	l

 ,Jl
 
#l
\ '
3 '
3 '
r=   r2   )B__doc__r   rA   r   typingr   r   r   r   r   r   litellmr	   *litellm.litellm_core_utils.litellm_loggingr
   rB  -litellm.llms.base_llm.realtime.transformationr   r   r   Blitellm.responses.litellm_completion_transformation.transformationr   litellm.types.llms.geminir   r   r   r   r   r   litellm.types.llms.openair   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   litellm.types.llms.vertex_air%   r&   r'   litellm.types.realtimer(   r)   r*   r+   litellm.utilsr,   common_utilsr.   r1  rV   r2  r0   r   __annotations__r2   r9   r=   r;   <module>rP     s     	  9 9 " S L     $ 
  * 6 .==(@(S(S":"H"H!9!G!G	I  $s,D'D"E r
- r
r=   