
    Uvh<                     R   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rd dlmZmZmZmZmZmZmZ d dlmZ 	 d dlmZmZ d dl m!Z!m"Z" erd dl#m$Z$m%Z%  G d de      Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/y# e&$ r	  ed      w xY w)    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                   8    e Zd ZdZde ZddZed        Zd Zy)OpenAIIntegrationopenaizauto.ai.Nc                 Z    || _         d | _        |dd l}|j                  |      | _        y y Nr   )include_promptstiktoken_encodingtiktokenget_encoding)selfr"   tiktoken_encoding_namer$   s       Y/opt/face_recognition/venv/lib/python3.12/site-packages/sentry_sdk/integrations/openai.py__init__zOpenAIIntegration.__init__#   s4    .!%!-%-%:%:;Q%RD" .    c                     t        t        j                        t        _        t        t        j                        t        _        t        t        j                        t        _        t        t        j                        t        _        y N)	_wrap_chat_completion_creater   create_wrap_embeddings_creater   "_wrap_async_chat_completion_creater   _wrap_async_embeddings_creater    r*   r(   
setup_oncezOpenAIIntegration.setup_once-   sV     :+:L:LM3J4E4EF
"D###
 "??U?U!Vr*   c                 d    | j                   $t        | j                   j                  |            S yr!   )r#   lenencode_ordinary)r&   ss     r(   count_tokenszOpenAIIntegration.count_tokens8   s-    !!-t--==a@AAr*   )TN)	__name__
__module____qualname__
identifieroriginr)   staticmethodr3   r8   r2   r*   r(   r   r      s4    J
|$FS W Wr*   r   c                     t        | t        j                         j                  ddd      \  }}t        j                  ||       y )Nr   F)typehandled)client_options	mechanism)hint)r   
sentry_sdk
get_clientoptionscapture_event)exceventrD   s      r(   _capture_exceptionrK   ?   s?    &!,,.66#6KE4
 U.r*   c                 >   d}d}d}t        |d      rt        |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(  r| D ]  }d|v s| ||d         z  } |dk(  rT||D ]  }| ||      z  } n?t        |d      r3|j                  D ]$  }	t        |	d      s| ||	j                        z  }& |dk(  rd }|dk(  rd }|dk(  rd }t        ||||       y )	Nr   usagecompletion_tokensprompt_tokenstotal_tokenscontentchoicesmessage)
hasattrrM   
isinstancerN   intrO   rP   rR   rS   r   )
messagesresponsespanstreaming_message_responsesr8   rN   rO   rP   rS   choices
             r(    _calculate_chat_completion_usager\   I   s    MLx!8>>#67JNN,,c=
 !) @ @8>>?3
NN((#9
 %NN88M8>>>2zNN''8
 $>>66L 	BGG#gi.@!AA	B A&26 ;!\'%::!;Xy)"** F69-%fnn)EE%F A qt],=|Lr*   c              /   *  	
K   t        j                         j                  t               | |i |S d|vr | |i |S 	 t	        |d          t        |d         |d<   |d   	|j                  d      }|j                  d      }t        j                  t        j                  j                  dt        j                        j                          | ||ft               5  t               r'j                   rt#        t$        j&                  	       t#        t$        j(                  |       t#        t$        j*                  |       t-        d      r|t               rEj                   r9t#        t$        j.                  t        t1        d j2                                     t5        	d j6                         j9                  d d d        nt-        d      r]g j:                  
	
