
    tniW                     J   d dl Z d dlZd dl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mZmZ d dlZd dlmZmZmZ d dlmZmZ d dlmZ d d	lmZmZmZ d d
l m!Z! e
rd dl"m#Z# d dl m$Z$m%Z%m&Z&m'Z'm(Z(  G d de          Z)	 	 	 	 dAdZ*dBdZ+ddde,fdZ-dCdZ.	 	 	 	 dDd Z/	 	 	 	 dEd"Z0	 	 	 	 	 	 	 	 dFd)Z1d*e,d+ddd,fd-Z2dGd/Z3	 	 	 	 dHd2Z4	 	 	 	 dId4Z5	 	 	 	 dId5Z6d6d,d7dde,ddd%d&ddfd8Z7	 	 	 	 	 	 	 	 dJd9Z8	 	 	 	 	 	 dKd;Z9	 	 	 	 	 	 dLd=Z:	 	 	 	 	 	 	 	 	 	 dMd>Z;	 	 	 	 	 	 	 	 dNd@Z<dS )O    N)wraps   )ORIGINTOOL_ATTRIBUTES_MAPGEN_AI_SYSTEM)	castTYPE_CHECKINGIterableAnyCallableListOptionalUnion	TypedDict)set_data_normalizedtruncate_and_annotate_messagesnormalize_message_roles)OPSPANDATA)should_send_default_pii)capture_internal_exceptionsevent_from_exceptionsafe_serialize)GenerateContentConfig)Span)GenerateContentResponseContentListUnionToolModelEmbedContentResponsec                   F    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dS )	UsageDatazStructure for token usage data.input_tokensinput_tokens_cachedoutput_tokensoutput_tokens_reasoningtotal_tokensN)__name__
__module____qualname____doc__int__annotations__     g/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/sentry_sdk/integrations/google_genai/utils.pyr"   r"   +   sT         ))    r/   r"   response.Union[GenerateContentResponse, dict[str, Any]]returnc                 B   t          ddddd          }t          | t                    r|                     di           }|s|S |                    dd          pd}|                    dd          pd}||z   |d<   |                    dd          pd}||d<   |                    d	d          pd}||d
<   |                    dd          pd}||z   |d<   |                    dd          pd}||d<   |S t	          | d          s|S | j        }t          |dd          pd}t          |dd          pd}||z   |d<   t          |dd          pd}||d<   t          |d	d          pd}||d
<   t          |dd          pd}||z   |d<   t          |dd          pd}||d<   |S )a@  Extract usage data from response into a structured format.

    Args:
        response: The GenerateContentResponse object or dictionary containing usage metadata

    Returns:
        UsageData: Dictionary with input_tokens, input_tokens_cached,
                   output_tokens, and output_tokens_reasoning fields
    r   )r#   r$   r%   r&   r'   usage_metadataprompt_token_counttool_use_prompt_token_countr#   cached_content_token_countr$   thoughts_token_countr&   candidates_token_countr%   total_token_countr'   )r"   
