o
    0 if                     @   sv  d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlZd dl	m
Z
 d dlmZmZmZmZ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mZ d d
lmZmZ d dlm Z  e rd 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, z d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 W n e8y   edw zd dl9m:Z: W n e8y   zd dl;m:Z: W n e8y   dZ:Y nw Y nw ej<ej=ej>ej?ej@ej=ejAejBdZCe jDdddZEdd ZFdd ZGdd ZHG dd deZIG d d! d!ZJG d"d# d#e0ZKd$d% ZLd&d' ZMd(d) ZNd*d+ ZOd,d- ZPd.d/ ZQd0d1 ZRd2d3 ZSd4d5 ZTd6d7 ZUdS )8    N)OrderedDictwraps)set_ai_pipeline_name)GEN_AI_ALLOWED_MESSAGE_ROLESnormalize_message_rolesset_data_normalizedget_start_span_functiontruncate_and_annotate_messages)OPSPANDATA)DidNotEnableIntegration)should_send_default_pii)
_get_valueset_span_errored)loggercapture_internal_exceptions)TYPE_CHECKING)AnyAsyncIteratorCallableDictIteratorListOptionalUnion)UUID)Span)AgentFinish)BaseCallbackHandlerBaseCallbackManager	Callbacksmanager)BaseMessage)	LLMResultzlangchain not installed)AgentExecutor)Zfrequency_penaltyZfunction_callZ
max_tokensZpresence_penaltyZtemperature
tool_callsZtop_kZtop_pZlangchain_agent_stack)defaultc                 C   s6   t  }|du rg }n| }||  t | dS )z"Push an agent name onto the stack.N)_agent_stackgetcopyappendset)
agent_namestack r0   m/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/integrations/langchain.py_push_agentR   s   
r2   c                  C   s.   t  } | r|  } |  }t |  |S dS )z/Pop an agent name from the stack and return it.N)r)   r*   r+   popr-   )r/   r.   r0   r0   r1   
_pop_agent_   s   
r4   c                  C   s   t  } | r
| d S dS )z>Get the current agent name (top of stack) without removing it.N)r)   r*   )r/   r0   r0   r1   _get_current_agentl   s   r6   c                   @   s0   e Zd ZdZde Zd	ddZedd ZdS )
LangchainIntegrationZ	langchainzauto.ai.TNc                 C   s,   || _ || _|d urtjdtdd d S d S )NzsThe `max_spans` parameter of `LangchainIntegration` is deprecated and will be removed in version 3.0 of sentry-sdk.   )
stacklevel)include_prompts	max_spanswarningswarnDeprecationWarning)selfr:   r;   r0   r0   r1   __init__y   s   
zLangchainIntegration.__init__c                   C   s4   t tjt_td urttjt_ttjt_d S d S N)_wrap_configurer#   Z
_configurer&   _wrap_agent_executor_invokeZinvoke_wrap_agent_executor_streamstreamr0   r0   r0   r1   
setup_once   s
   zLangchainIntegration.setup_once)TN)__name__
__module____qualname__
identifieroriginr@   staticmethodrF   r0   r0   r0   r1   r7   u   s    

r7   c                   @   s    e Zd ZdZg ZdZdd ZdS )WatchedSpanNFc                 C   s
   || _ d S rA   )span)r?   rN   r0   r0   r1   r@      s   
zWatchedSpan.__init__)rG   rH   rI   rN   childrenis_pipeliner@   r0   r0   r0   r1   rM      s
    rM   c                   @   s   e Zd Z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S )$SentryLangchainCallbackz+Callback handler that creates Sentry spans.c                 C   s   t  | _|| _|| _d S rA   )r   span_mapmax_span_map_sizer:   )r?   rS   r:   r0   r0   r1   r@      s   
z SentryLangchainCallback.__init__c                 C   sT   | j d ur&t| j| j kr(| jjdd\}}| || t| j| j ksd S d S d S )NF)last)rS   lenrR   popitem
_exit_span)r?   run_idwatched_spanr0   r0   r1   gc_span_map   s   
z#SentryLangchainCallback.gc_span_mapc                 C   s   t  7 |r|| jvr	 W d    d S | j| }|j}t| t||j |d d d  | j|= W d    d S 1 s=w   Y  d S rA   )r   rR   rN   r   
sentry_sdkZcapture_exceptionscope__exit__)r?   rX   error	span_datarN   r0   r0   r1   _handle_error   s   

