
    hh                         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
mZ d dl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  G d de      Z G d	 d
      Zy)    N)AnyAsyncIteratorDictIteratorListOptionalUnioncast)normalize_tool_schema)	AllMessageValuesChatCompletionAssistantMessageChatCompletionAssistantToolCallChatCompletionRequest#ChatCompletionToolCallFunctionChunkChatCompletionToolChoiceValuesChatCompletionToolMessageChatCompletionToolParamChatCompletionUserMessage)GenericLiteLLMParams)AdapterCompletionStreamWrapperChoicesModelResponseModelResponseStreamStreamingChoicesc                        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                 @    d| _         i | _        t        |   |       y )NF)r   r   super__init__)selfr   	__class__s     h/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/google_genai/adapters/transformation.pyr"   z!GoogleGenAIStreamWrapper.__init__$   s!     %&(#*+    c                     	 | j                   D ]*  }|dk(  s|t               j                  ||       }|s(|c S  t        # t        $ r t        t        $ r t        w xY wNNone)r   GoogleGenAIAdapter2translate_streaming_completion_to_generate_contentStopIteration	Exceptionr#   chunktransformed_chunks      r%   __next__z!GoogleGenAIStreamWrapper.__next__)   sv    	 //F?em %7$8$k$k4%! %,, 0   	  	 	 s   3A A A Ac                    K   	 | j                   2 3 d {   }|dk(  s|t               j                  ||       }|s.|c S 7 -6 t        # t        $ r t        t        $ r t        w xY wwr(   )r   r*   r+   StopAsyncIterationr-   r.   s      r%   	__anext__z"GoogleGenAIStreamWrapper.__anext__<   s     	%#55 	- 	-eF?em %7$8$k$k4%! %,,	-5 %$! 	%$$ 	%$$	%sA   A,A AAA%A A A,AA A))A,returnc              #      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)r   
isinstancedictjsondumpsencode)r#   r/   payloads      r%   google_genai_sse_wrapperz1GoogleGenAIStreamWrapper.google_genai_sse_wrapperO   sL      ++E%&"4::e#4"5T:nn&& ,s   AAc                  K   ddl m} | j                  2 3 d{   }t        |t              r-dt        j                  |       d}|j                          Ft        ||      ret               j                  ||       }t        |t              r-dt        j                  |       d}|j                          t        d|       t        d|       7 6 yw)z<
        Async version of google_genai_sse_wrapper.
        r   )r   Nr7   r8   zInvalid chunk 1: zInvalid chunk 2: )litellm.types.utilsr   r   r9   r:   r;   r<   r=   r*   r+   
ValueError)r#   r   r/   r>   r0   s        r%   async_google_genai_sse_wrapperz7GoogleGenAIStreamWrapper.async_google_genai_sse_wrapperZ   s      	<11 	> 	>%%&"4::e#4"5T:nn&&E#67$6$8$k$k4%! /6 &tzz2C'D&ETJG!..**$'8%@AA #4UG!<==!	>1s&   CCCCB=CCC)__name__
__module____qualname____doc__r   bool__annotations__r   strr   r"   r1   r4   r   bytesr?   r   rC   __classcell__)r$   s   @r%   r   r      sd    
 #d" d38n!455,# ,
 &%&	(5/ 	>mE6J >r&   r   c                      e Zd ZdZd dZ	 	 d!dedeeeee	f      eee	f   f   de
eee	f      de
e   deee	f   f
d	Z	 d"d
eee	f   de
e   defdZde	deee   df   fdZdeeee	f      dee   fdZdeee	f   de
e   fdZdeeee	f      dee   fdZdedeee	f   fdZdeeef   dedeee	f   fdZde	deeee	f      fdZde	deeee	f      fdZde	dedeeee	f      fdZde
e   defdZ de	deee!f   fdZ"y)#r*   zaAdapter for transforming Google GenAI generate_content requests to/from litellm.completion formatr5   Nc                      y N )r#   s    r%   r"   zGoogleGenAIAdapter.__init__v   s    r&   modelcontentsconfiglitellm_paramsc                    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	<   d
|v r;|d
   }	t        |	t              r&t	        |	      dkD  r| j                  |	      }
|
r|
|d
<   d|v r| j                  |d         }|r||d<   t        |      }|r| j                  ||      }|S )a^  
        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

        Returns:
            Dict in OpenAI format
        )rQ   messagestemperaturemaxOutputTokens
