
    Dj6E              
       :   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' d dl(m)Z)m*Z* e
jX                  e
jZ                  e
j\                  e
j^                  e
j`                  e
jb                  e
jd                  e
jf                  e
jh                  d	Z5g dZ6 G d de      Z7 G d d      Z8 G d de'      Z9d Z:y# e+$ r	  ed      w xY w)    )OrderedDictwrapsN)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)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)selfr/   r0   r1   s       eC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\sentry_sdk/integrations/langchain.py__init__zLangchainIntegration.__init__<   s      /"&<#    c                  H    t        t        j                        t        _        y r.   )_wrap_configurer   
_configure r5   r3   
setup_oncezLangchainIntegration.setup_onceD   s     -W-?-?@r5   )Tr,   N)	__name__
__module____qualname__
identifieroriginr0   r4   staticmethodr:   r9   r5   r3   r*   r*   5   s<    J
|$F I LP= A Ar5   r*   c                   *    e Zd ZdZdZdZdZg ZdZd Z	y)WatchedSpanNr   Fc                     || _         y r.   )span)r2   rD   s     r3   r4   zWatchedSpan.__init__R   s	    	r5   )
r;   r<   r=   rD   num_completion_tokensnum_prompt_tokensno_collect_tokenschildrenis_pipeliner4   r9   r5   r3   rB   rB   J   s(    DHKr5   rB   c                       e Zd ZdZ e       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.r   Nc                 h    || _         || _        d | _        |dd l}|j	                  |      | _        y y Nr   )max_span_map_sizer/   tiktoken_encodingtiktokenget_encoding)r2   rN   r/   r1   rP   s        r3   r4   z SentryLangchainCallback.__init__^   s<    !2.!%!-%-%:%:;Q%RD" .r5   c                 d    | j                   $t        | j                   j                  |            S yrM   )rO   lenencode_ordinary)r2   ss     r3   count_tokensz$SentryLangchainCallback.count_tokensi   s-    !!-t--==a@AAr5   c                     t        | j                        | j                  kD  rU| j                  j                  d      \  }}| j	                  ||       t        | j                        | j                  kD  rTy y )NF)last)rS   span_maprN   popitem
_exit_span)r2   run_idwatched_spans      r3   gc_span_mapz#SentryLangchainCallback.gc_span_mapo   s^     $-- 4#9#99#'==#8#8e#8#D FLOOL&1 $-- 4#9#99r5   c                     |r|| j                   vry | j                   |   }|sy t        j                  ||j                  j                         |j                  j                  d d d        | j                   |= y r.   )rY   
sentry_sdkcapture_exceptionrD   scope__exit__)r2   r\   error	span_datas       r3   _handle_errorz%SentryLangchainCallback._handle_errorv   sc    t}}4MM&)	$$UINN,@,@AdD1MM&!r5   c                 n    |j                   |j                  d}|j                  |j                         |S )N)contentrole)rh   typeupdateadditional_kwargs)r2   messageparseds      r3   _normalize_langchain_messagez4SentryLangchainCallback._normalize_langchain_message   s+    $__gllCg//0r5   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.nameTr9   )rY   getrB   rD   start_childrH   appendr`   
start_span
startswithr   rI   	__enter__r^   )r2   r\   	parent_idkwargsr]   parent_spans         r3   _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r5   c                     |j                   rt        d        |j                  j                  d d d        | j                  |= y r.   )rI   r   rD   rc   rY   )r2   re   r\   s      r3   r[   z"SentryLangchainCallback._exit_span   s7        &dD1MM&!r5   )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   rs   zLangchain LLM callrq   rs   r?   )r   rt   rk   r}   r   LANGCHAIN_RUNr*   r?   rD   r   r/   r
   r	   AI_INPUT_MESSAGESDATA_FIELDSitems)r2   
