Ë
    uPêj´{  ã                   ó°  — d dl Z d dlmZmZmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ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 d d	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%  G d
„ ded¬«      Z& G d„ ded¬«      Z' G d„ ded¬«      Z( G d„ ded¬«      Z) G d„ ded¬«      Z* G d„ ded¬«      Z+ G d„ ded¬«      Z,de-de.fd„Z/ G d„ de «      Z0 G d„ d «      Z1y)!é    N)ÚAsyncIteratorÚIteratorÚSequence)ÚAnyÚFinalÚ	TypedDictÚcast)ÚReadOnly)Úverbose_logger)Únormalize_tool_schema)ÚAllMessageValuesÚChatCompletionAssistantMessageÚChatCompletionAssistantToolCallÚChatCompletionImageObjectÚChatCompletionRequestÚChatCompletionSystemMessageÚChatCompletionTextObjectÚ#ChatCompletionToolCallFunctionChunkÚChatCompletionToolChoiceValuesÚChatCompletionToolMessageÚChatCompletionToolParamÚChatCompletionUserMessage)ÚGenericLiteLLMParams)ÚAdapterCompletionStreamWrapperÚChoicesÚModelResponseÚModelResponseStreamÚStreamingChoicesÚUsagec                   ó   — e Zd ZU ee   ed<   y)Ú_GenAITextPartÚtextN©Ú__name__Ú
__module__Ú__qualname__r
   ÚstrÚ__annotations__© ó    úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/google_genai/adapters/transformation.pyr!   r!   "   ó   … Ø
�3‰-Ôr*   r!   F)Útotalc                   ó$   — e Zd ZU eee      ed<   y)Ú_GenAISystemInstructionÚpartsN)r$   r%   r&   r
   Úlistr!   r(   r)   r*   r+   r/   r/   &   s   … Ø�D˜Ñ(Ñ)Ô)r*   r/   c                   ó8   — e Zd ZU ee   ed<   eeeef      ed<   y)Ú
_GenAIPartr"   ÚfunctionCallN©r$   r%   r&   r
   r'   r(   ÚdictÚobjectr)   r*   r+   r3   r3   *   s    … Ø
�3‰-ÓØ˜4  V Ñ,Ñ-Ô-r*   r3   c                   óH   — e Zd ZU ee   ed<   ee   ed<   eeeef      ed<   y)Ú_GenAIFunctionDeclarationÚnameÚdescriptionÚparametersJsonSchemaNr5   r)   r*   r+   r9   r9   /   s*   … Ø
�3‰-ÓØ˜#‘ÓØ" 4¨¨V¨Ñ#4Ñ5Ô5r*   r9   c                   ó$   — e Zd ZU eee      ed<   y)Ú
_GenAIToolÚfunctionDeclarationsN)r$   r%   r&   r
   r1   r9   r(   r)   r*   r+   r>   r>   5   s   … Ø" 4Ð(AÑ#BÑCÔCr*   r>   c                   ó   — e Zd ZU ee   ed<   y)Ú_GenAIFunctionCallingConfigÚmodeNr#   r)   r*   r+   rA   rA   9   r,   r*   rA   c                   ó   — e Zd ZU ee   ed<   y)Ú_GenAIToolConfigÚfunctionCallingConfigN)r$   r%   r&   r
   rA   r(   r)   r*   r+   rD   rD   =   s   … Ø#Ð$?Ñ@Ô@r*   rD   Úraw_argumentsÚreturnc                 ó,   — t        j                  | «      S )zPDecode a tool call's JSON-encoded arguments into the value Google GenAI expects.)ÚjsonÚloads)rF   s    r+   Ú_decode_tool_call_argumentsrK   A   s   € ä�:‰:�mÓ$Ð$r*   c                   ó†   ‡ — e Zd ZU dZdZeed<   eeee	e	f   f   ed<   de
