o
    i                     @   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l5m6Z6 d dl7m8Z8 zFzd dl7m9Z9 W n e:y   dZ9Y nw zd dl7m8Z8 W n e:y   dZ8Y nw d dl;m<Z<m=Z= d dl>m?Z?m@Z@ e)rd dlAmBZBmCZCmDZD W n e:y   edw dZEzd dlFmGZGmHZH d dlImJZJ W n e:y   dZEY nw G dd deZKd_dd d!eLd"dfd#d$ZMd%d d&d'd"eNfd(d)ZO	*	+	,	 	-	.	/	0	1	2	"	d`d3d4ZP	5	6	"	7dad8d9ZQ	-	.	5	6	"	dbd:d;ZR	-	.	5	6	<		"	dcd=d>ZS	-	.	5	6	<		"	dcd?d@ZT	-	.	5	6	<		"	dcdAdBZU		ddd-d.d,d d5d6d<ddCdDdEeLd"dfdFdGZVdedJdKZWdfdLdMZXdfdNdOZYdedPdQZZdgdRdSZ[dgdTdUZ\dedVdWZ]dgdXdYZ^dgdZd[Z_d\d d"eLfd]d^Z`dS )h    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)Omit)NotGiven)CompletionsAsyncCompletions)
EmbeddingsAsyncEmbeddings)ChatCompletionMessageParamChatCompletionChunk ChatCompletionSystemMessageParamz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   )r2   tiktoken_encodingtiktokenget_encoding)r1   r2   r3   r7    r9   [/home/ubuntu/veenaModal/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_creater-   r9   r9   r9   r:   
setup_oncei   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 r5   )r6   lenencode_ordinary	Exception)r1   rF   r9   r9   r:   count_tokensw   s   
zOpenAIIntegration.count_tokens)TN)r4   N)__name__
__module____qualname__
identifieroriginboolr;   staticmethodrE   strintrJ   r9   r9   r9   r:   r/   X   s"    

r/   excr   manual_span_cleanupr4   c                 C   sZ   t  }t| |r|d ur|d d d  t| t  jdddd\}}t j||d d S )Nr0   F)typehandled)client_options	mechanism)hint)
sentry_sdkget_current_spanr   __exit__r   
get_clientoptionscapture_event)rT   rU   current_spaneventrZ   r9   r9   r:   _capture_exception   s   
rc   usagenamesz	List[str]c                 C   s6   |D ]}t | |rtt| |trt| |  S qdS r5   )hasattr
isinstancegetattrrS   )rd   re   namer9   r9   r:   
_get_usage   s
   rj   messages.Optional[Iterable[ChatCompletionMessageParam]]responsespanr    streaming_message_responsesOptional[List[str]]rJ   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   rd   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<   r9   ).0textrJ   r9   r:   	<genexpr>   s    z)_calculate_token_usage.<locals>.<genexpr>choicesmessage)rr   input_tokens_cachedrv   output_tokens_reasoningrz   )rf   rj   rd   rt   rx   rg   rR   dictgetr   sumr   r   r{   r   )rk   rm   rn   ro   rJ   rr   r   rv   r   rz   r   message_content
text_itemschoicer9   r~   r:   _calculate_token_usage   sn   






	


r   kwargsdict[str, Any])Optional[Union[Iterable[Any], list[str]]]c                 C   s0   |  d}|d u r|  d}t|tr|g}|S )Nrk   input)r   rg   rR   )r   rk   r9   r9   r:   _get_input_messages   s   


r   c                 C   s   t | tjd tjtjtjtjtjtjtj	d}|
 D ]\}}||}|d ur3t|r3t | || q|d}|d urRt|rTt|dkrVt | tjt| d S d S d S d S )Nr0   )modelstream
max_tokenspresence_penaltyfrequency_penaltytemperaturetop_ptoolsr   )r   r   GEN_AI_SYSTEMGEN_AI_REQUEST_MODELGEN_AI_RESPONSE_STREAMINGGEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_PRESENCE_PENALTY GEN_AI_REQUEST_FREQUENCY_PENALTYGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_Pitemsr   	_is_givenrG   GEN_AI_REQUEST_AVAILABLE_TOOLSr   )rn   r   kwargs_keys_to_attributeskey	attributevaluer   r9   r9   r:   _commmon_set_input_data   s(   	

r   integrationc                 C   s  | d}| d}t r|jst| tjd t| | d S |d u rF|d urFt|rF| tj	t
d|dg t| tjd t| | d S |d u rXt| tjd t| | d S g }|d urjt|rj|d|d t|}|t|7 }t|dkr| tj	t
| t|trt|g}t }t|| |}	|	d urt| tj|	dd t| tjd t| | d S d	d
 |D }
t|
dkrt|
}t }t|| |}	|	d urt| tj|	dd t| tjd t| | d S )Ninstructionsr   	responsesr}   )rV   r{   r   Funpackc                 S      g | ]}t |s|qS r9   ) _is_system_instruction_responsesr|   r   r9   r9   r:   
<listcomp>T  s
    z1_set_responses_api_input_data.<locals>.<listcomp>)r   r   r2   r   r   GEN_AI_OPERATION_NAMEr   r   set_dataGEN_AI_SYSTEM_INSTRUCTIONSjsondumpsappend"_get_system_instructions_responsesr   rG   rg   rR   r   r[   get_current_scoper	   GEN_AI_REQUEST_MESSAGES)rn   r   r   explicit_instructionsrk   instructions_text_partssystem_instructionsnormalized_messagesscopemessages_datanon_system_messagesr9   r9   r:   _set_responses_api_input_data  s   









r   c           	      C   s0  | d}t r|jr|d u rt| tjd t| | d S t|}t|dkr3| 	tj
tt| t|trbt|g}t }t|| |}|d urTt| tj|dd t| tjd t| | d S dd |D }t|dkrt|}t }t|| |}|d urt| tj|dd t| tjd t| | d S )Nrk   chatr   Fr   c                 S   r   r9   )"_is_system_instruction_completionsr   r9   r9   r:   r     s    z3_set_completions_api_input_data.<locals>.<listcomp>)r   r   r2   r   r   r   r   $_get_system_instructions_completionsrG   r   r   r   r   r   rg   rR   r   r[   r   r	   r   )	rn   r   r   rk   r   r   r   r   r   r9   r9   r:   _set_completions_api_input_datad  sR   





r   c                 C   sz   t |}|d ur/t|dkr/t r/|jr/t|}t }t|| |}|d ur/t| t	j
|dd t| t	jd t| | d S )Nr   Fr   
embeddings)r   rG   r   r2   r   r[   r   r
   r   r   GEN_AI_EMBEDDINGS_INPUTr   r   )rn   r   r   rk   r   r   r   r9   r9   r:   _set_embeddings_input_data  s$   
r   
start_timezOptional[float]finish_spanc              
      sv  t drttjj |dd u r|dd ur'ttr'gd t dr_t rIj	rIdd j
D }t|dkrIttj| td j r]d d d  d S d S t drt rψj	rg g d	}jD ]8}|jd
kr|d |  qr|jdkr|jD ]}	z
|d |	j W q ty   |d |	  Y qw qrt|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r$g  jd f	dd}
d f	dd}ttjdkr| _d S |
 _d S td j r9d d d  d S d S )Nr   rk   r   r   c                 S   s    g | ]}|j d ur|j  qS r<   )r   
model_dump)r|   r   r9   r9   r:   r     s
    
z$_set_output_data.<locals>.<listcomp>r   output)rm   toolfunction_callr   r   rm   Fr   	_iteratorr4   Iterator[ChatCompletionChunk]c               	   3   s   d} D ]}t   t|drNd}|jD ]7}t|drHt|jdrHd ur0d u r0t  |jj}t |kr? g   | |pFd |d7 }qn(t|drvd urad u rat  t dkrl g   d |jptd t	rt
|trt|jd j d} W d    n1 sw   Y  |V  qt  8 d urt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 )NTr   r   deltar{       Fc                 S      g | ]}d  |qS r   joinr|   chunkr9   r9   r:   r   3      z:_set_output_data.<locals>.new_iterator.<locals>.<listcomp>r   rf   r   r   timeperf_counterr{   rG   r   rB   rg   r.   r   rm   rJ   r   r   #GEN_AI_RESPONSE_TIME_TO_FIRST_TOKENr   r2   GEN_AI_RESPONSE_TEXTr]   count_tokens_manuallyxchoice_indexr   r{   all_responses	data_bufr   r   rk   old_iteratorrm   rn   r   ttftr9   r:   new_iterator  sx   





#z&_set_output_data.<locals>.new_iterator"AsyncIterator[ChatCompletionChunk]c               	     s  d} 2 z3 d H W }t   t|drRd}|jD ]7}t|drLt|jdrLd ur4d u r4t  |jj}t |krC g   | |pJd |d7 }qn(t|drzd ured u ret  t dkrp g   d |jpxd t	rt
|trt|jd j d} W d    n1 sw   Y  |V  q6 t  8 d urt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 )NTr   r   r   r{   r   r   Fc                 S   r   r   r   r   r9   r9   r:   r   s  r   z@_set_output_data.<locals>.new_iterator_async.<locals>.<listcomp>r   r   r   r9   r:   new_iterator_asyncD  sz   





#&z,_set_output_data.<locals>.new_iterator_asyncz<class 'async_generator'>)r4   r   )r4   r   )rf   r   r   GEN_AI_RESPONSE_MODELr   r   rg   rR   r   r2   r   rG   r   r   rJ   r]   r   rV   r   r   r{   r}   AttributeErrorGEN_AI_RESPONSE_TOOL_CALLSr   )rn   rm   r   r   r   r   response_textoutput_messagesr   output_messager   r   r9   r   r:   _set_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||| t }| ||fV }t|||||dd |S )Nrk   r   zchat opri   rO   Tr   )r[   r^   get_integrationr/   iter	TypeErrorr   
start_spanr   OPGEN_AI_CHATrO   	__enter__r   r   r   r   r   r   r   r   r   rn   r   rm   r9   r9   r:   _new_chat_completion_common  s.   
r   c                    &   d
dd t d fdd	}|S )Nr   r   r   r   r4   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StopIterationr   rI   sysexc_infor   rc   r   sendr   r   r   generesultr  r9   r9   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 Nrk   r[   r^   r   r/   r   r   r   r  r   r9   r:   _sentry_patched_create_sync  s   zA_wrap_chat_completion_create.<locals>._sentry_patched_create_syncr   r   r   r   r   r   r4   r   r   r   r   r   r4   r   r   r   r  r9   r  r:   r=        
r=   c                    r  )Nr   r   r   r   r4   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	  r9   r9   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   r9   r:   _sentry_patched_create_async  s
   zH_wrap_async_chat_completion_create.<locals>._sentry_patched_create_asyncr  r  r   r   r  r9   r  r:   r?     r  r?   c                 o   s    t  t}|d u r| |i |S |d}t jtjjd| tj	d}t
||| | ||fV }t||||dd |W  d    S 1 sHw   Y  d S )Nr   zembeddings r   Fr   )r[   r^   r   r/   r   r   r   r   GEN_AI_EMBEDDINGSrO   r   r   )r   r   r   r   r   rn   rm   r9   r9   r:   _new_embeddings_create_common  s    
$r  c                    r  )Nr   r   r   r   r4   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)rU   r  r  r  r   rI   r  r  r   rc   r   r  r	  r9   r9   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  r9   r:   r       z<_wrap_embeddings_create.<locals>._sentry_patched_create_syncr  r  r   r  r9   r  r:   r@        
r@   c                    r  )Nr   r   r   r   r4   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 r   r!  r	  r9   r9   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  r9   r:   r  ?  
   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_asyncr  r  r   r  r9   r  r:   rA   )  r$  rA   c                 o   s    t  t}|d u r| |i |S |d}t jtjjd| tj	d}|
  t||| t }| ||fV }t|||||dd |S )Nr   z
responses r   Tr   )r[   r^   r   r/   r   r   r   r   GEN_AI_RESPONSESrO   r   r   r   r   r   r   r9   r9   r:   _new_responses_create_commonJ  s    
r(  c                    r  )Nr   r   r   r   r4   c                 _   r  r<   r(  r  r  r   rI   r  r  r   rc   r   r  r	  r9   r9   r:   r  c  r  z-_wrap_responses_create.<locals>._execute_syncc                     r"  r<   r  r  r  r9   r:   r  x  r#  z;_wrap_responses_create.<locals>._sentry_patched_create_syncr  r  r   r  r9   r  r:   rC   b  r$  rC   c                    r  )Nr   r   r   r   r4   c                    r  r<   r)  r	  r9   r9   r:   r    r  z4_wrap_async_responses_create.<locals>._execute_asyncc                     r%  r<   r  r  r  r9   r:   _sentry_patched_responses_async  r&  zE_wrap_async_responses_create.<locals>._sentry_patched_responses_asyncr  r  r   )r   r*  r9   r  r:   rD     r$  rD   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$   rg   r#   )r+  r9   r9   r:   r     s
   r   )T)rk   rl   rm   r   rn   r    ro   rp   rJ   rq   r4   N)r   r   r4   r   )rn   r    r   r   r4   N)rn   r    r   r   r   r/   r4   N)NTr  )r   rq   r4   rq   )r   r   r4   r   )ar  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"   r0   r#   r$   ImportError!openai.resources.chat.completionsr%   r&   openai.resourcesr'   r(   openai.types.chatr)   r*   r+   rB   openai.resources.responsesr,   r-   /openai.types.responses.response_completed_eventr.   r/   rP   rc   rS   rj   r   r   r   r   r   r   r   r   r=   r?   r  r@   rA   r(  rC   rD   r   r9   r9   r9   r:   <module>   s   (
(
G


X
7
 
 
X
"
"
"

!
!

!!