o
    ai;                     @   s  d dl Z d dlZd dl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
 d dlmZmZmZmZ d dlmZmZmZmZ d dlmZmZ d d	lmZ d d
l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' d dl(m)Z) e)rd dl(m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0mZ d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl5m8Z8 d dl9m:Z: zLzd dl9m;Z; W n e<y   dZ;Y nw zd dl9m:Z: W n e<y   dZ:Y nw d dl=m>Z>m?Z? d dl@mAZAmBZB d dl9mCZCmDZD e)rd dlEmFZFmGZG W n e<y   edw dZHzd dlImJZJmKZK d dlLmMZM W n e<y!   dZHY nw G dd  d eZNdvd!d"d#eOd$dfd%d&ZPd'd"d(d)d$eQfd*d+ZR	,	-	.	"	/	0	1	2	3	4	$	dwd5d6ZS	/	0	7	8	9	 	$	dxd:d;ZT	/	0	7	8	9	 	$	dxd<d=ZU	/	0	7	8	9	 	$	dxd>d?ZV	dvd/d0d.d"d@d"d9d dAeOd$dfdBdCZWdydFdGZX	dvd/d0d.d"d7d8d9d dAeOd$dfdHdIZY	/	0	9	 	J	K	,	-	.	L	M	N	A	O	$	NdzdPdQZZ	/	0	9	 	J	K	,	-	.	R	M	S	A	O	$	Sd{dTdUZ[	/	0	9	 	J	K	@	V	.	W	M	X	A	O	$	Xd|dYdZZ\	/	0	9	 	J	K	@	V	.	[	M	\	A	O	$	\d}d]d^Z]	dvd/d0d.d"d7d8d9d dAeOd$dfd_d`Z^	dvd/d0d.d"d7d8d9d dAeOd$dfdadbZ_d~dcddZ`d~dedfZadydgdhZbddidjZcddkdlZddydmdnZeddodpZfddqdrZgdsd"d$eOfdtduZhdS )    Nwraps)Iterable)consts)record_token_usage)set_data_normalizednormalize_message_rolestruncate_and_annotate_messages&truncate_and_annotate_embedding_inputs)_is_system_instruction_get_system_instructions_transform_system_instructions_get_text_items)r   r   )SPANDATA)DidNotEnableIntegration)should_send_default_pii)set_span_errored)capture_internal_exceptionsevent_from_exceptionsafe_serializereraise)TYPE_CHECKING)AnyListOptionalCallableAsyncIteratorIteratorUnionr   )Span)TextPart)ResponseInputParamSequenceNotStr)ResponseStreamEvent)Omit)NotGiven)CompletionsAsyncCompletions)
EmbeddingsAsyncEmbeddings)StreamAsyncStream)ChatCompletionMessageParamChatCompletionChunkzOpenAI not installedT)	ResponsesAsyncResponses)ResponseCompletedEventFc                	   @   s^   e Zd ZdZde Z		ddd deddd	dfd
dZedddZdd de	d	e
fddZdS )OpenAIIntegrationopenaizauto.ai.TNselfinclude_promptstiktoken_encoding_namezOptional[str]returnc                 C   s0   || _ d | _|d urdd l}||| _d S d S Nr   )r5   tiktoken_encodingtiktokenget_encoding)r4   r5   r6   r:    r<   \/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/sentry_sdk/integrations/openai.py__init__^   s   zOpenAIIntegration.__init__c                   C   sT   t tjt_ttjt_ttjt_ttjt_t	r(t
tjt_ttjt_d S d S N)_wrap_chat_completion_creater'   create"_wrap_async_chat_completion_creater(   _wrap_embeddings_creater)   _wrap_async_embeddings_creater*   RESPONSES_API_ENABLED_wrap_responses_creater/   _wrap_async_responses_creater0   r<   r<   r<   r=   
setup_oncek   s   zOpenAIIntegration.setup_oncesc                 C   s6   | j d u rdS z	t| j |W S  ty   Y dS w r8   )r9   lenencode_ordinary	Exception)r4   rI   r<   r<   r=   count_tokensy   s   
zOpenAIIntegration.count_tokens)TN)r7   N)__name__
__module____qualname__
identifieroriginboolr>   staticmethodrH   strintrM   r<   r<   r<   r=   r2   Z   s"    

