
    hT                     
   d Z ddlZddl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% ddl& ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 er	ddl4m5Z6 e6Z7ne8Z7d(de9dee9   de(fdZ:dee    dee;   fdZ<dee    de9de=ded   de=dee9   de)fdZ>dee9   dee    dee9   de9d ee   d!eee?e
j                  f      d"ee=   de=d#e7ded   de=de)fd$ZAdee9   dee    dee9   de9d ee   d!eee?e
j                  f      d"ee=   de=d#ej                  j                  jj                  ded   de=de)fd%ZDd&eEdee    deee+   ee    f   fd'ZFy))z|
Transformation logic from OpenAI format to Gemini format.

Why separate file? Make it easy to see how transformation works
    N)TYPE_CHECKING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)*)GenerationConfigPartTypeRequestBodySafetSettingsConfigSystemInstructions
ToolConfigTools)GenericImageParsingChunk   )_check_text_in_contentget_supports_response_schemaget_supports_system_message)Logging	image_urlformatreturnc                    	 d| v rtt         j                  j                  |       d   }|dd }|s0t        |      }t	        |      st        d|       t        |      }n|}t        ||       }t        |      S d| v r+|xs t        |       x}	 t        | |	      }t        |      S d
| v sd| v sd| v r,t        | |      }t        |d   |d         }	t        |	      S t        dj                  |             # t
        $ r}
|
d}
~
ww xY w)zH
    Given an image URL, return the appropriate PartType for Gemini
    zgs://   Nz$File type not supported by gemini - )	mime_typefile_uri)	file_datazhttps://)r2   r1   zhttp://base64)r,   data
media_type)r5   r1   )inline_datazInvalid image received - {})ospathsplitextr   r   	Exceptionr   FileDataTyper   r   r   BlobTyper,   )r+   r,   extension_with_dot	extension	file_typer1   r3   
image_typeimage_blobes              h/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/vertex_ai/gemini/transformation.py_process_gemini_imagerF   A   s/   
"i!#!1!1)!<R!@*12.I8C	 8	B#&J9+$VWW<YG	"	$y9MIi00)#%Q)Fy)QQ %i:NIi00)#zY'>(iBW29VLE%-5;NOE..5<<YGHH s*   A7C; :.C; )7C; !C; ;	DDDmessagesc           	         ddh}g }d}d}g }	 |t        |       k  rjg }|}|t        |       k  r| |   d   |v r| |   j                  d      }|t        |t              r	g }	t	        |      D ]  \  }
}|d   dk(  rFd|v rBt        |d         dkD  r1t        t        |      }t        |d   	      }|	j                  |       U|d   d
k(  rht        t        |      }|}d}t        |d
   t              r|d
   d   }|d
   j                  d      }n|d
   }t        ||      }|	j                  |       |d   dk(  rt        t        |      }|d   j                  d      }|d   j                  d      }|	||j                  d      du rd|z   n|}t        t        d||            }t        ||      }|	j                  |       _|d   dk(  sit        t         |      }|d   j                  d      }|d   j                  d      }|d   j                  d      }|xs |}|t#        d      	 t        ||      }|	j                  |        |j'                  |	       n=|;t        |t(              r+t        |      dkD  rt        |	      }|j                  |       |dz  }|t        |       k  r| |   d   |v r|r\	 t+        |      }|du r0t-        j.                  d       |j                  t        d	             |j                  t1        d|             g }|t        |       k  r|| |   d   dk(  rpt        | |   t2              r| |   j5                         }n| |   }t7        d)i |}|j                  dd      }|j                  dd      }||j                  t        d |!             |et        |t              rUg }	|D ]<  }t        |t              s|d   dk(  st        |d   	      }|	j                  |       > |j'                  |	       n1|/t        |t(              r|r|}|j                  t        |	             |j                  d"g       |j                  d#      |j'                  t9        |             |}|dz  }|t        |       k  r| |   d   dk(  rp|r|j                  t1        d$|             d%d&g}|t        |       k  r/| |   d   |v r%t;        | |   |      }|dz  }|j                  |       |t        |       k  r5| |   d   |vr+t        |      dkD  r|j                  t1        |'             g }||k(  rt#        d(j%                  | |               |t        |       k  rjt        |      dkD  r|j                  t1        |'             |S # t"        $ r t#        dj%                  |||
            w xY w# t"        $ r} | d} ~ ww xY w)*a!  
    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   rolecontenttypetextrN   r+   urlr,   )r+   r,   input_audior5   zaudio/Fr4   )rM   r6   r5   )image_chunkfilefile_idr3   z8Unknown file type. Please pass in a file_id or file_datazlUnable to determine mime type for file_id: {}, set this explicitly using message[{}].content[{}].file.formatr0   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 )rK   parts	assistantreasoning_contentT)thoughtrN   
tool_callsfunction_callmodeltoolfunctionrV   zWInvalid Message passed in - {}. File an issue https://github.com/BerriAI/litellm/issues )lenget
isinstancelist	enumerater	   r   r   appendr   dictrF   r   
startswithr   r%   r   r;   r,   extendstrr'   r   warningContentTyper
   
