o
    0 i8                     @   s  d dl mZ d dlmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZmZmZmZ z:zd dlmZ W n eyb   dZY nw zd dlm Z  W n eyv   dZ Y nw d dl!m"Z"m#Z# erd dl$m%Z% W n ey   edw erd dlm&Z&m'Z'm(Z( d dl)m*Z* G dd deZ+dd Z,dd Z-dd Z.dd Z/	d'ddZ0dd  Z1d!d" Z2d#d$ Z3d%d& Z4dS )(    wraps)TYPE_CHECKINGN)record_token_usage)set_data_normalizednormalize_message_rolestruncate_and_annotate_messagesget_start_span_function)OPSPANDATA
SPANSTATUS)_check_minimum_versionDidNotEnableIntegration)should_send_default_pii)set_span_errored)capture_internal_exceptionsevent_from_exceptionpackage_versionsafe_serialize)NotGiven)Omit)AsyncMessagesMessages)MessageStreamEventzAnthropic not installed)AnyAsyncIteratorIterator)Spanc                   @   s0   e Zd ZdZde Zd	ddZedd ZdS )
AnthropicIntegration	anthropiczauto.ai.Tc                 C   s
   || _ d S N)include_prompts)selfr"    r$   m/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/integrations/anthropic.py__init__2   s   
zAnthropicIntegration.__init__c                  C   s.   t d} tt|  ttjt_ttjt_d S )Nr    )r   r   r   _wrap_message_creater   create_wrap_message_create_asyncr   )versionr$   r$   r%   
setup_once6   s   
zAnthropicIntegration.setup_onceN)T)__name__
__module____qualname__
identifieroriginr&   staticmethodr+   r$   r$   r$   r%   r   .   s    

r   c                 C   s6   t   t| t jdddd\}}tj||d d S )Nr    F)typeZhandled)Zclient_optionsZ	mechanism)hint)r   r   
sentry_sdk
get_clientoptionsZcapture_event)exceventr3   r$   r$   r%   _capture_exception@   s   
r9   c                 C   sX   d}d}t | dr(| j}t |drt|jtr|j}t |dr(t|jtr(|j}||fS )z6
    Get token usage from the Anthropic response.
    r   usageinput_tokensoutput_tokens)hasattrr:   
isinstancer;   intr<   )resultr;   r<   r:   r$   r$   r%   _get_token_usageL   s   
rA   c                 C   s   t  _ t| dr[| jdkr#| jj}||j7 }||j7 }| jjp!|}n8| jdkr)n2| jdkrJt| jdr<|	| jj
 nt| jdrI|	| jj n| jdkrPn| jdkr[|| jj7 }W d	   n1 sew   Y  ||||fS )
zl
    Collect model information, token usage, and collect content blocks from the AI streaming response.
    r2   message_startZcontent_block_startZcontent_block_deltatextpartial_jsonZcontent_block_stopZmessage_deltaN)r   r=   r2   messager:   r;   r<   modeldeltaappendrC   rD   )r8   rF   r;   r<   content_blocksr:   r$   r$   r%   _collect_ai_data]   s,   







rJ   c              	   C   s  | d}|durpt|dkrpt rp|jrpg }|D ];}| ddkrOd|v rOt|d ttfrO|d D ]}| ddkrM|d	| d
| ddd q3q|| qt|}t	
 }t|| |}	|	durpt| tj|	dd t| tj| dd tjtjtjtjtjd}
|
 D ]\}}| |}|durt|rt| || q| d}|durt|rt|dkrt| tjt| dS dS dS dS )zq
    Set input data for the span based on the provided keyword arguments for the anthropic message creation.
    messagesNr   roleusercontentr2   Ztool_resulttooltool_use_id)rP   output)rL   rN   Funpackstream)Z
max_tokensrF   ZtemperatureZtop_kZtop_ptools)getlenr   r"   r>   listtuplerH   r   r4   Zget_current_scoper   r   r   ZGEN_AI_REQUEST_MESSAGESZGEN_AI_RESPONSE_STREAMINGZGEN_AI_REQUEST_MAX_TOKENSZGEN_AI_REQUEST_MODELZGEN_AI_REQUEST_TEMPERATUREZGEN_AI_REQUEST_TOP_KZGEN_AI_REQUEST_TOP_Pitems	_is_givenZGEN_AI_REQUEST_AVAILABLE_TOOLSr   )spankwargsintegrationrK   Znormalized_messagesrE   itemZrole_normalized_messagesscopeZmessages_dataZkwargs_keys_to_attributeskey	attributevaluerU   r$   r$   r%   _set_input_datax   sl   