isinstancedictgethasattrr5   getattr)	r1   
usage_datausageprompt_tokenstool_use_prompt_tokenscached_tokensreasoning_tokenscandidates_tokensr'   s	            r0   extract_usage_datarH   5   s<     !  J (D!! -r22 			"6::?a!&+H!!L!L!QPQ%25K%K
>"		">BBGa,9
() 99%;Q??D10@
,-!II&>BBGa '8:J&J
?#yy!4a88=A%1
>"8-.. #E E#7;;@qM$U,I1MMRQR!.1G!GJ~ E#?CCHqM(5J$% u&<a@@EA,<J()  '?CCHq"36F"FJ5"5q99>QL!-J~r/   excr   c                     t          | t          j                    j        ddd          \  }}t          j        ||           dS )z.Capture exception with Google GenAI mechanism.google_genaiF)typehandled)client_options	mechanism)hintN)r   
sentry_sdk
get_clientoptionscapture_event)rI   eventrP   s      r0   _capture_exceptionrV      sU    &!,..6)e<<  KE4
 U......r/   modelzUnion[str, Model]c                     t          | t                    r| S t          | d          rt          | j                  S t          |           S )z(Extract model name from model parameter.name)r<   strr?   rY   )rW   s    r0   get_model_namer[      sE    % uf 5:u::r/   contentsr   Optional[str]c                    | dS t          | t                    r| S t          | t                    rFg }| D ](}t          |          }|r|                    |           )|rd                    |          ndS t          | t                    r%d| v r| d         S d| v rt          | d                   S t          | dd          rt          | j                  S t          | d          r| j
        S dS )zDExtract text from contents parameter which can have various formats.N textparts)r<   rZ   listextract_contents_textappendjoinr=   r@   ra   r?   r`   )r\   textsitem	extracteds       r0   rc   rc      s   t (C    (D!! 2 	( 	(D-d33I (Y'''"'1sxxT1 (D!! <XF##h('):;;; x$'' 5$X^444 x   }4r/   tools#Iterable[Tool | Callable[..., Any]]Optional[List[dict[str, Any]]]c           
         g }| D ]}t          |          r7|                    t          |dd          t          |dd          d           Ht          |d          rH|j        A|j        D ]8}|                    t          |dd          t          |dd          d           9t          j                    D ]0\  }}t          ||d          r|                    ||d            n1|r|ndS )	z%Format tools parameter for span data.r(   unknownr+   N)rY   descriptionfunction_declarationsrY   rn   )callablerd   r@   r?   ro   r   items)ri   formatted_toolstool	func_decl	attr_namern   s         r0   _format_tools_for_spanrv      s`    O    D>> 	""#D*i@@#*4D#A#A     D122	*6 "7  	&& '	64 @ @'.y-'N'N     +>*C*E*E  &	;4D11 #**$-+6    E .7??47r/   r   c                    g }t          | dg           r| j        D ]}t          |d          rt          |j        dg           s)|j        j        D ]k}t          |dd          rX|j        }t          |dd          dd}t          |dd          rt          |j                  |d	<   |                    |           lt          | d
d          r| j	        D ]}t          |dd          st          |dg           D ]j}t          |dd          rW|j        }t          |dd          dd}t          |d          rt          |j                  |d	<   |                    |           k|r|ndS )z\Extract tool/function calls from response candidates and automatic function calling history.
candidatescontentra   function_callNrY   )rY   rL   args	arguments"automatic_function_calling_history)
r@   rx   r?   ry   ra   rz   r   r{   rd   r}   )r1   
tool_calls	candidatepartrz   	tool_callry   s          r0   extract_tool_callsr      s   
 J xr** 1!, 	1 	1I9i00 !7B9 9  !)/ 1 14$77 1$($6M 'vt D D /! !I }fd;; T1?@R1S1S	+.%%i0001  x=tDD 1B 	1 	1G7GT22 "55 1 14$77 1$($6M 'vt D D /! !I }f55 T1?@R1S1S	+.%%i0001 $-::-r/   r{   tuple[Any, ...]kwargsdict[str, Any]rs   r   c                 B   |r|                                 ni }| r	 t          j        |          }t          |j                                                  }t          |           D ]#\  }}|t          |          k     r||||         <   $n# t          $ r | |d<   Y nw xY w|S )z(Capture tool input from args and kwargs.r{   )	copyinspect	signaturerb   
