o
    ai                     @   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) d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 erd dl2m9Z9m:Z: W n e&y   edw erd dlm;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZE d dl2mFZFmGZGmHZHm:Z:mIZI G dd dZJG dd dZKG dd deZLdd!d"ZMdd&d'ZN		d	)	*	+	,		-	.	/	+	0	+	 	1dd2d3ZO	4	5	 	5dd6d7ZP	8	9	 	:dd;d<ZQ	=	>	?		@	A	B	C	*	D	E	F	G	H	I	J	K	H	L	M	 	ddNdOZR	=	>	P	5	?		 	ddQdRZS	S	T	U	V	 	VddWdXZT	S	Y	U	Z	 	Zdd[d\ZU		d	>	?		*	+	]	^	_	^	`	^	a	^	-	b	/	+	0	+	 	ddcddZVddgdhZWddidjZXddkdlZY	S	T	(	m	 	ddndoZZ	=	>	?		*	p	,		-	.	/	p	0	p	 	ddqdrZ[	e	s	 	sddtduZ\ddvdwZ]	e	x	 	xddydzZ^dd{d|Z_dd}d~Z`dddZadddZbddd ecfddZddS )    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)StreamAsyncStream)AsyncMessagesMessages)MessageStreamManagerMessageStreamAsyncMessageStreamManagerAsyncMessageStream)MessageStartEventMessageDeltaEventMessageStopEventContentBlockStartEventContentBlockDeltaEventContentBlockStopEvent)MessageStreamEventTextBlockParamzAnthropic not installed)AnyAsyncIteratorIteratorOptionalUnionCallable	Awaitable)Span)TextPart)RawMessageStreamEventMessageParam
ModelParamr+   ToolUnionParamc                   @   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_tokensOptional[int]cache_write_input_tokenscache_read_input_tokensN)	__name__
__module____qualname__r:   int__annotations__r;   r=   r>    rD   rD   _/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/sentry_sdk/integrations/anthropic.pyr9   U   s
   
 r9   c                   @   sN   e Zd ZdZ	ddddeddfdd	Zdd
dZ								dddZdS )_StreamSpanContextz
    Sets accumulated data on the stream's span and finishes the span on exit.
    Is a no-op if the stream has no span set, i.e., when the span has already been finished.
    Fstreamz=Union[Stream, MessageStream, AsyncStream, AsyncMessageStream]guaranteed_streaming_statereturnNc                 C   s   || _ || _d S N)_stream_guaranteed_streaming_state)selfrG   rH   rD   rD   rE   __init__b   s   
z_StreamSpanContext.__init__c                 C   s   | S rJ   rD   rM   rD   rD   rE   	__enter__k   s   z_StreamSpanContext.__enter__exc_typeOptional[type[BaseException]]exc_valOptional[BaseException]exc_tbOptional[Any]c              
   C   s   t  [ t| jds	 W d    d S | js1t| jds1| jj||| | j`	 W d    d S t| jj| jj| jj| jj	| jj
| jj| jjd | jj||| | j`W d    d S 1 saw   Y  d S )N_span_model)spanintegrationmodelusagecontent_blocksresponse_idfinish_reason)r   hasattrrK   rL   rW   __exit___set_streaming_output_data_integrationrX   _usage_content_blocks_response_id_finish_reason)rM   rQ   rS   rU   rD   rD   rE   ra   n   s.   
"z_StreamSpanContext.__exit__)F)rI   rF   )rQ   rR   rS   rT   rU   rV   rI   N)r?   r@   rA   __doc__boolrN   rP   ra   rD   rD   rD   rE   rF   \   s(    	

	rF   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.TrM   include_promptsrI   Nc                 C   s
   || _ d S rJ   )rl   )rM   rl   rD   rD   rE   rN      s   
zAnthropicIntegration.__init__c                  C   s   t d} tt|  	 ttjt_ttjt_t	t
jt
_ttjt_	 ttjt_ttjt_ttts:ttjt_tt
jt
_ttjt_tttsSttjt_d S d S )Nrk   )r   r   rj   _wrap_message_creater   create_wrap_closer   close_wrap_message_create_asyncr   _wrap_async_closer   _wrap_message_streamrG   "_wrap_message_stream_manager_enterr    rP   
issubclassr!   _wrap_async_message_stream)_wrap_async_message_stream_manager_aenterr"   
__aenter__r#   )versionrD   rD   rE   
setup_once   s,   