"z%SentryLangchainCallback._handle_errorc                 C   s   |j |jd}||j |S )NZrolecontent)typerb   updateZadditional_kwargs)r?   messageparsedr0   r0   r1   _normalize_langchain_message   s   z4SentryLangchainCallback._normalize_langchain_messagec                 K   sv   d }|r| j |}|rt|jjdi |}|j| |d u r+ttjdi |}|j	  || j |< | 
  |S )Nr0   )rR   r*   rM   rN   Zstart_childrO   r,   r[   Z
start_span	__enter__rZ   )r?   rX   Z	parent_idkwargsrY   Zparent_spanr0   r0   r1   _create_span   s   

z$SentryLangchainCallback._create_spanc                 C   s*   |j rtd  |jd d d  | j|= d S rA   )rP   r   rN   r]   rR   )r?   r_   rX   r0   r0   r1   rW      s   z"SentryLangchainCallback._exit_spanN)tagsparent_run_idmetadatac                K   s  t   |s	 W d   dS |di }||di  |dp.|dp.|dp.d}	| j||tj|dp;d	tjd
}
|
j}|	rL|	t
j|	 |dd}d|v r^|	t
jd nd|v ri|	t
jd t D ]\}}||v r|| durt|||| dd qmt||d t r| jrdd |D }t }t|||}|durt|t
j|dd W d   dS W d   dS W d   dS W d   dS 1 sw   Y  dS )zRun when LLM starts running.Ninvocation_paramsri   model
model_namemodel_id namezLangchain LLM calloprs   rK   _type	anthropicopenaiFunpacktoolsc                 S   s   g | ]}t jd |ddqS )text)rc   r|   ra   )r   USER).0promptr0   r0   r1   
<listcomp>  s    z8SentryLangchainCallback.on_llm_start.<locals>.<listcomp>)r   r*   rd   rj   r   ZGEN_AI_PIPELINEr7   rK   rN   set_datar   GEN_AI_REQUEST_MODELGEN_AI_SYSTEMDATA_FIELDSitemsr   _set_tools_on_spanr   r:   r[   get_current_scoper
   GEN_AI_REQUEST_MESSAGES)r?   
serializedZpromptsrX   rk   rl   rm   ri   
all_paramsro   rY   rN   ai_typekey	attributenormalized_messagesr\   messages_datar0   r0   r1   on_llm_start   st   
))5"z$SentryLangchainCallback.on_llm_startc                K   s  t   |s	 W d   dS |di }||di  |dp.|dp.|dp.d}| j||dtjd	|  tjd
}|j	}|
tjd |rV|
tj| |dd}	d|	v rh|
tjd nd|	v rs|
tjd t }
|
r|
tj|
 t D ]\}}||v r|| durt|||| dd qt||d t r| jrg }|D ]}|D ]
}|| | qqt|}t }t|||}|durt|tj|dd W d   dS W d   dS W d   dS W d   dS 1 sw   Y  dS )z#Run when Chat Model starts running.Nrn   ri   ro   rp   rq   rr   rl   zchat rt   Zchatrv   rw   rx   Fry   r{   )r   r*   rd   rj   r   ZGEN_AI_CHATstripr7   rK   rN   r   r   GEN_AI_OPERATION_NAMEr   r   r6   GEN_AI_AGENT_NAMEr   r   r   r   r   r:   r,   rg   r   r[   r   r
   r   )r?   r   messagesrX   ri   r   ro   rY   rN   r   r.   r   r   r   list_re   r\   r   r0   r0   r1   on_chat_model_start#  s   