fˆ fd„Zd„ Zd„ Zd	ee   fd
„Zd	ee   fd„Zˆ xZS )ÚGoogleGenAIStreamWrapperz‡
    Wrapper for streaming Google GenAI generate_content responses.
    Transforms OpenAI streaming chunks to Google GenAI format.
    FÚsent_first_chunkÚaccumulated_tool_callsÚcompletion_streamc                 óN   •— d| _         i | _        d| _        t        ‰| �  |«       y )NF)rN   rO   Ú_returned_responseÚsuperÚ__init__)ÚselfrP   Ú	__class__s     €r+   rT   z!GoogleGenAIStreamWrapper.__init__P   s)   ø€ Ø %ˆÔØ&(ˆÔ#Ø"'ˆÔÜ‰ÑÐ*Õ+r*   c                 ó^  — 	 t        | j                  d«      s<| j                  rt        ‚d| _        t	        «       j                  | j                  «      S | j                  D ]*  }|dk(  s|€Œt	        «       j                  || «      }|sŒ(|c S  t        ‚# t        $ r ‚ t        $ r t        ‚w xY w)NÚ__iter__TÚNone)ÚhasattrrP   rR   ÚStopIterationÚGoogleGenAIAdapterÚ(translate_completion_to_generate_contentÚ2translate_streaming_completion_to_generate_contentÚ	Exception)rU   ÚchunkÚtransformed_chunks      r+   Ú__next__z!GoogleGenAIStreamWrapper.__next__V   sµ   € ð	 Ü˜4×1Ñ1°:Ô>Ø×*Ò*Ü'Ð'Ø*.�Ô'Ü)Ó+×TÑTÐUY×UkÑUkÓlÐlà×/Ñ/ò -�Ø˜F’? e mØä$6Ó$8×$kÑ$kÐlqÐswÓ$xÐ!Ú$Ø,Ò,ð-ô  ÐøÜò 	ØÜò 	 ÜÐð	 ús   ‚AB Á3B ÂB ÂB ÂB,c           	   ƒ   ó€  K  — 	 t        | j                  d«      s<| j                  rt        ‚d| _        t	        «       j                  | j                  «      S | j                  2 3 d {  –—† }|dk(  s|€Œt	        «       j                  || «      }|sŒ.|c S 7 Œ-6 | j                  rù	 g }| j                  j                  «       D ]n  \  }}	 t        |d   xs d«      }d|d   xs d|d	œi}|j                  |«       Œ9# t        j                  $ r! t        j                  d
||d   |d   «       Y Œlw xY w |r)d|ddœddg dœgi}|| j                  j                  «        S 	 | j                  j                  «        t        ‚# | j                  j                  «        w xY wt        ‚# t        $ r ‚ t         $ r t        ‚w xY w­w)NÚ	__aiter__TrY   Ú	argumentsz{}r4   r:   Úundefined_tool_name©r:   Úargsz]Could not parse tool call arguments at end of stream for index %s. Name: %s. Partial args: %sÚ
candidatesÚmodel©r0   ÚroleÚSTOPr   ©ÚcontentÚfinishReasonÚindexÚsafetyRatings)rZ   rP   rR   ÚStopAsyncIterationr\   r]   r^   rO   ÚitemsrK   ÚappendrI   ÚJSONDecodeErrorr   ÚwarningÚclearr_   )	rU   r`   ra   r0   Útool_call_indexÚtool_call_dataÚparsed_argsÚfunction_call_partÚfinal_chunks	            r+   Ú	__anext__z"GoogleGenAIStreamWrapper.__anext__l   sý  è ø€ ð=	%Ü˜4×1Ñ1°;Ô?Ø×*Ò*Ü,Ð,Ø*.�Ô'Ü)Ó+×TÑTÐUY×UkÑUkÓlÐlà#×5Ñ5÷ -ð -�eØ˜F’? e mØä$6Ó$8×$kÑ$kÐlqÐswÓ$xÐ!Ú$Ø,Ò,ð-øÐ5ð ×*Ò*ð'8Ø57�Eð ×4Ñ4×:Ñ:Ó<òñ Ø'Ø&ðô +FÀnÐU`ÑFaÒFiÐeiÓ*j˜Kà .Ø,:¸6Ñ,BÒ,[ÐF[Ø,7ñ1"ð>Ð.ð "ŸL™LÐ);Õ<øÜ#×3Ñ3ò ä*×2Ñ2Ø Ø /Ø .¨vÑ 6Ø .¨{Ñ ;ö	ðúðñ. à(à9>ÈÑ/PØ4:Ø-.Ø57ñ	!"ð+ð	A˜ð  +ð ×/Ñ/×5Ñ5Õ7ð ð ×/Ñ/×5Ñ5Ô7Ü$Ð$øð ×/Ñ/×5Ñ5Õ7úÜ$Ð$øÜ!ò 	ØÜò 	%Ü$Ð$ð	%üs›   ‚F>„AF" ÁF>ÁF" Á"BÁ&BÁ'BÁ*%F" ÂF" ÂF>ÂBÂF" Â$"E= Ã1C9Ã8E= Ã91D-Ä*E= Ä,D-Ä-E= ÅF" ÅF>Å F" Å=FÆ	F" Æ"F;Æ;F>rG   c              #   ó®   K  — | j                   D ]B  }t        |t        «      r,dt        j                  |«      › d�}|j                  «       –— Œ?|–— ŒD y­w)zU
        Convert Google GenAI streaming chunks to Server-Sent Events format.
        údata: ú

N)rP   Ú
isinstancer6   rI   ÚdumpsÚencode)rU   r`   Úpayloads      r+   Úgoogle_genai_sse_wrapperz1GoogleGenAIStreamWrapper.google_genai_sse_wrapper¬   sQ   è ø€ ð ×+Ñ+ò 	ˆEÜ˜%¤Ô&Ø"¤4§:¡:¨eÓ#4Ð"5°TÐ:�Ø—n‘nÓ&Ó&à“ñ	ùs   ‚AAc                ó  K  — ddl m} | j                  2 3 d{  –—† }t        |t        «      r-dt        j                  |«      › d�}|j                  «       ­–— ŒFt        ||«      rXt        «       j                  || «      }t        |t        «      r-dt        j                  |«      › d�}|j                  «       ­–— Œ©Œªt        |d«      r|j                  «       ­–— ŒÊt        |«      j                  «       ­–— Œç7 Œâ6 y­w)z<
        Async version of google_genai_sse_wrapper.
        r   )r   Nr€   r�   r„   )Úlitellm.types.utilsr   rP   r‚   r6   rI   rƒ   r„   r\   r^   rZ   r'   )rU   r   r`   r…   ra   s        r+   Úasync_google_genai_sse_wrapperz7GoogleGenAIStreamWrapper.async_google_genai_sse_wrapper·   sÜ   è ø€ õ 	<à×1Ñ1÷ 	.ð 	.�%Ü˜%¤Ô&Ø"¤4§:¡:¨eÓ#4Ð"5°TÐ:�Ø—n‘nÓ&Ô&Ü˜EÐ#6Ô7ä$6Ó$8×$kÑ$kÐlqÐswÓ$xÐ!äÐ/´Ô6Ø &¤t§z¡zÐ2CÓ'DÐ&EÀTÐJ�GØ!Ÿ.™.Ó*Ô*ð ô ˜5 (Ô+ØŸ,™,›.Ô(ä˜e›*×+Ñ+Ó-Ô-ð'	.øÑ1ùs&   ‚D •C>™C<šC>�CD Ã<C>Ã>D )r$   r%   r&   Ú__doc__rN   Úboolr(   r6   Úintr'   r7   rT   rb   r~   r   Úbytesr†   r   r‰   Ú__classcell__)rV   s   @r+   rM   rM   F   se   ø… ñð
 #Ð�dÓ"à   d¨3°¨8¡nÐ!4Ñ5Ó5ð,¨&õ ,ò ò,>%ð@	¨(°5©/ó 	ð.°mÀEÑ6J÷ .r*   rM   c                   óØ  — e Zd ZdZd d„Z	 	 d!dedeeeef      eeef   z  deeef   dz  de	dz  deeef   f