zAnthropicIntegration.setup_once)T)rI   N)	r?   r@   rA   
identifieroriginri   rN   staticmethodrz   rD   rD   rD   rE   rj      s    
rj   excr,   rI   c                 C   s6   t   t| t jdddd\}}tj||d d S )Nrk   F)typehandled)client_options	mechanism)hint)r   r   
sentry_sdk
get_clientoptionscapture_event)r~   eventr   rD   rD   rE   _capture_exception   s   
r   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}||| 7 }||||fS )z
    Get token usage from the Anthropic response.
    Returns: (input_tokens, output_tokens, cache_read_input_tokens, cache_write_input_tokens)
    r   r\   r;   r:   r>   cache_creation_input_tokens)r`   r\   
isinstancer;   rB   r:   r>   r   )r   r;   r:   r>   r=   r\   rD   rD   rE   _get_token_usage   s0   
r   r   r*   r[   
str | Noner\   r]   	list[str]r^   r_   Dtuple[str | None, _RecordedUsage, list[str], str | None, str | None]c           
      C   s  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rm| jjp@|}| jj	}| 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|	|_| jjd	ur| jj}|||||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.
    r   content_block_startcontent_block_deltatextpartial_jsoncontent_block_stopmessage_startr   Nr>   message_deltar;   )r   r`   r   deltaappendr   r   messager[   idr\   r:   r;   getattrr=   r>   stop_reason)
r   r[   r\   r]   r^   r_   incoming_usager;   r   r>   rD   rD   rE   _collect_ai_data   st   





&
 Ar   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.
    r   documentsourcer   data r   r   N)getr   dictr   )r   r   r   rD   rD   rE   "_transform_anthropic_content_blockI  s   

r   system_instructions$Union[str, Iterable[TextBlockParam]]list[TextPart]c                 C   s$   t | trd| dgS dd | D S )Nr   r   contentc                 S   s,   g | ]}t |trd |v rd |d  dqS )r   r   )r   r   ).0instructionrD   rD   rE   
<listcomp>i  s    z2_transform_system_instructions.<locals>.<listcomp>)r   str)r   rD   rD   rE   _transform_system_instructions^  s   
r   rY   r3   rZ   
max_tokensrB   messagesIterable[MessageParam]r7   system.Optional[Union[str, Iterable[TextBlockParam]]]temperatureOptional[float]top_kr<   top_ptools"Optional[Iterable[ToolUnionParam]]c
                 C   sZ  |  tjd |  tjd |durt|dkrt r|jrt|ts(t|t	r4|  tj
tt| g }
|D ]j}|dtjkrd|v rt|d ttfrg }|d D ]}t|trd|ddkrdqU|t|trot|n| qU|r|
|d|d	 q8| }d|v r|d }t|ttfrd
d |D |d< |
| q8t|
}t }t|| |}|durt| tj|dd |durt|r|  tj| |durt|r|  tj| |durt|r|  tj | |durt|r|  tj!| |durt|r|  tj"| |	dur't|	r)t|	dkr+|  tj#t$|	 dS dS dS dS )q
    Set input data for the span based on the provided keyword arguments for the anthropic message creation.
    rk   chatNr   roler   r   tool_result)r   r   c                 S   s"   g | ]}t |trt|n|qS rD   )r   r   r   )r   itemrD   rD   rE   r     s    
z*_set_common_input_data.<locals>.<listcomp>Funpack)%set_datar   GEN_AI_SYSTEMGEN_AI_OPERATION_NAMElenr   rl   r   r   r   GEN_AI_SYSTEM_INSTRUCTIONSjsondumpsr   r   r   USERlisttupler   r   r   copyr	   r   get_current_scoper
   r   GEN_AI_REQUEST_MESSAGES	_is_givenGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_MODELGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TOP_PGEN_AI_REQUEST_AVAILABLE_TOOLSr   )rY   rZ   r   r   r[   r   r   r   r   r   normalized_messagesr   transformed_contentr   transformed_messager   role_normalized_messagesscopemessages_datarD   rD   rE   _set_common_input_datas  s   


"r   kwargsc                 C   sf   |  tj|dd t| ||d|d|d|d|d|d|d	|d
d
 dS )r   rG   Fr   r   r[   r   r   r   r   r   
rY   rZ   r   r   r[   r   r   r   r   r   N)r   r   GEN_AI_RESPONSE_STREAMINGr   r   )rY   r   rZ   rD   rD   rE   _set_create_input_data  s   
r   rG   Union[Stream, MessageStream]iterator:Iterator[Union[RawMessageStreamEvent, MessageStreamEvent]]c              
   c   sl    t | dd% |D ]}t|ttttttfs|V  q
t| | |V  q
W d   dS 1 s/w   Y  dS z
    Sets information received while iterating the response stream on the AI Client Span.
    Responsible for closing the AI Client Span unless the span has already been closed in the close() patch.
    T)rH   N	rF   r   r$   r%   r&   r'   r(   r)   _accumulate_event_datarG   r   r   rD   rD   rE   "_wrap_synchronous_message_iterator  s&   