++7"z+SentryLangchainCallback.on_chat_model_startc                K   s   t  ? |r|| jvr	 W d   dS | j| }|j}t r/| jr/t|tjdd |jD  t	|| | 
|| W d   dS 1 sEw   Y  dS )z!Run when Chat Model ends running.Nc                 S      g | ]	}d d |D qS )c                 S      g | ]}|j qS r0   r|   r~   xr0   r0   r1   r   s      zHSentryLangchainCallback.on_chat_model_end.<locals>.<listcomp>.<listcomp>r0   r~   r   r0   r0   r1   r   s      z=SentryLangchainCallback.on_chat_model_end.<locals>.<listcomp>)r   rR   rN   r   r:   r   r   GEN_AI_RESPONSE_TEXTgenerations_record_token_usagerW   )r?   responserX   ri   r_   rN   r0   r0   r1   on_chat_model_ende  s   

"z)SentryLangchainCallback.on_chat_model_endc          
   	   K   s  t   |r|| jvr	 W d   dS | j| }|j}z	|jd d }W n ty0   d}Y nw |durz|jd}|durG|tj	| W n	 t
yQ   Y nw z|jd}|durd|tj| W n	 t
yn   Y nw z t r| jrt|jdd}	|	dur|	g krt|tj|	dd W n	 t
y   Y nw t r| jrt|tjdd	 |jD  t|| | || W d   dS 1 sw   Y  dS )
zRun when LLM ends running.Nr   rp   finish_reasonr'   Fry   c                 S   r   )c                 S   r   r0   r   r   r0   r0   r1   r     r   zASentryLangchainCallback.on_llm_end.<locals>.<listcomp>.<listcomp>r0   r   r0   r0   r1   r     r   z6SentryLangchainCallback.on_llm_end.<locals>.<listcomp>)r   rR   rN   r   
IndexErrorZgeneration_infor*   r   r   ZGEN_AI_RESPONSE_MODELAttributeErrorZGEN_AI_RESPONSE_FINISH_REASONSr   r:   getattrre   r   GEN_AI_RESPONSE_TOOL_CALLSr   r   rW   )
r?   r   rX   ri   r_   rN   Z
generationZresponse_modelr   r'   r0   r0   r1   
on_llm_endy  sj   

"z"SentryLangchainCallback.on_llm_endc                K      |  || dS )zRun when LLM errors.Nr`   r?   r^   rX   ri   r0   r0   r1   on_llm_error     z$SentryLangchainCallback.on_llm_errorc                K   r   )zRun when Chat Model errors.Nr   r   r0   r0   r1   on_chat_model_error  r   z+SentryLangchainCallback.on_chat_model_errorc                K   s   t  7 |r|| jvr	 W d    d S | j| }|j}t r,| jr,t|tj|j	  | 
|| W d    d S 1 s=w   Y  d S rA   )r   rR   rN   r   r:   r   r   r   Zreturn_valuesr   rW   )r?   finishrX   ri   r_   rN   r0   r0   r1   on_agent_finish  s   
"z'SentryLangchainCallback.on_agent_finishc          
      K   s   t   |s	 W d   dS |dp|dpd}| j||dtjd|  tjd}|j}|	t
jd |	t
j| |d}|durP|	t
j| t }	|	r\|	t
j|	 t rv| jr~t|t
j|d	|g W d   dS W d   dS W d   dS 1 sw   Y  dS )
zRun when tool starts running.Nrs   rr   rl   zexecute_tool rt   Zexecute_tooldescriptionZinputs)r   r*   rj   r   ZGEN_AI_EXECUTE_TOOLr   r7   rK   rN   r   r   r   ZGEN_AI_TOOL_NAMEZGEN_AI_TOOL_DESCRIPTIONr6   r   r   r:   r   ZGEN_AI_TOOL_INPUT)
r?   r   Z	input_strrX   ri   	tool_namerY   rN   Ztool_descriptionr.   r0   r0   r1   on_tool_start  s@   
"z%SentryLangchainCallback.on_tool_startc                K   s   t  4 |r|| jvr	 W d   dS | j| }|j}t r)| jr)t|tj| | || W d   dS 1 s:w   Y  dS )zRun when tool ends running.N)	r   rR   rN   r   r:   r   r   ZGEN_AI_TOOL_OUTPUTrW   )r?   outputrX   ri   r_   rN   r0   r0   r1   on_tool_end  s   
"z#SentryLangchainCallback.on_tool_endc                O   r   )zRun when tool errors.Nr   )r?   r^   rX   argsri   r0   r0   r1   on_tool_error  r   z%SentryLangchainCallback.on_tool_error)rG   rH   rI   __doc__r@   rZ   r`   rg   rj   rW   r   r   r   r   r   r   r   r   r   r   r0   r0   r0   r1   rQ      s*    JB7$rQ   c                 C   sD   | sdS t | dpt | d}t | dpt | d}t | d}|||fS )NNNNZprompt_tokensinput_tokensZcompletion_tokensoutput_tokenstotal_tokensr   )token_usager   r   r   r0   r0   r1   _extract_tokens  s   