d	„Z
	 d"d
eeef   de	dz  deeef   fd„Zdedee   dz  fd„Zdee   dee   fd„Zdededz  fd„Z	 d"deeeef      dedz  dee   fd„Zdedeeef   fd„Zdeez  dedeeef   dz  fd„Zdedee   fd„Z dededee   fd„Z!dedz  defd„Z"de#dz  deee$f   fd„Z%y)#r\   zaAdapter for transforming Google GenAI generate_content requests to/from litellm.completion formatrG   Nc                  ó   — y ©Nr)   )rU   s    r+   rT   zGoogleGenAIAdapter.__init__Ö   s   € Ør*   rj   ÚcontentsÚconfigÚlitellm_paramsc                 óf  — |j                  d«      xs |j                  d«      }|j                  d«      }|j                  d«      xs |j                  d«      }t        |t        «      r|g}	n|}	| j                  |	|¬«      }
||
dœ}|r5d|v r|d   |d<   d	|v r|d	   |d
<   d|v r|d   |d<   d|v r	 d|v r|d   |d<   |r6t        |t        «      r&t        |«      dkD  r| j                  |«      }|r||d<   |r| j                  |«      }|r||d<   t        |«      }|r| j                  ||¬«      }|S )ax  
        Transform generate_content request to litellm completion format

        Args:
            model: The model name
            contents: Generate content contents (can be list or single dict)
            config: Optional config parameters
            **kwargs: Additional parameters from the original request

        Returns:
            Dict in OpenAI format
        ÚsystemInstructionÚsystem_instructionÚtoolsÚ
