
    jKj)j                        d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
 	 d dlZd dlmZ d dlmZmZmZmZmZ d dlmZmZmZmZmZ d d	lmZmZ d d
lm Z! d dl"m#Z#  G d dejH                        Z$dee%   dee%   deee%ef      de&deee%ef      defdZ' G d de#      Z( G d de#      Z) G d de#      Z* G d de#      Z+ G d de#      Z, G d d e#      Z- G d! d"e#      Z.y# e$ r	  ed      w xY w)#    N)AnyDictListOptional)AsyncStreamWrapper)
TokenUsagezGPlease install the OpenAI SDK to use this feature: 'pip install openai')setup)call_llm_and_track_usage_asyncextract_available_tool_callsget_model_paramsmerge_usage_statswith_privacy_mode)extract_openai_usage_from_chunk!extract_openai_content_from_chunk$extract_openai_tool_calls_from_chunkaccumulate_openai_tool_callsformat_openai_streaming_output)sanitize_openaisanitize_openai_response)Client)_OpenAIWrapperResourcec                   <     e Zd ZU dZeed<   ddee   f fdZ xZS )AsyncOpenAIzf
    An async wrapper around the OpenAI SDK that automatically sends LLM usage events to PostHog.
    
_ph_clientposthog_clientc                    t        |   di | |xs
 t               | _        t	        | dd      | _        t	        | dd      | _        t	        | dd      | _        t	        | dd      | _        | j
                  t        | | j
                        | _
        | j                  t        | | j                        | _        | j                  t        | | j                        | _        | j                  t        | | j                        | _        yy)a  
        Args:
            posthog_client: If provided, events will be captured via this client
                instead of the global ``posthog`` client.
            **kwargs: Arguments passed to ``openai.AsyncOpenAI`` such as
                ``api_key`` or ``organization``.
        chatN
embeddingsbeta	responses )super__init__r	   r   getattr_original_chat_original_embeddings_original_beta_original_responsesWrappedChatr   WrappedEmbeddingsr   WrappedBetar   WrappedResponsesr    )selfr   kwargs	__class__s      o/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/ai/openai/openai_async.pyr#   zAsyncOpenAI.__init__*   s     	"6"(3EG &dFD9$+D,$E!%dFD9#*4d#C  *#D$*=*=>DI$$0/d6O6OPDO*#D$*=*=>DI##/-dD4L4LMDN 0    )N)	__name__
__module____qualname____doc__PostHogClient__annotations__r   r#   __classcell__)r/   s   @r0   r   r   #   s)     Nx'> N Nr1   r   posthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr.   c                    K   t        || j                  j                  d||||| j                  j                  | j                  j
                  f	i | d {   S 7 w)Nopenai)r
   _clientr   base_url	_originalparse)wrapperr9   r:   r;   r<   r=   r.   s          r0   _parse_and_trackrE   J   sd      0""      s   AAAAc                      e Zd ZdZ	 	 	 	 	 ddee   dee   deeeef      dedeeeef      defd	Z	dee   dee   deeeef      dedeeeef      defd
Z
	 	 	 ddee   dee   deeeef      dedeeeef      deeef   dedededeeeeef         dee   dee   fdZ	 	 	 	 	 ddee   dee   deeeef      dedeeeef      defdZy)r,   z@Async wrapper for OpenAI responses that tracks usage in PostHog.Nr9   r:   r;   r<   r=   r.   c                 b  K   |t        t        j                               }|j                  dd      r | j                  |||||fi | d{   S t        || j                  j                  d||||| j                  j                  | j                  j                  f	i | d{   S 7 \7 w)a  
        Create an OpenAI Responses API response while tracking usage in PostHog.

        Args:
            posthog_distinct_id: Optional distinct ID to associate with the usage event.
            posthog_trace_id: Optional trace ID. Generated automatically when omitted.
            posthog_properties: Additional properties to include with the usage event.
            posthog_privacy_mode: Whether to redact captured input and output.
            posthog_groups: Optional PostHog groups to associate with the event.
            **kwargs: Arguments passed to OpenAI's async ``responses.create`` API.

        Returns:
            The OpenAI response, or an async streaming iterator when ``stream=True``.
        NstreamFr?   struuiduuid4get_create_streamingr
   r@   r   rA   rB   creater-   r9   r:   r;   r<   r=   r.   s          r0   rO   zWrappedResponses.created   s     . #"4::<0::h&///# "$    4LL## LL!!NN!!
 
 
 	

s%   AB/B+AB/&B-'B/-B/c                     	
K   t        j                          t               g d 	d   j                  j                  di  d {   
	
 fd}t	         |       
      S 7 'w)Nc                 
  K   	 2 3 d {   } t        | d      r:| j                  r.	,t        | j                  d      r| j                  j                  	t        | d      }|rt	        |       t        | d      }|j                  |       t        | d      rB| j                  dk(  r3t        | d      r'| j                  rt        | j                  dd       }|||  7 6 	 t        j                         }|z
  }}j                  