r2   excr   manual_span_cleanupr7   c                 C   sZ   t  }t| |r|d ur|d d d  t| t  jdddd\}}t j||d d S )Nr3   F)typehandled)client_options	mechanism)hint)
sentry_sdkget_current_spanr   __exit__r   
get_clientoptionscapture_event)rW   rX   current_spaneventr]   r<   r<   r=   _capture_exception   s   
rf   usagenamesz	List[str]c                 C   s6   |D ]}t | |rtt| |trt| |  S qdS r8   )hasattr
isinstancegetattrrV   )rg   rh   namer<   r<   r=   
_get_usage   s
   rm   messages.Optional[Iterable[ChatCompletionMessageParam]]responsespanr    streaming_message_responsesOptional[List[str]]rM   Callable[..., Any]c                    s  d}d}d}d}d}	t |drBt|jddg}t |jdr%t|jjdg}t|jddg}t |jd	r;t|jjd
g}t|jdg}	|dkrz| pIg D ]/}
t|
trX| |
7 }qJt|
try|
d}|d u rgqJt	|}|t
 fdd|D 7 }qJqJ|dkr|d ur|D ]}
| |
7 }qnt |dr|jD ]}t |drt |jdr| |jj7 }q|pd }|pd }|pd }|pd }|	pd }	t||||||	d d S )Nr   rg   input_tokensprompt_tokensinput_tokens_detailscached_tokensoutput_tokenscompletion_tokensoutput_tokens_detailsreasoning_tokenstotal_tokenscontentc                 3   s    | ]} |V  qd S r?   r<   ).0textrM   r<   r=   	<genexpr>   s    z)_calculate_token_usage.<locals>.<genexpr>choicesmessage)ru   input_tokens_cachedry   output_tokens_reasoningr}   )ri   rm   rg   rw   r{   rj   rU   dictgetr   sumr   r   r~   r   )rn   rp   rq   rr   rM   ru   r   ry   r   r}   r   message_content
text_itemschoicer<   r   r=   _calculate_token_usage   sn   






	


r   kwargsdict[str, Any]integrationc                 C   sv  | d}| d}| d}|d ur&t|r&t|dkr&t| tjt| | d}|d ur6| tj| | d}|d urJt|rJ| tj	| | d}|d ur^t|r^| tj
| | d}	|	d urrt|	rr| tj|	 t rx|jst| tjd	 d S |d u r|d urt|r| tjtd
|dg t| tjd	 d S |d u rt| tjd	 d S g }
|d urt|r|
d
|d t|}|
t|7 }
t|
dkr| tjt|
 t|trt|g}t }t|| |}|d urt| tj|dd t| tjd	 d S dd |D }t|dkr2t|}t }t|| |}|d ur2t| tj|dd t| tjd	 d S )Ninstructionsinputtoolsr   modelmax_output_tokenstemperaturetop_p	responsesr   )rY   r~   Funpackc                 S      g | ]}t |s|qS r<   ) _is_system_instruction_responsesr   r   r<   r<   r=   
<listcomp>;  s
    z1_set_responses_api_input_data.<locals>.<listcomp>)r   	_is_givenrJ   r   r   GEN_AI_REQUEST_AVAILABLE_TOOLSr   set_dataGEN_AI_REQUEST_MODELGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_Pr   r5   GEN_AI_OPERATION_NAMEGEN_AI_SYSTEM_INSTRUCTIONSjsondumpsappend"_get_system_instructions_responsesr   rj   rU   r   r^   get_current_scoper	   GEN_AI_REQUEST_MESSAGES)rq   r   r   explicit_instructionsrn   r   r   
