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m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 d d
lmZ d dlmZ eeZedi  defddZdeeef fddZee Zejejejddej iej!ej"dej#ej$ej%ddej&idej'idej(idej)iej*ej+ej,ej-ej.dej/ej0dd
Z1dZ2dd Z3dd Z4dd Z5dd  Z6d!d" Z7d#d$ Z8G d%d& d&Z9d'd( Z:d)d* Z;dS )+    N)version)config)_endpoint_hooks)unwrap)wrap)
get_logger)deep_getattr)parse_version)OpenAIIntegration)traceropenaireturnc                   C   s   t jS N)r   VERSION r   r   Y/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/openai/patch.pyget_version   s   r   c                   C   s   ddiS )Nr   z>=1.0r   r   r   r   r   _supported_versions   s   r   )listretrievedeletecreate)r   parse)generateeditcreate_variation)r   r   r   r   retrieve_content)
zmodels.Modelszcompletions.Completionszchat.Completionszimages.Imageszaudio.Transcriptionszaudio.Translationszembeddings.Embeddingszmoderations.Moderationszfiles.Fileszresponses.Responsesz_dd.with_raw_responsec               	   C   s  t tddrd S tdk rtdt d S ttjtd} | t_tdkr/ttdt	 ttdt	 nttd	t	 ttd
t
 ttdt
 ttdt
 ttdt
 ttdt ttdt ttdt ttdt ztd W n	 tyu   Y nw t D ]L\}}ttj|d u rtd| qz| D ]4\}}d||}dd|d|}tt|d urtt|t| tt|d urtt|t| qqzdt_d S )N__datadog_patchF   r   r   Qopenai version %s is not supported, please upgrade to openai version 1.0 or later)integration_configr   r      r   z,_base_client.SyncAPIClient._process_responsez-_base_client.AsyncAPIClient._process_responsez)_base_client.BaseClient._process_responsezOpenAI.__init__zAsyncOpenAI.__init__zAzureOpenAI.__init__zAsyncAzureOpenAI.__init__z2resources.chat.CompletionsWithRawResponse.__init__z-resources.CompletionsWithRawResponse.__init__z7resources.chat.AsyncCompletionsWithRawResponse.__init__z2resources.AsyncCompletionsWithRawResponse.__init__zopenai.resources.responsesz!WARNING: resource %s is not foundzresources.{}.{}.Async.T)getattrr   OPENAI_VERSIONlogwarningr
   r   _datadog_integrationr   traced_converttraced_client_init)traced_completions_with_raw_response_init	importlibimport_moduleImportError
_RESOURCESitemsr   	resourcesdebugformatjoinsplit_patched_endpoint_patched_endpoint_asyncr   )integrationresourcemethod_hook_dictmethod_nameendpoint_hooksync_methodasync_methodr   r   r   patchQ   sT   
rA   c               	   C   sn  t tddsd S tdk rtdt d S dt_tdkr*ttjjd ttjj	d nttjj
d ttjd ttjd ttjd ttjd ttjjjd ttjjd ttjjjd ttjjd t D ]D\} }ttj| d u rxqk| D ]2\}}ttj| }ttjd| d	}|d urt||rt|| |d urt||rt|| q|qkttd
 d S )Nr   Fr   r    r"   _process_response__init__r$   r%   r*   )r&   r   r'   r(   r)   r   r   _base_clientSyncAPIClientAsyncAPIClient
BaseClientOpenAIAsyncOpenAIAzureOpenAIAsyncAzureOpenAIr3   chatCompletionsWithRawResponseAsyncCompletionsWithRawResponser1   r2   r   r6   r7   hasattrdelattr)r;   r<   r=   _sync_resourceasync_resourcer   r   r   unpatch   s>   

rT   c                 C   s   | |i | t j}||_dS )z
    Patch for `openai.OpenAI/AsyncOpenAI` client init methods to add
    the client object to the OpenAIIntegration object.
    N)r   r*   _client)funcinstanceargskwargsr:   r   r   r   r,      s   r,   c                 C   s   | |i | t |drXt|tjjjrt|dttj	 dS t|tjj
jr2t|dttj dS t|tjjjrEt|dttj	 dS t|tjj
jrVt|dttj dS dS )z
    Patch create method of CompletionsWithRawResponse classes to catch requests that use with_raw_response wrapper
    since the response for these streamed requests cannot be traced and we therefore need to avoid creating
    spans for these cases.
    r   N)rO   
isinstancer   r3   completionsrM   r   r8   r   _CompletionWithRawResponseHookrL   "_ChatCompletionWithRawResponseHookrN   r9   )rV   rW   rX   rY   r   r   r   r-      s   
r-   c           
   
   c   s&   |j | j|d}d\}}zr|  d |||||}|d  d V \}}|d ur.|jt   z	|||f W n2 tyi }	 z&|d u r_|	jW  Y d }	~	W |	drY|d usY|d u r^|
  S S W Y d }	~	nd }	~	ww W |	drx|d usx|d u r~|
  d S d S |	dr|d us|d u r|
  w w )N)rW   NNstream)traceOPERATION_IDhandle_requestsendset_exc_infosysexc_infoStopIterationvaluegetfinish)
r>   r:   rW   rX   rY   spanresperrhooker   r   r   _traced_endpoint   s4   



rp   c                        fdd}|S )Nc           
         sZ   t ju s
 t ju rd|t< | |i |S |tdr(|ddr(| |i |S tj}t ||||}|	d  d\}}d }z=z	| |i |}W n t