||t        d      	       d {  7   y # t        j                         }|z
  }}j                  
||t        d      	       d {  7   w xY ww)	Nresponsemodelr    typezresponse.completedstatusr?   stop_reason)hasattrrS   rT   r   r   r   appendrU   r$   time_capture_streaming_eventr   )chunkchunk_usagecontentchunk_statusend_timelatencyoutputfinal_contentr.   model_from_responser9   r=   r<   r;   r:   rS   r-   
start_timerX   usage_statss          r0   async_generatorz;WrappedResponses._create_streaming.<locals>.async_generator   s    4#+  %uj1enn.67!NNG< 38..2F2F/ #B%"UK")+{C @{SG*%,,W5  v.!JJ*>>#E:6!NN'.u~~x'N'3*6KK? 8D  99;"Z/&33'$&("06B' + 4   	  99;"Z/&33'$&("06B' + 4   sW   FD3 C%C#C%CD3 #C%%D3 'AF,D/-F3AF 9E<:F  FrH   r!   r[   r   rB   rO   r   )r-   r9   r:   r;   r<   r=   r.   rh   rd   re   rS   rf   rX   rg   s   ``````` @@@@@@r0   rN   z"WrappedResponses._create_streaming   sp      YY[
",,-1%)...888:	 :	 :	x "/"3HEE} 9s   AA=A;(A=rg   rb   rc   available_tool_callsre   rX   c                 T  K   |t        t        j                               }|j                  d      xs |xs d}d|t	        |      t        | j                  j                  |t        |j                  d                  t        | j                  j                  |t        |	d            d|j                  dd      |j                  d	d      |j                  d
d      |j                  dd      ||t        | j                  j                        d|xs i }|j                  d      }|t        |t              r
|dkD  r||d<   |||d<   |
r|
|d<   |d|d<   t        | j                  j                  d      r.| j                  j                  j                  |xs |d||       y y w)NrT   unknownr?   inputr       input_tokensr   output_tokenscache_read_input_tokensreasoning_tokens$ai_provider	$ai_modelz$ai_model_parameters	$ai_inputz$ai_output_choices$ai_http_status$ai_input_tokensz$ai_output_tokensz$ai_cache_read_input_tokensz$ai_reasoning_tokens$ai_latency$ai_trace_id$ai_base_urlweb_search_count$ai_web_search_count$ai_stop_reason	$ai_toolsF$process_person_profilecapture$ai_generationdistinct_idevent
propertiesgroups)rJ   rK   rL   rM   r   r   r@   r   r   r   rA   
isinstanceintrY   r   )r-   r9   r:   r;   r<   r=   r.   rg   rb   rc   rk   re   rX   rT   event_propertiesr}   s                   r0   r\   z)WrappedResponses._capture_streaming_event   s     #"4::<0 

7#G':Gi %$4V$<*''$(G)<=
 #4''$.v{C#
  # + B!,!!D+6??)1, %0OO4F$J", 5 56/
0 "'R1
8 '??+=>(+S1 1$7G34"2=./,@[)&:?674<<**I6LL##++/C3C&+%	 ,  7s   F&F(c                 @   K   t        | |||||fi | d{   S 7 w)a  
        Parse structured output using OpenAI's 'responses.parse' method, but also track usage in PostHog.

        Args:
            posthog_distinct_id: Optional ID to associate with the usage event.
            posthog_trace_id: Optional trace UUID for linking events.
            posthog_properties: Optional dictionary of extra properties to include in the event.
            posthog_privacy_mode: Whether to anonymize the input and output.
            posthog_groups: Optional dictionary of groups to associate with the event.
            **kwargs: Any additional parameters for the OpenAI Responses Parse API.

        Returns:
            The response from OpenAI's responses.parse call.
        NrE   rP   s          r0   rC   zWrappedResponses.parse-  ;     . & 
 
 
 	
 
   NNNFN)NNN)r2   r3   r4   r5   r   rJ   r   r   boolrO   rN   r   floatr   r\   rC   r!   r1   r0   r,   r,   a   s4   J .2*.7;%*37/