max_tokensr   r   instructions_text_partssystem_instructionsnormalized_messagesscopemessages_datanon_system_messagesr<   r<   r=   _set_responses_api_input_data   s   










r   c                 C   sn  | d}| d}|d ur!t|r!t|dkr!t| tjt| | d}|d ur1| tj| | d}|d urEt|rE| tj	| | d}|d urYt|rY| tj
| | d}|d urmt|rm| tj| | d}	|	d urt|	r| tj|	 | d	}
|
d urt|
r| tj|
 t r|jr|d u rt| tjd
 d S t|trt|g}t }t|| |}|d urt| tj|dd t| tjd
 d S t|trt|trt| tjd
 d S t|}||d< t|}t|dkr| tjtt| dd |D }t|dkr.t|}t }t|| |}|d ur.t| tj|dd t| tjd
 d S )Nrn   r   r   r   r   presence_penaltyfrequency_penaltyr   r   chatFr   c                 S   r   r<   )"_is_system_instruction_completionsr   r<   r<   r=   r     s    z3_set_completions_api_input_data.<locals>.<listcomp>) r   r   rJ   r   r   r   r   r   r   r   GEN_AI_REQUEST_PRESENCE_PENALTY GEN_AI_REQUEST_FREQUENCY_PENALTYr   r   r   r5   r   rj   rU   r   r^   r   r	   r   r   r   list$_get_system_instructions_completionsr   r   r   r   )rq   r   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   r<   r<   r=   _set_completions_api_input_dataJ  s   











r   c                 C   s.  | d}| d}|d ur| tj| t r|jr|d u r(t| tjd d S t|t	rRt| tjd t
|g}t }t|| |}|d urPt| tj|dd d S t|tr\t|tret| tjd d S t|}||d< t|dkrt
|}t }t|| |}|d urt| tj|dd t| tjd d S )Nr   r   
embeddingsFr   r   )r   r   r   r   r   r5   r   r   rj   rU   r   r^   r   r
   GEN_AI_EMBEDDINGS_INPUTr   r   r   rJ   )rq   r   r   rn   r   r   r   r   r<   r<   r=   _set_embeddings_input_data  sR   




r   r   finish_spanc           	   
   C   s  t |drt| tj|j t |drCt r-|jr-dd |jD }t|dkr-t| tj	| t
||| d |j |rA| d d d  d S d S t |drt r|jrg g d}|jD ]8}|jdkrg|d	 |  qV|jd
kr|jD ]}z
|d |j W qo ty   |d |  Y qow qVt|d	 dkrt| tj|d	 dd t|d dkrt| tj	|d  t
||| d |j |r| d d d  d S d S t
||| d |j |r| d d d  d S d S )Nr   r   c                 S   s    g | ]}|j d ur|j  qS r?   )r   
model_dump)r   r   r<   r<   r=   r     s
    
z+_set_common_output_data.<locals>.<listcomp>r   output)rp   toolfunction_callr   r   rp   Fr   )ri   r   r   GEN_AI_RESPONSE_MODELr   r   r5   r   rJ   GEN_AI_RESPONSE_TEXTr   rM   r`   r   rY   r   r   r~   r   AttributeErrorGEN_AI_RESPONSE_TOOL_CALLS)	rq   rp   r   r   r   response_textoutput_messagesr   output_messager<   r<   r=   _set_common_output_data  s`   






r   fargsc           
   	   o   s   t  t}|d u r| |i |S d|vr| |i |S zt|d  W n ty6   | |i | Y S w |d}t jtj	j