"r   &Union[AsyncStream, AsyncMessageStream]?AsyncIterator[Union[RawMessageStreamEvent, MessageStreamEvent]]c              
   C  sv   t | dd* |2 z3 dH W }t|ttttttfs|V  q
t| | |V  q
6 W d   dS 1 s4w   Y  dS r   r   r   rD   rD   rE   #_wrap_asynchronous_message_iterator  s&   
"r   r;   
int | Noner:   r>   r=   	list[Any]c
                 C   s   |  tj| |dur|  tj| |	dur|  tj|	g t ro|jrog g d}
|D ]}|d dkr=|
d |d  q+|d dkrJ|
d | q+t|
d dkr^t	| tj
|
d d	d
 t|
d dkrot	| tj|
d  t| ||||d dS )z;
    Set output data for the span based on the AI response.N)responsetoolr   r   r   tool_user   r   Fr   )r;   r:   input_tokens_cachedinput_tokens_cache_write)r   r   GEN_AI_RESPONSE_MODELGEN_AI_RESPONSE_IDGEN_AI_RESPONSE_FINISH_REASONSr   rl   r   r   r   GEN_AI_RESPONSE_TOOL_CALLSGEN_AI_RESPONSE_TEXTr   )rY   rZ   r[   r;   r:   r>   r=   r]   r^   r_   output_messagesoutputrD   rD   rE   _set_output_data&  sB   
r   fargsc                 o   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rr||_||_t| t||j|_|S t|tr||_||_t| t||j|_|S t } t|drt|\}}}	}
g }|jD ]*}t|dr||  qt|d	r||  qt|d
r|d
|jd qt||t|dd |||	|
|t|dd t|dd d
 |d d d  n| dd |d d d  W d    |S W d    |S 1 sw   Y  |S )NrZ   r   r[   r   chat opnamer|   r   to_dict
model_dumpr   r   r   r   
rY   rZ   r[   r;   r:   r>   r=   r]   r^   r_   unknown_responseT)!popiter	TypeErrorr   r   r   GEN_AI_CHATstriprj   r|   rP   r   r   r   rW   rc   #_initialize_data_accumulation_stater   	_iteratorr   r   r   r`   r   r   r   r  r  r   r   r   ra   r   )r   r  r   rZ   r[   rY   r   r;   r:   r>   r=   r]   r   rD   rD   rE   _sentry_patched_create_common[  s   











#
##r  c                    &   d
dd t d fdd	}|S )Nr   r,   r  r   rI   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 rJ   r  nextStopIterationvalue	Exceptionsysexc_infor   r   r   sendr   r  r   gener   r~   r  rD   rD   rE   _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 NrZ   
r   r   get_integrationrj   get_current_spanstatusr   INTERNAL_ERRORr   ra   r  r   rZ   rY   r  r   rD   rE   _sentry_patched_create_sync  s   z9_wrap_message_create.<locals>._sentry_patched_create_syncr   r,   r  r,   r   r,   rI   r,   r  r,   r   r,   rI   r,   r   )r   r'  rD   r&  rE   rm        
rm   c                 C   s2   t | dsd| _t | _g | _d| _d| _dS dS )zK
    Initialize fields for accumulating output on the Stream instance.
    rX   N)r`   rX   r9   rd   re   rf   rg   )rG   rD   rD   rE   r    s   

r  0Union[RawMessageStreamEvent, MessageStreamEvent]c                 C   sH   t || j| j| j| j| j\}}}}}|| _|| _|| _|| _|| _dS )z?
    Update accumulated output from a single stream event.
    N)r   rX   rd   re   rf   rg   )rG   r   r[   r\   r]   r^   r_   rD   rD   rE   r     s   	
r   Optional[str]c                 C   sN   |j |jpd |jpd }t| ||||j|j|jd|ddg||d
 dS )z6
    Set output attributes on the AI Client Span.
    r   r   r   )r   r   r  N)r;   r>   r=   r   r:   join)rY   rZ   r[   r\   r]   r^   r_   total_inputrD   rD   rE   rb     s$   
rb   Callable[..., None]c                       d fdd}|S )zr
    Closes the AI Client Span unless the finally block in `_wrap_synchronous_message_iterator()` runs first.
    rM   r   rI   Nc                    s4   t |   | W  d    S 1 sw   Y  d S rJ   rF   rO   r   rD   rE   rp   %  s   
$z_wrap_close.<locals>.close)rM   r   rI   NrD   r   rp   rD   r2  rE   ro        ro   c                    r  )Nr   r,   r  r   rI   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 rJ   r  r  rD   rD   rE   _execute_async-  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%  r5  r   rD   rE   _sentry_patched_create_asyncB  s    z@_wrap_message_create_async.<locals>._sentry_patched_create_asyncr(  r)  r   )r   r7  rD   r6  rE   rq   ,  r*  rq   Callable[..., Awaitable[None]]c                    r0  )zs
    Closes the AI Client Span unless the finally block in `_wrap_asynchronous_message_iterator()` runs first.
    rM   r   rI   Nc                    s<   t |   | I d H W  d    S 1 sw   Y  d S rJ   r1  rO   r2  rD   rE   rp   Y  s   
$z _wrap_async_close.<locals>.close)rM   r   rI   NrD   r3  rD   r2  rE   rr   R  r4  rr   c                    s   t  d	 fdd}|S )

    Attaches user-provided arguments to the returned context manager.
    The attributes are set on AI Client Spans in the patch for the context manager.
    r  r,   r   rI   r    c                     r    | i |}| d|_| d|_| d|_| d|_| d|_| d|_| d|_| d|_|S 	Nr   r   r[   r   r   r   r   r   	r   _max_tokens	_messagesrX   _system_temperature_top_k_top_p_toolsr  r   stream_managerr2  rD   rE   _sentry_patched_streamf  s   z4_wrap_message_stream.<locals>._sentry_patched_streamN)r  r,   r   r,   rI   r    r   r   rF  rD   r2  rE   rs   `  s   rs   c                    s   t  d fdd}|S )	.
    Creates and manages AI Client Spans.
    rM   r    rI   r!   c                    s    | }t | ds|S t t}|d u r|S | jd u r|S zt| j W n ty1   | Y S w t t	j
