o
    h]                     @   s  d dl mZ d dlZd dlmZ d dlmZ d dl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 d dlmZ er`d dlmZmZmZmZmZmZmZ d dlmZ z0zd dl m!Z! W n e"yt   dZ!Y nw d dl#m$Z$m%Z% d dl&m'Z'm(Z( erd dl)m*Z*m+Z+ W n e"y   edw dZ,zd dl-m.Z.m/Z/ d dl0m1Z1 W n e"y   dZ,Y nw G dd deZ2d5ddZ3dd Z4dd Z5dd  Z6d5d!d"Z7d#d$ Z8d%d& Z9d'd( Z:d)d* Z;d+d, Z<d-d. Z=d/d0 Z>d1d2 Z?d3d4 Z@dS )6    wrapsN)consts)record_token_usage)set_data_normalized)SPANDATA)DidNotEnableIntegration)should_send_default_pii)set_span_errored)capture_internal_exceptionsevent_from_exceptionsafe_serialize)TYPE_CHECKING)AnyIterableListOptionalCallableAsyncIteratorIterator)Span)	NOT_GIVEN)CompletionsAsyncCompletions)
EmbeddingsAsyncEmbeddings)ChatCompletionMessageParamChatCompletionChunkzOpenAI not installedT)	ResponsesAsyncResponses)ResponseCompletedEventFc                   @   s8   e Zd ZdZde ZdddZedd Zd	d
 ZdS )OpenAIIntegrationopenaizauto.ai.TNc                 C   s0   || _ d | _|d urdd l}||| _d S d S Nr   )include_promptstiktoken_encodingtiktokenget_encoding)selfr%   tiktoken_encoding_namer'    r+   `/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/sentry_sdk/integrations/openai.py__init__2   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    r+   r+   r+   r,   
setup_once<   s   zOpenAIIntegration.setup_oncec                 C   s   | j d urt| j |S dS r$   )r&   lenencode_ordinary)r)   sr+   r+   r,   count_tokensK   s   
zOpenAIIntegration.count_tokens)TN)	__name__
__module____qualname__
identifieroriginr-   staticmethodr7   r;   r+   r+   r+   r,   r"   .   s    



r"   c                 C   sZ   t  }t| |r|d ur|d d d  t| t  jdddd\}}t j||d d S )Nr#   F)typehandled)client_options	mechanism)hint)
sentry_sdkget_current_spanr   __exit__r   
get_clientoptionscapture_event)excmanual_span_cleanupcurrent_spaneventrF   r+   r+   r,   _capture_exceptionR   s   
rQ   c                 C   s6   |D ]}t | |rtt| |trt| |  S qdS r$   )hasattr
isinstancegetattrint)usagenamesnamer+   r+   r,   
_get_usaged   s
   rY   c                 C   sj  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rj| pIg D ]}