parameterskeys	enumeratelen	Exception)r{   r   rs   
tool_inputsigparam_namesiargs           r0   _capture_tool_inputr     s     #)0bJ  	&	&#D))Cs~224455K#D// 5 53s;''''14J{1~.5  	& 	& 	&!%Jv	& s   A-B
 
BB	tool_nametool_docr   c                    t          j        t          j        d|  t                    }|                    t          j        |            |                    t          j        d           |r |                    t          j	        |           |S )z!Create a span for tool execution.zexecute_tool )oprY   originfunction)
rQ   
start_spanr   GEN_AI_EXECUTE_TOOLr   set_datar   GEN_AI_TOOL_NAMEGEN_AI_TOOL_TYPEGEN_AI_TOOL_DESCRIPTION)r   r   spans      r0   _create_tool_spanr   .  s     !(Y((  D
 	MM(+Y777MM(+Z888 Bh6AAAKr/   Tool | Callable[..., Any]c                      t                     s S t           dd           j        t          j                   rt                     d
 fd            }|S t                     d
 fd            }|S )z3Wrap a tool to emit execute_tool spans when called.r(   rm   r{   r   r   r3   c                  0  K   t                    5 }t          | |          }t                      5  |                    t          j        t          |                     d d d            n# 1 swxY w Y   	  | i | d {V }t                      5  |                    t          j        t          |                     d d d            n# 1 swxY w Y   |cd d d            S # t          $ r}t          |            d }~ww xY w# 1 swxY w Y   d S N
r   r   r   r   r   GEN_AI_TOOL_INPUTr   GEN_AI_TOOL_OUTPUTr   rV   	r{   r   r   r   resultrI   rs   r   r   s	         r0   async_wrappedz#wrapped_tool.<locals>.async_wrappedG  s     "9h77 40vtDD
022  MM 2N:4N4N                
#'4#8#8#8888888F 566  $79O9O                
 "#       $ !   &s+++%         sv    D.A."D.A2	2D5A2	6D:C).CC)C	C)C	C))
D3DDDDDc                      t                    5 }t          | |          }t                      5  |                    t          j        t          |                     d d d            n# 1 swxY w Y   	  | i |}t                      5  |                    t          j        t          |                     d d d            n# 1 swxY w Y   |cd d d            S # t          $ r}t          |            d }~ww xY w# 1 swxY w Y   d S r   r   r   s	         r0   sync_wrappedz"wrapped_tool.<locals>.sync_wrappedb  s   "9h77 40vtDD
022  MM 2N:4N4N                
!T42622F 566  $79O9O                
 "#       $ !   &s+++%         sv    D.A, D,A0	0D3A0	4D8C!.C<C!C	C!C	C!!