d| tjd}|  |tjd |ddp\d}|tj| t||| t }| ||fV }t|trt|dr|d}	|	d urt|	tr|	g}	t||||	||jd	d
|_|S t|trt|dr|d}	|	d urt|	tr|	g}	t||||	||jd	d
|_|S t||||d	d |S )Nrn   r   zchat oprl   rR   r3   streamF	_iteratorT)rq   r   
start_timern   rp   old_iteratorr   r   )r^   ra   get_integrationr2   iter	TypeErrorr   
start_spanr   OPGEN_AI_CHATrR   	__enter__r   r   GEN_AI_SYSTEMGEN_AI_RESPONSE_STREAMINGr   timeperf_counterrj   r+   ri   rU   ,_wrap_synchronous_completions_chunk_iteratorr   r,   -_wrap_asynchronous_completions_chunk_iterator _set_completions_api_output_data)
r   r   r   r   r   rq   is_streaming_responser   rp   rn   r<   r<   r=   _new_chat_completion_common!  sp   



r   c                 C   6   | d}|d urt|tr|g}t| |||| d S Nrn   r   rj   rU   r   )rq   rp   r   r   r   rn   r<   r<   r=   r   m     
r   r   Optional[float]Stream[ChatCompletionChunk]r   Iterator[ChatCompletionChunk]rS   c              	   c   sp   d}g }|D ]b}	|  tj|	j t J t|	drWd}
|	jD ]7}t|drRt|jdrR|dur:|du r:t	 | }|jj
}t||
krI|g  ||
 |pPd |
d7 }
qW d   n1 saw   Y  |	V  qt 6 |duryt| tj| t|dkrdd	 |D }t r|jrt| tj| t||| ||j W d   n1 sw   Y  |r| ddd dS dS )
/  
    Sets information received while iterating the response stream on the AI Client Span.
    Compute token count based on inputs and outputs using tiktoken if token counts are not in the model response.
    Responsible for closing the AI Client Span if instructed to by the `finish_span` argument.
    Nr   r   deltar~       c                 S      g | ]}d  |qS r   joinr   chunkr<   r<   r=   r         z@_wrap_synchronous_completions_chunk_iterator.<locals>.<listcomp>r   r   r   r   r   ri   r   r   r   r   r~   rJ   r   r   #GEN_AI_RESPONSE_TIME_TO_FIRST_TOKENr   r5   r   r   rM   r`   rq   r   r   rn   rp   r   r   ttftdata_bufxchoice_indexr   r~   all_responsesr<   r<   r=   r     sR   



r    AsyncStream[ChatCompletionChunk]"AsyncIterator[ChatCompletionChunk]c              	   C  sz  d}g }|2 zf3 dH W }	|  tj|	j t J t|	dr[d}
|	jD ]7}t|drVt|jdrV|dur>|du r>t	 | }|jj
}t||
krM|g  ||
 |pTd |
d7 }
q#W d   n1 sew   Y  |	V  q6 t 6 |dur~t| tj| t|dkrdd	 |D }t r|jrt| tj| t||| ||j W d   n1 sw   Y  |r| ddd dS dS )
r   Nr   r   r   r~   r   r   c                 S   r   r   r   r   r<   r<   r=   r     r   zA_wrap_asynchronous_completions_chunk_iterator.<locals>.<listcomp>r   r   r<   r<   r=   r     sT   