rd   Fc           	      C   s   |  tj| t rX|jrXg g d}|D ]}|d dkr&|d |d  q|d dkr3|d | qt|d dkrGt| tj|d dd	 t|d dkrXt| tj	|d  t
| ||d
 |rj| ddd dS dS )z;
    Set output data for the span based on the AI response.)responserO   r2   rC   re   Ztool_userO   r   FrR   )r;   r<   N)set_datar   ZGEN_AI_RESPONSE_MODELr   r"   rH   rW   r   ZGEN_AI_RESPONSE_TOOL_CALLSZGEN_AI_RESPONSE_TEXTr   __exit__)	r\   r^   rF   r;   r<   rI   finish_spanZoutput_messagesrQ   r$   r$   r%   _set_output_data   s<   ri   c              
   /   s   | d  d u r| |i |S d|vr| |i |S zt|d  W n ty4   | |i | Y S w |dd}t tjd|  tj	d
  t|  | ||fV }t  t|drt|\}}g }|jD ]*}t|dr}||  qnt|d	r||  qnt|d
r|d
|jd qnt t|dd |||dd n@t|dr|j fdd}	 fdd}
tt|jdkr|
 |_n*|	 |_ndd d d d  W d    |S W d    |S W d    |S W d    |S 1 sw   Y  |S )Nr^   rK   rF    zchat )opnamer0   rN   to_dict
model_dumprC   )r2   rC   Tr\   r^   rF   r;   r<   rI   rh   	_iteratorc               	   3   sb    d } d}d}g }D ]}t || |||\} }}}|V  qt | ||d|ddgdd d S Nr   rj   rC   )rC   r2   Tro   rJ   ri   joinrF   r;   r<   rI   r8   r^   Zold_iteratorr\   r$   r%   new_iterator"  s(   


z3_sentry_patched_create_common.<locals>.new_iteratorc               	     sl   d } d}d}g }2 z3 d H W }t || |||\} }}}|V  q6 t | ||d|ddgdd d S rq   rr   rt   ru   r$   r%   new_iterator_async;  s*   


z9_sentry_patched_create_common.<locals>.new_iterator_asyncz<class 'async_generator'>Zunknown_response)popiter	TypeErrorrV   r	   r
   ZGEN_AI_CHATstripr   r0   	__enter__rd   r   r=   rA   rN   rH   rm   rn   rC   ri   getattrrp   strr2   rf   rg   )fargsr]   rF   r@   r;   r<   rI   Zcontent_blockrv   rw   r$   ru   r%   _sentry_patched_create_common   s~   










V
V
V
VVr   c                    "   dd  t  fdd}|S )Nc              
   _   s   t | g|R i |}z	t|\} }}W n ty) } z	|jW  Y d }~S d }~ww z#z	| |i |}W n tyG } zt| |d d }~ww ||W S  tyb } z	|jW  Y d }~S d }~ww r!   r   nextStopIterationrc   	Exceptionr9   sendr   r   r]   gener@   r7   r$   r$   r%   _execute_syncb  s(   z+_wrap_message_create.<locals>._execute_syncc                     s   t  t}||d< z6 g| R i |W t  }|d ur@|jtjkrAt  |	d d d  W d    S 1 s:w   Y  S S S t  }|d urj|jtjkrjt  |	d d d  W d    w 1 sew   Y  w Nr^   
r4   r5   Zget_integrationr   Zget_current_spanstatusr   ERRORr   rg   r   r]   r^   r\   r   r   r$   r%   _sentry_patched_create_syncv  s   z9_wrap_message_create.<locals>._sentry_patched_create_syncr   )r   r   r$   r   r%   r'   `     r'   c                    r   )Nc              
      s   t | g|R i |}z	t|\} }}W n ty- } z|jI d H W  Y d }~S d }~ww z&z| |i |I d H }W n tyN } zt| |d d }~ww ||W S  tyi } z	|jW  Y d }~S d }~ww r!   r   r   r$   r$   r%   _execute_async  s*   z2_wrap_message_create_async.<locals>._execute_asyncc                     s   t  t}||d< z9 g| R i |I d H W t  }|d urD|jtjkrEt  |	d d d  W d    S 1 s>w   Y  S S S t  }|d urn|jtjkrnt  |	d d d  W d    w 1 siw   Y  w r   r   r   r   r   r$   r%   _sentry_patched_create_async  s    z@_wrap_message_create_async.<locals>._sentry_patched_create_asyncr   )r   r   r$   r   r%   r)     r   r)   c                 C   s0   t durt| t rdS tdurt| trdS dS )zI
    Check for givenness safely across different anthropic versions.
    NFT)r   r>   r   )objr$   r$   r%   r[     s
   r[   )F)5	functoolsr   typingr   r4   Zsentry_sdk.ai.monitoringr   Zsentry_sdk.ai.utilsr   r   r   r	   Zsentry_sdk.constsr
   r   r   Zsentry_sdk.integrationsr   r   r   Zsentry_sdk.scoper   Zsentry_sdk.tracing_utilsr   Zsentry_sdk.utilsr   r   r   r   r    r   ImportErrorr   Zanthropic.resourcesr   r   Zanthropic.typesr   r   r   r   Zsentry_sdk.tracingr   r   r9   rA   rJ   rd   ri   r   r'   r)   r[   r$   r$   r$   r%   <module>   sT    K
0t''