o
    iR                     @   s  d dl Z d dlZd dlmZ 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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"m#Z# z<zd dl$m%Z% W n e&yv   dZ%Y nw zd dl$m'Z' W n e&y   dZ'Y nw d dl(m)Z)m*Z* erd dl+m,Z,m-Z- W n e&y   edw erd dlm.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 G dd dZ8G dd deZ9dPddZ:dQd d!Z;	"	#	$	%	&		'	(		)dRd*d+Z<	,	-		-dSd.d/Z=	0	1		2dTd3d4Z>	5	6	7	-	8			dUd9d:Z?	;dVd5d6d8dd$d%d<d=d>d=d?d=d@d=d'dAdBe@ddfdCdDZAdWdGdHZBdXdIdJZCdXdKdLZDdMdde@fdNdOZEdS )Y    N)Iterablewraps)TYPE_CHECKING)record_token_usage)GEN_AI_ALLOWED_MESSAGE_ROLESset_data_normalizednormalize_message_rolestruncate_and_annotate_messagesget_start_span_function transform_anthropic_content_part)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reraise)NotGiven)Omit)AsyncMessagesMessages)MessageStreamEventTextBlockParamzAnthropic not installed)AnyAsyncIteratorIteratorListOptionalUnion)Span)TextPartc                   @   s>   e Zd ZU dZeed< dZeed< dZded< dZded< dS )_RecordedUsager   output_tokensinput_tokenszOptional[int]cache_write_input_tokenscache_read_input_tokensN)	__name__
__module____qualname__r)   int__annotations__r*   r+   r,    r2   r2   ^/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/sentry_sdk/integrations/anthropic.pyr(   5   s
   
 r(   c                   @   s@   e Zd ZdZde Zddd deddfdd	Zedd
dZdS )AnthropicIntegration	anthropiczauto.ai.Tselfinclude_promptsreturnNc                 C   s
   || _ d S N)r7   )r6   r7   r2   r2   r3   __init__@   s   
zAnthropicIntegration.__init__c                  C   s.   t d} tt|  ttjt_ttjt_d S )Nr5   )r   r   r4   _wrap_message_creater   create_wrap_message_create_asyncr   )versionr2   r2   r3   
setup_onceC   s   
zAnthropicIntegration.setup_once)T)r8   N)	r-   r.   r/   
identifieroriginboolr:   staticmethodr?   r2   r2   r2   r3   r4   <   s    
r4   excr    r8   c                 C   s6   t   t| t jdddd\}}tj||d d S )Nr5   F)typehandled)client_options	mechanism)hint)r   r   
sentry_sdk
get_clientoptionscapture_event)rD   eventrI   r2   r2   r3   _capture_exceptionL   s   
rO   resultr   tuple[int, int, int, int]c                 C   s   d}d}d}d}t | drH| j}t |drt|jtr|j}t |dr,t|jtr,|j}t |dr:t|jtr:|j}t |drHt|jtrH|j}||||fS )z
    Get token usage from the Anthropic response.
    Returns: (input_tokens, output_tokens, cache_read_input_tokens, cache_write_input_tokens)
    r   usager*   r)   r,   cache_creation_input_tokens)hasattrrR   
isinstancer*   r0   r)   r,   rS   )rP   r*   r)   r,   r+   rR   r2   r2   r3   _get_token_usageW   s.   
rV   rN   r   model
str | NonerR   content_blocks	list[str],tuple[str | None, _RecordedUsage, list[str]]c                 C   sv  t   t| dr| jdkrn'| jdkr0t| jdr"|| jj nt| jdr/|| jj n| jdkr6	 | jdkrg| jjp@|}| jj	}|j
|_
|j|_t|dd	|_t|d
d	|_|||fW  d	   S | jdkr| j	j
|_
t| j	dd	}|d	ur||_t| j	dd	}|d	ur||_t| j	d
d	}|d	ur||_|||fW  d	   S W d	   n1 sw   Y  |||fS )zl
    Collect model information, token usage, and collect content blocks from the AI streaming response.
    rE   content_block_startcontent_block_deltatextpartial_jsoncontent_block_stopmessage_startrS   Nr,   message_deltar*   )r   rT   rE   deltaappendr^   r_   messagerW   rR   r)   r*   getattrr+   r,   )rN   rW   rR   rY   incoming_usager*   rS   r,   r2   r2   r3   _collect_ai_dataw   sl   	





