
    bi3                       d Z ddlmZ ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZ ddl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 d	dlmZmZ d	dlmZmZ dZdZ ddZ! ejD                  e#      Z$dZ%ddZ&ddZ'd dZ(d!dZ)d!dZ*	 	 	 	 	 	 	 	 	 	 d!dZ+d"dZ,	 	 	 	 	 	 	 	 	 	 d!dZ-	 	 	 	 	 	 	 	 	 	 d!dZ.	 	 	 	 	 d#	 	 	 	 	 	 	 	 	 d$dZ/y)%z2Client instrumentation for Google ADK using wrapt.    )annotationsN)aclosing)datetimetimezone)AnyOptional)get_current_run_treetrace)RunTree   )get_tracing_config)clear_active_runs)convert_llm_request_to_messageshas_function_calls)RecursiveCallbackInjectorget_callbacks)extract_model_nameextract_usage_from_responsegoogle_vertexai	google_aic                 ~    ddl } | j                  j                  dd      j                         dv }|rt        S t
        S )z;Detect provider based on GOOGLE_GENAI_USE_VERTEXAI env var.r   NGOOGLE_GENAI_USE_VERTEXAI0)1trueyes)osenvirongetlower_LS_PROVIDER_VERTEXAI_LS_PROVIDER_GOOGLE_AI)r   use_vertexais     s/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/langsmith/integrations/google_adk/_client.py_get_ls_providerr%      s?    ::>>"=sCIIK P L
 %1 L6LL    zgoogle_adk.sessionc                    | y t        | dd       }|sy |D cg c]%  }t        |dd       st        |j                        ' }}|rdj                  |      S d S c c}w )Npartstext )getattrstrr)   join)contentr(   p
text_partss       r$   _extract_text_from_contentr1   *   s`    GWd+E',I!640H#aff+IJI#-388J747 Js
   AAc                    	 t        t                     }|j                  |        y # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)Nz$Failed to inject tracing callbacks: )r   r   inject	Exceptionloggerwarning)agentinjectores      r$   _inject_tracing_callbacksr:   4   sI    C,]_= C=aSABBCs   $' 	AAAc                     t               S )N)r	    r&   r$   _get_parent_runr=   <   s    !!r&   c                    |j                  d      xs	 |r|d   nd}|rt        |        | |i |}t               |_        |S )zJWrap Runner.__init__ to inject tracing callbacks into the agent hierarchy.r7   r   N)r   r:   r   _langsmith_config)wrappedinstanceargskwargsr7   results         r$   wrap_runner_initrE   @   sG    JJw>tDGE!%(d%f%F!3!5HMr&   c                   
 t        |dd      xs
 t               

j                  d      xs t        i j                  d      x}rt	        |      x}r|d<   dt               i
j                  d      xs i t        |dd      x}r|d<   j                  d	      x}r|d	<   j                  d
      x}r|d
<   
 fd}	 |	       S )zEWrap Runner.run to create a traced session for synchronous execution.r?   Nnamenew_messageinputls_providermetadataapp_nameuser_id
session_idc            	   3  (  K   t        d
j                  d      j                  d            5  	 t         i 	      } d }t        |       D ]#  }t	        |dd       x}st        |      x}s!|} n t               }|r|j                  |rd|ind        | E d {    	 t                	 d d d        y 7 # t        $ r-}t               }|r|j                  t        |              d }~ww xY w# t                w xY w# 1 sw Y   y xY ww	Nchainproject_nametagsrG   run_typeinputsrR   rS   rK   r.   outputoutputserror)r
   r   listreversedr+   r1   r	   endr4   r,   r   )eventsfinal_outputeventr.   r)   runr9   rB   configrC   trace_inputstrace_metadata
trace_namer@   s          r$   
_trace_runz#wrap_runner_run.<locals>._trace_run_   s    N3F##
 	$$gt6v67#%f- "E")%D"AAwA#=g#FF4F+/L!	"
 +,GGX|$<RVGW!!! "#5	$ 	$& " *,GG#a&G)	 "#5	$ 	$si   0DD0B>&B>4.B>"B<#B>(
D3	D<B>>	C4(C//C44C77DDDDr+   r   r   TRACE_CHAIN_NAMEr1   r%   )r@   rA   rB   rC   rH   r)   rL   rM   rN   rg   rc   rd   re   rf   s   ` ``      @@@@r$   wrap_runner_runrj   J   s    X2D9Q=O=QFF#7'7J#%Ljj//{/-k::4:$(L! 	')::j!'RN 8Z66x6%-z"**Y''w'$+y!ZZ--z-'1|$$ $: <r&   c                  K   t        |dd      xs
 t               j                  d      xs t        i j                  d      x}rt	        |      x}r|d<   dt               ij                  d      xs i t        |dd      x}r|d<   j                  d	      x}r|d	<   j                  d
      x}r|d
