o
    BDi<                     @   sT  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mZ d d
lmZ erXd dlmZmZmZmZmZmZmZ d dlmZ zd dlmZmZ d dl m!Z!m"Z" ersd dl#m$Z$m%Z% W n e&y   edw G dd deZ'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd  Z.d!d" Z/dS )#    wrapsN)consts)record_token_usage)set_data_normalized)SPANDATA)DidNotEnableIntegration)should_send_default_pii)capture_internal_exceptionsevent_from_exception)TYPE_CHECKING)AnyIterableListOptionalCallableAsyncIteratorIterator)Span)CompletionsAsyncCompletions)
EmbeddingsAsyncEmbeddings)ChatCompletionMessageParamChatCompletionChunkzOpenAI not installedc                   @   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%   W/var/www/Datamplify/venv/lib/python3.10/site-packages/sentry_sdk/integrations/openai.py__init__#   s   zOpenAIIntegration.__init__c                   C   s4   t tjt_ttjt_ttjt_ttjt_d S N)	_wrap_chat_completion_creater   create_wrap_embeddings_creater   "_wrap_async_chat_completion_creater   _wrap_async_embeddings_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_tokens8   s   
zOpenAIIntegration.count_tokens)TN)	__name__
__module____qualname__
identifieroriginr'   staticmethodr.   r2   r%   r%   r%   r&   r      s    




r   c                 C   s0   t | t jdddd\}}tj||d d S )Nr   F)typehandled)client_options	mechanism)hint)r   
sentry_sdk
get_clientoptionscapture_event)exceventr=   r%   r%   r&   _capture_exception?   s   
rD   c           
      C   s2  d}d}d}t |dr>t |jdrt|jjtr|jj}t |jdr-t|jjtr-|jj}t |jdr>t|jjtr>|jj}|dkrS| D ]}d|v rR|||d 7 }qD|dkr~|d urg|D ]}|||7 }q]nt |dr~|jD ]}	t |	dr}|||	j7 }qo|dkrd }|dkrd }|dkrd }t	|||| d S )	Nr   usagecompletion_tokensprompt_tokenstotal_tokenscontentchoicesmessage)
hasattrrE   
isinstancerF   intrG   rH   rJ   rK   r   )
messagesresponsespanstreaming_message_responsesr2   rF   rG   rH   rK   choicer%   r%   r&    _calculate_chat_completion_usageI   sL   



rT   c                 /   s.   t  td u r| |i |S d|vr| |i |S zt|d  W n ty6   | |i | Y S w t|d |d< |d |d}|d}t jt	j
jdtjd  | ||fV t  t rsjrsttj ttj| ttj| tdrt rjrttjttdd j td j d d d  nHtd	rg  j fd
d} fdd}ttjdkr| _n*| _ntdd d d d  W d    S W d    S W d    S W d    S 1 sw   Y  S )NrO   modelstreamzChat Completion)opnamer7   rJ   c                 S   s   | j S r(   )rK   )xr%   r%   r&   <lambda>   s    z-_new_chat_completion_common.<locals>.<lambda>	_iteratorc                  3   s    t  i D ]9} t| dr=d}| jD ])}t|dr8t|jdr8|jj}t |kr/ g   | |p6d |d7 }q| V  qt dkrfttdd  }t	 r]j
r]ttj| t|j W d    n1 spw   Y  d d d  d S )	NrJ   r   deltarI       c                 S   
   d | S Nr]   joinchunkr%   r%   r&   rZ         
 zC_new_chat_completion_common.<locals>.new_iterator.<locals>.<lambda>r   rL   rJ   r\   rI   r/   appendlistmapr
   r   r   r   AI_RESPONSESrT   r2   __exit__rY   choice_indexrS   rI   all_responsesdata_bufintegrationrO   old_iteratorresrQ   r%   r&   new_iterator   sB   



z1_new_chat_completion_common.<locals>.new_iteratorc                    s  t  n 2 z=3 d H W } t| drAd}| jD ])}t|dr<t|jdr<|jj}t |kr3 g   | |p:d |d7 }q| V  q6 t dkrkttdd  }t	 rbj
rbttj| t|j W d    n1 suw   Y  d d d  d S )	NrJ   r   r\   rI   r]   r^   c                 S   r_   r`   ra   rc   r%   r%   r&   rZ      re   zI_new_chat_completion_common.<locals>.new_iterator_async.<locals>.<lambda>rf   rl   ro   r%   r&   new_iterator_async   sD   



z7_new_chat_completion_common.<locals>.new_iterator_asyncz<class 'async_generator'>unknown_responseT) r>   r?   get_integrationr   iter	TypeErrorrh   get
start_spanr   OPOPENAI_CHAT_COMPLETIONS_CREATEr7   	__enter__r   r
   r   r   r   AI_INPUT_MESSAGESAI_MODEL_IDAI_STREAMINGrL   rj   ri   rJ   rT   r2   rk   r[   strr9   )fargskwargsrU   	streamingrt   ru   r%   ro   r&   _new_chat_completion_commonu   sz   



!!


a
a
a
aar   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StopIterationvalue	ExceptionrD   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 NrO   r>   r?   rw   r   r   r   rq   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_async0  s
   zH_wrap_async_chat_completion_create.<locals>._sentry_patched_create_asyncr   r   r   r%   r   r&   r,     r   r,   c                 o   s   t  t}|d u r| |i |S t jtjjdtjd}d|v r\t	 r\|j
r\t|d tr;t|tj|d g n!t|d tr\t|d dkr\t|d d tr\t|tj|d  d|v rit|tj|d  | ||fV }d}d}t|drt|jdrt|jjtr|jj}t|jdrt|jjtr|jj}|dkr||d pd	}t||d |p| |W  d    S 1 sw   Y  d S )
NzOpenAI Embedding Creation)rW   descriptionr7   inputr   rU   rE   rG   rH   r]   )r>   r?   rw   r   r{   r   r|   OPENAI_EMBEDDINGS_CREATEr7   r
   r   rM   r   r   r   r   rh   r/   r   rL   rE   rG   rN   rH   r2   r   )r   r   r   rq   rQ   rP   rG   rH   r%   r%   r&   _new_embeddings_create_common=  sT   
$r   c                    r   )Nc              
   _   r   r(   r   r   r   r   r   rD   r   r   r%   r%   r&   r   n  r   z._wrap_embeddings_create.<locals>._execute_syncc                     s:   t  t}|d u r| i |S  g| R i |S r(   r   r   r   r%   r&   r     s   z<_wrap_embeddings_create.<locals>._sentry_patched_create_syncr   r   r%   r   r&   r+   l     r+   c                    r   )Nc              
      r   r(   r   r   r%   r%   r&   r     r   z5_wrap_async_embeddings_create.<locals>._execute_asyncc                     sH   t  t}|d u r| i |I d H S  g| R i |I d H S r(   r   r   r   r%   r&   r     s
   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_asyncr   r   r%   r   r&   r-     r   r-   )0	functoolsr   r>   r   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   sentry_sdk.constsr   sentry_sdk.integrationsr   r	   sentry_sdk.scoper
   sentry_sdk.utilsr   r   typingr   r   r   r   r   r   r   r   sentry_sdk.tracingr   !openai.resources.chat.completionsr   r   openai.resourcesr   r   openai.types.chatr   r   ImportErrorr   rD   rT   r   r)   r,   r   r+   r-   r%   r%   r%   r&   <module>   s@    $ 
, ##/"