#
 ?rh   content_blockdict[str, Any]c                 C   sZ   |  ddkr!|  d}t|tr!| ddkr!d| dddS t| }|dur+|S | S )	z
    Transform an Anthropic content block using the Anthropic-specific transformer,
    with special handling for Anthropic's text-type documents.
    rE   documentsourcer^   data rE   r^   N)getrU   dictr   )ri   rl   rP   r2   r2   r3   "_transform_anthropic_content_block   s   

rr   system_instructions$Union[str, Iterable[TextBlockParam]]list[TextPart]c                 C   s$   t | trd| dgS dd | D S )Nr^   rE   contentc                 S   s,   g | ]}t |trd |v rd |d  dqS )r^   rv   )rU   rq   ).0instructionr2   r2   r3   
<listcomp>   s    z2_transform_system_instructions.<locals>.<listcomp>)rU   str)rs   r2   r2   r3   _transform_system_instructions   s   
r|   spanr&   kwargsintegrationc                 C   s8  t | tjd |d}|d}|durt|dkrt r|jrt|ts+t|t	r7| 
tjtt| g }|D ]j}|dtjkrd|v rt|d ttfrg }|d D ]}t|trg|dd	krgqX|t|trrt|n| qX|r||d|d
 q;| }	d|	v r|	d }
t|
ttfrdd |
D |	d< ||	 q;t|}t }t|| |}|durt | 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rt#|rt|dkrt | 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.
    chatsystemmessagesNr   rolerw   rE   tool_result)r   rw   c                 S   s"   g | ]}t |trt|n|qS r2   )rU   rq   rr   )rx   itemr2   r2   r3   rz   )  s    
z#_set_input_data.<locals>.<listcomp>Funpackstream)
max_tokensrW   temperaturetop_ktop_ptools)&r   r   GEN_AI_OPERATION_NAMErp   lenr   r7   rU   r{   r   set_dataGEN_AI_SYSTEM_INSTRUCTIONSjsondumpsr|   r   USERlisttuplerq   rd   rr   copyr	   rJ   get_current_scoper
   GEN_AI_REQUEST_MESSAGESGEN_AI_RESPONSE_STREAMINGGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_MODELGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TOP_Pitems	_is_givenGEN_AI_REQUEST_AVAILABLE_TOOLSr   )r}   r~   r   rs   r   normalized_messagesre   transformed_contentr   transformed_messagerw   role_normalized_messagesscopemessages_datakwargs_keys_to_attributeskey	attributevaluer   r2   r2   r3   _set_input_data   s   






"r   Fr*   z
int | Noner)   r,   r+   z	list[Any]finish_spanc	                 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
 |rl| ddd dS dS )z;
    Set output data for the span based on the AI response.)responsetoolrE   r^   r   tool_user   r   Fr   )r*   r)   input_tokens_cachedinput_tokens_cache_writeN)r   r   GEN_AI_RESPONSE_MODELr   r7   rd   r   r   GEN_AI_RESPONSE_TOOL_CALLSGEN_AI_RESPONSE_TEXTr   __exit__)r}   r   rW   r*   r)   r,   r+   rY   r   output_messagesoutputr2   r2   r3   _set_output_dataT  s@   r   fargsc                 /   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|	|
  qpt|
d	r|	|
  qpt|
