
    gT                         	 d dl Z d dlmZ d dlZd dlZd dlmZm	Z	m
Z
 d dlmZmZmZmZ d dlmZ  G d de j&                        Z G d	 d
e      Zy# e$ r	  ed      w xY w)    N)AsyncMessageszMPlease install the Anthropic SDK to use this feature: 'pip install anthropic')AnyDictOptional)call_llm_and_track_usage_asyncget_model_paramsmerge_system_promptwith_privacy_mode)Clientc                   4     e Zd ZU dZeed<   def fdZ xZS )AsyncAnthropiczi
    An async wrapper around the Anthropic SDK that automatically sends LLM usage events to PostHog.
    
_ph_clientposthog_clientc                 R    t        |   di | || _        t        |       | _        y)z
        Args:
            posthog_client: PostHog client for tracking usage
            **kwargs: Additional arguments passed to the Anthropic client
        N )super__init__r   AsyncWrappedMessagesmessages)selfr   kwargs	__class__s      Y/var/www/openai/venv/lib/python3.12/site-packages/posthog/ai/anthropic/anthropic_async.pyr   zAsyncAnthropic.__init__   s(     	"6"(,T2    )__name__
__module____qualname____doc__PostHogClient__annotations__r   __classcell__r   s   @r   r   r      s!     3} 3 3r   r   c                       e Zd ZU eed<   	 	 	 	 	 ddee   dee   deeeef      de	deeeef      def 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 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eef   deeef   dedefdZ xZS )r   _clientposthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr   c                 :  K   |t        j                         }|j                  dd      r | j                  |||||fi | d{   S t	        || j
                  j                  d||||| j
                  j                  t        | $  f	i | d{   S 7 P7 w)a8  
        Create a message using Anthropic's API while tracking 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 redact sensitive information in tracking
            posthog_groups: Optional group analytics properties
            **kwargs: Arguments passed to Anthropic's messages.create
        NstreamF	anthropic)
uuiduuid4get_create_streamingr   r$   r   base_urlr   create)r   r%   r&   r'   r(   r)   r   r   s          r   r2   zAsyncWrappedMessages.create$   s     ( ##zz|::h&///# "$    4LL## LL!!GN
 
 
 	

s%   ABBABBBBc                 x   K   |t        j                         } | j                  |||||fi | d {   S 7 w)N)r-   r.   r0   )r   r%   r&   r'   r(   r)   r   s          r   r+   zAsyncWrappedMessages.streamR   sR      ##zz|+T++ 
 
 
 	
 
s   1:8:c                     	
K   t        j                          
dddg t           di  d {   		 
fd} |       S 7 w)Nr   input_tokensoutput_tokensc                 `  K   	 2 3 d {   } t        | d      r2| j                  r&dD ci c]  }|t        | j                  |d       c}t        | d      r'| j                  rj	                  | j                         |  7 {c c}w 6 	 t        j
                         }|z
  }dj                        }j                  
	||	       d {  7   y # t        j
                         }|z
  }dj                        }j                  
	||	       d {  7   w xY ww)Nusager5   r   content )hasattrr9   getattrr:   appendtimejoin_capture_streaming_event)eventkend_timelatencyoutputaccumulated_contentr   r%   r)   r(   r'   r&   responser   
start_timeusage_statss        r   	generatorz9AsyncWrappedMessages._create_streaming.<locals>.generatoru   sF    #+  %ug.5;;&'& wu{{Aq99&' ui0U]]+225==AK ' $,   99;"Z/!4533'$&("
 
 
	  99;"Z/!4533'$&("
 
 
sa   D.C BBBC B	<C B	C AD.CD.AD+$D'%D++D.r   )r?   r   r2   )r   r%   r&   r'   r(   r)   r   rK   rG   rH   rI   rJ   r   s   ``````` @@@@r   r0   z&AsyncWrappedMessages._create_streamingg   sT      YY[
781&M 1&11"	 "	H {M 2s   .AAArJ   rE   rF   c
                 L  K   |t        j                         }d|j                  d      t        |      t	        | j
                  j                  |t        |d            t	        | j
                  j                  ||	ddg      d|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|
|       y y w)Nr,   model	assistant)r:   role   r6   r   r7   )z$ai_providerz	$ai_modelz$ai_model_parametersz	$ai_inputz$ai_output_choicesz$ai_http_statusz$ai_input_tokensz$ai_output_tokensz$ai_latencyz$ai_trace_idz$ai_base_urlFz$process_person_profilecapturez$ai_generation)distinct_idrB   
propertiesgroups)r-   r.   r/   r   r
   r$   r   r	   strr1   r<   rQ   )r   r%   r&   r'   r(   r)   r   rJ   rE   rF   event_propertiess              r   rA   z-AsyncWrappedMessages._capture_streaming_event   s&     ##zz| (G,$4V$<*''$#FK8
 #4''$#[9:#
  # + B!,!!D", 5 56'
( "'R)
. &:?674<<**I6LL##++/C3C&+%	 ,  7s   D"D$)NNNFN)r   r   r   r   r    r   rU   r   r   boolr2   r+   r0   intfloatrA   r!   r"   s   @r   r   r   !   s    .2*.7;%*37,
%c],
 #3-,
 %T#s(^4	,

 #,
 !c3h0,
 ,
` .2*.7;%*37
%c]
 #3-
 %T#s(^4	

 #
 !c3h0
 
*2%c]2 #3-2 %T#s(^4	2
 #2 !c3h02 2h/%c]/ #3-/ %T#s(^4	/
 #/ !c3h0/ S#X/ #s(^/ / /r   r   )r,   anthropic.resourcesr   ImportErrorModuleNotFoundErrorr?   r-   typingr   r   r   posthog.ai.utilsr   r   r	   r
   posthog.clientr   r   r   r   r   r   r   <module>r`      sg   o1   & & u u 23Y-- 3$i= i;  o
m
nnos   
A A