%c]/
 #3-/
 %T#s(^4	/

 #/
 !c3h0/
 /
bLF%c]LF #3-LF %T#s(^4	LF
 #LF !c3h0LF LFr @D-1%)H%c]H #3-H %T#s(^4	H
 #H !c3h0H S#XH  H H H 'tDcN';<H &c]H c]HX .2*.7;%*37
%c]
 #3-
 %T#s(^4	

 #
 !c3h0
 
r1   r,   c                        e Zd ZdZed        Zy)r)   z;Async wrapper for OpenAI chat that tracks usage in PostHog.c                 V    t        | j                  | j                  j                        S )z:Access async chat completions with PostHog usage tracking.)WrappedCompletionsr@   rB   completionsr-   s    r0   r   zWrappedChat.completionsR  s     "$,,0J0JKKr1   Nr2   r3   r4   r5   propertyr   r!   r1   r0   r)   r)   O  s    EL Lr1   r)   c                      e Zd ZdZ	 	 	 	 	 ddee   dee   deeeef      dedeeeef      defd	Z		 	 	 	 	 ddee   dee   deeeef      dedeeeef      defd
Z
dee   dee   deeeef      dedeeeef      defdZ	 	 	 	 ddee   dee   deeeef      dedeeeef      deeef   dedededeeeeef         deeeeef         dee   dee   fdZy)r   zGAsync wrapper for OpenAI chat completions that tracks usage in PostHog.Nr9   r:   r;   r<   r=   r.   c                 @   K   t        | |||||fi | d{   S 7 w)a  
        Parse an OpenAI chat completion while tracking usage in PostHog.

        Args:
            posthog_distinct_id: Optional distinct ID to associate with the usage event.
            posthog_trace_id: Optional trace ID. Generated automatically when omitted.
            posthog_properties: Additional properties to include with the usage event.
            posthog_privacy_mode: Whether to redact captured input and output.
            posthog_groups: Optional PostHog groups to associate with the event.
            **kwargs: Arguments passed to OpenAI's async ``chat.completions.parse`` API.

        Returns:
            The parsed response from OpenAI.
        Nr   rP   s          r0   rC   zWrappedCompletions.parse[  r   r   c                 f  K   |t        t        j                               }|j                  dd      r | j                  |||||fi | d{   S t        || j                  j                  d||||| j                  j                  | j                  j                  f	i | d{   }|S 7 ^7 w)a  
        Create an OpenAI chat completion while tracking usage in PostHog.

        Args:
            posthog_distinct_id: Optional distinct ID to associate with the usage event.
            posthog_trace_id: Optional trace ID. Generated automatically when omitted.
            posthog_properties: Additional properties to include with the usage event.
            posthog_privacy_mode: Whether to redact captured input and output.
            posthog_groups: Optional PostHog groups to associate with the event.
            **kwargs: Arguments passed to OpenAI's async ``chat.completions.create`` API.

        Returns:
            The OpenAI chat completion, or an async streaming iterator when ``stream=True``.
        NrH   Fr?   rI   )r-   r9   r:   r;   r<   r=   r.   rS   s           r0   rO   zWrappedCompletions.create|  s     . #"4::<0 ::h&///# "$    8LL## LL!!NN!!
 
 
 +
s%   AB1B-AB1&B/'B1/B1c                 (   	
K   t        j                          t               g i 	d 
d dvri d<   dd   d<     j                  j                  di  d {   	
 fd}t	         |             S 7 (w)Nstream_optionsTinclude_usagec                 N  K   	 2 3 d {   } 