max_tokenstopPtop_ptopKstopSequencesstoptoolsr   tool_configtool_choice)completion_request_dictrT   )r9   r:   _transform_contents_to_messageslistlen'_transform_google_genai_tools_to_openai-_transform_google_genai_tool_config_to_openai&_add_generic_litellm_params_to_request)r#   rQ   rR   rS   rT   kwargscontents_listrV   completion_requestr_   openai_toolsra   rb   s                r%   (translate_generate_content_to_completionz;GoogleGenAIAdapter.translate_generate_content_to_completiony   s[   , h%%JM$M 77F  5
$ &4:=4I"=1 F*39:K3L"<0.4Vn"7+&(-3O-D"6* f7OE %&3u:>#KKER2>&w/ F"LL}%K 4?"=1
 #''9":&*&Q&Q(?- 'R '#
 '&r&   rb   c                     t         j                  j                         }|r4|j                  d      }|j	                         D ]  \  }}||v s|||<    |S )zAdd 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_dumpitems)r#   rb   rT   allowed_fieldslitellm_dictkeyvalues          r%   rh   z9GoogleGenAIAdapter._add_generic_litellm_params_to_request   s`     .::??A)44$4GL*002
U.(38+C0 3 '&r&   r   c                 :    t        |      }|j                         S )z<Transform streaming completion output to Google GenAI format)r   )r   rC   )r#   r   google_genai_wrappers      r%   ,translate_completion_output_params_streamingz?GoogleGenAIAdapter.translate_completion_output_params_streaming   s#      8/ 
 $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 formatfunctionDeclarationsname description
parametersfunction)typer   )getappendr   r
   r   r   )r#   r_   rl   tool	func_declfunction_chunkopenai_toolnormalized_toolss           r%   rf   z:GoogleGenAIAdapter._transform_google_genai_tools_to_openai   s     .0D%-!%&<!=I	fb 96N %	18A-8P}5#y07@7N|4+5>"RK ''4 ">   EQQD1$7QQD013CDD R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_choicefunctionCallingConfigmodeAUTOautorequirednone)r   ANYNONE)r   r
   r   )r#   r`   function_calling_configr   mode_mappingra   s         r%   rg   z@GoogleGenAIAdapter._transform_google_genai_tool_config_to_openai  sT     #.//2I2"N&**66: &z6J"&&tV42K@@r&   c                    g }|D ]  }|j                  dd      }|j                  dg       }|dk(  rd}g }|D ]  }t        |t              rmd|v r	||d   z  } d|v s%|d   }	t        dd|	j                  d	d
       t	        j
                  |	j                  di                   }
|j                  |
       t        |t              s||z  } |r|j                  t        d|             |j                  |       |dk(  sd}g }|D ]  }t        |t              rd|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 formatroleuserpartsr~   textfunctionResponser   call_r}   unknownresponse)r   tool_call_idcontent)r   r   rQ   functionCallr   args)r}   	arguments)idr   r   	assistantN)r   r   
tool_calls)r   r9   r:   r   r;   r<   r   rJ   r   extendr   r   r   )r#   rR   rV   r   r   r   combined_texttool_messagespartfunc_responsetool_messager   	func_call	tool_callassistant_messages                  r%   rc   z2GoogleGenAIAdapter._transform_contents_to_messages  s    ,.G;;vv.DKK,Ev~ "AC!D!$-!T>)T&\9M/47,01C,DM+D%+/4]5F5Fvy5Y4Z-[(,

=3D3DZQS3T(U,L
 *00>#D#.%- "" !OO1v}U
 . "DF
!D!$-!T>)T&\9M+t3(,^(<I(G%*9==+K*L#M%/)L)2vr)B.2jjvr9R.S*")I '--i8#D#.%-# "( (F(1>D#-)% )G(1>D)%
  12O  R r&   r   c                    |j                   r|j                   d   nd}|st        d      t        |t              r3|j                  st        d      | j                  |j                        }nt        |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 choicez?Invalid completion response: no delta found in streaming choicemessager   r~   deltar   rQ   r   r   finish_reasonr   finishReasonindexsafetyRatingsusagepromptTokenCountcandidatesTokenCounttotalTokenCount)
candidatesusageMetadata)choicesrB   r9   r   r   /_transform_openai_message_to_google_genai_partsr   r   -_transform_openai_delta_to_google_genai_partsgetattrr   _map_finish_reasonhasattr
_map_usager:   )r#   r   choicer   message_contentgenerate_content_responsetext_contentr   s           r%   (translate_completion_to_generate_contentz;GoogleGenAIAdapter.translate_completion_to_generate_contentn  s    )1(8(8!!!$dLMM fg&>> M  HHXE 01<< U  FFv||TE &fi<@@2 A"-11)R@  4Cfo./E */@$($;$;>% %'	 8W-'(GT2R '4 @A )*,-'(5
!. D$%&D.V,  0<%f-((r&   wrapperc                 l   |j                   r|j                   d   nd}|si S 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i S 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   r   r~   r   r   rQ   r   r   r   r   r   )r   r9   r   r   ?_transform_openai_delta_to_google_genai_parts_with_accumulationr   r   r   r   r   r:   )r#   r   r   r   r   r   r   streaming_chunkusage_metadatar   r   s              r%   r+   zEGoogleGenAIAdapter.translate_streaming_completion_to_generate_content  s   " )1(8(8!!!$dI f./||\\LL' #FOTBM &fgr:>>y"MO3Bfo./E#FOTBM ]I ).@ ) //>!%'	+
   8W-'(GT2R '4 @A )*,-'(  0>OO, D$%&D.V,  &2OF#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                  j
                        ni }d|j                  j                  |di}|j                  |        |r|S ddigS # t        j                  $ r i }Y Nw xY w)z5Transform OpenAI message to Google GenAI parts formatr   r   r   r   r   r}   r   r~   )