toolConfigÚtool_config)r—   )rj   ÚmessagesÚtemperatureÚmaxOutputTokensÚ
max_tokensÚtopPÚtop_pÚtopKÚstopSequencesÚstopr   Útool_choice)Úcompletion_request_dictr”   )	Úgetr‚   r6   Ú_transform_contents_to_messagesr1   ÚlenÚ'_transform_google_genai_tools_to_openaiÚ-_transform_google_genai_tool_config_to_openaiÚ&_add_generic_litellm_params_to_request)rU   rj   r’   r“   r”   Úkwargsr—   r˜   rš   Úcontents_listr›   Úcompletion_requestÚopenai_toolsr¤   r¥   s                  r+   Ú(translate_generate_content_to_completionz;GoogleGenAIAdapter.translate_generate_content_to_completionÙ   s�  € ð, %+§J¡JÐ/BÓ$CÒ$gÀvÇzÁzÐRfÓGgÐØ—z‘z 'Ó*ˆØ#ŸZ™Z¨Ó5ÒR¸¿¹ÀMÓ9Rˆô �h¤Ô%Ø%˜J‰Mà$ˆMð ×>Ñ>¸}ÐasÐ>Ótˆð Ø ñ<
Ðñ$ à Ñ&Ø4:¸=Ñ4IÐ" =Ñ1Ø  FÑ*Ø39Ð:KÑ3LÐ" <Ñ0Ø˜ÑØ.4°V©nÐ" 7Ñ+Ø˜ÑàØ &Ñ(Ø-3°OÑ-DÐ" 6Ñ*ñ ä˜%¤Ô&¬3¨u«:¸ª>à&*×&RÑ&RÐSXÓ&Y�áØ2>Ð& wÑ/ñ Ø!%×!SÑ!SÐT_Ó!`ˆKÙØ4?Ð" =Ñ1ô
 #'Ð'9Ó":ÐÙØ&*×&QÑ&QØ(?Ø-ð 'Ró 'Ð#ð
 'Ð&r*   r¥   c                 ó®   — t         j                  j                  «       }|r4|j                  d¬«      }|j	                  «       D ]  \  }}||v sŒ|||<   Œ |S )zýAdd generic litellm params to request. e.g add api_base, api_key, api_version, etc.

        Args:
            completion_request_dict: Dict[str, Any]
            litellm_params: GenericLiteLLMParams

        Returns:
            Dict[str, Any]
        T)Úexclude_none)r   Úmodel_fieldsÚkeysÚ
model_dumprt   )rU   r¥   r”   Úallowed_fieldsÚlitellm_dictÚkeyÚvalues          r+   r«   z9GoogleGenAIAdapter._add_generic_litellm_params_to_request9  se   € ô !5× AÑ A× FÑ FÓ HˆÙØ"0×";Ñ";ÈÐ";Ó"NˆLØ*×0Ñ0Ó2ò 9‘
��UØ˜.Ò(Ø38Ð+¨CÒ0ð9ð 'Ð&r*   rP   c                 ó:   — t        |¬«      }|j                  «       S )z<Transform streaming completion output to Google GenAI format)rP   )rM   r‰   )rU   rP   Úgoogle_genai_wrappers      r+   Ú,translate_completion_output_params_streamingz?GoogleGenAIAdapter.translate_completion_output_params_streamingO  s   € ô
 '?ÐQbÔ&cÐà#×BÑBÓDÐDr*   r˜   c                 ó  — g }|D ]S  }d|v sŒ|d   D ]D  }d|j                  dd«      i}d|v r|d   |d<   d|v r|d   |d<   d|dœ}|j                  |«       ŒF ŒU |D �cg c]  }t        |«      ‘Œ }}t        t        t
           |«      S c c}w )	z3Transform Google GenAI tools to OpenAI tools formatr?   r:   Ú r;   r<   Ú
parametersÚfunction)ÚtyperÀ   )r¦   ru   r   r	   r1   r   )rU   r˜   r¯   ÚtoolÚ	func_declÚfunction_chunkÚopenai_toolÚnormalized_toolss           r+   r©   z:GoogleGenAIAdapter._transform_google_genai_tools_to_openaiX  sÎ   € ð
 8:ˆàò 	5ˆDØ%¨Ò-Ø!%Ð&<Ñ!=ò 5�Ià 	§¡¨f°bÓ 9ð9�Nð %¨	Ñ1Ø8AÀ-Ñ8P˜ }Ñ5Ø-°Ñ:Ø7@ÐAWÑ7X˜ |Ñ4à>HÐVdÑ5e�KØ ×'Ñ'¨Õ4ñ5ð	5ð  LXÖ"XÀ4Ô#8¸Õ#>Ð"XÐÐ"Xä”DÔ0Ñ1Ð3CÓDÐDùò #Ys   ÁB
rš   c                 óš   — |j                  di «      }|j                  dd«      }ddddœ}|j                  |d«      }t        t        |«      S )z8Transform Google GenAI tool_config to OpenAI tool_choicerE   rB   ÚAUTOÚautoÚrequiredÚnone)rÈ   ÚANYÚNONE)r¦   r	   r   )rU   rš   Úfunction_calling_configrB   Úmode_mappingr¤   s         r+   rª   z@GoogleGenAIAdapter._transform_google_genai_tool_config_to_openais  sU   € ð
 *5¯©Ð9PÐRTÓ)UÐØ-×1Ñ1°&¸&ÓAˆà'-°jÈ&ÑQˆà)×-Ñ-¨d°FÓ;ˆÜÔ2°KÓ@Ð@r*   r—   c                 óz  — g }|r=|j                  dg «      }|r)d|d   v r"|j                  t        d|d   d   ¬«      «       |D �]ó  }|j                  dd«      }|j                  dg «      }|dk(  �rÏg }g }	|D �])  }
t        |
t        «      râd|
v r&|j                  t        t        d|
d   dœ«      «       Œ>d	|
v rT|
d	   }|j                  d
d«      }|j                  dd«      }|j                  t        t        ddd|› d|› �idœ«      «       Œ–d|
v sŒ›|
d   }t        dd|j                  dd«      › �t        j                  |j                  di «      «      ¬«      }|	j                  |«       Œöt        |
t        «      s�Œ|j                  t        t        d|
dœ«      «       �Œ, |r‡t        |«      dk(  r]t        |d   t        «      rJ|d   j                  d«      dk(  r3t        t        |d   «      }|j                  t        d|d   ¬«      «       n|j                  t        d|¬«      «       |j                  |	«       �Œý|dk(  s�Œd}g }|D ]°  }
t        |
t        «      rˆd|
v r	||
d   z  }Œ d|
v sŒ%|
d   }t        d|j                  dd«      › �dt!        |j                  dd«      t        j                  |j                  di «      «      ¬ «      ¬!«      }|j                  |«       Œ›t        |
t        «      sŒ¬||
z  }Œ² |rt#        d"|r|nd#|¬$«      }nt#        d"|r|nd#¬«      }|j                  |«       �Œö |S )%z9Transform Google GenAI contents to OpenAI messages formatr0   r"   r   Úsystem)rl   ro   rl   Úuser)rÁ   r"   Úinline_dataÚ	mime_typez
image/jpegÚdatar¾   Ú	image_urlÚurlzdata:z;base64,)rÁ   rÖ   ÚfunctionResponserÂ   Úcall_r:   ÚunknownÚresponse)rl   Útool_call_idro   é   rÁ   rj   r4   rÀ   rh   ©r:   re   )ÚidrÁ   rÀ   Ú	assistantN)rl   ro   Ú
tool_calls)r¦   ru   r   r‚   r6   r	   r   r   r   rI   rƒ   r'   r¨   r   Úextendr   r   r   )rU   r’   r—   r›   Úsystem_partsro   rl   r0   Úcontent_partsÚtool_messagesÚpartrÓ   rÔ   rÕ   Úfunc_responseÚtool_messageÚ	text_partÚcombined_textrá   Ú	func_callÚ	tool_callÚassistant_messages                         r+   r§   z2GoogleGenAIAdapter._transform_contents_to_messages€  sq  € ð 35ˆñ Ø"4×"8Ñ"8¸À"Ó"EˆLÙ ¨,°q©/Ñ 9Ø—‘Ô ;ÀÐS_Ð`aÑSbÐciÑSjÔ kÔlàó b	3ˆGØ—;‘;˜v vÓ.ˆDØ—K‘K ¨Ó,ˆEà�v‹~à\^�ØAC�à!ó !m�DÜ! $¬Ô-Ø! T™>Ø)×0Ñ0Ü $Ü$<Ø-3¸TÀ&¹\Ñ$Jó!"õð +¨dÑ2à*.¨}Ñ*=˜KØ(3¯©¸À\Ó(R˜IØ#.§?¡?°6¸2Ó#>˜DØ)×0Ñ0Ü $Ü$=à0;Ø6;¸uÀYÀKÈxÐX\ÐW]Ð=^Ð5_ñ%&ó!"õð 0°4Ò7à,0Ð1CÑ,D˜MÜ+DØ%+Ø/4°]×5FÑ5FÀvÈyÓ5YÐ4ZÐ-[Ü(,¯
©
°=×3DÑ3DÀZÐQSÓ3TÓ(Uô,˜Lð
 *×0Ñ0°Õ>Ü# D¬#Ö.Ø%×,Ñ,¬TÔ2JÐU[ÐeiÑLjÓ-kÖlðC!mñH !ô ˜MÓ*¨aÒ/Ü& }°QÑ'7¼Ô>Ø)¨!Ñ,×0Ñ0°Ó8¸FÒBä$(Ô)AÀ=ÐQRÑCSÓ$T˜	Ø Ÿ™Ô(AÀvÐW`ÐagÑWhÔ(iÕjð !Ÿ™Ô(AÀvÐWdÔ(eÔfð —‘ Ö.à˜”à "�ØDF�
à!ò .�DÜ! $¬Ô-Ø! T™>Ø)¨T°&©\Ñ9™MØ+¨tÒ3à(,¨^Ñ(<˜IÜ(GØ%*¨9¯=©=¸ÀÓ+KÐ*LÐ#MØ%/Ü)LØ)2¯©°v¸rÓ)BÜ.2¯j©j¸¿¹ÀvÈrÓ9RÓ.Sô*"ô)˜Ið '×-Ñ-¨iÕ8Ü# D¬#Õ.Ø%¨Ñ-™ð#.ñ( Ü(FØ(Ù1>¡ÀDØ#-ô)Ñ%ô )GØ(Ù1>¡ÀDô)Ð%ð
 —‘Ð 1Ö2ðEb	3ðH ˆr*   rÛ   c                 óˆ  — |j                   r|j                   d   nd}|st        d«      ‚t        |t        «      r3|j                  st        d«      ‚| j                  |j                  «      }nEt        |di «      j                  dd«      xs t        |di «      j                  dd«      }|rd	|igng }|d
dœ| j                  t        |dd«      «      dg dœgt        |d«      r)t        |dd«      r| j                  t        |dd«      «      nddddœdœ}d}|D ]   }t        |t        «      sŒd	|v sŒ||d	   z  }Œ" |r||d	<   |S )zþ
        Transform litellm completion response to Google GenAI generate_content format

        Args:
            response: ModelResponse from litellm.completion

        Returns:
            Dict in Google GenAI generate_content response format
        r   Nz-Invalid completion response: no choices foundz7Invalid completion response: no message found in choiceÚmessagero   r¾   Údeltar"   rj   rk   Úfinish_reasonrn   Úusage©ÚpromptTokenCountÚcandidatesTokenCountÚtotalTokenCount)ri   ÚusageMetadata)ÚchoicesÚ
