
    i                        U d Z ddlZddlZddlmZmZmZmZmZm	Z	m
Z
mZ ddlZddlmZ ddlZddlmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ dd	lmZmZm Z  dd
l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl) ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7 er	ddl8m9Z: e:Z;ne<Z;dee=   deee=e=f      fdZ>dee=   dee=   dee=   fdZ?dee"   dee=   fdZ@de+dee=   deee=e=f      deee=e<f      de+f
dZA	 	 	 	 dEde=dee=   deee=e=f      dee=   deee=e<f      de+fd ZBd!e=de=fd"ZCd#e=de=fd$ZDd%e=d&eEdee=   fd'ZFg fd(ee+   de+d)ee=   deGfd*ZH	 dFdee"   dee=   deeI   fd+ZJ eKd,d-h      ZLeKeMd.<   d/e,d0eNddfd1ZOdee"   de=d0eNd2ed3   d4eNd5ee=   de,fd6ZPd7ee=   dee"   d8ee=   de=d9ee   d:ee
eQej                  f      d;eeN   d0eNd<e;d2ed3   d4eNd=ee=   d>ee=   d?ee=   de,fd@ZSd7ee=   dee"   d8ee=   de=d9ee   d:ee
eQej                  f      d;eeN   d0eNd<ej                  j                  jr                  d2ed3   d4eNd=ee=   d>ee=   d?ee=   de,fdAZVde(fdBZWdCeGdee"   de	ee.   ee"   f   fdDZXy)Gz|
Transformation logic from OpenAI format to Gemini format.

Why separate file? Make it easy to see how transformation works
    N)TYPE_CHECKINGDictListLiteralOptionalTupleUnioncast)	BaseModel)verbose_logger)_get_image_mime_type_from_url)/convert_generic_image_chunk_to_openai_image_objconvert_to_anthropic_image_obj"convert_to_gemini_tool_call_invoke"convert_to_gemini_tool_call_resultresponse_schema_prompt)AsyncHTTPHandlerHTTPHandler) get_file_mime_type_for_file_typeget_file_type_from_extension is_gemini_1_5_accepted_file_type)AllMessageValuesChatCompletionAssistantMessageChatCompletionAudioObjectChatCompletionFileObjectChatCompletionImageObjectChatCompletionTextObjectChatCompletionUserMessage)*)GenerationConfigPartTypeRequestBodySafetSettingsConfigSystemInstructions
ToolConfigTools)GenericImageParsingChunkLlmProviders   )_check_text_in_contentget_supports_response_schemaget_supports_system_message)Loggingdetailreturnc                 L    | dk(  rddiS | dk(  rddiS | dk(  rddiS | dk(  rdd	iS y )
NlowlevelMEDIA_RESOLUTION_LOWmediumMEDIA_RESOLUTION_MEDIUMhighMEDIA_RESOLUTION_HIGH
ultra_highMEDIA_RESOLUTION_ULTRA_HIGH )r.   s    }/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/vertex_ai/gemini/transformation.py(_convert_detail_to_media_resolution_enumr<   B   sV     /00	8	233	6	011	<	677    current
new_detailc                 z    ddddd}| r|j                  | d      nd}|r|j                  |d      nd}||kD  r|S | S )z
    Compare two media resolution values and return the highest one.
    Resolution hierarchy: ultra_high > high > medium > low > None
          r)      )r8   r6   r4   r1   r   )get)r>   r?   resolution_prioritycurrent_prioritynew_prioritys        r;   _get_highest_media_resolutionrH   P   sV     *+A1M>E*..w:1=G&**:q9QL&&Nr=   messagesc                    d}| D ]  }|j                  d      }t        |t              s%|D ]  }t        |t              sd}|j                  d      dk(  r3|j                  d      }t        |t              rX|j                  d      }nF|j                  d      dk(  r2|j                  d      }t        |t              r|j                  d      }|st	        ||      }  |S )aw  
    Extract the highest media resolution (detail) from image content in messages.

    This is used to set the global media_resolution in generation_config for
    Gemini 2.x models which don't support per-part media resolution.

    Args:
        messages: List of messages in OpenAI format

    Returns:
        The highest detail level found ("high", "low", or None)
    Ncontenttype	image_urlr.   file)rD   