d
r|	d
|
jd qpt t|dd |||||	dd	 nBt|dr|jd fd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   r   rW   rn   zchat )opnamerA   rw   to_dict
model_dumpr^   ro   T	r}   r   rW   r*   r)   r,   r+   rY   r   	_iteratorr8   Iterator[MessageStreamEvent]c                  3   sh    d } t  }g }D ]}t|| ||\} }}|V  q
t | |j|j|j|jd|ddgdd	 d S Nrn   r^   )r^   rE   Tr   r(   rh   r   r*   r)   r,   r+   joinrW   rR   rY   rN   r   old_iteratorr}   r2   r3   new_iterator  s6   
z3_sentry_patched_create_common.<locals>.new_iterator!AsyncIterator[MessageStreamEvent]c                    sr   d } t  }g }2 z3 d H W }t|| ||\} }}|V  q
6 t | |j|j|j|jd|ddgdd	 d S r   r   r   r   r2   r3   new_iterator_async  s8   
z9_sentry_patched_create_common.<locals>.new_iterator_asyncz<class 'async_generator'>unknown_response)r8   r   )r8   r   )popiter	TypeErrorrp   r   r   GEN_AI_CHATstripr4   rA   	__enter__r   r   rT   rV   rw   rd   r   r   r^   r   rf   r   r{   rE   r   r   )r   r   r~   rW   rP   r*   r)   r,   r+   rY   ri   r   r   r2   r   r3   _sentry_patched_create_common  s   










g
g
g
ggr   c                    &   d
dd t d fdd	}|S )Nr   r    r   r~   r8   c                 _   s  t | g|R i |}z	t|\} }}W n ty) } z	|jW  Y d }~S d }~ww zAz	| |i |}W n1 tye } z%t }t  t| W d    n1 sRw   Y  t	|  W Y d }~nd }~ww |
|W S  ty } z	|jW  Y d }~S d }~ww r9   r   nextStopIterationr   	Exceptionsysexc_infor   rO   r   sendr   r   r~   generP   rD   r   r2   r2   r3   _execute_sync  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   
rJ   rK   get_integrationr4   get_current_spanstatusr   INTERNAL_ERRORr   r   r   r~   r   r}   r   r   r2   r3   _sentry_patched_create_sync!  s   z9_wrap_message_create.<locals>._sentry_patched_create_syncr   r    r   r    r~   r    r8   r    r   r    r~   r    r8   r    r   )r   r   r2   r   r3   r;        
r;   c                    r   )Nr   r    r   r~   r8   c                    s  t | g|R i |}z	t|\} }}W n ty- } z|jI d H W  Y d }~S d }~ww zDz| |i |I d H }W n1 tyl } z%t }t  t| W d    n1 sYw   Y  t	|  W Y d }~nd }~ww |
|W S  ty } z	|jW  Y d }~S d }~ww r9   r   r   r2   r2   r3   _execute_async2  s0   
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   r2   r3   _sentry_patched_create_asyncG  s    z@_wrap_message_create_async.<locals>._sentry_patched_create_asyncr   r   r   )r   r   r2   r   r3   r=   1  r   r=   objc                 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   rU   r   )r   r2   r2   r3   r   W  s
   r   )rD   r    r8   N)rP   r   r8   rQ   )
rN   r   rW   rX   rR   r(   rY   rZ   r8   r[   )ri   rj   r8   rj   )rs   rt   r8   ru   )r}   r&   r~   rj   r   r4   r8   N)Fr   )r   r    r8   r    )Fr   r   collections.abcr   	functoolsr   typingr   rJ   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   r   r	   r
   r   r   sentry_sdk.constsr   r   r   sentry_sdk.integrationsr   r   r   sentry_sdk.scoper   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   r   r   r   r5   r   ImportErrorr   anthropic.resourcesr   r   anthropic.typesr   r   r    r!   r"   r#   r$   r%   sentry_sdk.tracingr&   sentry_sdk._typesr'   r(   r4   rO   rV   rh   rr   r|   r   rB   r   r   r;   r=   r   r2   r2   r2   r3   <module>   s      

 
N


n	


3 

&&