
    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)MessageszMPlease install the Anthropic SDK to use this feature: 'pip install anthropic')AnyDictOptional)call_llm_and_track_usage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 )	Anthropiczb
    A 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   WrappedMessagesmessages)selfr   kwargs	__class__s      Y/root/projects/butler/venv/lib/python3.11/site-packages/posthog/ai/anthropic/anthropic.pyr   zAnthropic.__init__   s<     	""6"""('--    )__name__
__module____qualname____doc__PostHogClient__annotations__r   __classcell__r   s   @r   r   r      s^           .} . . . . . . . . . .r   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                    | t          t          j                              }|                    dd          r | j        |||||fi |S t          || j        j        d||||| j        j        t                      j
        f	i |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WrappedMessages.create+   s    ( #"4:<<00::h&& 	)4)# "$     (L# L!GGN
 
 
 
 	
r   c                 j    | t          t          j                              } | j        |||||fi |S )N)r-   r.   r/   r1   )r   r%   r&   r'   r(   r)   r   s          r   r+   zWrappedMessages.streamY   sS     #"4:<<00%t% 
 
 
 
 	
r   c                     	
 t          j                     
dddg  t                      j        di 		 
fd} |            S )Nr   )input_tokensoutput_tokensc               3     K   	 D ]\t          d          rj        rfddD             t          d          r!j        r                    j                   V  ]	 t	          j                    } | z
  }d                              }                    
	||	  	         d S # t	          j                    } | z
  }d                              }                    
	||	  	         w xY w)Nusagec                 >    i | ]}|t          j        |d           S )r   )getattrr9   ).0kevents     r   
<dictcomp>zHWrappedMessages._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   	generatorz4WrappedMessages._create_streaming.<locals>.generator|   sq     !%    Eug.. 	5; 	' ' ' '&' ' ' ui00 BU] B+225=AAAKKKK $  9;;"Z/!455--'$&("
 
 
 
 
	  9;;"Z/!455--'$&("
 
 
 
s   AB2 2AC>r   )rF   r   r3   )r   r%   r&   r'   r(   r)   r   rP   rL   rM   rN   rO   r   s   ``````` @@@@r   r1   z!WrappedMessages._create_streamingn   s     Y[[
781&M&M !577>++F++$	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	 $	L y{{r   rO   rJ   rK   c
                    | 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(WrappedMessages._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  ,,,,,,,   

W  
   & & & & & & & & & &            3 2 2 2 2 2. . . . .	# . . .$q q q q qh q q q q qs   
 