r   c           
      C   s   | sdS d}d}d}| D ]0}|D ]+}t |}t|\}}}	||dur$|nd7 }||dur.|nd7 }||	dur8|	nd7 }qq|dkrC|nd|dkrJ|nd|dkrR|fS dfS )z8Extract token usage from response.generations structure.r   r   N)_get_token_usager   )
r   Ztotal_inputZtotal_outputZtotal_totalZgen_listgenr   r   r   r   r0   r0   r1    _extract_tokens_from_generations  s&   
r   c                 C   s   d}t | d}|dur|D ]}t ||}|dur|  S qt | d}|dur8|D ]}t ||}|dur7|  S q(|D ]}t | |}|durI|  S q:dS )zM
    Check multiple paths to extract token usage from different objects.
    )usager   Zusage_metadatare   N
llm_outputr   )objZpossible_namesre   rs   r   r   r0   r0   r1   r   ,  s*   




r   c                 C   sv   t |}|rt|\}}}nt|j\}}}|d ur!| tj| |d ur,| tj| |d ur9| tj| d S d S rA   )	r   r   r   r   r   r   ZGEN_AI_USAGE_INPUT_TOKENSZGEN_AI_USAGE_OUTPUT_TOKENSZGEN_AI_USAGE_TOTAL_TOKENS)rN   r   r   r   r   r   r0   r0   r1   r   I  s   
r   c                 C   s   t | dd}t |dd}t |di }t | ddp't |ddp'|dp'|d}|r2t|dkr2|nd}z"d}t|dkrD|d d	}|du rR|d	}W ||fS W ||fS  tyb   Y ||fS w )
z?
    Get the agent name and available tools for the agent.
    agentNrunnableconfigr{   Zavailable_toolsr      run_name)r   r*   rU   	Exception)r   r   ri   r   r   Zrunnable_configr{   r.   r0   r0   r1   _get_request_data]  s0   
r   c              	   C   s  | sdS t | ttfsdS g }| D ]}zt |trtd|v r=t |d tr=|d }|d|dd}|d r<|| n~d|v rR|d|dd}|| ni|dp`|dp`|d}|rs|||dpo|dd nGt|drt|ddt|ddpt|ddd}|d r|| n%t|d	r||jt|d
dd nt	|}|r|dkr||dd W q t
y   Y qw |r|S dS )z/Parse and simplify tools into a cleaner format.Nfunctionrs   r   )rs   r   r   Zfunction_nameZdescrG   r   rr   )
isinstancelisttupledictr*   r,   hasattrr   rG   strr   )r{   simplified_toolsZtoolfuncZsimplified_toolrs   Ztool_strr0   r0   r1   _simplify_langchain_toolsy  sp   









r   c                 C   s2   |durt |}|rt| tj|dd dS dS dS )z9Set available tools data on a span if tools are provided.NFry   )r   r   r   ZGEN_AI_REQUEST_AVAILABLE_TOOLS)rN   r{   r   r0   r0   r1   r     s   
r   c                    s   t  	 	 d fdd	}|S )Nc           	         s>  t  t}|d u r | ||g|R i |S |pg }t|tr%|j}n$t|tr.|g}nt|tr6|}nt	
d|  | ||g|R i |S t|trR|j}n
t|trZ|}ng }tdd t||D st|j|j}t|tr| }g |j||_nt|tr||g}ng ||} | ||g|R i |S )NzUnknown callback type: %sc                 s   s    | ]}t |tV  qd S rA   )r   rQ   )r~   cbr0   r0   r1   	<genexpr>  s
    
z9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>)r[   
get_clientget_integrationr7   r   r!   handlersr    r   r   debugany	itertoolschainrQ   r;   r:   r+   )	Zcallback_manager_clsZinheritable_callbacksZlocal_callbacksr   ri   integrationZcallbacks_listZinheritable_callbacks_listZsentry_handlerfr0   r1   new_configure  sv   




	