serializedpromptsr\   r'   r   r   r{   
all_paramsr]   rD   kvs                r3   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   rs   zLangchain Chat Modelr   model
model_namemodel_idc              3   F   K   | ]  }|j                  d d      v   yw)_typerr   N)rt   ).0xr   s     r3   	<genexpr>z>SentryLangchainCallback.on_chat_model_start.<locals>.<genexpr>   s&      156Z^^GR001s   !	anthropicr   zclaude-2)r   rt   rk   r}   r   !LANGCHAIN_CHAT_COMPLETIONS_CREATEr*   r?   rD   anyNO_COLLECT_TOKEN_MODELSrG   set_datar	   AI_MODEL_IDr   r/   r
   r   ro   r   r   rY   rF   rV   rh   rj   )r2   r   messagesr\   r{   r]   rD   r   list_r   r   r   rm   r   s                @r3   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   rY   rG   rE   rV   )r2   tokenr\   r{   re   s        r3   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_outputrt   rY   r   r/   r
   rD   r	   AI_RESPONSESgenerationstextrG   r   rF   rE   r[   )r2   responser\   r{   r   re   r   r   s           r3   
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   rf   r2   rd   r\   r{   s       r3   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   rs   zChain executionr   r   )r   r}   rt   r   r   LANGCHAIN_PIPELINEr*   r?   r
   rD   r	   AI_METADATA)r2   r   inputsr\   r{   r]   r   s          r3   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   rY   r[   )r2   outputsr\   r{   re   s        r3   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rf   r   s       r3   on_chain_errorz&SentryLangchainCallback.on_chain_errorN       	65)r5   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}   rt   r   LANGCHAIN_AGENTtoolr*   r?   
tool_inputr   r/   r
   rD   r	   r   )r2   actionr\   r{   r]   s        r3   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r.   )r   rY   r   r/   r
   rD   r	   r   return_valuesr   r[   )r2   finishr\   r{   re   s        r3   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   rs   r   r   r   r   )r   r}   rt   r   LANGCHAIN_TOOLr*   r?   r   r/   r
   rD   r	   r   r   )r2   r   	input_strr\   r{   r]   s         r3   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   rY   r   r/   r
   rD   r	   r   r[   )r2   outputr\   r{   re   s        r3   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   )r2   rd   r\   argsr{   s        r3   on_tool_errorz%SentryLangchainCallback.on_tool_error  r   r5   r.   )r;   r<   r=   __doc__r   rY   rN   r4   rV   r^   rf   ro   r}   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r5   r3   rK   rK   W   s    T}H	S2
"," @@,<\	H%/N.W*
/*
"/0/*r5   rK   c                 .     t                fd       }|S )Nc                     t        j                         j                  t              }| | i |S t	               5  g }d|v r|d   }||d<   n't        |       dkD  r| d   }| d   | d   |f| dd  z   } ng }|rat        |t              r|D ]  }|j                  |        n8t        |t              r|j                  |       nt        j                  d|       d}|D ]  }t        |t              sd} |s:|j                  t        |j                  |j                  |j                               d d d         | i |S # 1 sw Y   xY w)	Nlocal_callbacks   r         zUnknown callback type: %sFT)r`   
get_clientget_integrationr*   r   rS   
isinstancelistrv   r   r   debugrK   r0   r/   r1   )	r   r{   integrationnew_callbacksexisting_callbackscbalready_addedcallbackfs	           r3   new_configurez&_wrap_configure.<locals>.new_configure  s}    !++-==>RSd%f%%(* $	M F*%+,=%>",9()TQ%)!W"GG! H	 &("!0$70 1%,,R01 24GH!(();<LL!<>PQ!M) )h(?@$(M) !$$+#--#33#::=$	J $!&!!K$	 $	s   B3E1A EE
r   )r   r   s   ` r3   r7   r7     s$     1X," ,"\ r5   );collectionsr   	functoolsr   r`   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   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*   rB   rK   r7   r9   r5   r3   <module>r      s    #   M * 3 4 # = @  AA	230 ? **..((22((
 A; A*
 
E*1 E*P
2I  2
0
112s   "D D