
    Uvh$                     "   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 	 d d	lmZmZ erd d
lmZ erd dlmZmZmZ d dlmZ  G d de      Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'y# e$ r	  ed      w xY w)    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                   2    e Zd ZdZde ZddZed        Zy)AnthropicIntegration	anthropiczauto.ai.c                     || _         y N)include_prompts)selfr   s     \/opt/face_recognition/venv/lib/python3.12/site-packages/sentry_sdk/integrations/anthropic.py__init__zAnthropicIntegration.__init__    s
    .    c                      t        d      } t        t        |        t        t        j
                        t        _        t        t        j
                        t        _        y )Nr   )r   r	   r   _wrap_message_creater   create_wrap_message_create_asyncr   )versions    r   
setup_oncezAnthropicIntegration.setup_once$   s<     "+.3W=.x?9-:N:NOr    N)T)__name__
__module____qualname__
identifieroriginr   staticmethodr&    r    r   r   r      s.    J
|$F/ P Pr    r   c                     t        | t        j                         j                  ddd      \  }}t        j                  ||       y )Nr   F)typehandled)client_options	mechanism)hint)r   
sentry_sdk
get_clientoptionscapture_event)exceventr3   s      r   _capture_exceptionr:   .   s?    &!,,.66&59KE4
 U.r    c                 *   d}d}t        | d      rp| j                  }t        |d      r&t        |j                  t              r|j                  }t        |d      r&t        |j
                  t              r|j
                  }||z   }t        ||||       y )Nr   usageinput_tokensoutput_tokens)hasattrr<   
