o
    0 ia                     @   s4  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	 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rdd dlmZmZmZmZmZmZmZ d dl m!Z! zDzd dl"m#Z# W n e$yx   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+ erd dl,m-Z-m.Z. W n e$y   edw dZ/zd dl0m1Z1m2Z2 d dl3m4Z4 W n e$y   dZ/Y nw G dd deZ5d8ddZ6dd Z7dd Z8d d! Z9d8d"d#Z:d$d% Z;d&d' Z<d(d) Z=d*d+ Z>d,d- Z?d.d/ Z@d0d1 ZAd2d3 ZBd4d5 ZCd6d7 ZDdS )9    wrapsN)consts)record_token_usage)set_data_normalizednormalize_message_rolestruncate_and_annotate_messages)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)NotGiven)Omit)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tiktokenZget_encoding)selfr(   Ztiktoken_encoding_namer*    r,   j/home/app/PaddleOCR-VL-test/.venv_paddleocr/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#   r,   r,   r,   r-   
setup_onceE   s   zOpenAIIntegration.setup_oncec                 C   s   | j d urt| j |S dS r'   )r)   lenZencode_ordinary)r+   sr,   r,   r-   count_tokensT   s   
zOpenAIIntegration.count_tokens)TN)	__name__
__module____qualname__
identifieroriginr.   staticmethodr8   r;   r,   r,   r,   r-   r%   7   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)typeZhandled)Zclient_optionsZ	mechanism)hint)
sentry_sdkZget_current_spanr   __exit__r   
get_clientoptionsZcapture_event)excmanual_span_cleanupZcurrent_spaneventrC   r,   r,   r-   _capture_exception[   s   
rK   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_usagem   s
   rS   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   rP   input_tokensZprompt_tokensinput_tokens_detailsZcached_tokensoutput_tokensZcompletion_tokensoutput_tokens_detailsZreasoning_tokenstotal_tokenscontentchoicesmessage)rT   input_tokens_cachedrV   output_tokens_reasoningrX   )rL   rS   rP   rU   rW   rM   dictstrrZ   r[   r   )messagesresponsespanZstreaming_message_responsesr;   rT   r\   rV   r]   rX   r[   choicer,   r,   r-   _calculate_token_usageu   sb   








rd   c                 C   s@  | d}|d u r| d}t|tr|g}|d urAt|dkrAt rA|jrAt|}t }t	|| |}|d urAt
| 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 ]\}	}
| |	}|d ur{t|r{t
| |
| qd| d}|d urt|rt|dkrt
| tjt| d S d S d S d S )	Nr`   inputr   Funpackr&   )modelstreamZ
max_tokensZpresence_penaltyZfrequency_penaltyZtemperatureZtop_ptools)getrM   r_   r9   r   r(   r   rD   Zget_current_scoper   r   r	   ZGEN_AI_REQUEST_MESSAGESZGEN_AI_SYSTEMZGEN_AI_OPERATION_NAMEZGEN_AI_REQUEST_MODELZGEN_AI_RESPONSE_STREAMINGZGEN_AI_REQUEST_MAX_TOKENSZGEN_AI_REQUEST_PRESENCE_PENALTYZ GEN_AI_REQUEST_FREQUENCY_PENALTYZGEN_AI_REQUEST_TEMPERATUREZGEN_AI_REQUEST_TOP_Pitems	_is_givenZGEN_AI_REQUEST_AVAILABLE_TOOLSr   )rb   kwargs	operationintegrationr`   Znormalized_messagesscopeZmessages_dataZkwargs_keys_to_attributeskey	attributevaluerj   r,   r,   r-   _set_input_data   sN   



	

ru   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 )Nrh   r`   re   rZ   c                 S   s    g | ]}|j d ur|j  qS r/   )r[   Z
model_dump).0rc   r,   r,   r-   
<listcomp>   s
    
z$_set_output_data.<locals>.<listcomp>r   output)ra   toolZfunction_callry   r[   ra   Frf   	_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 )NTrZ   r   deltarY       Fc                 S      g | ]}d  |qS r|   joinrv   chunkr,   r,   r-   rw   S      z:_set_output_data.<locals>.new_iterator.<locals>.<listcomp>r   rL   rZ   r{   rY   r9   appendr5   rM   r$   rd   ra   r;   r   r(   r   r	   GEN_AI_RESPONSE_TEXTrE   Zcount_tokens_manuallyxZchoice_indexrc   rY   Zall_responsesZdata_buffinish_spanrp   r`   Zold_iteratorra   rb   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 )NTrZ   r   r{   rY   r|   r}   Fc                 S   r~   r   r   r   r,   r,   r-   rw     r   z@_set_output_data.<locals>.new_iterator_async.<locals>.<listcomp>r   r   r   r,   r-   new_iterator_asyncd  sj   





"z,_set_output_data.<locals>.new_iterator_asyncz<class 'async_generator'>)rL   r   r	   ZGEN_AI_RESPONSE_MODELrh   rk   rM   r_   r   r(   rZ   r9   r   rd   r;   rE   rx   rB   r   r^   rY   textAttributeErrorZGEN_AI_RESPONSE_TOOL_CALLSrz   )rb   ra   rn   rp   r   Zresponse_textZoutput_messagesrx   Zoutput_messager   r   r,   r   r-   _set_output_data   sz   








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 )Nr`   rh   Zchat oprR   r@   Tr   )rD   rF   get_integrationr%   iter	TypeErrorrk   
start_spanr   OPZGEN_AI_CHATr@   	__enter__ru   r   fargsrn   rp   rh   ro   rb   ra   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StopIterationrt   	ExceptionrK   sendr   r   rn   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 Nr`   rD   rF   r   r%   r   rn   rp   r   r   r,   r-   _sentry_patched_create_sync  s   zA_wrap_chat_completion_create.<locals>._sentry_patched_create_syncr   r   r   r,   r   r-   r0        	r0   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-   r2     r   r2   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 )Nrh   Z
embeddingsr   r   Fr   )rD   rF   r   r%   rk   r   r   r   ZGEN_AI_EMBEDDINGSr@   ru   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)rI   r   r   r   rt   r   rK   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-   r3   %     r3   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   I  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   ]  
   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_asyncr   r   r,   r   r-   r4   G  r   r4   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 )Nrh   	responsesr   r   Tr   )rD   rF   r   r%   rk   r   r   r   ZGEN_AI_RESPONSESr@   r   ru   r   r   r,   r,   r-   _new_responses_create_commoni  s    
r   c                    r   )Nc              
   _   r   r/   r   r   r   rt   r   rK   r   r   r,   r,   r-   r     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-   r6     r   r6   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-   r7     r   r7   c                 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   rM   r   )objr,   r,   r-   rm     s
   rm   )T)E	functoolsr   rD   r   Zsentry_sdk.ai.monitoringr   Zsentry_sdk.ai.utilsr   r   r   Zsentry_sdk.constsr	   Zsentry_sdk.integrationsr
   r   Zsentry_sdk.scoper   Zsentry_sdk.tracing_utilsr   Zsentry_sdk.utilsr   r   r   typingr   r   r   r   r   r   r   r   Zsentry_sdk.tracingr   r&   r   ImportErrorr   Z!openai.resources.chat.completionsr   r   Zopenai.resourcesr   r   Zopenai.types.chatr    r!   r5   Zopenai.resources.responsesr"   r#   Z/openai.types.responses.response_completed_eventr$   r%   rK   rS   rd   ru   r   r   r0   r2   r   r3   r4   r   r6   r7   rm   r,   r,   r,   r-   <module>   sr    $
$=
4 @###""""