t        | d      r| j                  
t        | d      }|rt        |       t	        | d      }|j                  |       t        |       }|rt        |       t        | d      r?| j                  r3t        | j                  d   dd       | j                  d   j                  |  7 6 	 t        j                         }|z
  }rt        j                               nd }j                  	||t        d	      
       d {  7   y # t        j                         }|z
  }rt        j                               nd }j                  	||t        d	      
       d {  7   w xY ww)NrT   r   choicesr   finish_reasonr?   rW   )rY   rT   r   r   r   rZ   r   r   r   r$   r   r[   listvaluesr\   r   )r]   r^   r_   chunk_tool_callsra   rb   tool_calls_listaccumulated_contentaccumulated_tool_callsr.   re   r9   r=   r<   r;   r:   rS   r-   rf   rX   rg   s          r0   rh   z=WrappedCompletions._create_streaming.<locals>.async_generator  s    :#+  %*2wug7N.3kk+ #B%"PK")+{C @vNG*+227; (LE'R$'424D  y1!MM#EMM!$4otLX&+mmA&6&D&DK= 8B  99;"Z/
 . /6689   33'$&("'#06B' + 4     99;"Z/
 . /6689   33'$&("'#06B' + 4   sW   F%D9 CCCB>D9 CD9 A!F%2D53F%9A"F"FF""F%ri   r!   rj   )r-   r9   r:   r;   r<   r=   r.   rh   r   r   re   rS   rf   rX   rg   s   ``````` @@@@@@@r0   rN   z$WrappedCompletions._create_streaming  s      YY[
",, <>-1%)6)')F#$48 1...888A	 A	 A	F "/"3HEEK 9s   AB'B()Brg   rb   rc   
tool_callsrk   re   rX   c                 V  K   |t        t        j                               }|j                  d      xs |xs d}d|t	        |      t        | j                  j                  |t        |j                  d                  t        | j                  j                  |t        |	d|
            d|j                  dd      |j                  d	d      |j                  d
d      |j                  dd      ||t        | j                  j                        d|xs i }|j                  d      }|t        |t              r
|dkD  r||d<   |||d<   |r||d<   |d|d<   t        | j                  j                  d      r.| j                  j                  j                  |xs |d||       y y w)NrT   rm   r?   messagesr   ro   rp   r   rq   rr   rs   rt   r}   r~   r   r   Fr   r   r   r   )rJ   rK   rL   rM   r   r   r@   r   r   r   rA   r   r   rY   r   )r-   r9   r:   r;   r<   r=   r.   rg   rb   rc   r   rk   re   rX   rT   r   r}   s                    r0   r\   z+WrappedCompletions._capture_streaming_event	  s      #"4::<0 

7#G':Gi %$4V$<*''$

: 67
 #4''$.vvzJ#
  # + B!,!!D+6??)1, %0OO4F$J", 5 56/
0 "'R1
8 '??+=> (+S1 1$7G34"2=./,@[)&:?674<<**I6LL##++/C3C&+%	 ,  7s   F'F)r   )NNNN)r2   r3   r4   r5   r   rJ   r   r   r   rC   rO   rN   r   r   r   r\   r!   r1   r0   r   r   X  sR   Q .2*.7;%*37
%c]
 #3-
 %T#s(^4	

 #
 !c3h0
 
F .2*.7;%*371%c]1 #3-1 %T#s(^4	1
 #1 !c3h01 1fXF%c]XF #3-XF %T#s(^4	XF
 #XF !c3h0XF XFJ 6:?C-1%)J%c]J #3-J %T#s(^4	J
 #J !c3h0J S#XJ  J J J T$sCx.12J 'tDcN';<J &c]J c]Jr1   r   c                   h    e Zd ZdZ	 	 	 	 	 d
dee   dee   deeeef      dedeeeef      defd	Z	y)r*   zAAsync wrapper for OpenAI embeddings that tracks usage in PostHog.Nr9   r:   r;   r<   r=   r.   c                 V  K   |t        t        j                               }t        j                         } | j                  j
                  di | d{   }t        j                         }	t               }
t        |d      rC|j                  r7t        t        |j                  dd      t        |j                  dd            }
|	|z
  }d|j                  d      t        | j                  j                  |t        |j                  d	                  d
