
    Uvh1J              
       J   d dl Z d dlmZ d dlmZ d dl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 erd dl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,m-Z- ej^                  ej`                  ejb                  ejd                  ejf                  ejh                  ejj                  ejl                  ejn                  d	Z8g dZ9 G d de      Z: G d d      Z; G d de(      Z<d Z=y# e.$ r	  ed      w xY w)    N)OrderedDictwraps)set_ai_pipeline_namerecord_token_usage)OPSPANDATA)set_data_normalized)should_send_default_pii)Span)DidNotEnableIntegration)loggercapture_internal_exceptions)TYPE_CHECKING)AnyListCallableDictUnionOptional)UUID)BaseMessage)	LLMResult)managerBaseCallbackHandlerBaseCallbackManager	Callbacks)AgentActionAgentFinishzlangchain not installed)	temperaturetop_ptop_kfunction_call
tool_callstoolsresponse_format
logit_biastags)zopenai-chatzanthropic-chatzcohere-chathuggingface_endpointc                   8    e Zd ZdZde ZdZ	 ddZed        Zy)LangchainIntegration	langchainzauto.ai.   Nc                 .    || _         || _        || _        y N)include_prompts	max_spanstiktoken_encoding_name)selfr1   r2   r3   s       \/opt/face_recognition/venv/lib/python3.12/site-packages/sentry_sdk/integrations/langchain.py__init__zLangchainIntegration.__init__?   s      /"&<#    c                  H    t        t        j                        t        _        y r0   )_wrap_configurer   
_configure r7   r5   
setup_oncezLangchainIntegration.setup_onceG   s     -W-?-?@r7   )Tr.   N)	__name__
__module____qualname__
identifieroriginr2   r6   staticmethodr<   r;   r7   r5   r,   r,   8   s<    J
|$F I LP= A Ar7   r,   c                   *    e Zd ZdZdZdZdZg ZdZd Z	y)WatchedSpanNr   Fc                     || _         y r0   )span)r4   rF   s     r5   r6   zWatchedSpan.__init__U   s	    	r7   )
r=   r>   r?   rF   num_completion_tokensnum_prompt_tokensno_collect_tokenschildrenis_pipeliner6   r;   r7   r5   rD   rD   M   s(    DHKr7   rD   c                       e Zd ZdZd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d Zd Zd Zy)SentryLangchainCallbackzJBase callback handler that can be used to handle callbacks from langchain.Nc                     t               | _        || _        || _        d | _        |dd l}|j                  |      | _        y y Nr   )r   span_mapmax_span_map_sizer1   tiktoken_encodingtiktokenget_encoding)r4   rQ   r1   r3   rS   s        r5   r6   z SentryLangchainCallback.__init__]   sE    #!2.!%!-%-%:%:;Q%RD" .r7   c                 d    | j                   $t        | j                   j                  |            S yrO   )rR   lenencode_ordinary)r4   ss     r5   count_tokensz$SentryLangchainCallback.count_tokensi   s-    !!-t--==a@AAr7   c                     t        | j                        | j                  kD  rU| j                  j                  d      \  }}| j	                  ||       t        | j                        | j                  kD  rTy y )NF)last)rV   rP   rQ   popitem
_exit_span)r4   run_idwatched_spans      r5   gc_span_mapz#SentryLangchainCallback.gc_span_mapo   s^     $-- 4#9#99#'==#8#8e#8#D FLOOL&1 $-- 4#9#99r7   c                     |r|| j                   vry | j                   |   }|sy t        j                  ||j                  j                         |j                  j                  d d d        | j                   |= y r0   )rP   
sentry_sdkcapture_exceptionrF   scope__exit__)r4   r^   error	span_datas       r5   _handle_errorz%SentryLangchainCallback._handle_errorv   sc    t}}4MM&)	$$UINN,@,@AdD1MM&!r7   c                 n    |j                   |j                  d}|j                  |j                         |S )N)contentrole)rj   typeupdateadditional_kwargs)r4   messageparseds      r5   _normalize_langchain_messagez4SentryLangchainCallback._normalize_langchain_message   s+    $__gllCg//0r7   c                     d }|r]| j                   j                  |      }|r@t         |j                  j                  di |      }|j
                  j                  |       |t        t        j                  di |      }|j                  dd      j                  d      r2|j                  d      rt        |j                  d             d|_        |j                  j                          || j                   |<   | j                          |S )Nop zai.pipeline.nameTr;   )rP   getrD   rF   start_childrJ   appendrb   
start_span
startswithr   rK   	__enter__r`   )r4   r^   	parent_idkwargsr_   parent_spans         r5   _create_spanz$SentryLangchainCallback._create_span   s     --++I6K*+G;+;+;+G+G+Q&+QR$$++L9&z'<'<'Fv'FGL::dB**>:zz&!$VZZ%78'+L$##% ,fr7   c                     |j                   rt        d        |j                  j                  d d d        | j                  |= y r0   )rK   r   rF   re   rP   )r4   rg   r^   s      r5   r]   z"SentryLangchainCallback._exit_span   s7        &dD1MM&!r7   )r)   parent_run_idmetadatac          	      F   t               5  |s
	 ddd       y|j                  di       }|j                  |j                  di              | j                  ||j                  d      t        j
                  |j                  d      xs dt        j                        }	|	j                  }