D +C;;D  DD
DN)r{   r   r   r   r3   r   )rp   r@   r+   r   iscoroutinefunctionr   )rs   r   r   r   r   s   `  @@r0   wrapped_toolr   <  s    D>> j)44I|H"4(( 5	t	 	 	 	 	 	 	 
	.  
t	 	 	 	 	 	 	 
	. r/   configr   c                     | rt          | dd          s| S t          j        |           }d | j        D             |_        |S )zWrap tools in config to emit execute_tool spans. Tools are sometimes passed directly as
    callable functions as a part of the config object.ri   Nc                 ,    g | ]}t          |          S r.   )r   ).0rs   s     r0   
<listcomp>z-wrapped_config_with_tools.<locals>.<listcomp>  s     @@@4L&&@@@r/   )r@   r   ri   )r   r   s     r0   wrapped_config_with_toolsr   }  sO      $77 YvF@@6<@@@FLMr/   Optional[List[str]]c                    | rt          | dg           sdS g }| j        D ]b}t          |d          rt          |j        d          s(|j        j        D ]-}t          |dd          r|                    |j                   .c|r|ndS )z&Extract text from response candidates.rx   Nry   ra   r`   )r@   rx   r?   ry   ra   rd   r`   )r1   rf   r   r   s       r0   _extract_response_textr     s    
  78\2>> tE( ( (	y),, 	GI<Mw4W4W 	%+ 	( 	(DtVT** (TY'''	( #55t#r/   c                    | rt          | dg           sdS g }| j        D ][}t          |dd          rHt          |j                  }d|v r|                    d          d         }|                    |           \|r|ndS )z0Extract finish reasons from response candidates.rx   Nfinish_reason.)r@   rx   rZ   r   splitrd   )r1   finish_reasonsr   reasons       r0   extract_finish_reasonsr     s      78\2>> tN( * *	9ot44 	*011Ff}}c**2.!!&)))+5>>5r/   r   integrationc                    |                      t          j        t                     |                      t          j        |           |                    dd          r |                      t          j        d           |                    d          }t                      r|j        rg }|rBt          |d          r2|j	        }|r)t          |          }|r|                    d|d           t          |          }	|	r|                    d|	d           |rRt          |          }
t          j                    }t          |
| |          }|t!          | t          j        |d
           dt          j        fdt          j        fdt          j        fdt          j        fdt          j        fdt          j        fdt          j        ffD ]=\  }}t          ||          r(t3          ||          }||                      ||           >|It          |d          r;|j        }|r4t7          |          }|r%t!          | t          j        |d
           d	S d	S d	S d	S d	S )zSet span data for the request.streamFTr   system_instructionsystem)rolery   userNunpacktemperaturetop_ptop_kmax_output_tokenspresence_penaltyfrequency_penaltyseedri   )r   r   r   GEN_AI_REQUEST_MODELr>   GEN_AI_RESPONSE_STREAMINGr   include_promptsr?   r   rc   rd   r   rQ   get_current_scoper   r   GEN_AI_REQUEST_MESSAGESGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_PGEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_PRESENCE_PENALTY GEN_AI_REQUEST_FREQUENCY_PENALTYGEN_AI_REQUEST_SEEDr@   ri   rv   GEN_AI_REQUEST_AVAILABLE_TOOLS)r   r   rW   r\   r   r   messagesr   system_textcontents_textnormalized_messagesscopemessages_dataparamspan_keyvalueri   rr   s                     r0   set_span_data_for_requestr     s    	MM((-888MM(/777zz(E"" @h8$???06

80D0DF    [%@   	Pgf&:;; 	P!'!:! P34FGG POOX+$N$NOOO .h77 	HOOVFFGGG 	"9("C"C022E:#T5 M (#4! 	    
;<	(/0	(/0	h@A	XEF	hGH	-. / /x 65!! 	/FE**E h... gfg66 	4U;;O #;# 	      	 	 r/   c                 N   |sdS t                      rE|j        r>t          |          }|r-|                     t          j        t          |                     t          |          }|r-|                     t          j        t          |                     t          |          }|rt          | t          j        |           t          |dd          r%|                     t          j        |j                   t          |dd          r%|                     t          j        |j                   t#          |          }|d         r&|                     t          j        |d                    |d         r&|                     t          j        |d                    |d         r&|                     t          j        |d                    |d         r&|                     t          j        |d                    |d         r(|                     t          j        |d                    dS dS )	zSet span data for the response.Nresponse_idmodel_versionr#   r$   r%   r&   r'   )r   r   r   r   r   GEN_AI_RESPONSE_TEXTr   r   GEN_AI_RESPONSE_TOOL_CALLSr   r   GEN_AI_RESPONSE_FINISH_REASONSr@   GEN_AI_RESPONSE_IDr   GEN_AI_RESPONSE_MODELr   rH   GEN_AI_USAGE_INPUT_TOKENS GEN_AI_USAGE_INPUT_TOKENS_CACHEDGEN_AI_USAGE_OUTPUT_TOKENS$GEN_AI_USAGE_OUTPUT_TOKENS_REASONINGGEN_AI_USAGE_TOTAL_TOKENS)r   r   r1   response_textsr~   r   rA   s          r0   set_span_data_for_responser      s-        Y[%@ Y/99 	YMM(79W9WXXX#H--J Wh9>*;U;UVVV+H55N 
(9>	
 	
 	
 x-- Ih183GHHHx$// Nh4h6LMMM#H--J.! Vh8*^:TUUU'( 
5,-	
 	
 	

 /" Xh9:o;VWWW+, 
901	
 	
 	

 .! Vh8*^:TUUUUUV Vr/   tuple[Any, Any, str]c                 $   | r| d         n|                     dd          }t          |           dk    r| d         n|                     d          }t          |          }|                     d          }t          |          }||ur||d<   |||fS )zBExtract and prepare common arguments for generate_content methods.r   rW   rm   r   r\   r   )r>   r   r[   r   )r{   r   rW   r\   
model_namer   wrapped_configs          r0   prepare_generate_content_argsr   6  s     ?DGGGY!?!?Ed))a--tAwwVZZ
-C-CH&&JZZ!!F.v66NV##)x(J&&r/   tuple[str, Any]c                 ~    |                     dd          }|                     d          }t          |          }||fS )zxExtract and prepare common arguments for embed_content methods.

    Returns:
        tuple: (model_name, contents)
    rW   rm   r\   )r>   r[   )r{   r   rW   r\   r   s        r0   prepare_embed_content_argsr   F  s@     JJw	**Ezz*%%H&&Jxr/   c                 b   t                      r|j        r|rg }t          |t                    r|g}nUt          |t                    r,|D ](}t          |          }|r|                    |           )nt          |          }|r|g}|r%t          | t          j	        |d           dS dS dS dS dS )z$Set span data for embedding request.Fr   N)
r   r   r<   rZ   rb   rc   rd   r   r   GEN_AI_EMBEDDINGS_INPUT)r   r   r\   r   input_textsrg   r`   s          r0   set_span_data_for_embed_requestr  U  s   
    [%@  	K (C(( 
)'jHd++ )$ 1 1D066D 1#**40001
 -X66 )#'&K #4 	     '   	 	" r/   r    c                 .   |sdS t          |d          r||j        rwd}|j        D ]C}t          |d          r1|j        r*t          |j        dd          }||t	          |          z  }D|dk    r&|                     t          j        |           dS dS dS dS )z%Set span data for embedding response.N
embeddingsr   
statisticstoken_count)r?   r  r  r@   r,   r   r   r   )r   r   r1   r'   	embeddingr  s         r0    set_span_data_for_embed_responser	  u  s       x&& L8+> L!, 	5 	5Iy,// 5I4H 5%i&:M4PP* C$4$44L !MM(<lKKKKKL L L L r/   )r1   r2   r3   r"   )rI   r   r3   N)r\   r   r3   r]   )ri   rj   r3   rk   )r1   r   r3   rk   )r{   r   r   r   rs   r   r3   r   )rs   r   r3   r   )r   r   r3   r   )r1   r   r3   r   )r   r   r   r   r1   r   r3   N)r{   r   r   r   r3   r   )r{   r   r   r   r3   r   )
r   r   r   r   r\   r   r   r   r3   N)r   r   r   r   r1   r    r3   N)=r   r   	functoolsr   constsr   r   r   typingr   r	   r
   r   r   r   r   r   r   rQ   sentry_sdk.ai.utilsr   r   r   sentry_sdk.constsr   r   sentry_sdk.scoper   sentry_sdk.utilsr   r   r   google.genai.typesr   sentry_sdk.tracingr   r   r   r   r   r    r"   rH   rV   rZ   r[   rc   rv   r   r   r   r   r   r   r   r   r   r   r   r  r	  r.   r/   r0   <module>r     s           > > > > > > > > > >
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
             
 + * * * * * * * 4 4 4 4 4 4         
 5 4 4 4 4 4 ''''''                 	   H>HH H H HV/ / / /- #    # # # #L'80'8%'8 '8 '8 '8T2.'2.%2. 2. 2. 2.j
%5=C   *  F    > > > >B#   $'$$ $ $ $(6'66 6 6 6(I
II I !	I
 I 
I I I IX3V
3V$3V0I3V	3V 3V 3V 3Vl'
'%5'' ' ' '  
 %5        
$05?O	   @L
L$L0FL	L L L L L Lr/   