|
j                  dd      ||t        | j                  j                        d|xs i }|d|d<   t        | j                  j                  d      r-| j                  j                  j!                  |xs |d||       |S 7 Qw)a  
        Create an embedding using OpenAI's 'embeddings.create' method, but also track usage in PostHog.

        Args:
            posthog_distinct_id: Optional ID to associate with the usage event.
            posthog_trace_id: Optional trace UUID for linking events.
            posthog_properties: Optional dictionary of extra properties to include in the event.
            posthog_privacy_mode: Whether to anonymize the input and output.
            posthog_groups: Optional dictionary of groups to associate with the event.
            **kwargs: Any additional parameters for the OpenAI Embeddings API.

        Returns:
            The response from OpenAI's embeddings.create call.
        Nusageprompt_tokensr   completion_tokens)rp   rq   r?   rT   rn   ro   rp   )ru   rv   rw   rx   ry   rz   r{   r|   Fr   r   z$ai_embeddingr   r!   )rJ   rK   rL   r[   rB   rO   r   rY   r   r$   rM   r   r@   r   r   rA   r   )r-   r9   r:   r;   r<   r=   r.   rf   rS   ra   rg   rb   r   s                r0   rO   zWrappedEmbeddings.createY  s    0 #"4::<0YY[
...88899; #-,8W%(..$$X^^_aH%hnn6I1MK
 Z' %G,*''$(G)<=
  # + B", 5 56
 "'R
  &:?67 4<<**I6LL##++/C3C%+%	 ,  W 9s   AF)F&EF)r   )
r2   r3   r4   r5   r   rJ   r   r   r   rO   r!   r1   r0   r*   r*   V  s~    K .2*.7;%*37G%c]G #3-G %T#s(^4	G
 #G !c3h0G Gr1   r*   c                        e Zd ZdZed        Zy)r+   zDAsync wrapper for OpenAI beta features that tracks usage in PostHog.c                 V    t        | j                  | j                  j                        S )z8Access async beta chat APIs with PostHog usage tracking.)WrappedBetaChatr@   rB   r   r   s    r0   r   zWrappedBeta.chat  s     t||T^^-@-@AAr1   N)r2   r3   r4   r5   r   r   r!   r1   r0   r+   r+     s    NB Br1   r+   c                        e Zd ZdZed        Zy)r   z@Async wrapper for OpenAI beta chat that tracks usage in PostHog.c                 V    t        | j                  | j                  j                        S )z?Access async beta chat completions with PostHog usage tracking.)WrappedBetaCompletionsr@   rB   r   r   s    r0   r   zWrappedBetaChat.completions  s     &dllDNN4N4NOOr1   Nr   r!   r1   r0   r   r     s    JP Pr1   r   c                   h    e Zd ZdZ	 	 	 	 	 d
dee   dee   deeeef      dedeeeef      defd	Z	y)r   zLAsync wrapper for OpenAI beta chat completions that tracks usage in PostHog.Nr9   r:   r;   r<   r=   r.   c                 @   K   t        | |||||fi | d{   S 7 w)a  
        Parse an OpenAI beta chat completion while tracking usage in PostHog.

        Args:
            posthog_distinct_id: Optional distinct ID to associate with the usage event.
            posthog_trace_id: Optional trace ID. Generated automatically when omitted.
            posthog_properties: Additional properties to include with the usage event.
            posthog_privacy_mode: Whether to redact captured input and output.
            posthog_groups: Optional PostHog groups to associate with the event.
            **kwargs: Arguments passed to OpenAI's async beta ``chat.completions.parse`` API.

        Returns:
            The parsed response from OpenAI.
        Nr   rP   s          r0   rC   zWrappedBetaCompletions.parse  r   r   r   )
r2   r3   r4   r5   r   rJ   r   r   r   rC   r!   r1   r0   r   r     sw    V .2*.7;%*37
%c]
 #3-
 %T#s(^4	

 #
 !c3h0
 
r1   r   )/r[   rK   typingr   r   r   r   posthog.ai.streamr   posthog.ai.typesr   r?   ImportErrorModuleNotFoundErrorposthogr	   posthog.ai.utilsr
   r   r   r   r   "posthog.ai.openai.openai_converterr   r   r   r   r   posthog.ai.sanitizationr   r   posthog.clientr   r6   posthog.ai.openai.wrapper_utilsr   r   rJ   r   rE   r,   r)   r   r*   r+   r   r   r!   r1   r0   <module>r      sF     , , 0 '    N 2 B$N&$$ $NN!# sm !c3h0	
  T#s(^, .k
- k
\L( L{/ {|J. JZB( BP, P"
3 "
W  
Q s   C% %C3