t               r'| j                  rt        |
t        j                  |       t        j                         D ]  \  }}||v st        |
|||           	 ddd       y# 1 sw Y   yxY w)zRun when LLM starts running.Ninvocation_paramsr}   r   ru   zLangchain LLM callrs   ru   rA   )r   rv   rm   r   r   LANGCHAIN_RUNr,   rA   rF   r   r1   r
   r	   AI_INPUT_MESSAGESDATA_FIELDSitems)r4   
serializedpromptsr^   r)   r   r   r}   
all_paramsr_   rF   kvs                r5   on_llm_startz$SentryLangchainCallback.on_llm_start   s    )* 	@	@ 	@  $7<JjnnXr:;,,

?+##ZZ'?+?+22 - L  $$D&(T-A-A#D(*D*DgN#))+ @1
?'aA?@	@ 	@ 	@s   DC"D;DD c                   t               5  |s
	 ddd       y|j                  di       j                  |j                  di              | j                  ||j                  d      t        j
                  |j                  d      xs dt        j                        }|j                  }j                  dj                  d	j                  d
                  }t        fdt        D              |_        |sdj                  d      v rd}|r |j                  t        j                  |       t               rT| j                   rHt#        |t        j$                  |D 	cg c]!  }|D 	cg c]  }	| j'                  |	       c}	# c}	}       t(        j+                         D ]  \  }
}|
v st#        |||
           |j                  se|D ]`  }|D ]Y  }| j,                  |   xj.                  | j1                  |j2                        | j1                  |j4                        z   z  c_        [ b 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   r}   r   ru   zLangchain Chat Modelr   model
model_namemodel_idc              3   F   K   | ]  }|j                  d d      v   yw)_typert   N)rv   ).0xr   s     r5   	<genexpr>z>SentryLangchainCallback.on_chat_model_start.<locals>.<genexpr>   s&      156Z^^GR001s   !	anthropicr   zclaude-2)r   rv   rm   r   r   !LANGCHAIN_CHAT_COMPLETIONS_CREATEr,   rA   rF   anyNO_COLLECT_TOKEN_MODELSrI   set_datar	   AI_MODEL_IDr   r1   r
   r   rq   r   r   rP   rH   rY   rj   rl   )r4   r   messagesr^   r}   r_   rF   r   list_r   r   r   ro   r   s                @r5   on_chat_model_startz+SentryLangchainCallback.on_chat_model_start   s/    )* )	<)	< )	<  $7<JjnnXr:;,,

?+77ZZ'A+A+22 - L  $$DNNjnnZ6PQE .1 1:Q1 .L* [JNN7,CC"h22E:&(T-A-A#.. &.! HMM!::1=M $))+ @1
?'aA?@  11% <E#( <f-??4CTCT#OOD --gll;D< <?<<K)	< )	<: N9)	< )	<s<   IE
I#	I,H<I	&I0BI<IIIc                   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|r|j                  r
	 ddd       y|xj                  | j	                  |      z  c_        ddd       y# 1 sw Y   yxY w)z?Run on new LLM token. Only available when streaming is enabled.N)r   rP   rI   rG   rY   )r4   tokenr^   r}   rg   s        r5   on_llm_new_tokenz(SentryLangchainCallback.on_llm_new_token   s     )* 	HV4==8	H 	H f-I	 ; ;	H 	H ++t/@/@/GG+	H 	H 	Hs   A:A:$A::Bc                   t               5  |s
	 ddd       y|j                  r|j                  j                  d      nd}| j                  |   }|s
	 ddd       yt	               rc| j
                  rWt        |j                  t        j                  |j                  D cg c]  }|D cg c]  }|j                   c} c}}       |j                  ss|rFt        |j                  |j                  d      |j                  d      |j                  d             n+t        |j                  |j                  |j                         | j!                  ||       ddd       yc c}w c c}}w # 1 sw Y   yxY w)zRun when LLM ends running.Ntoken_usageprompt_tokenscompletion_tokenstotal_tokens)r   
llm_outputrv   rP   r   r1   r
   rF   r	   AI_RESPONSESgenerationstextrI   r   rH   rG   r]   )r4   responser^   r}   r   rg   r   r   s           r5   
on_llm_endz"SentryLangchainCallback.on_llm_end   sD    )* "	/"	/ "	/
 ;C:M:M##''6SW  f-I"	/ "	/ '(T-A-A#NN)):B:N:NOe,aff,O ..&!#8#(;<#7	 '!!33!77 OOIv.E"	/ "	/  -O!"	/ "	/s<   E.;E.AE. 	E()E#<E(BE.#E((E..E7c                f    t               5  | j                  ||       ddd       y# 1 sw Y   yxY w)zRun when LLM errors.N)r   rh   r4   rf   r^   r}   s       r5   on_llm_errorz$SentryLangchainCallback.on_llm_error'  s/     )* 	.vu-	. 	. 	.s   '0c          	         t               5  |s
	 ddd       y| j                  ||j                  d      |j                  d      t        j                  nt        j
                  |j                  d      xs dt        j                        }|j                  d      }|r%t        |j                  t        j                  |       ddd       y# 1 sw Y   yxY w)zRun when chain starts running.Nr   ru   zChain executionr   r   )r   r   rv   r   r   LANGCHAIN_PIPELINEr,   rA   r
   rF   r	   AI_METADATA)r4   r   inputsr^   r}   r_   r   s          r5   on_chain_startz&SentryLangchainCallback.on_chain_start-  s     )* 	W	W 	W  ,,

?+ zz/2> $$..ZZ'<+<+22 - 
L zz*-H#L$5$5x7K7KXV!	W 	W 	Ws   CB-CCc                    t               5  |r|| j                  vr
	 ddd       y| j                  |   }|s
	 ddd       y| j                  ||       ddd       y# 1 sw Y   yxY w)zRun when chain ends running.N)r   rP   r]   )r4   outputsr^   r}   rg   s        r5   on_chain_endz$SentryLangchainCallback.on_chain_endB  sj     )* 	/V4==8	/ 	/ f-I	/ 	/ OOIv.	/ 	/ 	/s   AAAA%c                (    | j                  ||       y)zRun when chain errors.Nrh   r   s       r5   on_chain_errorz&SentryLangchainCallback.on_chain_errorN       	65)r7   c                   t               5  |s
	 d d d        y | j                  ||j                  d      t        j                  |j
                  xs dt        j                        }|j                  rEt               r;| j                  r/t        |j                  t        j                  |j                         d d d        y # 1 sw Y   y xY w)Nr   AI tool usager   )r   r   rv   r   LANGCHAIN_AGENTtoolr,   rA   
tool_inputr   r1   r
   rF   r	   r   )r4   actionr^   r}   r_   s        r5   on_agent_actionz'SentryLangchainCallback.on_agent_actionS  s    (* 		 	  ,,

?+%%[[3O+22 - L   %<%>4CWCW# %%x'A'A6CTCT	 	 	s   CB CC
c                Z   t               5  |s
	 d d d        y | j                  |   }|s
	 d d d        y t               rI| j                  r=t	        |j
                  t        j                  |j                  j                                | j                  ||       d d d        y # 1 sw Y   y xY wr0   )r   rP   r   r1   r
   rF   r	   r   return_valuesr   r]   )r4   finishr^   r}   rg   s        r5   on_agent_finishz'SentryLangchainCallback.on_agent_finishd  s    (* 	/	/ 	/ f-I	/ 	/ '(T-A-A#NNH$9$96;O;O;U;U;W OOIv.	/ 	/ 	/s   B!B!A%B!!B*c          	      J   t               5  |s
	 ddd       y| j                  ||j                  d      t        j                  |j                  d      xs |j                  d      xs dt
        j                        }t               r| j                  r{t        |j                  t        j                  |j                  d|g             |j                  d      r4t        |j                  t        j                  |j                  d             ddd       y# 1 sw Y   yxY w)zRun when tool starts running.Nr   ru   r   r   r   r   )r   r   rv   r   LANGCHAIN_TOOLr,   rA   r   r1   r
   rF   r	   r   r   )r4   r   	input_strr^   r}   r_   s         r5   on_tool_startz%SentryLangchainCallback.on_tool_starts  s     )* 		 	  ,,

?+$$^^F+Tvzz&/AT_+22 - L '(T-A-A# %%..JJx)5
 ::j)'$))8+?+?JAW#	 	 	s   DC8DD"c                F   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|s
	 ddd       yt               r1| j                  r%t	        |j
                  t        j                  |       | j                  ||       ddd       y# 1 sw Y   yxY w)zRun when tool ends running.N)	r   rP   r   r1   r
   rF   r	   r   r]   )r4   outputr^   r}   rg   s        r5   on_tool_endz#SentryLangchainCallback.on_tool_end  s     )* 		/V4==8		/ 		/ f-I		/ 		/ '(T-A-A#INNH4I4I6ROOIv.		/ 		/ 		/s   BBABB c                (    | j                  ||       y)zRun when tool errors.Nr   )r4   rf   r^   argsr}   s        r5   on_tool_errorz%SentryLangchainCallback.on_tool_error  r   r7   r0   )r=   r>   r?   __doc__r6   rY   r`   rh   rq   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r7   r5   rM   rM   Z   s{    T
S2
"," @@,<\	H%/N.W*
/*
"/0/*r7   rM   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              s|t        |j                  |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r0   )
isinstancerM   )r   cbs     r5   r   z9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>  s       
 r23
s   )rb   
get_clientget_integrationr,   r   r   handlersr   listr   debugr   	itertoolschainrM   r2   r1   r3   copy)
callback_manager_clsinheritable_callbackslocal_callbacksr   r}   integrationcallbacks_listinheritable_callbacks_listsentry_handlerfs
            r5   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%%++22N
 /+>?"1"6"6"8,$--,",( O-@A#2N"C"DO"D^"D !
 	

 
 	
r7   )NNr   )r   r   s   ` r5   r9   r9     s.     1X #L
 L
\ r7   )>r   collectionsr   	functoolsr   rb   sentry_sdk.ai.monitoringr   r   sentry_sdk.constsr   r	   sentry_sdk.ai.utilsr
   sentry_sdk.scoper   sentry_sdk.tracingr   sentry_sdk.integrationsr   r   sentry_sdk.utilsr   r   typingr   r   r   r   r   r   r   uuidr   langchain_core.messagesr   langchain_core.outputsr   langchain_core.callbacksr   r   r   r   langchain_core.agentsr   r    ImportErrorAI_TEMPERATUREAI_TOP_PAI_TOP_KAI_FUNCTION_CALLAI_TOOL_CALLSAI_TOOLSAI_RESPONSE_FORMATAI_LOGIT_BIASAI_TAGSr   r   r,   rD   rM   r9   r;   r7   r5   <module>r     s     #   M * 3 4 # = @  AA230  ? **..((22((
 A; A*
 
B*1 B*J
RC  2
0
112s   & D D"