fd	}	
fd
}t=        t?        j:                              dk(  r |       _        n- |       _        n t#        dd       j9                  d d d        d d d        S # t
        $ r  | |i |cY S w xY w# 1 sw Y   S xY ww)NrW   modelstreamzChat Completion)opnamer=   rR   c                     | j                   S r,   )rS   )xs    r(   <lambda>z-_new_chat_completion_common.<locals>.<lambda>   s
    qyy r*   	_iteratorc               3     K   t               5  D ]  } t        | d      rd}| j                  D ]v  }t        |d      rct        |j                  d      rM|j                  j                  }t              |k  rj                  g        |   j                  |xs d       |dz  }x |   t              dkD  r`t        t        d             }t               r'j                  rt        
t        j                  |       t        	
|j                         d d d        
j!                  d d d        y # 1 sw Y   xY ww)NrR   r   deltarQ       c                 $    dj                  |       S Nrh   joinchunks    r(   rd   zC_new_chat_completion_common.<locals>.new_iterator.<locals>.<lambda>       bggen r*   r   rT   rR   rg   rQ   r5   appendlistmapr   r"   r   r   AI_RESPONSESr\   r8   __exit__rc   choice_indexr[   rQ   all_responsesdata_bufintegrationrW   old_iteratorresrY   s        r(   new_iteratorz1_new_chat_completion_common.<locals>.new_iterator   s7    02 )  "1i0+,L*+)) 2#*67#;$*LL)A" /5ll.B.BG'*8}'D(0(;$,\$:$A$A'-R$P , 12    8}q((, <hG) 349T9T/ $h&;&;] 9$ )'44-: dD$/; s   EDD7E7E <Ec                   K   t               5  2 3 d {   } t        | d      rd}| j                  D ]v  }t        |d      rct        |j                  d      rM|j                  j                  }t              |k  rj                  g        |   j                  |xs d       |dz  }x |  7 6 t              dkD  r`t        t        d             }t               r'j                  rt        
t        j                  |       t        	
|j                         d d d        n# 1 sw Y   nxY w
j!                  d d d        y w)NrR   r   rg   rQ   rh   ri   c                 $    dj                  |       S rk   rl   rn   s    r(   rd   zI_new_chat_completion_common.<locals>.new_iterator_async.<locals>.<lambda>   rp   r*   rq   rw   s        r(   new_iterator_asyncz7_new_chat_completion_common.<locals>.new_iterator_async   s@    02 #/    a"1i0+,L*+)) 2#*67#;$*LL)A" /5ll.B.BG'*8}'D(0(;$,\$:$A$A'-R$P , 12   < 8}q((, <hG) 349T9T/ $h&;&;] 9$ )'44-  : dD$/s>   ED-B5B3B5BD-3B55A/D-$	E-D62Ez<class 'async_generator'>unknown_responseT) rE   rF   get_integrationr   iter	TypeErrorrs   get
start_spanr   OPOPENAI_CHAT_COMPLETIONS_CREATEr=   	__enter__r   r   r"   r   r   AI_INPUT_MESSAGESAI_MODEL_IDAI_STREAMINGrT   ru   rt   rR   r\   r8   rv   re   strr@   )fargskwargsr^   	streamingr~   r   rz   r{   rW   r|   r}   rY   s          @@@@@@r(   _new_chat_completion_commonr   u   sU    '')99:KLK$!&!!$!&!!"VJ 
 fZ01F:j!HJJwE

8$I  9933 ''D
 	NN4
C	$	& `,"$)D)Dh&@&@(KD("6"6>D("7"7C3	"&([-H-H#))0#++>?
 -#tT;+C+C MM$d+S+&(*H==L0 0B0 0B 4&'+FF 2 4 ,  &8$?MM$d+A`,B Jg  "$!&!!"$`,B JsC   >JI/ BJ,E9J%
J/J JJJJJc                 8     d t                fd       }|S )Nc                 <   t        | g|i |}	 t        |      \  } }}	 	  | |i |}|j                  |      S # t        $ r}|j                  cY d }~S d }~ww xY w# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wr,   r   nextStopIterationvalue	ExceptionrK   sendr   r   r   generesults         r(   _execute_syncz3_wrap_chat_completion_create.<locals>._execute_sync   s    )!=d=f=	"3iOAtV		"D+F+
 88F##  	77N	  ""1%T!"
  	77N	U   ; A A< 	AAAA	A9&A44A99A< <	BBBBc                      t        j                         j                  t              }|d|vr | i |S  g| i |S NrW   rE   rF   r   r   r   r   r{   r   r   s      r(   _sentry_patched_create_synczA_wrap_chat_completion_create.<locals>._sentry_patched_create_sync  sQ     !++-==>OP*F":d%f%%Q0000r*   r   r   r   r   s   ` @r(   r-   r-      s(    ( 1X1 1 '&r*   c                 8     d t                fd       }|S )Nc                 j  K   t        | g|i |}	 t        |      \  } }}	 	  | |i | d {   }|j                  |      S # t        $ r}|j                   d {  7  cY d }~S d }~ww xY w7 @# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wwr,   r   r   s         r(   _execute_asyncz:_wrap_async_chat_completion_create.<locals>._execute_async  s     )!=d=f=	!"3iOAtV		" $1&11
 88F##  	!== 	!
 2 ""1%T!"
  	77N	   B3A A2 A0A2 B B3	A-A(A A("A-#B3(A--B30A2 2	B;B		BB 	B0B+%B0&B3+B00B3c                     K   t        j                         j                  t              }|d|vr | i | d {   S  g| i | d {   S 7 7 wr   r   r   r   r{   r   r   s      r(   _sentry_patched_create_asynczH_wrap_async_chat_completion_create.<locals>._sentry_patched_create_async0  sd      !++-==>OP*F":D+F+++#A77777 ,7s!   9AAAAAAr   r   r   r   s   ` @r(   r0   r0     s(    ( 1X8 8 ('r*   c              /   r  K   t        j                         j                  t              }| | |i |S t        j                  t
        j                  j                  dt        j                        5 }d|v rt               r|j                  rt        |d   t              r t        |t        j                  |d   g       nXt        |d   t               rEt#        |d         dkD  r4t        |d   d   t              rt        |t        j                  |d          d|v rt        |t        j$                  |d          | ||f}d}d}t'        |d      rt'        |j(                  d      r:t        |j(                  j*                  t,              r|j(                  j*                  }t'        |j(                  d      r:t        |j(                  j.                  t,              r|j(                  j.                  }|dk(  r|j1                  |d   xs d	      }t3        ||d |xs |       |cd d d        S # 1 sw Y   y xY ww)
NzOpenAI Embedding Creation)r`   descriptionr=   inputr   r^   rM   rO   rP   rh   )rE   rF   r   r   r   r   r   OPENAI_EMBEDDINGS_CREATEr=   r   r"   rU   r   r   r   r   rs   r5   r   rT   rM   rO   rV   rP   r8   r   )r   r   r   r{   rY   rX   rO   rP   s           r(   _new_embeddings_create_commonr   =  s    '')99:KLK$!&!!			99--/ ''
 & 
f#%+*E*E&/3/#D(*D*DvgFWX6'?D1w(1,vgq137#D(*D*DfWoVfh&:&:F7OLD&(8W%x~~7J,,c= !) < <x~~~6:++S<  (~~::A'44VG_5JKM4l6SmTM& & &s   A0H72F/H+!
H7+H40H7c                 8     d t                fd       }|S )Nc                 <   t        | g|i |}	 t        |      \  } }}	 	  | |i |}|j                  |      S # t        $ r}|j                  cY d }~S d }~ww xY w# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wr,   r   r   r   r   r   rK   r   r   s         r(   r   z._wrap_embeddings_create.<locals>._execute_syncn  s    +A???	"3iOAtV		"D+F+
 88F##  	77N	  ""1%T!"
  	77N	r   c                  ~    t        j                         j                  t              }| | i |S  g| i |S r,   r   r   s      r(   r   z<_wrap_embeddings_create.<locals>._sentry_patched_create_sync  sJ     !++-==>OPd%f%%Q0000r*   r   r   s   ` @r(   r/   r/   l  s(    ( 1X1 1 '&r*   c                 8     d t                fd       }|S )Nc                 j  K   t        | g|i |}	 t        |      \  } }}	 	  | |i | d {   }|j                  |      S # t        $ r}|j                   d {  7  cY d }~S d }~ww xY w7 @# t        $ r}t        |       |d d }~ww xY w# t        $ r}|j                  cY d }~S d }~ww xY wwr,   r   r   s         r(   r   z5_wrap_async_embeddings_create.<locals>._execute_async  s     +A???	!"3iOAtV		" $1&11
 88F##  	!== 	!
 2 ""1%T!"
  	77N	r   c                     K   t        j                         j                  t              }| | i | d {   S  g| i | d {   S 7 7 wr,   r   r   s      r(   r   zC_wrap_async_embeddings_create.<locals>._sentry_patched_create_async  s]      !++-==>OPD+F+++#A77777 ,7s!   5AAAAAAr   r   s   ` @r(   r1   r1     s(    ( 1X8 8 ('r*   )0	functoolsr   rE   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   rK   r\   r   r-   r0   r   r/   r1   r2   r*   r(   <module>r      s       7 3 & = 4
 !WWW'/O<U
 @/)MXD 'F (F,^'D(g  /
-
../s   B B&