r   (Optional[Union[str, ResponseInputParam]]Stream[ResponseStreamEvent]Iterator[ResponseStreamEvent]c              	   c   sh   d}g }d}	|D ]Z}
t  J t|
dr7|dur"|du r"t | }t|dkr-|g  |d |
jp5d t|
trQ| 	t
j|
jj t||
j| d|j d}	W d   n1 s[w   Y  |
V  q	t  8 |durst| t
j| t|dkrdd |D }t r|jrt| t
j| |	rt||| ||j W d   n1 sw   Y  |r| ddd dS dS )	r   NTr   r   r   Fc                 S   r   r   r   r   r<   r<   r=   r   !  r   z>_wrap_synchronous_responses_event_iterator.<locals>.<listcomp>r   ri   r   r   rJ   r   r   rj   r1   r   r   r   rp   r   r   rM   r   r   r   r5   r   r`   rq   r   r   r   rp   r   r   r   r   count_tokens_manuallyr   r  r<   r<   r=   *_wrap_synchronous_responses_event_iterator  s^   


r   AsyncStream[ResponseStreamEvent]"AsyncIterator[ResponseStreamEvent]c              	   C  sr  d}g }d}	|2 z^3 dH W }
t  J t|
dr;|dur&|du r&t | }t|dkr1|g  |d |
jp9d t|
trU| 	t
j|
jj t||
j| d|j d}	W d   n1 s_w   Y  |
V  q	6 t  8 |durxt| t
j| t|dkrdd |D }t r|jrt| t
j| |	rt||| ||j W d   n1 sw   Y  |r| ddd dS dS )	r   NTr   r   r   Fc                 S   r   r   r   r   r<   r<   r=   r   `  r   z?_wrap_asynchronous_responses_event_iterator.<locals>.<listcomp>r  r	  r<   r<   r=   +_wrap_asynchronous_responses_event_iterator1  s`   


r  c                 C   r   Nr   r   rq   rp   r   r   r   r   r<   r<   r=   _set_responses_api_output_datao  r   r  c                 C   r   r  r   r  r<   r<   r=   _set_embeddings_output_data  r   r  c                    &   d
dd t d fdd	}|S )Nr   r   r   r   r7   c                 _     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 r?   r   nextStopIterationvaluerL   sysexc_infor   rf   r   sendr   r   r   generesultr  r<   r<   r=   _execute_sync  .   
z3_wrap_chat_completion_create.<locals>._execute_syncc                     sB   t  t}|d u sd|vr| i |S  g| R i |S r   r^   ra   r   r2   r   r   r   r   r   r<   r=   _sentry_patched_create_sync  s   zA_wrap_chat_completion_create.<locals>._sentry_patched_create_syncr   r   r   r   r   r   r7   r   r   r   r   r   r7   r   r   r   r%  r<   r$  r=   r@        
r@   c                    r  )Nr   r   r   r   r7   c                      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 r?   r  r  r<   r<   r=   _execute_async  0   
z:_wrap_async_chat_completion_create.<locals>._execute_asyncc                     sP   t  t}|d u sd|vr| i |I d H S  g| R i |I d H S r   r"  r#  r+  r   r<   r=   _sentry_patched_create_async  s
   zH_wrap_async_chat_completion_create.<locals>._sentry_patched_create_asyncr&  r'  r   r   r.  r<   r-  r=   rB     r)  rB   c                 o   s    t  t}|d u r| |i |S |d}t jtjjd| tj	d&}|
tjd t||| | ||fV }t||||dd |W  d    S 1 sOw   Y  d S )Nr   zembeddings r   r3   Fr   )r^   ra   r   r2   r   r   r   r   GEN_AI_EMBEDDINGSrR   r   r   r   r   r  )r   r   r   r   r   rq   rp   r<   r<   r=   _new_embeddings_create_common  s&   

$r1  c                    r  )Nr   r   r   r   r7   c                 _   s  t | g|R i |}z	t|\} }}W n ty) } z	|jW  Y d }~S d }~ww zCz	| |i |}W n3 tyg } z't }t  t|dd W d    n1 sTw   Y  t	|  W Y d }~nd }~ww |
|W S  ty } z	|jW  Y d }~S d }~ww NF)rX   r1  r  r  r  rL   r  r  r   rf   r   r  r  r<   r<   r=   r     s.   z._wrap_embeddings_create.<locals>._execute_syncc                     :   t  t}|d u r| i |S  g| R i |S r?   r"  r#  r$  r<   r=   r%       z<_wrap_embeddings_create.<locals>._sentry_patched_create_syncr&  r'  r   r(  r<   r$  r=   rC        
rC   c                    r  )Nr   r   r   r   r7   c                    s  t | g|R i |}z	t|\} }}W n ty- } z|jI d H W  Y d }~S d }~ww zFz| |i |I d H }W n3 tyn } z't }t  t|dd W d    n1 s[w   Y  t	|  W Y d }~nd }~ww |
|W S  ty } z	|jW  Y d }~S d }~ww r2  r3  r  r<   r<   r=   r+    s0   z5_wrap_async_embeddings_create.<locals>._execute_asyncc                     H   t  t}|d u r| i |I d H S  g| R i |I d H S r?   r"  r#  r-  r<   r=   r.  ,  
   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_asyncr&  r'  r   r/  r<   r-  r=   rD     r6  rD   c           
   	   o   s^   t  t}|d u r| |i |S |d}t jtjjd| tj	d}|
  |tjd |ddp8d}|tj| t||| t }| ||fV }t|trzt|drz|d}	|	d urkt|	trk|	g}	t||||	||jd	d
|_|S t|trt|dr|d}	|	d urt|	tr|	g}	t||||	||jd	d
|_|S t||||d	d |S )Nr   z
responses r   r3   r   Fr   r   T)rq   r   r   r   rp   r   r   r   )r^   ra   r   r2   r   r   r   r   GEN_AI_RESPONSESrR   r   r   r   r   r   r   r   r   rj   r+   ri   rU   r  r   r,   r  r  )
r   r   r   r   r   rq   r   r   rp   r   r<   r<   r=   _new_responses_create_common7  sb   



r:  c                    r  )Nr   r   r   r   r7   c                 _   r  r?   r:  r  r  r  rL   r  r  r   rf   r   r  r  r<   r<   r=   r   z  r!  z-_wrap_responses_create.<locals>._execute_syncc                     r4  r?   r"  r#  r$  r<   r=   r%    r5  z;_wrap_responses_create.<locals>._sentry_patched_create_syncr&  r'  r   r(  r<   r$  r=   rF   y  r6  rF   c                    r  )Nr   r   r   r   r7   c                    r*  r?   r;  r  r<   r<   r=   r+    r,  z4_wrap_async_responses_create.<locals>._execute_asyncc                     r7  r?   r"  r#  r-  r<   r=   _sentry_patched_responses_async  r8  zE_wrap_async_responses_create.<locals>._sentry_patched_responses_asyncr&  r'  r   )r   r<  r<   r-  r=   rG     r6  rG   objc                 C   s0   t durt| t rdS tdurt| trdS dS )zF
    Check for givenness safely across different openai versions.
    NFT)r&   rj   r%   )r=  r<   r<   r=   r     s
   r   )T)rn   ro   rp   r   rq   r    rr   rs   rM   rt   r7   N)rq   r    r   r   r   r2   r7   Nr&  )rq   r    r   r2   r   r   rn   ro   rp   r   r   r   r   rS   r7   r   )rq   r    r   r2   r   r   rn   ro   rp   r  r   r  r   rS   r7   r  )rq   r    r   r2   r   r   r   r  rp   r  r   r  r   rS   r7   r  )rq   r    r   r2   r   r   r   r  rp   r  r   r  r   rS   r7   r  )r   rt   r7   rt   )r   r   r7   r   )ir  r   r   	functoolsr   collections.abcr   r^   r   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   r   r	   r
   %sentry_sdk.ai._openai_completions_apir   r   r   r   r   r   #sentry_sdk.ai._openai_responses_apir   r   sentry_sdk.constsr   sentry_sdk.integrationsr   r   sentry_sdk.scoper   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   r   r   typingr   r   r   r   r   r   r   r   sentry_sdk.tracingr    sentry_sdk._typesr!   openai.types.responsesr"   r#   r$   r3   r%   r&   ImportError!openai.resources.chat.completionsr'   r(   openai.resourcesr)   r*   r+   r,   openai.types.chatr-   r.   rE   openai.resources.responsesr/   r0   /openai.types.responses.response_completed_eventr1   r2   rS   rf   rV   rm   r   r   r   r   r   r   r   r   r   r  r  r  r  r@   rB   r1  rC   rD   r:  rF   rG   r   r<   r<   r<   r=   <module>   s   (
(
G
i
Z
@

BQ

8
8
?
C



"
"

!
!
B
!!