| jd u r=dnd| j  tjd}|  |tjd t||| j| j| j| j| j| j| j| jd
 ||_||_t| t||j|_|S Nr=  r   r  r  Tr   )r`   r   r   r!  rj   r>  r  r  r   r   r  rX   r  r|   rP   r   r   r   r   r=  r?  r@  rA  rB  rC  rW   rc   r  r   r  rM   rG   rZ   rY   r2  rD   rE   _sentry_patched_enter}  sP   

zA_wrap_message_stream_manager_enter.<locals>._sentry_patched_enterN)rM   r    rI   r!   r   )r   rK  rD   r2  rE   rt   x  s   2rt   c                    s&   t  						d	 fdd}|S )
r9  r  r,   r   rI   r"   c                     r:  r;  r<  rD  r2  rD   rE   rF    s   z:_wrap_async_message_stream.<locals>._sentry_patched_streamN)r  r,   r   r,   rI   r"   r   rG  rD   r2  rE   rv     s   rv   c                    s"   t  				d fdd}|S )	rH  rM   r"   rI   r#   c                    s   | I d H }t | ds|S t t}|d u r|S | jd u r#|S zt| j W n ty5   | Y S w t t	j
| jd u rAdnd| j  tjd}|  |tjd t||| j| j| j| j| j| j| j| jd
 ||_||_t| t||j|_|S rI  )r`   r   r   r!  rj   r>  r  r  r   r   r  rX   r  r|   rP   r   r   r   r   r=  r?  r@  rA  rB  rC  rW   rc   r  r   r  rJ  r2  rD   rE   _sentry_patched_aenter  sR   

zI_wrap_async_message_stream_manager_aenter.<locals>._sentry_patched_aenterN)rM   r"   rI   r#   r   )r   rL  rD   r2  rE   rw     s   4rw   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   r   r   )rM  rD   rD   rE   r   
  s
   r   )r~   r,   rI   N)r   r   rI   r   )NN)r   r*   r[   r   r\   r9   r]   r   r^   r   r_   r   rI   r   )r   r   rI   r   )r   r   rI   r   )rY   r3   rZ   rj   r   rB   r   r   r[   r7   r   r   r   r   r   r<   r   r   r   r   rI   N)rY   r3   r   r   rZ   rj   rI   N)rG   r   r   r   rI   r   )rG   r   r   r   rI   r   )rY   r3   rZ   rj   r[   r   r;   r   r:   r   r>   r   r=   r   r]   r   r^   r   r_   r   rI   Nr(  )r   r,   rI   r,   )rG   r   rI   N)rG   r   r   r+  rI   N)rY   r3   rZ   rj   r[   r,  r\   r9   r]   r   r^   r,  r_   r,  rI   N)r   r/  rI   r/  )r   r8  rI   r8  )er  r   collections.abcr   	functoolsr   typingr   r   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   rk   r   ImportErrorr   r   r   anthropic.resourcesr   r   anthropic.lib.streamingr    r!   r"   r#   anthropic.typesr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   sentry_sdk.tracingr3   sentry_sdk._typesr4   r5   r6   r7   r8   r9   rF   rj   r   r   r   r   r   r   r   r   r   r   r  rm   r  r   rb   ro   rq   rr   rs   rt   rv   rw   ri   r   rD   rD   rD   rE   <module>   sr     	$		1
8
*
T

	

a


'	


5
X
&

"

&



;
=