
    lh-g              
          d dl Z d dlm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 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 er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& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 ejf                  ejh                  ejj                  ejl                  ejn                  ejh                  ejp                  ejr                  ejt                  d	Z; G d de      Z< G d d      Z= G d de*      Z>d Z?d Z@d ZAd ZBd  ZCd! ZDd" ZEd# ZFy# e2$ r	  ed      w xY w)$    N)OrderedDictwraps)set_ai_pipeline_name)set_data_normalized)OPSPANDATA)DidNotEnableIntegration)should_send_default_pii)Span
_get_value)loggercapture_internal_exceptions)TYPE_CHECKING)AnyAsyncIteratorCallableDictIteratorListOptionalUnion)UUID)AgentExecutor)AgentFinish)BaseCallbackHandlerBaseCallbackManager	Callbacksmanager)BaseMessage)	LLMResultzlangchain not installed)	frequency_penaltyfunction_call
max_tokenspresence_penaltytemperature
tool_callstoolstop_ktop_pc                   6    e Zd ZdZde ZdZddZed        Zy)LangchainIntegration	langchainzauto.ai.   c                      || _         || _        y N)include_prompts	max_spans)selfr3   r4   s      s/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/sentry_sdk/integrations/langchain.py__init__zLangchainIntegration.__init__C   s    ."    c                      t        t        j                        t        _        t        Et	        t        j
                        t        _        t        t        j                        t        _        y y r2   )_wrap_configurer!   
_configurer   _wrap_agent_executor_invokeinvoke_wrap_agent_executor_streamstream r8   r6   
setup_oncezLangchainIntegration.setup_onceH   sH     -W-?-?@$#>}?S?S#TM #>}?S?S#TM  %r8   N)Tr0   )	__name__
__module____qualname__
identifieroriginr4   r7   staticmethodrA   r@   r8   r6   r.   r.   <   s5    J
|$F I#
 U Ur8   r.   c                       e Zd ZdZg ZdZd Zy)WatchedSpanNFc                     || _         y r2   )span)r5   rK   s     r6   r7   zWatchedSpan.__init__W   s	    	r8   )rB   rC   rD   rK   childrenis_pipeliner7   r@   r8   r6   rI   rI   R   s    DHKr8   rI   c                   z    e Zd ZdZd Zd Zd Zd Zd Zd Z	dddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zy)SentryLangchainCallbackz+Callback handler that creates Sentry spans.c                 >    t               | _        || _        || _        y r2   )r   span_mapmax_span_map_sizer3   )r5   rR   r3   s      r6   r7   z SentryLangchainCallback.__init___   s    #!2.r8   c                     t        | j                        | j                  kD  rU| j                  j                  d      \  }}| j	                  ||       t        | j                        | j                  kD  rTy y )NF)last)lenrQ   rR   popitem
_exit_span)r5   run_idwatched_spans      r6   gc_span_mapz#SentryLangchainCallback.gc_span_mape   s^     $-- 4#9#99#'==#8#8e#8#D FLOOL&1 $-- 4#9#99r8   c                 N   t               5  |r|| j                  vr
	 d d d        y | j                  |   }|j                  }|j                  d       t	        j
                  ||j                         |j                  d d d        | j                  |= d d d        y # 1 sw Y   y xY w)Nunknown)r   rQ   rK   
set_status
sentry_sdkcapture_exceptionscope__exit__)r5   rX   error	span_datarK   s        r6   _handle_errorz%SentryLangchainCallback._handle_errorl   s    (* 	&V4==8	& 	& f-I>>DOOI&((

;MM$d+f%	& 	& 	&s   BA,BB$c                 n    |j                   |j                  d}|j                  |j                         |S )N)rolecontent)typerg   updateadditional_kwargs)r5   messageparseds      r6   _normalize_langchain_messagez4SentryLangchainCallback._normalize_langchain_message{   s+    !,,7??Cg//0r8   c                 z   d }|r]| j                   j                  |      }|r@t         |j                  j                  di |      }|j
                  j                  |       |t        t        j                  di |      }|j                  j                          || j                   |<   | j                          |S )Nr@   )rQ   getrI   rK   start_childrL   appendr^   