model_dumpr   r   r   )!rG   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_elementr,   r+   audio_element
audio_dataaudio_formataudio_format_modifiedopenai_image_strfile_elementrT   r3   passed_filehas_text_in_contentassistant_contentmsg_dictassistant_msgrX   assistant_texttool_call_message_rolesrD   s!                                    rE   %_gemini_convert_messages_with_historyr   k   s    !(+"$H#' Er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*1K48F)+k*BDI,7,DU,K	)4[)A)E)Eh)O,7,D	$9*3F%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*>YK*2&/$^'" !"
"(=.9&)" !'e 4y 1LF !''/$0"#3S9,-1$*:;E ''.
c H%(5/&*AEW*Wf 
 '=\&J#&%/"** C !'' c* | LM "#h-'HUOF,C{,Rhuoy9LTUZOLfLfLhH'H > J J#0#4#4Y#E $1$5$56I4$P!$0%,, 4EF $/J?OQU4VF#3%gt4&v&8(0gfo(F &e 4	 $4 &,,V4$0"#3S9(%5N%,,X>-JK "%%lB7C$((9E%,,:=I 4A0
O #h-'HUOF,C{,RR !@Q RS (.z&:#H%UOF+/FF:UO%A 
#**51s8}$'/FF*+a/OOK6I$JK*,'
"mtt  Q c(m#Z "#a'OOK.ABCQ $- "&/ %S  %Z  %Z(/%&'" !""R  sf   E)W 9W =AW AW 9V2A/W DW &W /CW 3CW *W 2&WW 	W+$W&&W+r\   optional_paramscustom_llm_provider)	vertex_aivertex_ai_betageminilitellm_paramscached_contentc                 2   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      }t        j                  j!                         }|j                         D ci c]  \  }}||v s|| }}}t        di |}t#        |      }|||d<   |||d<   |||d<   |||d<   |||d<   |||d<   |S c c}}w c c}}w # t$        $ r}|d}~ww xY w)zX
    Common transformation logic across sync + async Gemini /generateContent calls.
    )r\   r   )supports_system_messagerG   response_schemaF)r\   r   rI   )rK   rL   litellm_param_r   )rG   toolsNtool_choicesafety_settings)ro   system_instruction
toolConfigsafetySettingsgenerationConfigcachedContentr`   )r)   _transform_system_messager(   r   rb   rf   popitemsrh   updatelitellmGoogleAIStudioGeminiConfig_transform_messagesVertexGeminiConfigr   __annotations__keysr    r;   )rG   r\   r   r   r   r   r   system_instructionssupports_response_schemauser_response_schema_messageremove_keyskvrL   r   r   r   config_fieldsfiltered_paramsgeneration_configr5   rD   s                         rE   _transform_request_bodyr   1  s    :)< %> 7(%! O+#?-@$
  $u,+A_-@-@AR-S,( OOV8TUV 12 K%%'1<<()!!1a&)q! (
 )8(=(=(?X11KCWq!tXOX%(*88:NN! O G 002FF! G G "1!4!4Wd!C,;,?,?t,T?N?R?Rt@
 )88==? -224
Q]8JAqD
 
 9I 9
9
 G,*)<D%&!DM"!,D&%4D!"('8D#$%$2D! KS Y$
(  s>   G:$G:-B5H "H /H 4AH  H 	HHHgemini_api_keyapi_baseclienttimeoutextra_headerslogging_objc                     ddl m}  |       }| 0|j                  ||| ||||||j                  dd       |
      \  }}}n|j                  dd       }t	        |||	|
||      S Nr&   )ContextCachingEndpointsr   )
rG   r   api_keyr   r\   r   r   r   r   r   )rG   r\   r   r   r   r   ))context_caching.vertex_ai_context_cachingr   check_and_create_cacher   r   r   rG   r   r\   r   r   r   r   r   r   r   r   context_caching_endpointsr   s                 rE   sync_transform_request_bodyr     s     T 7 9!%<<! /&!+.223CTJ' =  	2/> ),,-=tD"/%%'     c                    K   ddl m}  |       }| 8|j                  ||| ||||||j                  dd       |
       d {   \  }}}n|j                  dd       }t	        |||	|
||      S 7 ,wr   )r   r   async_check_and_create_cacher   r   r   s                 rE   async_transform_request_bodyr     s      T 7 9!
 ,HH+"'*../?F# I 
 
		
 ),,-=tD"/%%' 
s   >A/ A--A/r   c                    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  r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)
    TrK   rJ   NrL   rO    rN   r   r_   )re   rc   rj   r   rd   rb   rf   ra   reversedr   r"   )	r   rG   system_prompt_indicessystem_content_blocksidxmessage_system_content_blocksystem_textrL   s	            rE   r   r     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%!(=>HH>r   )N)G__doc__r8   typingr   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   litellm.types.llms.vertex_air   r   r    r!   r"   r#   r$   litellm.types.utilsr%   common_utilsr'   r(   r)   *litellm.litellm_core_utils.litellm_loggingr*   _LiteLLMLoggingObjLiteLLMLoggingObjAnyrj   rF   rl   r   rg   r   floatTimeoutr   litellm_core_utilslitellm_loggingr   boolr   r`   r   rE   <module>r      s   
 M M M    +  Q 
  +   9  X*'S '(3- '8 'TC#$C	+CLO#$OO O !!HI	O
 O SMO Od*SM*#$* sm* 	*
 [!* eE5==012* D>* * #* !!HI* * *Z,SM,#$, sm, 	,
 %&, eE5==012, D>, , ++;;CC, !!HI, , ,^$!$-12B-C$
8&'.>)??@$r   