t|
tr^d|
v r^|||
d 7 }qJt|
tri|||
7 }qJ|dkr|d ur~|D ]}
|||
7 }qtnt |dr|jD ]}t |dr|||j	7 }q|pd }|pd }|pd }|pd }|	pd }	t
||||||	d d S )Nr   rV   input_tokensprompt_tokensinput_tokens_detailscached_tokensoutput_tokenscompletion_tokensoutput_tokens_detailsreasoning_tokenstotal_tokenscontentchoicesmessage)rZ   input_tokens_cachedr^   output_tokens_reasoningrb   )rR   rY   rV   r\   r`   rS   dictstrrd   re   r   )messagesresponsespanstreaming_message_responsesr;   rZ   rf   r^   rg   rb   re   choicer+   r+   r,   _calculate_token_usagel   sb   








ro   c           
      C   s  | d}|d u r| d}t|tr|g}|d ur/t|dkr/t r/|jr/t| tj|dd t| tj	d t| tj
| tjtjtjtjtjtjtjd}| D ]\}}| |}|turi|d urit| || qR| d}	|	tur|	d urt|	dkrt| tjt|	 d S d S d S d S )	Nrj   inputr   Funpackr#   )modelstream
max_tokenspresence_penaltyfrequency_penaltytemperaturetop_ptools)getrS   ri   r8   r
   r%   r   r   GEN_AI_REQUEST_MESSAGESGEN_AI_SYSTEMGEN_AI_OPERATION_NAME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   GEN_AI_REQUEST_AVAILABLE_TOOLSr   )
rl   kwargs	operationintegrationrj   kwargs_keys_to_attributeskey	attributevaluerz   r+   r+   r,   _set_input_data   sF   



	

r   c              
      sf  t drttjj |dd u r|dd ur'ttr'gt dr]t rGj	rGdd j
D }t|dkrGt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 |  qp|jdkr|jD ]}z
|d |j W q ty   |d |  Y qw qpt|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 fdd}	 fdd}
ttjdkr|
 _d S |	 _d S td j r1d d d  d S d S )Nrs   rj   rp   rd   c                 S   s   g | ]}|j  qS r+   )re   rh   ).0rn   r+   r+   r,   
<listcomp>       z$_set_output_data.<locals>.<listcomp>r   output)rk   toolfunction_callr   re   rk   Frq   	_iteratorc               	   3   s   d} D ]z}t  j t|dr@d}|jD ])}t|dr:t|jdr:|jj}t |kr1 g   | |p8d |d7 }qnt|drZt dkrP g   d |jpXd trmt|t	rmt
|jd j d} W d    n1 sww   Y  |V  qt  - 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 )NTrd   r   deltarc       Fc                 S      g | ]}d  |qS r   joinr   chunkr+   r+   r,   r   B  r   z:_set_output_data.<locals>.new_iterator.<locals>.<listcomp>r   rR   rd   r   rc   r8   appendr4   rS   r!   ro   rk   r;   r
   r%   r   r   GEN_AI_RESPONSE_TEXTrI   count_tokens_manuallyxchoice_indexrn   rc   all_responsesdata_buffinish_spanr   rj   old_iteratorrk   rl   r+   r,   new_iterator  sh   





z&_set_output_data.<locals>.new_iteratorc               	     s  d} 2 z~3 d H W }t  j t|drDd}|jD ])}t|dr>t|jdr>|jj}t |kr5 g   | |p<d |d7 }qnt|dr^t dkrT g   d |jp\d trqt|t	rqt
|jd j d} W d    n1 s{w   Y  |V  q6 t  - 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 )NTrd   r   r   rc   r   r   Fc                 S   r   r   r   r   r+   r+   r,   r   z  r   z@_set_output_data.<locals>.new_iterator_async.<locals>.<listcomp>r   r   r   r+   r,   new_iterator_asyncS  sj   





"z,_set_output_data.<locals>.new_iterator_asyncz<class 'async_generator'>)rR   r   r   GEN_AI_RESPONSE_MODELrs   r{   rS   ri   r
   r%   rd   r8   r   ro   r;   rI   r   rB   r   rh   rc   textAttributeErrorGEN_AI_RESPONSE_TOOL_CALLSr   )rl   rk   r   r   r   response_textoutput_messagesr   output_messager   r   r+   r   r,   _set_output_data   sv   








87r   c                 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}d}t jtj	j
| d| tjd}|  t|||| | ||fV }t||||dd |S )Nrj   rs   chat oprX   r@   Tr   )rG   rJ   get_integrationr"   iter	TypeErrorr{   
start_spanr   OPGEN_AI_CHATr@   	__enter__r   r   fargsr   r   rs   r   rl   rk   r+   r+   r,   _new_chat_completion_common  s.   
r   c                    "   dd  t  fdd}|S )Nc              
   _      t | g|R i |}z	t|\} }}W n ty) } z	|jW  Y d }~S d }~ww z#z	| |i |}W n tyG } zt| |d d }~ww ||W S  tyb } z	|jW  Y d }~S d }~ww r.   r   nextStopIterationr   	ExceptionrQ   sendr   r   r   generesultr+   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 Nrj   rG   rJ   r   r"   r   r   r   r   r   r+   r,   _sentry_patched_create_sync  s   zA_wrap_chat_completion_create.<locals>._sentry_patched_create_syncr   r   r   r+   r   r,   r/        	r/   c                    r   )Nc              
         t | g|R i |}z	t|\} }}W n ty- } z|jI d H W  Y d }~S d }~ww z&z| |i |I d H }W n tyN } zt| |d d }~ww ||W S  tyi } z	|jW  Y d }~S d }~ww r.   r   r   r+   r+   r,   _execute_async  *   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,   r1     r   r1   c                 o   s    t  t}|d u r| |i |S |d}d}t jtjj| d| tj	d }t
|||| | ||fV }t||||dd |W  d    S 1 sMw   Y  d S )Nrs   
embeddingsr   r   Fr   )rG   rJ   r   r"   r{   r   r   r   GEN_AI_EMBEDDINGSr@   r   r   r   r+   r+   r,   _new_embeddings_create_common  s"   
$r   c                    r   )Nc              
   _   s   t | g|R i |}z	t|\} }}W n ty) } z	|jW  Y d }~S d }~ww z%z	| |i |}W n tyI } z	t|dd |d d }~ww ||W S  tyd } z	|jW  Y d }~S d }~ww NF)rN   r   r   r   r   r   rQ   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,   r2        r2   c                    r   )Nc              
      s   t | g|R i |}z	t|\} }}W n ty- } z|jI d H W  Y d }~S d }~ww z(z| |i |I d H }W n tyP } z	t|dd |d d }~ww ||W S  tyk } z	|jW  Y d }~S d }~ww r   r   r   r+   r+   r,   r   8  s*   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   L  
   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_asyncr   r   r+   r   r,   r3   6  r   r3   c                 o   s    t  t}|d u r| |i |S |d}d}t jtjj| d| tj	d}|
  t|||| | ||fV }t||||dd |S )Nrs   	responsesr   r   Tr   )rG   rJ   r   r"   r{   r   r   r   GEN_AI_RESPONSESr@   r   r   r   r   r+   r+   r,   _new_responses_create_commonX  s    
r   c                    r   )Nc              
   _   r   r.   r   r   r   r   r   rQ   r   r   r+   r+   r,   r   s  r   z-_wrap_responses_create.<locals>._execute_syncc                     r   r.   r   r   r   r+   r,   r     r   z;_wrap_responses_create.<locals>._sentry_patched_create_syncr   r   r+   r   r,   r5   q  r   r5   c                    r   )Nc              
      r   r.   r   r   r+   r+   r,   r     r   z4_wrap_async_responses_create.<locals>._execute_asyncc                     r   r.   r   r   r   r+   r,   _sentry_patched_responses_async  r   zE_wrap_async_responses_create.<locals>._sentry_patched_responses_asyncr   )r   r   r+   r   r,   r6     r   r6   )T)A	functoolsr   rG   r   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   sentry_sdk.constsr   sentry_sdk.integrationsr   r	   sentry_sdk.scoper
   sentry_sdk.tracing_utilsr   sentry_sdk.utilsr   r   r   typingr   r   r   r   r   r   r   r   sentry_sdk.tracingr   r#   r   ImportError!openai.resources.chat.completionsr   r   openai.resourcesr   r   openai.types.chatr   r   r4   openai.resources.responsesr   r    /openai.types.responses.response_completed_eventr!   r"   rQ   rY   ro   r   r   r   r/   r1   r   r2   r3   r   r5   r6   r+   r+   r+   r,   <module>   sf    $
$=
0 <###"""