yW }	 z|	} d }	~	ww W z	|	||f W nB ty{ }	 z|d u rq|	j}W Y d }	~	n.d }	~	ww z	|	||f W w  ty }	 z|d u r|	j}W Y d }	~	w W Y d }	~	w d }	~	ww |d ur|S d S )NTFr_   r^   )r   r]   r\   OPENAI_WITH_RAW_RESPONSE_ARGpopri   r   r*   rp   rc   BaseExceptionrg   rh   )
rV   rW   rX   rY   r:   grl   rm   override_returnro   
patch_hookr   r   patched_endpoint   sJ   


z+_patched_endpoint.<locals>.patched_endpointr   rx   ry   r   rw   r   r8      s   r8   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	_TracedAsyncPaginatorzXWrapper for AsyncPaginator objects to enable tracing for both await and async for usage.c                 C   s(   || _ || _|| _|| _|| _|| _d S r   )
_paginator_integration_patch_hook	_instance_args_kwargs)self	paginatorr:   rx   rW   rX   rY   r   r   r   rC   	  s   
z_TracedAsyncPaginator.__init__c                    s    fdd}| S )Nc                    s&  t  j j j j j} | d  d }d}zez3 j }|	 I d H }z	| d d}W n t
y9   d}Y nw |V  |2 z	3 d H W }|V  q?6 W n tyT   Y n tyb } z|} d }~ww W |s{z
| d |f W d S  t
yz   Y d S w d S |sz	| d |f W w  t
y   Y w w w )NFr^   T)rp   r~   r}   r   r   r   rc   r|   	__aiter__	__anext__rg   StopAsyncIterationrt   )ru   rm   	completediterator
first_itemitemro   r   r   r   _traced_aiter  sN   


z6_TracedAsyncPaginator.__aiter__.<locals>._traced_aiterr   )r   r   r   r   r   r     s   z_TracedAsyncPaginator.__aiter__c                    s    fdd}|   S )Nc                     s  t  j j j j j} | d  d\}}zEz jI d H }W n ty/ } z|} d }~ww W z
| ||f W |S  t	y\ } z|d u rQ|j
}W Y d }~|S W Y d }~|S d }~ww z	| ||f W w  t	y } z|d u r{|j
}W Y d }~w W Y d }~w d }~ww Nr^   )rp   r~   r}   r   r   r   rc   r|   rt   rg   rh   )ru   rl   rm   ro   r   r   r   _trace_and_await3  s>   

z9_TracedAsyncPaginator.__await__.<locals>._trace_and_await)	__await__)r   r   r   r   r   r   2  s   
z_TracedAsyncPaginator.__await__N)__name__
__module____qualname____doc__rC   r   r   r   r   r   r   r{     s
    !r{   c                    rq   )Nc                    s   t ju s
t ju rdt< |  i S tdr(ddr(|  i S |  i tdrCtdrCttj	 S  fdd}| S )NTFr_   r   r   c                     s  t j} t|  }|d  d\}}d }z;zI d H }W n ty. } z|} d }~ww W z	|||f W nB tyR } z|d u rH|j}W Y d }~n.d }~ww z	|||f W w  ty{ } z|d u rq|j}W Y d }~w W Y d }~w d }~ww |d ur|S |S r   )r   r*   rp   rc   rt   rg   rh   )r:   ru   rl   rm   rv   ro   )rX   rW   rY   rx   resultr   r   async_wrapperX  s@   
zH_patched_endpoint_async.<locals>.patched_endpoint.<locals>.async_wrapper)
r   r]   r\   rr   rs   ri   rO   r{   r   r*   )rV   rW   rX   rY   r   rw   )rX   rW   rY   r   r   ry   H  s   

z1_patched_endpoint_async.<locals>.patched_endpointr   rz   r   rw   r   r9   G  s   (r9   c           	      C   sZ  t  }|s| |i |S tdk r'|d }t|tjjs#| |i |S |j}n	|di }|j	}|
ddur>| |i |S |drN|d}|d| |drd|d}|durd|dt| |d	rz|d	}|durz|d
t| |dr|d}|dur|dt| |dr|d}|dur|dt| | |i |S )z@Patch convert captures header information in the openai responser   r   responsezopenai.organization.nameNzopenai-organizationzx-ratelimit-limit-requestsz,openai.organization.ratelimit.requests.limitzx-ratelimit-limit-tokensz*openai.organization.ratelimit.tokens.limitzx-ratelimit-remaining-requestsz0openai.organization.ratelimit.requests.remainingzx-ratelimit-remaining-tokensz.openai.organization.ratelimit.tokens.remaining)r   current_spanr'   rZ   r   openai_responseOpenAIResponse_headersri   headersget_tag_set_tag_str
set_metricint)	rV   rW   rX   rY   rk   rl   r   org_namevr   r   r   r+   s  s@   









r+   )<r.   re   r   r   ddtracer   ddtrace.contrib.internal.openair   ddtrace.contrib.trace_utilsr   r   ddtrace.internal.loggerr   ddtrace.internal.utils.formatsr   ddtrace.internal.utils.versionr	   ddtrace.llmobs._integrationsr
   ddtrace.tracer   r   r(   _addstrr   dictr   r'   _ModelListHook_ModelRetrieveHook_ModelDeleteHook_CompletionHook_ChatCompletionHook_ChatCompletionParseHook_ImageCreateHook_ImageEditHook_ImageVariationHook_AudioTranscriptionHook_AudioTranslationHook_EmbeddingHook_ModerationHook_FileCreateHook_FileRetrieveHook_FileListHook_FileDeleteHook_FileDownloadHook_ResponseHook_ResponseParseHookr1   rr   rA   rT   r,   r-   rp   r8   r{   r9   r+   r   r   r   r   <module>   sv    
+3&#A,