ValueErrorr‚   r   rï   Ú/_transform_openai_message_to_google_genai_partsÚgetattrr¦   Ú_map_finish_reasonrZ   Ú
_map_usager6   )rU   rÛ   Úchoicer0   Úmessage_contentÚgenerate_content_responseÚtext_contentræ   s           r+   r]   z;GoogleGenAIAdapter.translate_completion_to_generate_contentô  sx  € ð 08×/?Ò/?˜×(Ñ(¨Ò+ÀTˆÙÜÐLÓMÐMô �fœgÔ&Ø—>’>Ü Ð!ZÓ[Ð[Ø×HÑHÈÏÉÓX‰Eô & f¨i¸Ó<×@Ñ@ÀÈBÓOò ÔSZÐ[aÐcjÐlnÓSo×SsÑSsØ˜2óTˆOñ 4C�f˜oÐ.Ñ/ÈˆEð */¸Ñ@Ø$(×$;Ñ$;¼GÀFÈOÐ]aÓ<bÓ$cØØ%'ñ	ðô ˜8 WÔ-´'¸(ÀGÈTÔ2Rð —‘¤¨°'¸4Ó @ÔAð )*Ø,-Ø'(ññ?
Ð!ð* ˆØò 	-ˆDÜ˜$¤Õ%¨&°Dª.Ø  V¡Ñ,‘ð	-ñ Ø0<Ð% fÑ-à(Ð(r*   Úwrapperc                 óh  — |j                   r|j                   d   nd}|syt        |t        «      r9|j                  r| j	                  |j                  |«      }ng }t        |dd«      }n3t        |di «      j                  dd«      }|rd|igng }t        |dd«      }|s|syd|d	d
œ|r| j                  |«      nddg dœgi}|r@t        |d«      r)t        |dd«      r| j                  t        |dd«      «      nddddœ}||d<   d}	|D ]   }
t        |
t        «      sŒd|
v sŒ|	|
d   z  }	Œ" |	r|	|d<   |S )aV  
        Transform streaming litellm completion chunk to Google GenAI generate_content format

        Args:
            response: Streaming ModelResponse chunk from litellm.completion
            wrapper: GoogleGenAIStreamWrapper instance

        Returns:
            Dict in Google GenAI streaming generate_content response format
        r   Nrñ   rð   ro   r¾   r"   ri   rj   rk   rn   rò   ró   r÷   )rø   r‚   r   rð   Ú?_transform_openai_delta_to_google_genai_parts_with_accumulationrû   r¦   rü   rZ   rý   r6   )rU   rÛ   r  rþ   r0   rñ   rÿ   Ústreaming_chunkÚusage_metadatar  ræ   s              r+   r^   zEGoogleGenAIAdapter.translate_streaming_completion_to_generate_content2  s€  € ð" 08×/?Ò/?˜×(Ñ(¨Ò+ÀTˆÙàô �fÔ.Ô/Ø�|Š|Ø×\Ñ\Ð]c×]iÑ]iÐkrÓs‘à�Ü(/°¸ÈÓ(N‰Mô &-¨V°W¸bÓ%A×%EÑ%EÀiÐQSÓ%TˆOÙ3B�f˜oÐ.Ñ/ÈˆEÜ# F¨O¸TÓBˆMñ ™]Øð à).¸Ñ@ÙO\ T×%<Ñ%<¸]Ô%KÐbfØØ%'ñ	ðð	5
ˆñ ô ˜8 WÔ-´'¸(ÀGÈTÔ2Rð —‘¤¨°'¸4Ó @ÔAð )*Ø,-Ø'(ñð ð 0>ˆO˜OÑ,ð ˆØò 	-ˆDÜ˜$¤Õ%¨&°Dª.Ø  V¡Ñ,‘ð	-ñ Ø&2ˆO˜FÑ#àÐr*   rï   c                 ó  — g }t        |d«      r)|j                  r|j                  d|j                  i«       t        |d«      rŸ|j                  r“|j                  D ]„  }t        |d«      sŒ|j                  sŒ	 |j                  j
                  rt        |j                  j
                  «      ni }d|j                  j                  xs d|dœi}|j                  |«       Œ† |r|S ddigS # t        j                  $ r i }Y ŒRw xY w)	z5Transform OpenAI message to Google GenAI parts formatro   r"   rá   rÀ   r4   rf   rg   r¾   )
