o
    Zh+                     @   sz  d dl mZ d dlmZ er$d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dl Z d dlmZ d dlmZmZ d dlmZmZ d d	lmZmZmZ zd d
lmZ d dlmZ er_d dlmZmZ W n e yk   edw zd dl!Z!e!"dZ#dd Z$e%d W n e y   e&d dd Z$Y nw dZ'dZ(dZ)G dd deZ*dd Z+dd Z,dd Z-	d%dd Z.d!d" Z/d#d$ Z0dS )&    )consts)TYPE_CHECKING)AnyIterableListOptionalCallableIterator)SpanNwraps)Hub_should_send_default_pii)DidNotEnableIntegration)loggercapture_internal_exceptionsevent_from_exception)Completions)
Embeddings)ChatCompletionMessageParamChatCompletionChunkzOpenAI not installedZcl100k_basec                 C   s   t t| S N)lenencZencode_ordinarys r   U/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/integrations/openai.pycount_tokens   s   r   z'[OpenAI] using tiktoken to count tokenszThe Sentry Python SDK requires 'tiktoken' in order to measure token usage from some OpenAI APIsPlease install 'tiktoken' if you aren't receiving token usage in Sentry.See https://docs.sentry.io/platforms/python/integrations/openai/ for more information.c                 C   s   dS )Nr   r   r   r   r   r   r   (   s   u   ai.completion_tоkens.usedu   ai.prompt_tоkens.usedu   ai.total_tоkens.usedc                   @   s&   e Zd ZdZdddZedd ZdS )	OpenAIIntegrationopenaiTc                 C   s
   || _ d S r   )include_prompts)selfr"   r   r   r   __init__5   s   
zOpenAIIntegration.__init__c                   C   s   t tjt_ttjt_d S r   )_wrap_chat_completion_creater   create_wrap_embeddings_creater   r   r   r   r   
setup_once9   s   zOpenAIIntegration.setup_onceN)T)__name__
__module____qualname__
identifierr$   staticmethodr(   r   r   r   r   r    2   s
    
r    c                 C   s<   | j d urt|| j jdddd\}}| j||d d S d S )Nr!   F)typeZhandled)Zclient_optionsZ	mechanism)hint)clientr   optionsZcapture_event)hubexceventr/   r   r   r   _capture_exception@   s   

r5   c              
   C   s   t | dr%z|  W S  ty$ } ztd| | W  Y d }~S d }~ww t| tr3tdd | D S t| trAdd |  D S | S )N
model_dumpz+Could not convert pydantic data to JSON: %sc                 s   s    | ]}t |V  qd S r   _normalize_data).0xr   r   r   	<genexpr>W   s    z"_normalize_data.<locals>.<genexpr>c                 S   s   i | ]	\}}|t |qS r   r7   )r9   kvr   r   r   
<dictcomp>Y   s    z#_normalize_data.<locals>.<dictcomp>)	hasattrr6   	Exceptionr   warning
isinstancelistdictitems)dataer   r   r   r8   L   s   



r8   c                 C   s   |  |t| d S r   )set_datar8   )spankeyvaluer   r   r   set_data_normalized]   s   rL   c           	      C   sP  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|t|d 7 }qD|dkr~|d urg|D ]}|t|7 }q]nt |dr~|jD ]}t |dr}|t|j	7 }qo|dkr|| }|dkrt
|t| |dkrt
|t| |dkrt
|t| d S d S )	Nr   usagecompletion_tokensprompt_tokenstotal_tokenscontentchoicesmessage)r?   rM   rB   rN   intrO   rP   r   rR   rS   rL   COMPLETION_TOKENS_USEDPROMPT_TOKENS_USEDTOTAL_TOKENS_USED)	messagesresponserI   Zstreaming_message_responsesrN   rO   rP   rS   choicer   r   r    _calculate_chat_completion_usageb   sP   



r[   c                       t   fdd}|S )Nc               
      s  t j}|s| i |S |ts| i |S d|vr%| i |S zt|d  W n ty=   | i | Y S w t|d |d< |d |d}|d}tj	t
jjdd  z	| i |W n ty } ztt j| d d d  |d d }~ww t p t rjrtd td| td| td	rt rjrtd
ttdd j t d d d  n'tdrg  j fdd}| _ntdd d d d  W  d    S 1 sw   Y  d S )NrX   modelstreamzChat Completionopdescriptionai.input_messagesai.model_idzai.streamingrR   ai.responsesc                 S   s   | j S r   )rS   )r:   r   r   r   <lambda>   s    zK_wrap_chat_completion_create.<locals>.new_chat_completion.<locals>.<lambda>	_iteratorc                  3   s    t  f 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rcttdd  }t	 r\j
r\td	| t| W d    n1 smw   Y  d d d  d S )
NrR   r   deltarQ       c                 S   s
   d | S )Nrh   )join)chunkr   r   r   re      s   
 za_wrap_chat_completion_create.<locals>.new_chat_completion.<locals>.new_iterator.<locals>.<lambda>rd   )r   r?   rR   rg   rQ   r   appendrC   mapr   r"   rL   r[   __exit__)r:   Zchoice_indexrZ   rQ   Zall_responsesZdata_bufintegrationrX   Zold_iteratorresrI   r   r   new_iterator   s<   



zO_wrap_chat_completion_create.<locals>.new_chat_completion.<locals>.new_iteratorZunknown_responseT)r   currentget_integrationr    iter	TypeErrorrC   get
sentry_sdk
start_spanr   OPZOPENAI_CHAT_COMPLETIONS_CREATE	__enter__r@   r5   rn   r   r   r"   rL   r?   rm   rR   r[   rf   )argskwargsr2   r]   Z	streamingrG   rr   fro   r   new_chat_completion   sh   





$z9_wrap_chat_completion_create.<locals>.new_chat_completionr   )r   r   r   r~   r   r%      s   ]r%   c                    r\   )Nc            	         s  t j}|s | i |S |t}|s | i |S tjtjjdd}d|v r_t	 r_|j
r_t|d tr?t|d|d g n t|d tr_t|d dkr_t|d d tr_t|d|d  d|v rkt|d|d  z	 | i |}W n ty } z	tt j| |d d }~ww 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rt|d pd}|dkr|}t|t| t|t| |W  d    S 1 sw   Y  d S )NzOpenAI Embedding Creationr_   inputrb   r   r]   rc   rM   rO   rP   rh   )r   rs   rt   r    rx   ry   r   rz   ZOPENAI_EMBEDDINGS_CREATEr   r"   rB   strrL   rC   r   r@   r5   r?   rM   rO   rT   rP   r   rV   rW   )	r|   r}   r2   rp   rI   rY   rG   rO   rP   r~   r   r   new_embeddings_create   sh   

$z6_wrap_embeddings_create.<locals>.new_embeddings_creater   )r   r   r   r~   r   r'      s   9r'   r   )1rx   r   Zsentry_sdk._typesr   typingr   r   r   r   r   r	   Zsentry_sdk.tracingr
   Zsentry_sdk._functoolsr   Zsentry_sdk.hubr   r   Zsentry_sdk.integrationsr   r   Zsentry_sdk.utilsr   r   r   Z!openai.resources.chat.completionsr   Zopenai.resourcesr   Zopenai.types.chatr   r   ImportErrorZtiktokenZget_encodingr   r   debuginforU   rV   rW   r    r5   r8   rL   r[   r%   r'   r   r   r   r   <module>   sR     

.c