o
    BDiE                  
   @   s  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rdd dlmZmZmZmZmZmZ d dl m!Z! z d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+m,Z, W n e-y   edw ej.ej/ej0ej1ej2ej3ej4ej5ej6d	Z7g dZ8G dd deZ9G dd dZ:G dd de(Z;dd Z<dS )    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	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                   @   s6   e Zd ZdZde ZdZ	d
ddZedd	 ZdS )LangchainIntegration	langchainzauto.ai.   TNc                 C   s   || _ || _|| _d S N)include_prompts	max_spanstiktoken_encoding_name)selfr-   r.   r/    r1   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/sentry_sdk/integrations/langchain.py__init__>   s   
zLangchainIntegration.__init__c                   C   s   t tjt_d S r,   )_wrap_configurer   
_configurer1   r1   r1   r2   
setup_onceF      zLangchainIntegration.setup_once)Tr+   N)	__name__
__module____qualname__
identifieroriginr.   r3   staticmethodr6   r1   r1   r1   r2   r)   7   s    

r)   c                   @   s,   e Zd ZdZdZdZdZg ZdZdd Z	dS )WatchedSpanNr   Fc                 C   s
   || _ d S r,   )span)r0   r?   r1   r1   r2   r3   T   s   
zWatchedSpan.__init__)
r8   r9   r:   r?   num_completion_tokensnum_prompt_tokensno_collect_tokenschildrenis_pipeliner3   r1   r1   r1   r2   r>   L   s    r>   c                   @   s   e Zd ZdZd,ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dddd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% Zd&d' Zd(d) Zd*d+ ZdS )-SentryLangchainCallbackzJBase callback handler that can be used to handle callbacks from langchain.Nc                 C   s>   t  | _|| _|| _d | _|d urdd l}||| _d S d S Nr   )r   span_mapmax_span_map_sizer-   tiktoken_encodingtiktokenget_encoding)r0   rH   r-   r/   rJ   r1   r1   r2   r3   \   s   z SentryLangchainCallback.__init__c                 C   s   | j d urt| j |S dS rF   )rI   lenencode_ordinary)r0   sr1   r1   r2   count_tokensh   s   
z$SentryLangchainCallback.count_tokensc                 C   sF   t | j| jkr!| jjdd\}}| || t | j| jksd S d S )NF)last)rL   rG   rH   popitem
_exit_span)r0   run_idwatched_spanr1   r1   r2   gc_span_mapn   s   z#SentryLangchainCallback.gc_span_mapc                 C   sP   |r|| j vr	d S | j | }|sd S t||jj |jd d d  | j |= d S r,   )rG   
sentry_sdkcapture_exceptionr?   scope__exit__)r0   rS   error	span_datar1   r1   r2   _handle_erroru   s   
z%SentryLangchainCallback._handle_errorc                 C   s   |j |jd}||j |S )N)contentrole)r]   typeupdateadditional_kwargs)r0   messageparsedr1   r1   r2   _normalize_langchain_message   s   z4SentryLangchainCallback._normalize_langchain_messagec                 K   s   d }|r| j |}|rt|jjdi |}|j| |d u r+ttjdi |}|dd	drC|dr@t
|d d|_|j  || j |< |   |S )Nop zai.pipeline.nameTr1   )rG   getr>   r?   start_childrC   appendrV   
start_span
startswithr   rD   	__enter__rU   )r0   rS   	parent_idkwargsrT   parent_spanr1   r1   r2   _create_span   s    