z&_wrap_configure.<locals>.new_configure)NNr   )r   r   r0   r   r1   rB     s
   MrB   c                       t   fdd}|S )Nc                    st  t  t}|d u r | g|R i |S t| ||\}}t }|tj|r+d| ndtjd}t	| zu|r@|
tj| |
tjd |
tjd t||  | g|R i |}|d}	|	d urt r|jrt|	g}
t  }t|
||}|d urt|tj|dd |d}|d urt r|jrt|tj| |W t  W  d    S t  w 1 sw   Y  d S )Ninvoke_agent invoke_agentrt   Finputry   r   )r[   r   r   r7   r   r	   r   GEN_AI_INVOKE_AGENTrK   r2   r   r   r   r   GEN_AI_RESPONSE_STREAMINGr   r*   r   r:   r   r   r
   r   r   r   r4   )r?   r   ri   r   r.   r{   start_span_functionrN   resultr   r   r\   r   r   r   r0   r1   
new_invoke   sb   



0z/_wrap_agent_executor_invoke.<locals>.new_invoker   )r   r   r0   r   r1   rC     s   ;rC   c                    r   )Nc                    sr  t  t  d u r| g|R i |S t| ||\}}t }|tj|r+d| ndtjd	  t
| |rBtj| tjd tjd t| t|dkrb|d dnd }|d urt r jrt|g}t  }t||}	|	d urttj|	dd	 | g|R i |}
|
 fd
d} fdd}tt|
dkr| }
|
S | }
|
S )Nr   r   rt   Tr   r   r   Fry   c                  3   s    d} zJz.D ]}|V  qz| d}W n ty   d }Y nw |d ur1t r1 jr1ttj| W n tyB   t } t	  w W t
  j|   d S t
  j|   w Nr   r   r*   r   r   r:   r   r   r   sysexc_infor   r4   r]   r   eventr   r   Zold_iteratorrN   r0   r1   new_iterator  s6   zE_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iteratorc                    s   d} zOz32 z	3 d H W }|V  q6 z| d}W n ty$   d }Y nw |d ur6t r6 jr6ttj| W n tyG   t } t	  w W t
  j|   d S t
  j|   w r   r   r   r   r0   r1   new_iterator_async  s8   zK_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator_asyncz<class 'async_generator'>)r[   r   r   r7   r   r	   r   r   rK   rh   r2   r   r   r   r   r   r   rU   r*   r   r:   r   r   r
   r   r   r   rc   )r?   r   ri   r.   r{   r   r   r   r\   r   r   r   r   r   r   r1   
new_streamb  sX   

z/_wrap_agent_executor_stream.<locals>.new_streamr   )r   r   r0   r   r1   rD   _  s   orD   )Vcontextvarsr   r<   collectionsr   	functoolsr   r   r[   Zsentry_sdk.ai.monitoringr   Zsentry_sdk.ai.utilsr   r   r   r	   r
   Zsentry_sdk.constsr   r   Zsentry_sdk.integrationsr   r   Zsentry_sdk.scoper   Zsentry_sdk.tracing_utilsr   r   Zsentry_sdk.utilsr   r   typingr   r   r   r   r   r   r   r   r   uuidr   Zsentry_sdk.tracingr   Zlangchain_core.agentsr   Zlangchain_core.callbacksr    r!   r"   r#   Zlangchain_core.messagesr$   Zlangchain_core.outputsr%   ImportErrorZlangchain_classic.agentsr&   Zlangchain.agentsZ GEN_AI_REQUEST_FREQUENCY_PENALTYr   ZGEN_AI_REQUEST_MAX_TOKENSZGEN_AI_REQUEST_PRESENCE_PENALTYZGEN_AI_REQUEST_TEMPERATUREZGEN_AI_REQUEST_TOP_KZGEN_AI_REQUEST_TOP_Pr   
ContextVarr)   r2   r4   r6   r7   rM   rQ   r   r   r   r   r   r   r   rB   rC   rD   r0   r0   r0   r1   <module>   s    (
		
  kBTB