
    Dj/%                        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 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)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     eC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\sentry_sdk/integrations/anthropic.py__init__zAnthropicIntegration.__init__    s
    .    c                      t        d      } | t        d      | dk  rt        d      t        t        j                        t        _        t        t        j                        t        _        y )Nr   zUnparsable anthropic version.)r      z!anthropic 0.16 or newer required.)r   r	   _wrap_message_creater   create_wrap_message_create_asyncr   )versions    r   
setup_oncezAnthropicIntegration.setup_once$   sV     "+.?>??WBCC.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:   3   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   =   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   L   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(  r<t        | 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   content_block_stopmessage_deltaN)
r   r?   r/   messager<   r=   r>   deltarI   rG   )r9   r=   r>   content_blocksr<   s        r   _collect_ai_datarW   ]   s    
 
%	& ;5&!zz_,++ 2 22!4!4444445;;/"))%++*:*:;33.!:!::;  66!; ;s   C$C<<D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>   rV   complete_messagerD   s          r   _add_ai_data_to_spanr`   u   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        || ||      \  } }}|j                  dk7  s%| * t        | ||       j                  d d d        y wNr   message_stoprW   r/   r`   __exit__r=   r>   rV   r9   r^   old_iteratorrC   s       r   new_iteratorz3_sentry_patched_create_common.<locals>.new_iterator   sz       !!#) $EBR|]NC?L- zz^3#$ %+|]N dD$/s
   -A)Ac                    K   d} d}g }2 3 d {   }t        || ||      \  } }}|j                  dk7  s+| 17 ,6 t        | ||       j                  d d d        y wrh   rj   rl   s       r   new_iterator_asyncz9_sentry_patched_create_common.<locals>.new_iterator_async   s       !!##/ $ $%BR|]NC?L- zz^3#$< %+|]N dD$/s$   	A#?=?"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   rf   strr/   )fargskwargsrB   rb   re   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+y<,| M]  "$!&!!" <,| 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
   sentry_sdk.scoper   sentry_sdk.utilsr   r   r   anthropic.resourcesr   r   anthropic.typesr   ImportErrorr   r   r   sentry_sdk.tracingr   r   r:   rE   rM   rW   r`   r   r"   r$   r-   r   r   <module>r      s        7 * = 4 2;6 33'P; P./H"703&Yx'B(c  2
0
112s   A> >B