rZ   ro   ru   rá   rÀ   re   rK   rI   rv   r:   )rU   rï   r0   rì   rh   r|   s         r+   rú   zBGoogleGenAIAdapter._transform_openai_message_to_google_genai_parts|  s	  € ð
 *,ˆô �7˜IÔ&¨7¯?ª?Ø�L‰L˜& '§/¡/Ð2Ô3ô �7˜LÔ)¨g×.@Ò.@Ø$×/Ñ/ò 5�	Ü˜9 jÕ1°i×6HÓ6Hð"ð  )×1Ñ1×;Ò;ô 8¸	×8JÑ8J×8TÑ8TÔUà!#ð ð 'Ø$-×$6Ñ$6×$;Ñ$;Ò$TÐ?TØ$(ñ)ð6Ð&ð —L‘LÐ!3Õ4ð#5ñ& ˆuÐ1 V¨R L >Ð1øô  ×/Ñ/ò "Ø!šð"ús   Á:7C,Ã,DÄDrð   c                 ó  — t        |d«      si |_        g }t        |d«      r)|j                  r|j                  d|j                  i«       |j                  xs g }|D �]  }t        |d«      sŒt        |dd«      }|€Œ!||j                  vrdddœ|j                  |<   t        |j                  d	d«      }t        |j                  d