isinstancer=   intr>   r   )resultspanr=   r>   r<   total_tokenss         r   _calculate_token_usagerE   8   s    LMvw5.)j9K9KS.Q --L5/*z%:M:Ms/S!//M-/Lt\=,Gr    c                     g }| D ]7  }t        |d      s|j                  |j                  |j                  d       9 |S )z,
    Get JSON of a Anthropic responses.
    textr/   rG   )r?   appendr/   rG   )content	responsesitems      r   _get_responsesrM   G   sK    
 I 4  II II r    c                    t               5  t        | d      r| j                  dk(  r5| j                  j                  }||j
                  z  }||j                  z  }n| j                  dk(  rn| j                  dk(  rxt        | j                  d      r&|j                  | j                  j                         ntt        | j                  d      r^|j                  | j                  j                         n8| j                  dk(  rn(| j                  dk(  r|| j                  j                  z  }d	d	d	       |||fS # 1 sw Y   xY w)
zV
    Count token usage and collect content blocks from the AI streaming response.
    r/   message_startcontent_block_startcontent_block_deltarG   partial_jsoncontent_block_stopmessage_deltaN)r   r?   r/   messager<   r=   r>   deltarI   rG   rR   )r9   r=   r>   content_blocksr<   s        r   _collect_ai_datarX   X   s   
 
%	& ;5&!zz_,++ 2 22!4!4444445;;/"))%++*:*:;U[[.9"))%++*B*BC33.!:!::!;$ 66%; ;s   D!D99Ec                 >   t               5  t               rA|j                  r5dj                  |      }| j	                  t
        j                  d|dg       ||z   }t        | |||       | j	                  t
        j                  d       ddd       y# 1 sw Y   yxY w)zX
    Add token usage and content blocks from the AI streaming response to the span.
     rG   rH   TN)	r   r   r   joinset_datar   AI_RESPONSESr   AI_STREAMING)rC   integrationr=   r>   rW   complete_messagerD   s          r   _add_ai_data_to_spanra   r   s     
%	& 	3"$)D)D!ww~6MM%% *:;< $m34}lKh++T2	3 	3 	3s   A?BBc              /     	
K   |j                  d       | |i |S d|vr | |i |S 	 t        |d          t        j                  t
        j                  dt        j                        

j                          | ||f}t        |d         }|j                  d      }t               5  
j                  t        j                  |       
j                  t        j                   d       t#               r,j$                  r 
j                  t        j&                  |       t)        |d      rit#               r?j$                  r3
j                  t        j*                  t-        |j.                               t1        |
       
j3                  d d d        nt)        |d      rU|j4                  		
fd	}	
fd
}t7        t9        |j4                              dk(  r |       |_        n2 |       |_        n%
j                  dd       
j3                  d d d        d d d        |S # t        $ r  | |i |cY S w xY w# 1 sw Y   |S xY ww)Nr_   messageszAnthropic messages create)opdescriptionr+   modelFrJ   	_iteratorc               3      K   d} d}g }D ]  }t        || ||      \  } }}|  t        | ||       j                  d d d        y wNr   rX   ra   __exit__r=   r>   rW   r9   r_   old_iteratorrC   s       r   new_iteratorz3_sentry_patched_create_common.<locals>.new_iterator   sn       !!#)  EBR|]NC?L-  K	  %+|]N dD$/s   AA
c                    K   d} d}g }2 3 d {   }t        || ||      \  } }}| !7 6 t        | ||       j                  d d d        y wri   rj   rl   s       r   new_iterator_asyncz9_sentry_patched_create_common.<locals>.new_iterator_async   sv       !!##/    %BR|]NC?L-  K	 < %+|]N dD$/s   	A/-/A/$Az<class 'async_generator'>unknown_responseT)popiter	TypeErrorr4   
start_spanr   ANTHROPIC_MESSAGES_CREATEr   r+   	__enter__listgetr   r\   r   AI_MODEL_IDr^   r   r   AI_INPUT_MESSAGESr?   r]   rM   rJ   rE   rk   rg   strr/   )fargskwargsrB   rc   rf   rn   rp   r_   rm   rC   s           @@@r   _sentry_patched_create_commonr      s    **]+K$!&!!$!&!!"VJ    ''/#**D
 	NNdF?"F F:&'HJJwE	$	& :,h**E2h++U3"$)D)DMM(44h?69%&([-H-Hh33^FNN5ST"640MM$d+ V[)!++L0"0" 4(()*.II#5#7 #/>  MM,d3MM$d+u:,x MY  "$!&!!" :,x MsA   (IH, A4I0E2I"
I,I =I?I  IIIc                 8     d t                fd       }|S )Nc                 <   t        | g|i |}	 t        |      \  } }}	 	  | |i |}|j                  |      S # t        $ r}|j                  cY d }~S d }~ww xY w# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wr   r   nextStopIterationvalue	Exceptionr:   sendr}   r~   r   generB   r8   s          r   _execute_syncz+_wrap_message_create.<locals>._execute_sync   s    +A???	"3iOAtV		$D+F+
 88F##  	77N	  $"3't#$
  	77N	sU   ; A A< 	AAAA	A9&A44A99A< <	BBBBc                  t    t        j                         j                  t              }||d<    g| i |S Nr_   r4   r5   get_integrationr   )r~   r   r_   r   r}   s      r   _sentry_patched_create_syncz9_wrap_message_create.<locals>._sentry_patched_create_sync   s>     !++-==>RS +}Q0000r    r   )r}   r   r   s   ` @r   r"   r"      s(    ( 1X1 1 '&r    c                 8     d t                fd       }|S )Nc                 j  K   t        | g|i |}	 t        |      \  } }}	 	  | |i | d {   }|j                  |      S # t        $ r}|j                   d {  7  cY d }~S d }~ww xY w7 @# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wwr   r   r   s          r   _execute_asyncz2_wrap_message_create_async.<locals>._execute_async  s     +A???	!"3iOAtV		$ $1&11
 88F##  	!== 	!
 2 $"3't#$
  	77N	s   B3A A2 A0A2 B B3	A-A(A A("A-#B3(A--B30A2 2	B;B		BB 	B0B+%B0&B3+B00B3c                     K   t        j                         j                  t              }||d<    g| i | d {   S 7 wr   r   )r~   r   r_   r   r}   s      r   _sentry_patched_create_asyncz@_wrap_message_create_async.<locals>._sentry_patched_create_async  sH      !++-==>RS +}#A777777s   <AA Ar   )r}   r   r   s   ` @r   r$   r$      s(    ( 1X8 8 ('r    )(	functoolsr   typingr   r4   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   r:   rE   rM   rX   ra   r   r"   r$   r-   r    r   <module>r      s        7 * U U 4 2;6 33'P; P$/H"743&Wt'B(Y  2
0
112s   B   B