
    gh-g              
          S SK r S SKJr  S SKJr  S SKrS SKJr  S SKJ	r	  S SK
JrJr  S SKJrJr  S SKJr  S S	KJr  S S
KJr  S SKJrJr  S SKJr  \(       a  S SKJrJrJrJrJrJ r J!r!J"r"  S SK#J$r$   S SK%J&r&  S SK'J(r(  S SK)J*r*J+r+J,r,J-r-  S SK.J/r/  S SK0J1r1  \Rf                  \Rh                  \Rj                  \Rl                  \Rn                  \Rh                  \Rp                  \Rr                  \Rt                  S.	r; " S S\5      r< " S S5      r= " S S\*5      r>S r?S r@S rAS rBS  rCS! rDS" rES# rFg! \2 a	    \" S5      ef = f)$    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                   @    \ rS rSrSrS\ 3rSrS	S jr\S 5       r	Sr
g)
LangchainIntegration<   	langchainzauto.ai.   c                     Xl         X l        g Ninclude_prompts	max_spans)selfr5   r6   s      d/home/kali/devsecops-assessor/venv/lib/python3.13/site-packages/sentry_sdk/integrations/langchain.py__init__LangchainIntegration.__init__C   s    ."    c                      [        [        R                  5      [        l        [        bE  [	        [        R
                  5      [        l        [        [        R                  5      [        l        g g r3   )_wrap_configurer!   
_configurer   _wrap_agent_executor_invokeinvoke_wrap_agent_executor_streamstream r;   r8   
setup_onceLangchainIntegration.setup_onceH   sH     -W-?-?@$#>}?S?S#TM #>}?S?S#TM  %r;   r4   N)Tr1   )__name__
__module____qualname____firstlineno__
identifieroriginr6   r9   staticmethodrD   __static_attributes__rC   r;   r8   r.   r.   <   s5    J
|$F I#
 U Ur;   r.   c                   &    \ rS rSrSr/ rSrS rSrg)WatchedSpanR   NFc                     Xl         g r3   span)r7   rS   s     r8   r9   WatchedSpan.__init__W   s    	r;   rR   )	rF   rG   rH   rI   rS   childrenis_pipeliner9   rM   rC   r;   r8   rO   rO   R   s    DHKr;   rO   c                       \ rS rSrSrS rS rS rS rS r	S r