z$SentryLangchainCallback._create_spanc                 C   s*   |j rtd  |jd d d  | j|= d S r,   )rD   r   r?   rY   rG   )r0   r[   rS   r1   r1   r2   rR      s   z"SentryLangchainCallback._exit_span)r'   parent_run_idmetadatac                K   s   t  \ |s	 W d   dS |di }||di  | j||dtj|dp-dtjd}	|	j}
t	 rB| j
rBt|
tj| t D ]\}}||v rVt|
|||  qFW d   dS 1 sbw   Y  dS )zRun when LLM starts running.Ninvocation_paramsro   rr   rg   zLangchain LLM callre   rg   r<   )r   rh   r`   rq   r   LANGCHAIN_RUNr)   r<   r?   r
   r-   r	   r   AI_INPUT_MESSAGESDATA_FIELDSitems)r0   
serializedpromptsrS   r'   rr   rs   ro   
all_paramsrT   r?   kvr1   r1   r2   on_llm_start   s,   "z$SentryLangchainCallback.on_llm_startc             
      s  t   |s	 W d   dS |di   |di  j||dtj|dp-dtjd}|j} d d	 d
}t	 fddt
D |_|sYd dv rYd}|rb|tj| t rvjrvt|tjfdd|D  t D ]\}}	| v rt||	 |  qz|js|D ]#}
|
D ]}j|  j|j|j 7  _qqW d   dS W d   dS 1 sw   Y  dS )z#Run when Chat Model starts running.Nrt   ro   rr   rg   zLangchain Chat Modelru   model
model_namemodel_idc                 3   s     | ]}|  d dv V  qdS )_typerf   N)rh   .0x)r|   r1   r2   	<genexpr>   s    
z>SentryLangchainCallback.on_chat_model_start.<locals>.<genexpr>	anthropicr   zclaude-2c                    s   g | ]} fd d|D qS )c                    s   g | ]}  |qS r1   )rd   r   r0   r1   r2   
<listcomp>   s    zJSentryLangchainCallback.on_chat_model_start.<locals>.<listcomp>.<listcomp>r1   r   list_r   r1   r2   r      s    z?SentryLangchainCallback.on_chat_model_start.<locals>.<listcomp>)r   rh   r`   rq   r   !LANGCHAIN_CHAT_COMPLETIONS_CREATEr)   r<   r?   anyNO_COLLECT_TOKEN_MODELSrB   set_datar   AI_MODEL_IDr
   r-   r	   rw   rx   ry   rG   rA   rO   r]   r_   )r0   rz   messagesrS   ro   rT   r?   r   r}   r~   r   rb   r1   )r|   r0   r2   on_chat_model_start   sb   



%"z+SentryLangchainCallback.on_chat_model_startc                K   s   t  6 |r|| jvr	 W d   dS | j| }|r|jr'	 W d   dS | j| |7  _W d   dS 1 s<w   Y  dS )z?Run on new LLM token. Only available when streaming is enabled.N)r   rG   rB   r@   rO   )r0   tokenrS   ro   r[   r1   r1   r2   on_llm_new_token   s   

"z(SentryLangchainCallback.on_llm_new_tokenc                K   s   t  i |s	 W d   dS |jr|jdnd}| j| }|s*	 W d   dS t r>| jr>t|jtj	dd |j
D  |js^|rUt|j|d|d|d n	t|j|j|j | || W d   dS 1 sow   Y  dS )zRun when LLM ends running.Ntoken_usagec                 S   s   g | ]	}d d |D qS )c                 S   s   g | ]}|j qS r1   )textr   r1   r1   r2   r     s    zASentryLangchainCallback.on_llm_end.<locals>.<listcomp>.<listcomp>r1   r   r1   r1   r2   r     s    z6SentryLangchainCallback.on_llm_end.<locals>.<listcomp>prompt_tokenscompletion_tokenstotal_tokens)r   
llm_outputrh   rG   r
   r-   r	   r?   r   AI_RESPONSESgenerationsrB   r   rA   r@   rR   )r0   responserS   ro   r   r[   r1   r1   r2   
on_llm_end   s>   
"z"SentryLangchainCallback.on_llm_endc                K   s8   t   | || W d   dS 1 sw   Y  dS )zRun when LLM errors.N)r   r\   r0   rZ   rS   ro   r1   r1   r2   on_llm_error&  s   "z$SentryLangchainCallback.on_llm_errorc                K   s   t  I |s	 W d   dS | j||d|ddur tjntj|dp(dtjd}|d}|rDt|j	t
j| W d   dS W d   dS 1 sOw   Y  dS )zRun when chain starts running.Nrr   rg   zChain executionru   rs   )r   rq   rh   r   rv   LANGCHAIN_PIPELINEr)   r<   r	   r?   r   AI_METADATA)r0   rz   inputsrS   ro   rT   rs   r1   r1   r2   on_chain_start,  s&   
"z&SentryLangchainCallback.on_chain_startc                K   sx   t  / |r|| jvr	 W d   dS | j| }|s$	 W d   dS | || W d   dS 1 s5w   Y  dS )zRun when chain ends running.N)r   rG   rR   )r0   outputsrS   ro   r[   r1   r1   r2   on_chain_endA  s   
"z$SentryLangchainCallback.on_chain_endc                K      |  || dS )zRun when chain errors.Nr\   r   r1   r1   r2   on_chain_errorM  r7   z&SentryLangchainCallback.on_chain_errorc                K   s   t  P |s	 W d    d S | j||dtj|jpdtjd}|jr;t	 rC| j
rKt|jtj|j W d    d S W d    d S W d    d S W d    d S 1 sVw   Y  d S )Nrr   AI tool usageru   )r   rq   rh   r   LANGCHAIN_AGENTtoolr)   r<   
tool_inputr
   r-   r	   r?   r   rw   )r0   actionrS   ro   rT   r1   r1   r2   on_agent_actionR  s,   


