
    Zi                         	 d dl Z d dlmZ n# e$ r  ed          w xY w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dS )    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                 p     t                      j        di | || _        t          |           | _        dS )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      _/root/projects/butler/venv/lib/python3.11/site-packages/posthog/ai/anthropic/anthropic_async.pyr   zAsyncAnthropic.__init__   s<     	""6"""(,T22    )__name__
__module____qualname____doc__PostHogClient__annotations__r   __classcell__r   s   @r   r   r      s^           3} 3 3 3 3 3 3 3 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   _clientNFposthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr   c                 (  K   | t          t          j                              }|                    dd          r | j        |||||fi | d{V S t          || j        j        d||||| j        j        t                      j
        f	i | d{V S )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)struuiduuid4get_create_streamingr   r$   r   base_urlr   create)r   r%   r&   r'   r(   r)   r   r   s          r   r3   zAsyncWrappedMessages.create+   s      ( #"4:<<00::h&& 	//# "$           4L# L!GGN
 
 
 
 
 
 
 
 
 
 	
r   c                 z   K   | t          t          j                              } | j        |||||fi | d {V S )N)r-   r.   r/   r1   )r   r%   r&   r'   r(   r)   r   s          r   r+   zAsyncWrappedMessages.streamY   su       #"4:<<00+T+ 
 
 
 
 
 
 
 
 
 
 	
r   c                     	
K   t          j                     
dddg  t                      j        di  d {V 		 
fd} |            S )Nr   )input_tokensoutput_tokensc                 (  K   	 2 3 d {V t          d          rj        rfddD             t          d          r!j        r                    j                   W V  c6 	 t	          j                    } | z
  }d                              }                    
	||	  	         d {V  d S # t	          j                    } | z
  }d                              }                    
	||	  	         d {V  w xY w)Nusagec                 >    i | ]}|t          j        |d           S )r   )getattrr9   ).0kevents     r   
<dictcomp>zMAsyncWrappedMessages._create_streaming.<locals>.generator.<locals>.<dictcomp>   s9     ' ' ' ! wu{Aq99' ' 'r   )r6   r7   cache_read_input_tokenscache_creation_input_tokenscontent )hasattrr9   rB   appendtimejoin_capture_streaming_event)end_timelatencyoutputr>   accumulated_contentr   r%   r)   r(   r'   r&   responser   
start_timeusage_statss      @r   	generatorz9AsyncWrappedMessages._create_streaming.<locals>.generator|   s     !#+              %ug.. 	5; 	' ' ' '&' ' ' ui00 BU] B+225=AAAKKKKK $,8$  9;;"Z/!45533'$&("
 
 
 
 
 
 
 
 
 
 
	  9;;"Z/!45533'$&("
 
 
 
 
 
 
 
 
 
s   B? A+AB? ?ADr   )rF   r   r3   )r   r%   r&   r'   r(   r)   r   rP   rL   rM   rN   rO   r   s   ``````` @@@@r   r1   z&AsyncWrappedMessages._create_streamingn   s       Y[[
781&M&M '11&11111111$	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	L y{{r   rO   rJ   rK   c
                   K   | t          t          j                              }d|                    d          t	          |          t          | j        j        |t          |d                    t          | j        j        ||	ddg          d|                    dd          |                    dd          |                    d	d          |                    d
d          ||t          | j        j	                  d|pi }
|d|
d<   t          | j        j        d          r'| j        j                            |p|d|
|           d S d S )Nr,   model	assistant)rB   role   r6   r   r7   r@   rA   )z$ai_providerz	$ai_modelz$ai_model_parametersz	$ai_inputz$ai_output_choicesz$ai_http_statusz$ai_input_tokensz$ai_output_tokensz$ai_cache_read_input_tokensz$ai_cache_creation_input_tokensz$ai_latencyz$ai_trace_idz$ai_base_urlFz$process_person_profilecapturez$ai_generation)distinct_idr>   
propertiesgroups)r-   r.   r/   r0   r   r
   r$   r   r	   r2   rD   rV   )r   r%   r&   r'   r(   r)   r   rO   rJ   rK   event_propertiess              r   rH   z-AsyncWrappedMessages._capture_streaming_event   s      #"4:<<00 (G,,$4V$<$<*'$#FK88 
 #4'$#[99:# #
  # + B B!,!!D!D+6??)1, , 0;-q0 0 #, 5663
 
4 "'R5
: &:?674<*I66 	L#++/C3C&+%	 ,     	 	r   )NNNFN)r   r   r   r   r    r   r-   r   r   boolr3   r+   r1   intfloatrH   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
 
 
 
 
*4%c]4 #3-4 %T#s(^4	4
 #4 !c3h04 4 4 4 4 4 4l5%c]5 #3-5 %T#s(^4	5
 #5 !c3h05 S#X5 #s(^5 5 5 5 5 5 5 5 5 5r   r   )r,   anthropic.resourcesr   ImportErrorModuleNotFoundErrorrF   r.   typingr   r   r   posthog.ai.utilsr   r   r	   r
   posthog.clientr   r   r   r   r   r   r   <module>rd      sK  1111111   

W  
   & & & & & & & & & &            3 2 2 2 2 23 3 3 3 3Y- 3 3 3$q q q q q= q q q q qs   
 