S	S	S	S
.S jrS rS rS rS rS rS rS rS rS rSrg	)SentryLangchainCallback\   z+Callback handler that creates Sentry spans.c                 :    [        5       U l        Xl        X l        g r3   )r   span_mapmax_span_map_sizer5   )r7   r\   r5   s      r8   r9    SentryLangchainCallback.__init___   s    #!2.r;   c                     [        U R                  5      U R                  :  aR  U R                  R                  SS9u  pU R	                  X!5        [        U R                  5      U R                  :  a  MQ  g g )NF)last)lenr[   r\   popitem
_exit_span)r7   run_idwatched_spans      r8   gc_span_map#SentryLangchainCallback.gc_span_mape   sZ     $-- 4#9#99#'==#8#8e#8#D FOOL1 $-- 4#9#99r;   c                 d   [        5          U(       a  XR                  ;  a
   S S S 5        g U R                  U   nUR                  nUR                  S5        [        R
                  " X$R                  5        UR                  S S S 5        U R                  U	 S S S 5        g ! , (       d  f       g = f)Nunknown)r   r[   rS   
set_status
sentry_sdkcapture_exceptionscope__exit__)r7   rc   error	span_datarS   s        r8   _handle_error%SentryLangchainCallback._handle_errorl   s~    (*V==8 +* f-I>>DOOI&((

;MM$d+f% +**s   B!A,B!!
B/c                 n    UR                   UR                  S.nUR                  UR                  5        U$ )N)rolecontent)typert   updateadditional_kwargs)r7   messageparseds      r8   _normalize_langchain_message4SentryLangchainCallback._normalize_langchain_message{   s+    !,,7??Cg//0r;   c                    S nU(       ab  U R                   R                  U5      nU(       a@  [        UR                  R                  " S0 UD65      nUR
                  R                  U5        Uc  [        [        R                  " S0 UD65      nUR                  R                  5         X@R                   U'   U R                  5         U$ )NrC   )r[   getrO   rS   start_childrU   appendrj   
start_span	__enter__re   )r7   rc   	parent_idkwargsrd   parent_spans         r8   _create_span$SentryLangchainCallback._create_span   s    --++I6K*;+;+;+G+G+Q&+QR$$++L9&z'<'<'Fv'FGL##% ,fr;   c                     UR                   (       a  [        S 5        UR                  R                  S S S 5        U R                  U	 g r3   )rV   r   rS   rm   r[   )r7   ro   rc   s      r8   rb   "SentryLangchainCallback._exit_span   s5       &dD1MM&!r;   N)tagsparent_run_idmetadatac          	          [        5          U(       d
   SSS5        gUR                  S0 5      nUR                  UR                  S0 5      5        UR                  S5      =(       d2    UR                  S5      =(       d    UR                  S5      =(       d    Sn	U R                  UU[        R
                  UR                  S5      =(       d    S	[        R                  S
9n
U
R                  nU	(       a   UR                  [        R                  U	5        UR                  SS5      nSU;   a!  UR                  [        R                  S5        O&SU;   a   UR                  [        R                  S5        [        R                  5        H   u  pX;   d  M  X   c  M  [        XX   SS9  M"     [!        5       (       a,  U R"                  (       a  [        U[        R$                  U5        SSS5        g! , (       d  f       g= f)zRun when LLM starts running.Ninvocation_paramsr   model
model_namemodel_id namezLangchain LLM callopr   rK   _type	anthropicopenaiFunpack)r   r}   rv   r   r   GEN_AI_PIPELINEr.   rK   rS   set_datar	   GEN_AI_REQUEST_MODELGEN_AI_SYSTEMDATA_FIELDSitemsr   r   r5   GEN_AI_REQUEST_MESSAGES)r7   
serializedpromptsrc   r   r   r   r   
all_paramsr   rd   rS   ai_typekey	attributes                  r8   on_llm_start$SentryLangchainCallback.on_llm_start   s    )* +*  $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$)D'QVW #6 '((T-A-A#D(*J*JGTQ +**s   	G/E2G/G/AG//
G=c                   [        5          U(       d
   SSS5        gUR                  S0 5      nUR                  UR                  S0 5      5        UR                  S5      =(       d2    UR                  S5      =(       d    UR                  S5      =(       d    SnU R                  UUR                  S5      [        R
                  S	U 3R                  5       [        R                  S
9nUR                  nUR                  [        R                  S5        U(       a   UR                  [        R                  U5        UR                  SS5      n	SU	;   a!  UR                  [        R                  S5        O&SU	;   a   UR                  [        R                  S5        [        R!                  5        H   u  pX;   d  M  XZ   c  M  [#        XXZ   SS9  M"     [%        5       (       a^  U R&                  (       aM  [#        U[        R(                  U VVs/ s H$  nU Vs/ s H  oR+                  U5      PM     snPM&     snn5        SSS5        gs  snf s  snnf ! , (       d  f       g= f)z#Run when Chat Model starts running.Nr   r   r   r   r   r   r   zchat r   chatr   r   r   Fr   )r   r}   rv   r   r   GEN_AI_CHATstripr.   rK   rS   r   r	   GEN_AI_OPERATION_NAMEr   r   r   r   r   r   r5   r   rz   )r7   r   messagesrc   r   r   r   rd   rS   r   r   r   list_xs                 r8   on_chat_model_start+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$)D'QVW #6 '((T-A-A#44 &.%-E HMMu!::1=uM%-M +*T NS +*sB   	IFI;IAI
II	1I8I	II
I"c                   [        5          U(       a  X R                  ;  a
   SSS5        gU R                  U   nUR                  n[        5       (       ab  U R                  (       aQ  [        U[        R                  UR                   VVs/ s H  of Vs/ s H  owR                  PM     snPM      snn5        [        XQ5        U R                  XB5        SSS5        gs  snf s  snnf ! , (       d  f       g= f)z!Run when Chat Model ends running.N)r   r[   rS   r   r5   r   r	   GEN_AI_RESPONSE_TEXTgenerationstext_record_token_usagerb   )r7   responserc   r   ro   rS   r   r   s           r8   on_chat_model_end)SentryLangchainCallback.on_chat_model_end  s     )*V==8 +* f-I>>D&((T-A-A#11:B:N:NO:Ne,effe,:NO  /OOI. +* -O +*s5   C(AC(	C"C)C"0$C(C""C((
C6c                   [        5          U(       a  X R                  ;  a
   SSS5        gU R                  U   nUR                  n UR                  S   S   nUb   UR
                  R                  S5      nUb   UR                  [        R                  U5         UR
                  R                  S5      nUb   UR                  [        R                  U5         [        UR                  SS5      n	U	b   U	/ :w  a  [        U[        R                  U	SS9  [!        5       (       ab  U R"                  (       aQ  [        U[        R$                  UR                   V
Vs/ s H  o Vs/ s H  oR&                  PM     snPM      snn
5        [)        XQ5        U R+                  XB5        SSS5        g! [         a    Sn GNaf = f! [         a     GN0f = f! [         a     GNf = f! [         a     Nf = fs  snf s  snn
f ! , (       d  f       g= f)zRun when LLM ends running.Nr   r   finish_reasonr)   Fr   )r   r[   rS   r   
IndexErrorgeneration_infor}   r   r	   GEN_AI_RESPONSE_MODELAttributeErrorGEN_AI_RESPONSE_FINISH_REASONSgetattrrx   r   GEN_AI_RESPONSE_TOOL_CALLSr   r5   r   r   r   rb   )r7   r   rc   r   ro   rS   
generationresponse_modelr   r)   r   r   s               r8   
on_llm_end"SentryLangchainCallback.on_llm_end  s    )*V==8 +* 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:Ne,effe,:NO  /OOI.c +*  "!
" &  &  &  -O[ +*s   G<G<F,G<>F?>G:G!AG<	G6#G18G6?$G<,F<8G<;F<<G<?
G	G<GG<
GG<GG<!
G.+G<-G..G<1G66G<<
H
c                &    U R                  X!5        g)zRun when LLM errors.Nrp   r7   rn   rc   r   s       r8   on_llm_error$SentryLangchainCallback.on_llm_errorM       	6)r;   c                &    U R                  X!5        g)zRun when Chat Model errors.Nr   r   s       r8   on_chat_model_error+SentryLangchainCallback.on_chat_model_errorR  r   r;   c                   [        5          U(       a  X R                  ;  a
   S S S 5        g U R                  U   nUR                  n[        5       (       aD  U R                  (       a3  [        U[        R                  UR                  R                  5       5        U R                  XB5        S S S 5        g ! , (       d  f       g = fr3   )r   r[   rS   r   r5   r   r	   r   return_valuesr   rb   )r7   finishrc   r   ro   rS   s         r8   on_agent_finish'SentryLangchainCallback.on_agent_finishW  s    (*V==8 +* f-I>>D&((T-A-A#11((..0 OOI. +**s   B4A?B44
Cc          	         [        5          U(       d
   SSS5        gUR                  S5      =(       d    UR                  S5      =(       d    SnU R                  UUR                  S5      [        R                  SU 3R                  5       [        R                  S9nUR                  nUR                  [        R                  S5        UR                  [        R                  U5        UR                  S5      nUb   UR                  [        R                  U5        [        5       (       a=  U R                  (       a,  [!        U[        R"                  UR                  S	U/5      5        SSS5        g! , (       d  f       g= f)
zRun when tool starts running.Nr   r   r   zexecute_tool r   execute_tooldescriptioninputs)r   r}   r   r   GEN_AI_EXECUTE_TOOLr   r.   rK   rS   r   r	   r   GEN_AI_TOOL_NAMEGEN_AI_TOOL_DESCRIPTIONr   r5   r   GEN_AI_TOOL_INPUT)	r7   r   	input_strrc   r   	tool_namerd   rS   tool_descriptions	            r8   on_tool_start%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   	E3EE33
Fc                Z   [        5          U(       a  X R                  ;  a
   SSS5        gU R                  U   nUR                  n[        5       (       a,  U R                  (       a  [        U[        R                  U5        U R                  XB5        SSS5        g! , (       d  f       g= f)zRun when tool ends running.N)	r   r[   rS   r   r5   r   r	   GEN_AI_TOOL_OUTPUTrb   )r7   outputrc   r   ro   rS   s         r8   on_tool_end#SentryLangchainCallback.on_tool_end  su     )*V==8 +* f-I>>D&((T-A-A#D(*E*EvNOOI. +**s   BA'B
B*c                &    U R                  X!5        g)zRun when tool errors.Nr   )r7   rn   rc   argsr   s        r8   on_tool_error%SentryLangchainCallback.on_tool_error  r   r;   )r5   r\   r[   )rF   rG   rH   rI   __doc__r9   re   rp   rz   r   rb   r   r   r   r   r   r   r   r   r   r   rM   rC   r;   r8   rX   rX   \   se    5/2&"" 5Un0d/(4/l*
*
/$@/*r;   rX   c                     U (       d  g[        U S5      =(       d    [        U S5      n[        U S5      =(       d    [        U S5      n[        U S5      nXU4$ )NNNNprompt_tokensinput_tokenscompletion_tokensoutput_tokenstotal_tokensr   )token_usager   r   r   s       r8   _extract_tokensr     s`    k?; z^@L {,?@ J_EM k>:L44r;   c                     U (       d  gSnSnSnU  H@  nU H7  n[        U5      n[        U5      u  pxn	Xb  UOS-  nX(b  UOS-  nX9b  U	OS-  nM9     MB     US:  a  UOSUS:  a  UOSUS:  a  U4$ S4$ )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
             r8    _extract_tokens_from_generationsr     s     KLKC*3/K8G8T5L+C<JK-FMAML+C<JK    #QD$q(d"Q  -1 r;   c                     Sn[        U S5      nUb  U H  n[        X#5      nUc  M  Us  $    [        U S5      nUb  U H  n[        XS5      nUc  M  Us  $    U H  n[        X5      nUc  M  Us  $    g)zE
Check multiple paths to extract token usage from different objects.
)usager   usage_metadatarx   N
llm_outputr   )objpossible_namesrx   r   r   r  s         r8   r   r     s    
 @Ni(G"Dw-E  #
 C.J"Dz0E  # 3%L  r;   c                 J   [        U5      nU(       a  [        U5      u  p4nO[        UR                  5      u  p4nUb   U R	                  [
        R                  U5        Ub   U R	                  [
        R                  U5        Ub!  U R	                  [
        R                  U5        g g r3   )	r   r   r   r   r   r	   GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rS   r   r   r   r   r   s         r8   r   r     s    "8,K4CK4P1\4T  5
1\ h88,G h99=Ih88,G  r;   c                    [        U SS5      n[        USS5      n[        US0 5      n[        U SS5      =(       d=    [        USS5      =(       d)    UR                  S5      =(       d    UR                  S5      nU(       a  [        U5      S:  a  UOSn Sn[        U5      S:  a  US   R                  S	5      nUc  UR                  S	5      nXv4$ ! [         a     WU4$ f = f)
z7
Get the agent name and available tools for the agent.
agentNrunnableconfigr*   available_toolsr      run_name)r   r}   r`   	Exception)r  r   r   r	  r
  runnable_configr*   
agent_names           r8   _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   9C 
C C c                 8   ^  [        T 5        SU 4S jj5       nU$ )Nc                 Z  > [         R                  " 5       R                  [        5      nUc  T	" U UU/UQ70 UD6$ U=(       d    / n[	        U[
        5      (       a  UR                  nOV[	        U[        5      (       a  U/nO=[	        U[        5      (       a  UnO%[        R                  " SU5        T	" U UU/UQ70 UD6$ [	        U[
        5      (       a  UR                  nO[	        U[        5      (       a  UnO/ n[        S [        R                  " Xg5       5       5      (       dz  [        UR                  UR                   5      n[	        U[
        5      (       a&  UR#                  5       n/ UR                  QUPUl        O[	        U[        5      (       a  X(/nO/ UQUPnT	" U UU/UQ70 UD6$ )NzUnknown callback type: %sc              3   B   #    U  H  n[        U[        5      v   M     g 7fr3   )
isinstancerX   ).0cbs     r8   	<genexpr>9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>L  s"      
Q r233Qs   )rj   
get_clientget_integrationr.   r  r   handlersr   listr   debugany	itertoolschainrX   r6   r5   copy)
callback_manager_clsinheritable_callbackslocal_callbacksr   r   integrationcallbacks_listinheritable_callbacks_listsentry_handlerfs
            r8   new_configure&_wrap_configure.<locals>.new_configure  s    !++-==>RS$% 	
   */R o':;;,55N)<==-.N..,NLL4oF$% 	
   +-@AA)>)G)G&-t44)>&)+& 
oonQ
 
 
 5%%++N /+>??"1"6"6"8,$--,",( O-@AA#2"C"DO"D^"D !
 	

 
 	
r;   )NNr   )r+  r,  s   ` r8   r=   r=     s.     1X #K
 K
Z r;   c                 0   ^  [        T 5      U 4S j5       nU$ )Nc                   > [         R                  " 5       R                  [        5      nUc  T
" U /UQ70 UD6$ [	        XU5      u  pE[         R
                  " [        R                  U(       a  SU 3OS[        R                  S9 nU(       a   UR                  [        R                  U5        UR                  [        R                  S5        UR                  [        R                  S5        U(       a  [        U[        R                  USS9  T
" U /UQ70 UD6nUR!                  S5      nUb<  [#        5       (       a-  UR$                  (       a  [        U[        R&                  U/5        UR!                  S5      n	U	b@  [#        5       (       a1  UR$                  (       a   UR                  [        R(                  U	5        UsS S S 5        $ ! , (       d  f       g = f)Ninvoke_agent invoke_agentr   Fr   inputr   )rj   r  r  r.   r  r   r   GEN_AI_INVOKE_AGENTrK   r   r	   GEN_AI_AGENT_NAMEr   GEN_AI_RESPONSE_STREAMINGr   GEN_AI_REQUEST_AVAILABLE_TOOLSr}   r   r5   r   r   )r7   r   r   r'  r  r*   rS   resultr2  r   r+  s             r8   
new_invoke/_wrap_agent_executor_invoke.<locals>.new_invokem  s~    !++-==>RST+D+F++-d&A
""%%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:G		
Gr   )r+  r8  s   ` r8   r?   r?   j  s$     1X1 1f r;   c                 0   ^  [        T 5      U 4S j5       nU$ )Nc                   >^	^
^ [         R                  " 5       R                  [        5      m	T	c  T" U /UQ70 UD6$ [	        XU5      u  p4[         R
                  " [        R                  SU 3R                  5       [        R                  S9mTR                  5         U(       a   TR                  [        R                  U5        TR                  [        R                  S5        TR                  [        R                  S5        U(       a  [!        T[        R"                  USS9  [%        U5      S:  a  US   R'                  S	5      OS nUb<  [)        5       (       a-  T	R*                  (       a  [!        T[        R,                  U/5        T" U /UQ70 UD6nUm
U	U
U4S
 jnU	U
U4S jn[/        [1        U5      5      S:X  a	  U" 5       nU$ U" 5       nU$ )Nr0  r   r1  TFr   r  r   r2  c               3     >#    T H  n U v   M	      W R                  S5      nUb@  [        5       (       a1  TR                  (       a   TR	                  [
        R                  U5        TR                  S S S 5        g ! [         a    S n Nef = f7fNr   r}   r  r   r5   r   r	   r   rm   eventr   r'  old_iteratorrS   s     r8   new_iteratorE_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator  s{     % &8,
 "+--//h;;VDMM$d+  s(   BA: AB:B	BB		Bc                 .  >#    T  S h  vN n U 7v   M   N
  W R                  S5      nO! [         a    S n Of = fUb@  [        5       (       a1  TR                  (       a   TR	                  [
        R                  U5        TR                  S S S 5        g 7fr=  r>  r?  s     r8   new_iterator_asyncK_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator_async  s     + e|8,  "+--//h;;VDMM$d+s;   BBB, B;B;ABz<class 'async_generator'>)rj   r  r  r.   r  r   r   r3  r   rK   r   r   r	   r4  r   r5  r   r6  r`   r}   r   r5   r   strru   )r7   r   r   r  r*   r2  r7  rB  rE  r'  rA  rS   r+  s            @@@r8   
new_stream/_wrap_agent_executor_stream.<locals>.new_stream  s    !++-==>RST+D+F++-d&A
$$%% -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r;   r   )r+  rH  s   ` r8   rA   rA     s&     1XX Xt r;   )Gr!  collectionsr   	functoolsr   rj   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_TEMPERATUREr6  GEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TOP_Pr   r.   rO   rX   r   r   r   r   r  r=   r?   rA   rC   r;   r8   <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   3$D6 6E