start_span	__enter__rZ   )r5   rX   	parent_idkwargsrY   parent_spans         r6   _create_spanz$SentryLangchainCallback._create_span   s    --++I6K*+G;+;+;+G+G+Q&+QR$$++L9&z'<'<'Fv'FGL##% ,fr8   c                     |j                   rt        d        |j                  j                  d d d        | j                  |= y r2   )rM   r   rK   ra   rQ   )r5   rc   rX   s      r6   rW   z"SentryLangchainCallback._exit_span   s5       &dD1MM&!r8   N)tagsparent_run_idmetadatac          	         t               5  |s
	 ddd       y|j                  di       }|j                  |j                  di              |j                  d      xs( |j                  d      xs |j                  d      xs d}	| j                  ||t        j
                  |j                  d      xs d	t        j                  
      }
|
j                  }|	r |j                  t        j                  |	       |j                  dd      }d|v r!|j                  t        j                  d       n$d|v r |j                  t        j                  d       t        j                         D ]"  \  }}||v s||   t        ||||   d       $ t!               r'| j"                  rt        |t        j$                  |       ddd       y# 1 sw Y   yxY w)zRun when LLM starts running.Ninvocation_paramsru   model
model_namemodel_id namezLangchain LLM callopr   rF   _type	anthropicopenaiFunpack)r   ro   ri   rw   r   GEN_AI_PIPELINEr.   rF   rK   set_datar	   GEN_AI_REQUEST_MODELGEN_AI_SYSTEMDATA_FIELDSitemsr   r   r3   GEN_AI_REQUEST_MESSAGES)r5   
serializedpromptsrX   ry   rz   r{   ru   
all_paramsr~   rY   rK   ai_typekey	attributes                  r6   on_llm_startz$SentryLangchainCallback.on_llm_start   s    )* (	U(	U (	U  $7<JjnnXr:; w' >>,/>>*- 	   ,,%%ZZ'?+?+22 - L  $$D11
 !nnWb1Gg%h44kBW$h44h?"-"3"3"5 XY*$C)D'iCQVWX '(T-A-A#D(*J*JGTQ(	U (	U (	Us   GEG3G9AGGc                p   t               5  |s
	 ddd       y|j                  di       }|j                  |j                  di              |j                  d      xs( |j                  d      xs |j                  d      xs d}| j                  ||j                  d      t        j
                  d	| j                         t        j                  
      }|j                  }|j                  t        j                  d       |r |j                  t        j                  |       |j                  dd      }	d|	v r!|j                  t        j                  d       n$d|	v r |j                  t        j                  d       t        j!                         D ]"  \  }
}|
|v s||
   t#        ||||
   d       $ t%               rT| j&                  rHt#        |t        j(                  |D cg c]!  }|D cg c]  }| j+                  |       c}# c}}       ddd       yc c}w c c}}w # 1 sw Y   yxY w)z#Run when Chat Model starts running.Nr}   ru   r~   r   r   r   rz   zchat r   chatr   r   r   Fr   )r   ro   ri   rw   r   GEN_AI_CHATstripr.   rF   rK   r   r	   GEN_AI_OPERATION_NAMEr   r   r   r   r   r   r3   r   rm   )r5   r   messagesrX   ru   r   r~   rY   rK   r   r   r   list_xs                 r6   on_chat_model_startz+SentryLangchainCallback.on_chat_model_start   s    )* -	-	 -	  $7<JjnnXr:; w' >>,/>>*- 	   ,,

?+>>UG_**,+22 - L  $$DMM(88&Ah;;UC nnWb1Gg%h44kBW$h44h?"-"3"3"5 XY*$C)D'iCQVWX '(T-A-A#44 &.! HMM!::1=MM-	 -	T NS-	 -	sB   H,FH, H,&AH,*	H&3H!H&H,!H&&H,,H5c                   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }t               rY| j                  rMt        |t        j                  |j                  D cg c]  }|D cg c]  }|j                   c} c}}       t        ||       | j                  ||       ddd       yc c}w c c}}w # 1 sw Y   yxY w)z!Run when Chat Model ends running.N)r   rQ   rK   r   r3   r   r	   GEN_AI_RESPONSE_TEXTgenerationstext_record_token_usagerW   )r5   responserX   ru   rc   rK   r   r   s           r6   on_chat_model_endz)SentryLangchainCallback.on_chat_model_end  s     )* 	/V4==8	/ 	/ f-I>>D&(T-A-A#11:B:N:NOe,aff,O  h/OOIv.	/ 	/ -O	/ 	/s5   CAC;	CCC&CCCCc                   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }	 |j                  d   d   }|	 |j
                  j                  d      }| |j                  t        j                  |       	 |j
                  j                  d      }| |j                  t        j                  |       	 t        |j                  dd      }	|	"|	g k7  rt        |t        j                  |	d       t!               rY| j"                  rMt        |t        j$                  |j                  D 