<    fd}	 |	       2 3 d{   }
|
 7 
6 yw)zLWrap Runner.run_async to create a traced session for asynchronous execution.r?   NrG   rH   rI   rJ   rK   rL   rM   rN   c            	      K   t        d
j                  d      j                  d            4 d {   } 	 d }t         i 	      4 d {   }|2 3 d {   }t        |dd       x}rt	        |      x}r|}| -7 P7 57 ,6 d d d       d {  7   n# 1 d {  7  sw Y   nxY w| j                  |rd|ind        n-# t        $ r!}| j                  t        |              d }~ww xY w	 t                n# t                w xY wd d d       d {  7   y # 1 d {  7  sw Y   y xY wwrP   )	r
   r   r   r+   r1   r^   r4   r,   r   )rb   r`   agenra   r.   r)   r9   rB   rc   rC   rd   re   rf   r@   s          r$   _trace_run_asyncz/wrap_runner_run_async.<locals>._trace_run_async   sB    N3F##
 	$ 	$ $.2#GT$<V$<= $ $'+ $ $e&-eY&EE7E'A''JJtJ/3#	$$$t$ $ $ $ $ L< 8dS c!f% T
 "#!#+	$ 	$ 	$ 	$ 	$s   4D>BD>D)CB
CB!BB
 B#%B!D>
CBB!CBC!B3	'B*(B3	/CD	C9C44C99D=D)DD)D>"D%#D>)D;/D20D;7D>rh   )r@   rA   rB   rC   rH   r)   rL   rM   rN   rn   ra   rc   rd   re   rf   s   ` ``       @@@@r$   wrap_runner_run_asyncro      s     X2D9Q=O=QFF#7'7J#%Ljj//{/-k::4:$(L! 	')::j!'RN 8Z66x6%-z"**Y''w'$+y!ZZ--z-'1|$$ $0 ()  e)s*   CC-C+C)C+"C-)C++C-c                    	 t        | dd       xs g D ]4  }t        |dd       xs g D ]  }t        |d      s|j                  s  y 6 t        |      ryy# t        $ r Y yw xY w)Ncontentsr(   function_responseresponse_generationtool_selectiondirect_responseunknown)r+   hasattrrr   r   r4   )llm_requestllm_responser.   parts       r$   _determine_llm_call_typer{      sy    	{J=C 	1G$7=2 14!45$:P:P01	1 l+#  s"   4A A A A 	A#"A#c               F	  K   t               }|s | |i |2 3 d{   }| t        |      dkD  r|d   n|j                  d      }|rt        |      nd}|rt	        |      nd}i }	|r||	d<   dt               i}
|r||
d<   t        j                         }|j                  |xs dd|	d	|
it        j                  |t        j                  
            }	 |j                          d}d}d}	 t!         | |i |      4 d{   }|2 3 d{   }t#        |dd      }|\|rZt        j                         }	 |j%                  dt        j                  |t        j                  
      j'                         d       |}t)        |d      r|j*                  |}| 7 6 y# t        $ r"}t        j                  d|        Y d}~d}~ww xY w7 7 # t        $ r"}t        j                  d|        Y d}~d}~ww xY w6 ddd      d{  7   n# 1 d{  7  sw Y   nxY wddi}|xs |}|r)t)        |d      r|j*                  rt#        |j*                  dd      xs g }g g }}t-        |      D ]  \  }}t)        |d      r1|j.                  r%|j1                  t3        |j.                               Ct)        |d      sP|j4                  s]|j4                  }|j1                  d| dt#        |dd      t7        j8                  t#        |dd      rt;        |j<                        ni       dd        |rdj?                  |      nd|d<   |r||d <   |r,tA        |      x}r||jB                  jE                  d	i       d!<   |"||z
  |jB                  jE                  d	i       d"<   |r+|r)tG        ||      |jB                  jE                  d	i       d#<   |jI                  |$       	 |jK                          y# t        $ r"}t        j                  d%|        Y d}~yd}~ww xY w# t        $ r`}|jI                  t3        |      &       	 |jK                           # t        $ r"}t        j                  d'|        Y d}~ d}~ww xY wd}~ww xY ww)(zIWrap BaseLlmFlow._call_llm_async to capture LLM calls with TTFT tracking.Nr   rx   messagesrJ   ls_model_namegoogle_adk_llmllmrK   tzrG   rU   rV   extra