"z'SentryLangchainCallback.on_agent_actionc                K   s   t  ; |s	 W d    d S | j| }|s	 W d    d S t r0| jr0t|jtj|j	  | 
|| W d    d S 1 sAw   Y  d S r,   )r   rG   r
   r-   r	   r?   r   r   return_valuesry   rR   )r0   finishrS   ro   r[   r1   r1   r2   on_agent_finishc  s   
"z'SentryLangchainCallback.on_agent_finishc                K   s   t  h |s	 W d   dS | j||dtj|dp#|dp#dtjd}t rS| jr[t	|j
tj|d|g |drct	|j
tj|d W d   dS W d   dS W d   dS W d   dS 1 snw   Y  dS )zRun when tool starts running.Nrr   rg   r   ru   r   rs   )r   rq   rh   r   LANGCHAIN_TOOLr)   r<   r
   r-   r	   r?   r   rw   r   )r0   rz   	input_strrS   ro   rT   r1   r1   r2   on_tool_startr  s8   


"z%SentryLangchainCallback.on_tool_startc                K   s   t  = |r|| jvr	 W d   dS | j| }|s$	 W d   dS t r2| jr2t|jtj| | || W d   dS 1 sCw   Y  dS )zRun when tool ends running.N)	r   rG   r
   r-   r	   r?   r   r   rR   )r0   outputrS   ro   r[   r1   r1   r2   on_tool_end  s   
"z#SentryLangchainCallback.on_tool_endc                O   r   )zRun when tool errors.Nr   )r0   rZ   rS   argsro   r1   r1   r2   on_tool_error  r7   z%SentryLangchainCallback.on_tool_errorr,   )r8   r9   r:   __doc__r3   rO   rU   r\   rd   rq   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   rE   Y   s2    
 .'rE   c                    s   t  	 	 d fdd	}|S )Nc                    s   t  t}|d u r | ||g|R i |S |pg }t|tr%|g}nt|ts=td|  | ||g|R i |S t|trD|ng }t	dd t
||D s`g |t|j|j|j} | ||g|R i |S )NzUnknown callback type: %sc                 s   s    | ]}t |tV  qd S r,   )
isinstancerE   )r   cbr1   r1   r2   r     s
    
z9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>)rV   
get_clientget_integrationr)   r   r   listr   debugr   	itertoolschainrE   r.   r-   r/   )callback_manager_clsinheritable_callbackslocal_callbacksr   ro   integrationcallbacks_listinheritable_callbacks_listfr1   r2   new_configure  s`   


	
	z&_wrap_configure.<locals>.new_configure)NNr   )r   r   r1   r   r2   r4     s
   <r4   )=r   collectionsr   	functoolsr   rV   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   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_TAGSrx   r   r)   r>   rE   r4   r1   r1   r1   r2   <module>   sP       G