cg c]  }
|
D cg c]  }|j&                   c} c}}
       t)        ||       | j+                  ||       ddd       y# t        $ r d}Y Rw xY w# t        $ r Y "w xY w# t        $ r Y w xY w# t        $ r Y w xY wc c}w c c}}
w # 1 sw Y   yxY w)zRun when LLM ends running.Nr   r   finish_reasonr)   Fr   )r   rQ   rK   r   
IndexErrorgeneration_inforo   r   r	   GEN_AI_RESPONSE_MODELAttributeErrorGEN_AI_RESPONSE_FINISH_REASONSgetattrrk   r   GEN_AI_RESPONSE_TOOL_CALLSr   r3   r   r   r   rW   )r5   r   rX   ru   rc   rK   
generationresponse_modelr   r)   r   r   s               r6   
on_llm_endz"SentryLangchainCallback.on_llm_end  s    )* 1	/V4==81	/ 1	/ f-I>>D"%11!4Q7
 %%/%?%?%C%CL%QN%1h&D&DnU$.$>$>$B$B?$SM$0$CC]
!(););\4!PJ!-*2B+ $??&#(	 '(T-A-A#11:B:N:NOe,aff,O  h/OOIv.c1	/ 1	/  "!
" &  &  &  -O[1	/ 1	/s   G#G#FG#=F*=F:;G	:G#	GG$G)&G#F'#G#&F''G#*	F73G#6F77G#:	GG#GG#		GG#GG#GG##G,c                (    | j                  ||       y)zRun when LLM errors.Nrd   r5   rb   rX   ru   s       r6   on_llm_errorz$SentryLangchainCallback.on_llm_errorM       	65)r8   c                (    | j                  ||       y)zRun when Chat Model errors.Nr   r   s       r6   on_chat_model_errorz+SentryLangchainCallback.on_chat_model_errorR  r   r8   c                b   t               5  |r|| j                  vr
	 d d d        y | j                  |   }|j                  }t               r?| j                  r3t        |t        j                  |j                  j                                | j                  ||       d d d        y # 1 sw Y   y xY wr2   )r   rQ   rK   r   r3   r   r	   r   return_valuesr   rW   )r5   finishrX   ru   rc   rK   s         r6   on_agent_finishz'SentryLangchainCallback.on_agent_finishW  s    (* 	/V4==8	/ 	/ f-I>>D&(T-A-A#11((..0 OOIv.	/ 	/ 	/s   B%A6B%%B.c          	         t               5  |s
	 ddd       y|j                  d      xs |j                  d      xs d}| j                  ||j                  d      t        j                  d| j                         t        j                        }|j                  }|j                  t        j                  d       |j                  t        j                  |       |j                  d      }| |j                  t        j                  |       t               r8| j                  r,t!        |t        j"                  |j                  d	|g             ddd       y# 1 sw Y   yxY w)
zRun when tool starts running.Nr   r   rz   zexecute_tool r   execute_tooldescriptioninputs)r   ro   rw   r   GEN_AI_EXECUTE_TOOLr   r.   rF   rK   r   r	   r   GEN_AI_TOOL_NAMEGEN_AI_TOOL_DESCRIPTIONr   r3   r   GEN_AI_TOOL_INPUT)	r5   r   	input_strrX   ru   	tool_namerY   rK   tool_descriptions	            r6   on_tool_startz%SentryLangchainCallback.on_tool_starti  s,    )* 		 	 #v.J&**V2DJI,,