d«      }|s|st        j                  d|«       ŒŠ|r||j                  |   d	<   |r|j                  |   d
xx   |z  cc<   |j                  |   }	|	d	   }
|	d
   }	 t        |«      }|
r%d|
|dœi}|j                  |«       |j                  |= �Œ |S # t        j                  $ r Y �Œ!w xY w)zQTransforms OpenAI delta to Google GenAI parts, accumulating streaming tool calls.rO   ro   r"   rÀ   rq   Nr¾   rÞ   r:   re   z,Skipping empty tool call chunk for index: %sr4   rg   )rZ   rO   ro   ru   rá   rû   rÀ   r   ÚdebugrK   rI   rv   )rU   rð   r  r0   rá   rì   ry   Úfunction_nameÚ
args_chunkÚaccumulated_dataÚaccumulated_nameÚaccumulated_argsr{   r|   s                 r+   r  zRGoogleGenAIAdapter._transform_openai_delta_to_google_genai_parts_with_accumulationž  sÁ  € ô �wÐ 8Ô9Ø-/ˆGÔ*à)+ˆä�5˜)Ô$¨¯ªØ�L‰L˜& %§-¡-Ð0Ô1ð "×,Ñ,Ò2°ˆ
à#ó 6	ˆIÜ˜9 jÔ1Øô +2°)¸WÀdÓ*KˆOØÐ&Øð  g×&DÑ&DÑDàØ!#ñC�×.Ñ.¨Ñ?ô $ I×$6Ñ$6¸ÀÓEˆMÜ  ×!3Ñ!3°[À$ÓGˆJñ !©Ü×$Ñ$Ð%SÐUdÔeØáØJW�×.Ñ.¨Ñ?ÀÑGáØ×.Ñ.¨Ñ?ÀÓLÐPZÑZÓLð  '×=Ñ=¸oÑNÐØ/°Ñ7ÐØ/°Ñ<Ððä9Ð:JÓK�ñ $à6DÐO_ÐitÑFuÐ5vÐ&Ø—L‘LÐ!3Ô4ð  ×6Ñ6°ÐGùðc6	ðp ˆøô ×'Ñ'ò ò ðús   Ä12E(Å(E?Å>E?rñ   c                 ó<   — |syddddddœ}|j                  |d«      S )z8Map OpenAI finish reasons to Google GenAI finish reasonsrm   Ú
MAX_TOKENSÚSAFETY)r£   ÚlengthÚcontent_filterrá   Úfunction_call)r¦   )rU   rñ   Úmappings      r+   rü   z%GoogleGenAIAdapter._map_finish_reasoné  s3   € áØð Ø"Ø&Ø Ø#ñ
ˆð �{‰{˜=¨&Ó1Ð1r*   rò   c                 óh   — t        |dd«      xs dt        |dd«      xs dt        |dd«      xs ddœS )z-Map OpenAI usage to Google GenAI usage formatÚprompt_tokensr   Úcompletion_tokensÚtotal_tokensró   )rû   )rU   rò   s     r+   rý   zGoogleGenAIAdapter._map_usageø  sB   € ô !(¨¨ÀÓ BÒ GÀaÜ$+¨EÐ3FÈÓ$JÒ$OÈaÜ& u¨n¸aÓ@ÒEÀAñ
ð 	
r*   )rG   N)NNr‘   )&r$   r%   r&   rŠ   rT   r'   r1   r6   r   r   r°   r7   r«   r   r�   r¼   r   r>   r   r©   rD   r   rª   r/   r   r§   r   r]   r   rM   r^   r3   rú   r  rü   r   rŒ   rý   r)   r*   r+   r\   r\   Ó   s@  „ Ùkóð )-Ø6:ñ^'àð^'ð �t˜C ˜H‘~Ñ&¨¨c°3¨h©Ñ7ð^'ð �S˜#�X‘ Ñ%ð	^'ð
 -¨tÑ3ð^'ð 