start_timezFailed to post LLM run: partialF	new_token)rG   timezFailed to add new_token event: r.   role	assistantr(   r)   function_callcall_functionrG    rB   )rG   	arguments)idtyper   r*   
tool_callsusage_metadatatime_to_first_tokenllm_call_typerX   zFailed to patch LLM run: rZ   z"Failed to patch LLM run on error: )&r=   lenr   r   r   r%   r   create_childr   fromtimestampr   utcpostr4   r5   debugr   r+   	add_event	isoformatrw   r.   	enumerater)   appendr,   r   jsondumpsdictrB   r-   r   r   
setdefaultr{   r^   patch)r@   rA   rB   rC   parentra   rx   
model_namer}   rV   rK   r   llm_runr9   first_token_time
last_eventevent_with_contentrm   
is_partialrY   content_sourcer(   r0   r   irz   fcusagepatch_es                                r$   wrap_flow_call_llm_asyncr      s     F"D3F3 	 	%K !Y]$q'

=0IK4?#K0TJ?J.{;PTHF%z -/?/ABH$.!J!!++8$))*F " G5 )-JSGT4V45 	 	#  e$UIu=
#+
'+yy{$
L))(3(0(>(>$4)""+)+	 #
5),1J).&q	32  5/s3445	 % L'Fqc%JKKL  $	 	 	 	 	. $*;"7+9z 	2&&N22GTBHbE%'
J$U+ 44(TYY%%c$))n5T?38J8J++B%%$)!+$.(/FB(?-1ZZ5<R5NDMTV.")	$ :D*!5GI(2%3J??u?MR((R89IJ' :- MM$$Z45JK +(jA MM$$Z4_E 	G$	:MMO 	:LL4QC899	:  #a&!	IMMO 	  	ILL=gYGHH	I	sa  R!F$F!F$B8R!F& (R!/P5 GP5 HHGH&H:AG?"H!F$$R!&	G/GR!GR!P5 H	H!G>9H>HHP5 HP5 H+H" H+'B'P5 P5 DP5 6P R!	P2P-(P5 ,R!-P22P5 5	R>RQ+*R+	R4RRRRRR!c           
     p  K   t               }|s | |i | d{   S t        |dd      }|j                  di       }t        j                         }|j	                  d| dd||dd	d
t               iit        j                  |t        j                              }	 |j                          	  | |i | d{   }
|j                  |
xs i        	 |j                          |
S 7 # t        $ r"}	t        j                  d|	        Y d}	~	bd}	~	ww xY w7 ]# t        $ r#}	t        j                  d|	        Y d}	~	|
S d}	~	ww xY w# t        $ r`}	|j                  t!        |	             	 |j                           # t        $ r"}t        j                  d|        Y d}~ d}~ww xY wd}	~	ww xY ww)z5Wrap McpTool.run_async to trace MCP tool invocations.NrG   mcp_toolrB   z
mcp_tool []tool)	tool_namer   rK   rJ   r   r   zFailed to post MCP tool run: rX   zFailed to patch MCP tool run: rZ   z'Failed to patch MCP tool run on error: )r=   r+   r   r   r   r%   r   r   r   r   r   r4   r5   r   r^   r   r,   )r@   rA   rB   rC   r   r   	tool_argsr   tool_runr9   rD   r   s               r$   wrap_mcp_tool_run_asyncr   =  s     Fd-f---&*5I

62&IJ"")A&&Y?M+;+=>?))*F # H:///V\r*	?NN 5 .   :4QC899: 0  	?LL9!=>>	?  3q6"	NNN 	  	NLLB7)LMM	N	s   F6C)BF6C+ 0E
 ;D<E
 D 'E
 (F6+	D4DF6DF6E
 	E$E<E
 F6EE
 
	F3F./F ?F. 	F+	F&!F.&F++F..F33F6c                    t               }t        | xs |j                  d      xs t        d|xs i |xs |j                  d      |xs |j                  d      i |j                  d      xs i |xs i       S )z2Create a trace context for manual session tracing.rG   rQ   rR   rS   rK   rT   )r   r
   r   ri   )rG   rR   rK   rS   rV   rc   s         r$   create_traced_session_contextr   g  s{      !F;VZZ';+;|!?VZZ%?'VZZ'GVZZ
+1rGx~2G r&   )returnr,   )r.   r   r   Optional[str])r7   r   r   None)r   zOptional[RunTree])
r@   r   rA   r   rB   r   rC   r   r   r   )rx   r   ry   r   r   r,   )NNNNN)
rG   r   rR   r   rK   Optional[dict[str, Any]]rS   zOptional[list[str]]rV   r   )0__doc__
__future__r   r   loggingr   
contextlibr   r   r   typingr   r   langsmith.run_helpersr	   r
   langsmith.run_treesr   _configr   _hooksr   	_messagesr   r   
_recursiver   r   _usager   r   r!   r"   r%   	getLogger__name__r5   ri   r1   r:   r=   rE   rj   ro   r{   r   r   r   r<   r&   r$   <module>r      sR   8 "     '   = ' ' % J @ C) $ 	M 
		8	$' 8C"2j000'*04700f
{{{'*{47{{|''''*'47''V "&)- $'+
 ' 	
 %r&   