?+))$YK0668+22 - L  $$DMM(88.IMM(33Y?)~~m<+h>>@PQ&(T-A-A#..JJx)5/	 	 	s   ED;EE%c                2   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }t               r'| j                  rt        |t        j                  |       | j                  ||       ddd       y# 1 sw Y   yxY w)zRun when tool ends running.N)	r   rQ   rK   r   r3   r   r	   GEN_AI_TOOL_OUTPUTrW   )r5   outputrX   ru   rc   rK   s         r6   on_tool_endz#SentryLangchainCallback.on_tool_end  s     )* 
	/V4==8
	/ 
	/ f-I>>D&(T-A-A#D(*E*EvNOOIv.
	/ 
	/ 
	/s   BABBc                (    | j                  ||       y)zRun when tool errors.Nr   )r5   rb   rX   argsru   s        r6   on_tool_errorz%SentryLangchainCallback.on_tool_error  r   r8   )rB   rC   rD   __doc__r7   rZ   rd   rm   rw   rW   r   r   r   r   r   r   r   r   r   r   r@   r8   r6   rO   rO   \   se    5/2&"" 5Un0d/(4/l*
*
/$@/*r8   rO   c                     | syt        | d      xs t        | d      }t        | d      xs t        | d      }t        | d      }|||fS )NNNNprompt_tokensinput_tokenscompletion_tokensoutput_tokenstotal_tokensr   )token_usager   r   r   s       r6   _extract_tokensr     sb    k?; z^@L {,?@ J_EM k>:L44r8   c                     | syd}d}d}| D ]>  }|D ]7  }t        |      }t        |      \  }}}	|||ndz  }|||ndz  }||	|	ndz  }9 @ |dkD  r|nd|dkD  r|nd|dkD  r|fS dfS )z8Extract token usage from response.generations structure.r   r   N)_get_token_usager   )
r   total_inputtotal_outputtotal_totalgen_listgenr   r   r   r   s
             r6    _extract_tokens_from_generationsr     s     KLK K 	KC*3/K8G8T5L-<+C<JK]-FMAML<+C<JK	KK #QD$q(d"Q  -1 r8   c                     d}t        | d      }||D ]  }t        ||      }||c S  t        | d      }||D ]  }t        ||      }||c S  |D ]  }t        | |      }||c S  y)zM
    Check multiple paths to extract token usage from different objects.
    )usager   usage_metadatark   N
llm_outputr   )objpossible_namesrk   r   r   r   s         r6   r   r     s    
 @Ni(G" 	Dw-E 	
 C.J" 	Dz40E 	  3%L r8   c                 >   t        |      }|rt        |      \  }}}nt        |j                        \  }}}| | j	                  t
        j                  |       | | j	                  t
        j                  |       |!| j	                  t
        j                  |       y y r2   )	r   r   r   r   r   r	   GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rK   r   r   r   r   r   s         r6   r   r     s    "8,K4CK4P1m\4T  5
1m\ h88,G h99=Ih88,G  r8   c                    t        | dd      }t        |dd      }t        |di       }t        | dd      xs3 t        |dd      xs$ |j                  d      xs |j                  d      }|rt        |      dkD  r|nd}	 d}t        |      dkD  r|d   j                  d	      }||j                  d	      }||fS # t        $ r Y |fS w xY w)
z?
    Get the agent name and available tools for the agent.
    agentNrunnableconfigr*   available_toolsr      run_name)r   ro   rU   	Exception)r   r   ru   r   r   runnable_configr*   
agent_names           r6   _get_request_datar     s    
 C$'Euj$/Hh"5OWd# 	25'4(	2w'	2 01	 
 s5zA~E4E
t9q=aZ0J(,,Z8J   s   ?7B: :	C	C	c                 4     t               	 	 d fd	       }|S )Nc                    t        j                         j                  t              }| 	| ||g|i |S |xs g }t	        |t
              r|j                  }nKt	        |t              r|g}n7t	        |t              r|}n$t        j                  d|        	| ||g|i |S t	        |t
              r|j                  }nt	        |t              r|}ng }t        d t        j                  ||      D              sqt        |j                  |j                         }t	        |t
              r&|j#                         }g |j                  ||_        nt	        |t              r||g}ng ||} 	| ||g|i |S )NzUnknown callback type: %sc              3   <   K   | ]  }t        |t                y wr2   )
isinstancerO   ).0cbs     r6   	<genexpr>z9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>L  s       
 r23
s   )r^   
get_clientget_integrationr.   r   r   handlersr   listr   debugany	itertoolschainrO   r4   r3   copy)
callback_manager_clsinheritable_callbackslocal_callbacksr   ru   integrationcallbacks_listinheritable_callbacks_listsentry_handlerfs
            r6   new_configurez&_wrap_configure.<locals>.new_configure  s    !++-==>RS$% 	
   */R o':;,55N)<=-.N.,NLL4oF$% 	
   +-@A)>)G)G&-t4)>&)+& 
oon6PQ
 
 5%%++N /+>?"1"6"6"8,$--,",( O-@A#2N"C"DO"D^"D !
 	

 
 	
