o
    BDi$                     @   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	 d dl
mZmZmZ d dlmZ d dlmZmZmZ zd d	lmZmZ erId d
lmZ W n eyU   edw erhd 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 Z$dd Z%dd Z&dd Z'dS )     wraps)TYPE_CHECKINGN)record_token_usage)OPSPANDATA)_check_minimum_versionDidNotEnableIntegration)should_send_default_pii)capture_internal_exceptionsevent_from_exceptionpackage_version)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   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/sentry_sdk/integrations/anthropic.py__init__    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_once$   s   
zAnthropicIntegration.setup_onceN)T)__name__
__module____qualname__
identifieroriginr   staticmethodr"   r   r   r   r   r      s    

r   c                 C   s0   t | t jdddd\}}tj||d d S )Nr   F)typehandled)client_options	mechanism)hint)r   
sentry_sdk
get_clientoptionscapture_event)exceventr-   r   r   r   _capture_exception.   s   
r4   c                 C   sj   d}d}t | dr(| j}t |drt|jtr|j}t |dr(t|jtr(|j}|| }t|||| d S )Nr   usageinput_tokensoutput_tokens)hasattrr5   
isinstancer6   intr7   r   )resultspanr6   r7   r5   total_tokensr   r   r   _calculate_token_usage8   s   
r>   c                 C   s0   g }| D ]}t |dr||j|jd q|S )z,
    Get JSON of a Anthropic responses.
    textr)   r?   )r8   appendr)   r?   )content	responsesitemr   r   r   _get_responsesG   s   
rE   c                 C   s   t  Y t| drU| jdkr| jj}||j7 }||j7 }n8| jdkr#n2| jdkrDt| jdr6|| jj	 nt| jdrC|| jj
 n| jdkrJn| jdkrU|| jj7 }W d	   n1 s_w   Y  |||fS )
zV
    Count token usage and collect content blocks from the AI streaming response.
    r)   message_startcontent_block_startcontent_block_deltar?   partial_jsoncontent_block_stopmessage_deltaN)r   r8   r)   messager5   r6   r7   deltarA   r?   rI   )r3   r6   r7   content_blocksr5   r   r   r   _collect_ai_dataX   s*   







rO   c                 C   s|   t  1 t r|jrd|}| tjd|dg || }t| ||| | tjd W d   dS 1 s7w   Y  dS )zX
    Add token usage and content blocks from the AI streaming response to the span.
     r?   r@   TN)	r   r   r   joinset_datar   AI_RESPONSESr   AI_STREAMING)r<   integrationr6   r7   rN   complete_messager=   r   r   r   _add_ai_data_to_spanr   s   

"rW   c                 /   s   | d  d u r| |i |S d|vr| |i |S zt|d  W n ty4   | |i | Y S w tjtjdtjd	  | ||fV }t
|d }|d}t  tj| tjd t rs jrstj| t|drt r jrtjt|j t| 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 sw   Y  |S )NrU   messageszAnthropic messages create)opdescriptionr'   modelFrB   	_iteratorc                  3   sT    d} d}g }D ]}t || ||\} }}|V  q	t | || d d d  d S Nr   rO   rW   __exit__r6   r7   rN   r3   rU   old_iteratorr<   r   r   new_iterator   s   

z3_sentry_patched_create_common.<locals>.new_iteratorc                    s^   d} d}g }2 z3 d H W }t || ||\} }}|V  q	6 t | || d d d  d S r]   r^   r`   ra   r   r   new_iterator_async   s   

z9_sentry_patched_create_common.<locals>.new_iterator_asyncz<class 'async_generator'>unknown_responseT)popiter	TypeErrorr.   
start_spanr   ANTHROPIC_MESSAGES_CREATEr   r'   	__enter__listgetr   rR   r   AI_MODEL_IDrT   r   r   AI_INPUT_MESSAGESr8   rS   rE   rB   r>   r_   r\   strr)   )fargskwargsr;   rX   r[   rc   rd   r   ra   r   _sentry_patched_create_common   sh   







<
<
<
<<rt   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   rt   nextStopIterationvalue	Exceptionr4   sendrq   rr   rs   gener;   r2   r   r   r   _execute_sync   s(   z+_wrap_message_create.<locals>._execute_syncc                     s,   t  t}||d<  g| R i |S NrU   r.   r/   get_integrationr   rr   rs   rU   r   rq   r   r   _sentry_patched_create_sync   s   z9_wrap_message_create.<locals>._sentry_patched_create_syncr   )rq   r   r   r   r   r         r   c                    ru   )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   rv   r|   r   r   r   _execute_async  s*   z2_wrap_message_create_async.<locals>._execute_asyncc                     s4   t  t}||d<  g| R i |I d H S r   r   r   r   rq   r   r   _sentry_patched_create_async  s   z@_wrap_message_create_async.<locals>._sentry_patched_create_asyncr   )rq   r   r   r   r   r       r   r    )(	functoolsr   typingr   r.   sentry_sdk.ai.monitoringr   sentry_sdk.constsr   r   sentry_sdk.integrationsr   r	   r
   sentry_sdk.scoper   sentry_sdk.utilsr   r   r   anthropic.resourcesr   r   anthropic.typesr   ImportErrorr   r   r   sentry_sdk.tracingr   r   r4   r>   rE   rO   rW   rt   r   r    r   r   r   r   <module>   s8    
Z!