r   r   r   r   r   r   r;   loadsJSONDecodeErrorr}   )r#   r   r   r   r   function_call_parts         r%   r   zBGoogleGenAIAdapter._transform_openai_message_to_google_genai_parts  s     ') 7I&7??LL&'//23 7L)g.@.@$//	9j1i6H6H"  )11;; !JJy'9'9'C'CD!#  '1C1C1H1HRV(W*& LL!34 0  u1VRL>1  // "!"s   :AC22D
	D
r   c                     g }t        |d      r)|j                  r|j                  d|j                  i       t        |d      r|j                  r|j                  D ]  }t        |d      s|j                  st        |j                  dd      xs d}	 |rt        j                  |      ni }dt        |j                  d	d      xs d|d
i}|j                  |        |S # t        j                  $ r d|i}Y Nw xY w)zATransform OpenAI delta to Google GenAI parts format for streamingr   r   r   r   r   r~   partialr   r}   r   )	r   r   r   r   r   r   r;   r   r   )r#   r   r   r   args_strr   r   s          r%   r   z@GoogleGenAIAdapter._transform_openai_delta_to_google_genai_parts#  s     ') 5)$LL&%--01 5,'E,<,<"--	9j1i6H6H&y'9'9;KQrH57?tzz(3R '$+I,>,>$K$Qr$()*& LL!34! .$   // 5 )845s   C##C=<C=c                 H   g }t        |d      r)|j                  r|j                  d|j                  i       t        |d      rC|j                  r6|j                  D ]&  }t        |d      s|j                  st        |dd      xs d}t        |j                  dd      xs d}t        |j                  d	d      xs d}||j                  vrddd
d|j                  |<   |r||j                  |   d<   |r|j                  |   d	xx   |z  cc<   |j                  |   d	   }	 |r\t        j                  |      }	d|j                  |   d<   d|j                  |   d   |	di}
|j                  |
       |j                  |= ) |S # t        j                  $ r Y Bw xY w)zOTransform OpenAI delta to Google GenAI parts format with tool call accumulationr   r   r   r   r   r~   call_unknownr}   r   F)r}   r   completeTr   r   r   )
r   r   r   r   r   r   r   r;   r   r   )r#   r   r   r   r   r   function_namer   accumulated_argsparsed_argsr   s              r%   r   zRGoogleGenAIAdapter._transform_openai_delta_to_google_genai_parts_with_accumulationC  s    ') 5)$LL&%--01 5,'E,<,<"--	9j1i6H6H#*9dB#?#Q>L$+I,>,>$K$QrM&y'9'9;KQrH $7+I+II$&)+(-H66|D % *  66|D"
  66|D'%& 
 (/'E'El'S#($+*.**5E*FK !% $::<H *
 !/,3,J,J(4-&&,-. -8	1"2. "LL);< !( > >| Lc .p   //  s   'AF

F! F!r   c                 <    |sydddddd}|j                  |d      S )z8Map OpenAI finish reasons to Google GenAI finish reasonsSTOP
MAX_TOKENSSAFETY)r^   lengthcontent_filterr   function_call)r   )r#   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   )r#   r   s     r%   r   zGoogleGenAIAdapter._map_usage  sB     !( B Ga$+E3F$J$Oa&una@EA
 	
r&   )r5   N)NNrO   )#rD   rE   rF   rG   r"   rJ   r	   r   r   r   r   r   rm   r:   rh   r   rK   rz   r   rf   r   rg   r   rc   r   r   r   r   r+   r   r   r   r   intr   rP   r&   r%   r*   r*   s   s`   k ,09=\'\' T#s(^,d38n<=\' c3h(	\'
 !!56\' 
c3h\'B :>'!%c3h' !!56' 
	',E!$E	}U#T)	*EE$sCx.)E	%	&E4
AS>
A	0	1
AOT#s(^,O		ObE)%E)	c3hE)NN'::;N *N 
c3h	N`22	d38n	2<	d38n	@DD#;D	d38n	DL2 2# 2
 
S#X 
r&   r*   ) r;   typingr   r   r   r   r   r   r	   r
   /litellm.litellm_core_utils.json_validation_ruler   litellm.types.llms.openair   r   r   r   r   r   r   r   r   litellm.types.routerr   rA   r   r   r   r   r   r   r*   rP   r&   r%   <module>r      sN     R R R Q
 
 
 6 V>= V>rk
 k
r&   