ˆc�3ˆh‰ó^'ðF 7;ñ'à!% c¨6 kÑ!2ð'ð -¨tÑ3ð'ð 
ˆc�6ˆkÑ	ó	'ð,Eà!ðEð 
�uÑ	 Ñ	$óEðEà˜
Ñ#ðEð 
Ð%Ñ	&óEð6Aà%ðAð 
(¨$Ñ	.óAð  >Bñrà�t˜C ˜H‘~Ñ&ðrð 4°dÑ:ðrð 
ÐÑ	ó	rðh<)àð<)ð 
ˆc�6ˆkÑ	ó<)ð|HàÐ"5Ñ5ðHð *ðHð 
ˆc�6ˆkÑ	˜TÑ	!ó	HðT 2àð 2ð 
ˆjÑ	ó 2ðDIØðIØ#;ðIà	ˆjÑ	óIðV2°°d±
ð 2¸só 2ð
 ¨¡ð 
°°c¸3°h±ô 
r*   r\   )2rI   Úcollections.abcr   r   r   Útypingr   r   r   r	   Útyping_extensionsr
   Úlitellmr   Ú/litellm.litellm_core_utils.json_validation_ruler   Úlitellm.types.llms.openair   r   r   r   r   r   r   r   r   r   r   r   Úlitellm.types.routerr   rˆ   r   r   r   r   r   r   r!   r/   r3   r9   r>   rA   rD   r'   r7   rK   rM   r\   r)   r*   r+   ú<module>r!     sÕ   ðÛ ß =Ñ =ß .Ó .å &å "Ý Q÷÷ ÷ ó õ 6÷÷ ô�Y eõ ô*˜i¨uõ *ô.� %õ .ô
6 	°õ 6ôD� %õ Dô )°5õ ôA�y¨õ Að%¨sð %°vó %ô
J.Ð=ô J.÷Zk
ò k
r*   