isinstancelistdictrH   )rI   max_resolutionmsgrK   itemr.   rM   file_objs           r;   +_extract_max_media_resolution_from_messagesrV   `   s     %)N'')$gt$!$-(,88F#{2 $ 5I!)T2!*x!8XXf%/#xx/H!(D1!)h!7%B&&N   & r=   partmodelmedia_resolution_enumvideo_metadatac                     || S ddl m} |j                  |      s| S t        |       }|||d<   |-i }d|v r|d   |d<   d|v r|d   |d<   d|v r|d   |d<   |r||d	<   t	        t
        |      S )
zV
    Apply the unique media_resolution and video_metadata parameters of Gemini 3+
    rC   )VertexGeminiConfigmedia_resolutionfpsstart_offsetstartOffset
end_offset	endOffsetrZ   )"vertex_and_google_ai_studio_geminir\   _is_gemini_3_or_newerrQ   r
   r!   )rW   rX   rY   rZ   r\   	part_dictgemini_video_metadatas          r;   _apply_gemini_3_metadatarg      s     }F33E:T
I((=	$%! "N"+9%+@!%(^+3A.3Q!-0>)1?1M!+. *?I&')$$r=   rM   formatc                 L   	 d| v rzt         j                  j                  |       d   }|dd }|s0t        |      }t	        |      st        d|       t        |      }n|}t        ||       }	d|	i}
t        |
|||      S d| v r1|xs t        |       x}	 t        ||       }	d|	i}
t        |
|||      S d	| v sd| v sd
| v r8t        | |      }|d   |d   d}dt        t        |      i}
t        |
|||      S t        dj                  |             # t
        $ r}|d}~ww xY w)a  
    Given a media URL (image, audio, or video), return the appropriate PartType for Gemini
    By the way, actually video_metadata can only be used with videos; it cannot be used with images, audio, or files. However, I haven't made any special handling because vertex returns a parameter error.

    Args:
        image_url: The URL or base64 string of the media (image, audio, or video)
        format: The MIME type of the media
        media_resolution_enum: Media resolution level (for Gemini 3+)
        model: The model name (to check version compatibility)
        video_metadata: Video-specific metadata (fps, start_offset, end_offset)
    zgs://rC   Nz$File type not supported by gemini - )	mime_typefile_uri	file_datazhttps://zhttp://base64)rh   data
media_type)ro   rk   inline_datazInvalid image received - {})ospathsplitextr   r   	Exceptionr   FileDataTyperg   r   r   r
   BlobTyperh   )rM   rh   rY   rX   rZ   extension_with_dot	extension	file_typerk   rm   rW   
image_typeimage_blobes                  r;   _process_gemini_mediar      s|   &)i!#!1!1)!<R!@*12.I8C	 8	B#&J9+$VWW<YG	"	$y9MI)95D+e2N  )#%Q)Fy)QQ %zINI+D+e2N  )#zY'>(iBW29VLE',V}5CVWE!4%#89D+e2N  5<<YGHH s+   A=D  4D 5AD 9D 	D#DD#	snake_strc                 f    | j                  d      }|d   dj                  d |dd D              z   S )zConvert snake_case to camelCase_r    c              3   <   K   | ]  }|j                           y wN)
capitalize).0xs     r;   	<genexpr>z"_snake_to_camel.<locals>.<genexpr>   s     "J>a1<<>>s   rC   N)splitjoin)r   
componentss     r;   _snake_to_camelr      s4    %Ja=277"J:ab>"JJJJr=   	camel_strc                 L    ddl }|j                  dd|       j                         S )zConvert camelCase to snake_caser   Nz(?<!^)(?=[A-Z])r   )resublower)r   r   s     r;   _camel_to_snaker      s"    66$c95;;==r=   keyavailable_keysc                 T    | |v r| S t        |       }||v r|S t        |       }||v r|S y)ze
    Get the equivalent key from available keys, checking both camelCase and snake_case variants
    N)r   r   )r   r   	camel_key	snake_keys       r;   _get_equivalent_keyr      sH     n
  $IN"  $IN"r=   partsexcluded_keysc                    t        |j                               t        |      z
  }| D ]_  }t        |j                               }d}|D ]9  }t        ||      }|&|j                  |d      |j                  |d      k7  s7d} n |s_ y y)z
    Check if a part exists in a list of parts
    Handles both camelCase and snake_case key variations (e.g., function_call vs functionCall)
    TNF)setkeysr   rD   )	r   rW   r   keys_to_comparepp_keysmatch_foundr   equivalent_keys	            r;   check_if_part_exists_in_partsr   
  s     $))+&]);;OQVVX"C0f=N%~t)DTI * $ #   r=   c           
      2   ddh}g }d}d}g }	 |t        |       k  rg }|}|t        |       k  r| |   d   |v r| |   j                  d      }	|	tt        |	t              rcg }
t	        |	      D ]@  \  }}|d   dk(  rFd|v rBt        |d         dkD  r1t        t        |      }t        |d   	      }|
j                  |       U|d   d
k(  rt        t        |      }|}d}d}t        |d
   t              r<|d
   d   }|d
   j                  d      }|d
   j                  d      }t        |      }n|d
   }t        ||||      }|
j                  |       |d   dk(  rt        t        |      }|d   j                  d      }|d   j                  d      }|,|0|j                  d      du rd|z   n|}t        t!        d||            }t        |||      }|
j                  |       |d   dk(  st        t"        |      }|d   j                  d      }|d   j                  d      }|d   j                  d      }|d   j                  d      }|d   j                  d      }|xs |}|t%        d      t        |      }	 t        |||||      }|
j                  |       C |j)                  |
       n/|	-t        |	t*              rt        |		      }|j                  |       |dz  }|t        |       k  r| |   d   |v r|r\	 t-        |      }|du r0t/        j0                  d       |j                  t        d 	             |j                  t3        d|!             g }|t        |       k  rA| |   d   d"k(  r5t        | |   t4              r| |   j7                         }n| |   }t9        dCi |} | j                  dd      }	| j                  d#d      }!| j                  d$      }"|!|j                  t        d%|!&             |"h|"D ]c  }#|#d   d'k(  s|#j                  d'      }$|#j                  d(      }%|$1|%4	 |j                  t        dCd)|%it;        j<                  |$             e |	et        |	t              rUg }
|	D ]<  }t        |t              s|d   dk(  st        |d   	      }|
j                  |       > |j)                  |
       n|	t        |	t*              r|	}&| j                  d+      }'d}(|'r!t        |'t              r|'j                  d,      }(|(r>t        |(t              r.t        |(      dkD  r |j                  t        |&|(d   -             n|j                  t        |&	             | j                  d.      })|)t        |)t              r|)D ]  }*t        |*t              s|*j                  d
      }+t        |+t              s6|+j                  d      },|+j                  d      }|+j                  d      }t        |      }|,swt        |,|||      }|j                  |        | j                  d/g       | j                  d0      7t?        | |1      }-|-D ]#  }.tA        ||.d)g2      r|j                  |.       % | }| j                  d+      }/t        |/t              r|/j                  d3      }0t        |0t              r|0D ]  }1d4|1j                  d5      |1j                  d6      |1j                  d7      d8i}2d9|1v r|1d9   |2d)<   |j                  |2       d:|1v sZ|1j                  d6      |1j                  d:      d;}3|1j                  d5      r|1d5   |3d<<   d=|3i}4d9|1v r|1d9   |4d)<   |j                  |4        |dz  }|t        |       k  r| |   d   d"k(  r5|r|j                  t3        d>|!             d?d@g}5|t        |       k  rQ| |   d   |5v rGtC        | |   |      }|dz  }t        |t              r|j)                  |       n|j                  |       |t        |       k  r6| |   d   |5vr,t        |      dkD  r|j                  t3        d|!             g }||k(  rt%        dAj'                  | |               |t        |       k  rt        |      dkD  r|j                  t3        d|!             t        |      dk(  r<t/        j0                  dB       |j                  t3        dt        d 	      g!             |S # t$        $ r t%        dj'                  |||            w xY w# t$        $ r  |j                  t        |%|$*             Y ew xY w# t$        $ r}6|6d}6~6ww xY w)Da!  
    Converts given messages from OpenAI format to Gemini format

    - Parts must be iterable
    - Roles must alternate b/w 'user' and 'model' (same as anthropic -> merge consecutive roles)
    - Please ensure that function response turn comes immediately after a function call turn
    usersystemNr   rolerK   rL   textr   rM   urlrh   r.   )rM   rh   rY   rX   input_audioro   zaudio/Frn   )rL   rp   ro   )image_chunk)rM   rh   rX   rN   file_idrm   rZ   z8Unknown file type. Please pass in a file_id or file_data)rM   rh   rX   rY   rZ   zlUnable to determine mime type for file_id: {}, set this explicitly using message[{}].content[{}].file.formatrC   zNo text in user content. Adding a blank text to user content, to ensure Gemini doesn't fail the request. Relevant Issue - https://github.com/BerriAI/litellm/issues/5515 )r   r   	assistantreasoning_contentthinking_blocksT)thoughtr   thinking	signaturethoughtSignature)r   r   provider_specific_fieldsthought_signatures)r   r   images
tool_callsfunction_call)rX   )r   server_side_tool_invocationstoolCall	tool_typeidargs)toolTyper   r   thought_signatureresponse)r   r   r   toolResponserX   toolfunctionzWInvalid Message passed in - {}. File an issue https://github.com/BerriAI/litellm/issuesa%  
                No contents in messages. Contents are required. See
                https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.publishers.models/generateContent#request-body.
                If the original request did not comply to OpenAI API requirements it should have failed by now,
                but LiteLLM does not check for missing messages.
                Setting an empty content to prevent an 400 error.
                Relevant Issue - https://github.com/BerriAI/litellm/issues/9733
                r:   )"lenrD   rO   rP   	enumerater
   r   r!   appendr   rQ   r<   r   r   
startswithr   r'   r   ru   rh   extendstrr*   r   warningContentTyper   
model_dumpr   jsonloadsr   r   r   )7rI   rX   user_message_typescontentslast_message_with_tool_callsmsg_itool_call_responsesuser_content
init_msg_i_message_content_partselement_idxelement_partimg_elementrh   rY   rM   r.   audio_element
audio_dataaudio_formataudio_format_modifiedopenai_image_strfile_elementr   rm   rZ   passed_filehas_text_in_contentassistant_contentmsg_dictassistant_msgr   r   blockblock_thinking_strblock_signatureassistant_textr   r   assistant_images
image_itemimage_url_objassistant_image_urlgemini_tool_call_partsgemini_tool_call_part_psf_ss_invocations
invocationtc_parttr_dicttr_parttool_call_message_rolesr~   s7                                                          r;   %_gemini_convert_messages_with_historyr   #  s
    !(+"$H#' Ec(m#+-LJ H%(5/&*AEW*W#+E?#6#6y#A #/J?OQU4V-/F09:J0K,W#FOv5 &' 1 #GFO 4q 8&*+CW&MG$,'&/$BE"MM%0$V_;&*+Dg&NG*1K48FNR1)+k*BDI,7,DU,K	)4[)A)E)Eh)O)4[)A)E)Eh)O$LV$T !6 -8,D	$9*3'-6K&+	%E #MM%0$V_=,01JG,TM)6})E)I)I&)QJ+8+G+K+KH+UL)5,:R (4'>'>x'HE'Q %-|$;)5 !6 %T4L197L1;5*%& !1 )>.>+@*/)"
 !'e 4$V_6+/0H'+RL&26&:&>&>y&IG%1&%9%=%=h%GF(4V(<(@(@(MI%1&%9%=%=h%GF-9&-A-E-EFV-WN*1*>YK*2&/$^'" !" !I P 2"(=.9+1*/:O3A)" !'e 4c 1Lp !''/%1jAQSV6W$*:;E ''.
E H%(5/&*AEW*WH 
 '=\&J#&%/"** C !'' c* | LM "#h-'HUOF,C{,Rhuoy9LTUZOLfLfLhH'H > J J#0#4#4Y#E $1$5$56I4$P!"/"3"34E"F$0%,, 4EF #.!0 =J616:1F..3ii.DO 2 >$3$?!&$5$<$<(0 )*=L)*.2jj9K.L)*%& "1, $/J?OQU4VF#3%gt4&v&8(0gfo(F &e 4	 $4 &,,V4%1jAQSV6W%5N/</@/@20, *.&/J0$5 .F-I-I0.* +&'94@ 23a7 *00~`rst`u1vw)00~1NO $1#4#4X#> #/J?OQU4V&6
%j$7,6NN;,GM)->6C6G6G6N 3)6):):8)D)6):):8)D$LV$T !6 $7,A2E/5>S.3	-&E %6$<$<U$C# '7* "%%lB7C$((9E-O%U.* 2H-<-1+=*> 
 .445JK 2H 4A0 %(()CDdD)&*hh/M&NO!/48*9J !+0:{0K*4..*>,6NN6,B-"7G  3j@>H$7?"(: ; .44W=  *Z7*4..*>0:z0J;" $.>>+#>:D[:QGJ$7;I7:S#6*#DBL(;C&G,>$? !2 8 8 A9 +:< 
e #h-'HUOF,C{,Rh !@Q RS (.z&:#H%UOF+/FF:UO%A 
eT*'..u5'..u5s8}$'/FF*+a/OOKVCV$WX*,'
"mtt  Q	 c(m#Z	 "#a'OOKV;NOPx=A""	 OOKVH#<N;OPQA $- "&/ %S  %Z  %Z(/%&'" !""v (1 !&$5$<$<(0=L1C)*%&!&L  s   Ff f  Af =Bf !d11A!f Df )$f f /e+f -f 6Df !f *A f +A&f B2f A=f C5f ;A5f 1&ef %f?f ff 	fffcachetags!_LITELLM_INTERNAL_EXTRA_BODY_KEYSro   optional_paramsc                     |j                  dd      }|e| }|j                         D ]O  \  }}|t        v r||v r8t        ||   t              r%t        |t              r||   j                  |       K|||<   Q yy)zZPop extra_body from optional_params and shallow-merge into data, deep-merging dict values.
extra_bodyN)popitemsr   rO   rQ   update)ro   r   r  	data_dictkvs         r;   _pop_and_merge_extra_bodyr  {  s    !0!4!4\4!HJ	$$&DAq55Yy|T2q$'!##A& 	! ' r=   custom_llm_provider)	vertex_aivertex_ai_betageminilitellm_paramscached_contentc           
      @   t        ||      }t        ||       \  }} d|v rRt        ||      }|du rAt        ||j	                  d            }	| j                  d|	d       |j                  d       g }
|j                         D ];  \  }}|j                  d      s|j                  ||i       |
j                  |       = |j                         D ci c]  \  }}||
vs|| }}}	 |d	k(  r&t        j                         j                  | |
      }n%t        j                         j                  | |
      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd       t        j                  j!                         }|j                  dd      }|Hd|v rD|d   }|=d|v r9|d   }|j                         D ci c]  \  }}t#        |t$              s|| }}}|j                         D ci c]  \  }}t'        |t)        |            r|| }}}t        d i |}d|v r$t+        |       }|rt-        |      }|r
||d   |d<   t/        |      }|||d<   |||d<   |||d<   |rd|vri |d<   d|d   d<   |||d<   |t1        |      dkD  r||d<   |||d<   |r|t2        j4                  k7  r||d<   t7        ||       |S c c}}w c c}}w c c}}w # t8        $ r}|d}~ww xY w)!zX
    Common transformation logic across sync + async Gemini /generateContent calls.
    )rX   r	  )supports_system_messagerI   response_schemaF)rX   r  r   )r   rK   litellm_param_r  )rI   rX   toolsNtool_choice$include_server_side_tool_invocationssafety_settingsoutput_configlabelsmetadatarequester_metadatazgemini-2r2   mediaResolution)r   system_instruction
toolConfigT includeServerSideToolInvocationssafetySettingsr   generationConfigcachedContentr:   )r,   _transform_system_messager+   r   rD   r   r  r  r   r  litellmGoogleAIStudioGeminiConfig_transform_messagesr\   r    __annotations__r   rO   r   r   r   rV   r<   r"   r   r(   GEMINIr  ru   )rI   rX   r   r	  r  r  r  system_instructionssupports_response_schemauser_response_schema_messageremove_keysr  r  rK   r  r  r  r  config_fieldsr  r  rmfiltered_paramsgeneration_configmax_media_resolutionmedia_resolution_valuero   r~   s                               r;   _transform_request_bodyr2    s    :)< %> 7(%! O+#?-@$
  $u,+A_-@-@AR-S,( OOV8TUV 12 K%%'1<<()!!1a&)q! (
 )8(=(=(?X(?11KCWq!t(?OXN(*88:NN! O G 002FF! G G "1!4!4Wd!C,;,?,?t,T5D5H5H2E6
, @O?R?Rt@
 	OT2(88==? ,;+>+>x+N >jN:%j1H#(<(H23+-88:L:41aAs9K!Q$:L (--/
/1"1c-&89 qD/ 	 
 9I 9
9
 #Nx#X #)Q(*& *.?.K;Q<%&78 G,*)<D%&!DM"!,D/4'%'\"EIDAB&%4D!"(S1B-Ca-G'8D#$%$2D!)\-@-@@#DN!$8 Ke Y@ M
Z  sJ   K;$K;-DL 0L	LL $"LB3L L 	LLLgemini_api_keyapi_baseclienttimeoutextra_headerslogging_objvertex_projectvertex_locationvertex_auth_headerc                     ddl m}  |       }|j                  ||| xs d||||||j                  dd       ||	|||      \  }}}t	        |||	|
||      S Nr)   )ContextCachingEndpointsdummyr  )rI   r   api_keyr4  rX   r5  r6  r7  r  r8  r	  r9  r:  r;  )rI   rX   r	  r  r  r   ))context_caching.vertex_ai_context_cachingr>  check_and_create_cacher  r2  r3  rI   r4  rX   r5  r6  r7  r   r8  r	  r  r9  r:  r;  r>  context_caching_endpointsr  s                    r;   sync_transform_request_bodyrE    s      T 7 9 	"88')'#&**+;TB/%'- 	9 		$ #/%%' r=   c                    K   ddl m}  |       }|j                  ||| xs d||||||j                  dd       ||	|||       d {   \  }}}t	        |||	|
||      S 7 wr=  )rA  r>  async_check_and_create_cacher  r2  rC  s                    r;   async_transform_request_bodyrH  ;  s       T 7 9 (DD')'#&**+;TB/%'- E  		$ #/%%' #	s   AA"A A"c                      t        dd      S )z
    Returns a default user message when a "system" message is passed in gemini fails.

    This adds a blank user message to the messages list, to ensure that gemini doesn't fail the request.
    .r   )rK   r   )r   r:   r=   r;   0_default_user_message_when_system_message_passedrK  n  s     %Sv>>r=   r  c                 P   g }g }| du rt        |      D ]  \  }}|d   dk(  sd}t        |d   t              rt        |d         }nCt        |d   t              r0d}|d   D ]  }||j                  d      xs dz  } t        |      }|z|j                  |       |j                  |        t        |      d	kD  r!t        |      D ]  }|j                  |        t        |      d	kD  r5t        |      d	k(  r|j                  t                      t        |
      |fS d|fS )aU  
    Extracts the system message from the openai message list.

    Converts the system message to Gemini format

    Returns
    - system_content_blocks: Optional[SystemInstructions] - the system message list in Gemini format.
    - messages: List[AllMessageValues] - filtered list of messages in OpenAI format (transformed separately)
    Tr   r   NrK   r   r   r   r   )r   )r   rO   r   r!   rP   rD   r   r   reversedr  rK  r$   )	r  rI   system_prompt_indicessystem_content_blocksidxmessage_system_content_blocksystem_textrK   s	            r;   r"  r"  w  s:    ,.$&%h/LCv(*<@%gi0#6,4'):L,M)	 2D9"$K#*9#5#w{{6':'@b@ $6,4+,F)(4)001FG)005 0 $%) 56S! 7  !A%
 x=AOOLNO!(=>HH>r=   )NNNNr   )Y__doc__r   rr   typingr   r   r   r   r   r   r	   r
   httpxpydanticr   r#  litellm._loggingr   8litellm.litellm_core_utils.prompt_templates.common_utilsr   3litellm.litellm_core_utils.prompt_templates.factoryr   r   r   r   r   &litellm.llms.custom_httpx.http_handlerr   r   litellm.types.filesr   r   r   litellm.types.llms.openair   r   r   r   r   r   r   litellm.types.llms.vertex_air    r!   r"   r#   r$   r%   r&   litellm.types.utilsr'   r(   common_utilsr*   r+   r,   *litellm.litellm_core_utils.litellm_loggingr-   _LiteLLMLoggingObjLiteLLMLoggingObjAnyr   r<   rH   rV   rg   r   r   r   r   r   boolr   r   r   	frozensetr   r&  rQ   r  r2  floatTimeoutrE  litellm_core_utilslitellm_loggingrH  rK  r"  r:   r=   r;   <module>rk     s  
  	 S S S    +  Q 
   +   G  X*SMd38nc](0c] ##$#c]#L!%
!%C=!% $DcN3!% T#s(^,	!%
 !%L !6:/3<<SM< $DcN3< C=	<
 T#s(^,< <~Ks Ks K>s >s >S # (3- * GI>!):>s)	6  Q#$QC=Q 
+Qj
 09'69J/K !9 K!K !$ !4 !$x#$xx x !!HI	x
 x SMx xv0SM0#$0 sm0 	0
 [!0 eE5==0120 D>0 0 #0 !!HI0 0 SM0 c]0 !0 0f0SM0#$0 sm0 	0
 %&0 eE5==0120 D>0 0 ++;;CC0 !!HI0 0 SM0 c]0 !0 0f?:S ?+!+-12B-C+
8&'.>)??@+r=   