r8   )NNr   )r  r  s   ` r6   r:   r:     s.     1X #K
 K
Z r8   c                 .     t                fd       }|S )Nc                 j   t        j                         j                  t              }| 
| g|i |S t	        | ||      \  }}t        j
                  t        j                  |rd| ndt        j                        5 }|r |j                  t        j                  |       |j                  t        j                  d       |j                  t        j                  d       |rt        |t        j                  |d        
| g|i |}|j!                  d      }|2t#               r(|j$                  rt        |t        j&                  |g       |j!                  d      }	|	6t#               r,|j$                  r |j                  t        j(                  |	       |cd d d        S # 1 sw Y   y xY w)Ninvoke_agent invoke_agentr   Fr   inputr   )r^   r   r  r.   r   rr   r   GEN_AI_INVOKE_AGENTrF   r   r	   GEN_AI_AGENT_NAMEr   GEN_AI_RESPONSE_STREAMINGr   GEN_AI_REQUEST_AVAILABLE_TOOLSro   r   r3   r   r   )r5   r   ru   r  r   r*   rK   resultr  r   r  s             r6   
new_invokez/_wrap_agent_executor_invoke.<locals>.new_invokem  s    !++-==>RST+D+F++-dD&A
E""%%1;=-'..
 )	 h88*EMM(88.IMM(<<eD#(AA5QV
 t-d-f-FJJw'E!+-//#44 ZZ)F"+-//h;;VDS)	 )	 )	s   DF))F2r   )r  r  s   ` r6   r<   r<   j  s$     1X1 1f r8   c                 .     t                fd       }|S )Nc                 z  	
 t        j                         j                  t              		 | g|i |S t	        | ||      \  }}t        j
                  t        j                  d| j                         t        j                        j                          |r j                  t        j                  |       j                  t        j                  d       j                  t        j                  d       |rt!        t        j"                  |d       t%        |      dk\  r|d   j'                  d	      nd }|2t)               r(	j*                  rt!        t        j,                  |g        | g|i |}|
	
fd
}	
fd}t/        t1        |            dk(  r	 |       }|S  |       }|S )Nr  r   r  TFr   r   r   r  c               3      K   D ]  } |   	  j                  d      }|6t               r,j                  r j	                  t
        j                  |       j                  d d d        y # t        $ r d }Y Yw xY wwNr   ro   r   r   r3   r   r	   r   ra   eventr   r  old_iteratorrK   s     r6   new_iteratorzE_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator  s~     % 8,
 "+-//h;;VDMM$d+  s(   A>A- AA>-A;8A>:A;;A>c                   K   2 3 d {   } |  7 
6 	  j                  d      }n# t        $ r d }Y nw xY w|6t               r,j                  r j	                  t
        j                  |       j                  d d d        y wr   r!  r"  s     r6   new_iterator_asynczK_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator_async  s     +  e|8,  "+-//h;;VDMM$d+s;   BBB+ B9B9ABz<class 'async_generator'>)r^   r   r  r.   r   rr   r   r  r   rF   rs   r   r	   r  r   r  r   r  rU   ro   r   r3   r   strrh   )r5   r   ru   r   r*   r  r  r%  r'  r  r$  rK   r  s            @@@r6   
new_streamz/_wrap_agent_executor_stream.<locals>.new_stream  s    !++-==>RST+D+F++-dD&A
E$$%% -335'..

 	MM(44jAh44nEh88$?h==uU ),D	QQG$D')++00 4)$)&)	,&	,& tF| ;;')F  "^Fr8   r   )r  r)  s   ` r6   r>   r>     s&     1XX Xt r8   )Gr  collectionsr   	functoolsr   r^   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   sentry_sdk.constsr   r	   sentry_sdk.integrationsr
   r   sentry_sdk.scoper   sentry_sdk.tracingr   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   typingr   r   r   r   r   r   r   r   r   uuidr   langchain.agentsr   langchain_core.agentsr   langchain_core.callbacksr   r   r    r!   langchain_core.messagesr"   langchain_core.outputsr#   ImportError GEN_AI_REQUEST_FREQUENCY_PENALTYr   GEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_PRESENCE_PENALTYGEN_AI_REQUEST_TEMPERATUREr  GEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TOP_Pr   r.   rI   rO   r   r   r   r   r   r:   r<   r>   r@   r8   r6   <module>rB     s-    #   9 3 * = 4 # / @  	 	 	 2.1  40 "BB8844 @@665544****
U; U, *1 *D
5 2>H(8Qh7t^s  2
0
112s   .$D1 1D?