
    jKj)'                        	 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
mZ d dlmZmZmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d d	l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)MessageszMPlease install the Anthropic SDK to use this feature: 'pip install anthropic')AnyDictListOptional)StreamingContentBlock
TokenUsageToolInProgress)call_llm_and_track_usagemerge_usage_stats)"extract_anthropic_usage_from_event$handle_anthropic_content_block_starthandle_anthropic_text_deltahandle_anthropic_tool_deltafinalize_anthropic_tool_input)sanitize_anthropic)Client)setupc                   <     e Zd ZU dZeed<   dde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                 j    t        |   di | |xs
 t               | _        t	        |       | _        y)z
        Args:
            posthog_client: PostHog client for tracking usage
            **kwargs: Additional arguments passed to the Anthropic client
        N )super__init__r   r   WrappedMessagesmessages)selfr   kwargs	__class__s      o/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/ai/anthropic/anthropic.pyr   zAnthropic.__init__%   s/     	"6"(3EG'-    N)	__name__
__module____qualname____doc__PostHogClient__annotations__r   r   __classcell__r!   s   @r"   r   r      s&     .x'> . .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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e   dedee   fdZ xZS )r   _clientposthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr    c                    |t        t        j                               }|j                  dd      r | j                  |||||fi |S t        || j                  j                  d||||| j                  j                  t        | (  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
        streamF	anthropic)struuiduuid4get_create_streamingr   r.   r   base_urlr   create)r   r/   r0   r1   r2   r3   r    r!   s          r"   r=   zWrappedMessages.create3   s    * #"4::<0::h&)4))# "$   (LL## LL!!GN
 
 	
r#   c                 n    |t        t        j                               } | j                  |||||fi |S )a  
        Stream an Anthropic message 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 Anthropic's ``messages.create`` API.

        Returns:
            A streaming iterator yielding Anthropic events.
        )r7   r8   r9   r;   )r   r/   r0   r1   r2   r3   r    s          r"   r5   zWrappedMessages.streamb   sI    . #"4::<0%t%% 
 
 	
r#   c                     	
 t        j                          t        dd      dg 	i d 
d t           di 	
 fd} |       S )Nr   )input_tokensoutput_tokens c               3   &  K   	 D ]  } t        |       }t        |       t        | d      rf| j                  dk(  rWt	        |       \  }}|r*j                  |       |j                  d      dk(  r|nd |r|d   j                  d      }|r||<   t        |       }|r
|z  
t        |        t        | d      r| j                  dk(  rd t        |        t        | d      r/| j                  dk(  r t        | dd       }|t        |d	d       }|||   	 t        j                         }|z
  }	j                  |	

       y # t        j                         }|z
  }	j                  |	

       w xY ww)Ntypecontent_block_starttextblockidcontent_block_stopmessage_deltadeltastop_reason)rL   )r   r   hasattrrD   r   appendr:   r   r   r   getattrtime_capture_streaming_event)eventevent_usagerG   tooltool_id
delta_textrK   delta_stop_reasonend_timelatencyaccumulated_contentcontent_blockscurrent_text_blockr    r/   r3   r2   r1   r0   responser   
start_timerL   tools_in_progressusage_statss             r"   	generatorz4WrappedMessages._create_streaming.<locals>.generator   s    C%E"DU"KK%k;? uf-%**@U2U&J5&Qt *11%8$yy0F:5: 259 2&*7m&7&7&=G&=A 1' : "=UDV!WJ!+z9+ 0~/@
 uf-%**@T2T-1*5!>3D
 uf-%**2O 'w = ,07}d0S-0<.?Ka &f  99;"Z/--'$&(""' + .   99;"Z/--'$&(""' + . s   FDE !6F7FFr   )rP   r	   r   r=   )r   r/   r0   r1   r2   r3   r    ra   rZ   r[   r\   r]   r^   rL   r_   r`   r!   s   ``````` @@@@@@@@r"   r;   z!WrappedMessages._create_streaming   sg     YY[
",!1"M 6879>B%)7>+F+K	 K	 K	Z {r#   r`   rY   r[   rZ   rL   c                     ddl m} ddlm}m} ddlm}  ||      }t        |      } |d|j                  dd      t        | j                  j                        || ||	|
      ||||||||      } || j                  j                  |       y )	Nr   )StreamingEventData) format_anthropic_streaming_input*format_anthropic_streaming_output_complete)capture_streaming_eventr6   modelunknown)providerrg   r<   r    formatted_inputformatted_outputr`   rY   distinct_idtrace_id
propertiesprivacy_modegroupsrL   )posthog.ai.typesrc   (posthog.ai.anthropic.anthropic_converterrd   re   posthog.ai.utilsrf   r   r:   r7   r.   r<   r   )r   r/   r0   r1   r2   r3   r    r`   rY   r[   rZ   rL   rc   rd   re   rf   rj   sanitized_input
event_datas                      r"   rQ   z(WrappedMessages._capture_streaming_event   s     	8	
 	= ;6B,_=' **Wi0../+G 3 $+%)-!#!

( 	  7 7Dr#   )NNNFNr$   )r%   r&   r'   r   r*   r   r7   r   r   boolr=   r5   r;   r	   floatr   r   rQ   r+   r,   s   @r"   r   r   0   s    .2*.7;%*37-
%c]-
 #3--
 %T#s(^4	-

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

 #!
 !c3h0!
 !
F_%c]_ #3-_ %T#s(^4	_
 #_ !c3h0_ _Z &*-E%c]-E #3--E %T#s(^4	-E
 #-E !c3h0-E S#X-E  -E -E 23-E !-E c]-Er#   r   )"r6   anthropic.resourcesr   ImportErrorModuleNotFoundErrorrP   r8   typingr   r   r   r   rq   r   r	   r
   rs   r   r   rr   r   r   r   r   r   posthog.ai.sanitizationr   posthog.clientr   r)   posthogr   r   r   r   r#   r"   <module>r      s   ,   , , N N  7 2 .	## .$cEh cEY  
W s   
A3 3B