
    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 d dl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!  G d de jD                        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ListOptional)setup)AsyncStreamWrapper)StreamingContentBlock
TokenUsageToolInProgress)call_llm_and_track_usage_async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)Clientc                   <     e Zd ZU dZeed<   dde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                 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   AsyncWrappedMessagesmessages)selfr   kwargs	__class__s      u/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/ai/anthropic/anthropic_async.pyr   zAsyncAnthropic.__init__&   s/     	"6"(3EG,T2    N)	__name__
__module____qualname____doc__PostHogClient__annotations__r   r   __classcell__r"   s   @r#   r   r      s&     3x'> 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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                 L  K   |t        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)struuiduuid4get_create_streamingr   r/   r   base_urlr   create)r    r0   r1   r2   r3   r4   r!   r"   s          r#   r>   zAsyncWrappedMessages.create4   s     * #"4::<0::h&///# "$    4LL## LL!!GN
 
 
 	

s%   AB$B AB$B"B$"B$c                    K   |t        t        j                               } | j                  |||||fi | d{   S 7 w)a  
        Stream an Anthropic message asynchronously 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 async ``messages.create`` API.

        Returns:
            An async streaming iterator yielding Anthropic events.
        N)r8   r9   r:   r<   )r    r0   r1   r2   r3   r4   r!   s          r#   r6   zAsyncWrappedMessages.streamc   sW     . #"4::<0+T++ 
 
 
 	
 
s   :AAAc                     	
K   t        j                          t        dd      dg 	i d 
d t           di  d {   	
 fd}t	         |             S 7 )w)Nr   )input_tokensoutput_tokens c                 \  K   	 2 3 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       }|||  7 6 	 t        j                         }|z
  }	j                  |	

       d {  7   y # t        j                         }|z
  }	j                  |	

       d {  7   w xY ww)Ntypecontent_block_starttextblockidcontent_block_stopmessage_deltadeltastop_reason)rM   )r   r   hasattrrE   r   appendr;   r   r   r   getattrtime_capture_streaming_event)eventevent_usagerH   tooltool_id
delta_textrL   delta_stop_reasonend_timelatencyaccumulated_contentcontent_blockscurrent_text_blockr!   r0   r4   r3   r2   r1   responser    
start_timerM   tools_in_progressusage_statss             r#   	generatorz9AsyncWrappedMessages._create_streaming.<locals>.generator   s     C#+ 0 %"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0 8f  99;"Z/33'$&(""' + 4     99;"Z/33'$&(""' + 4   sU   F,E) D(D%D(DE) %D((E) *8F,"E%#F,)9F)"F%#F))F,)r6   r   )rQ   r   r   r>   r	   )r    r0   r1   r2   r3   r4   r!   rb   r[   r\   r]   r^   r_   rM   r`   ra   r"   s   ``````` @@@@@@@@r#   r<   z&AsyncWrappedMessages._create_streaming   s{      YY[
",!1"M 6879>B%)1&11K	 K	 K	Z ")+h??_ 2s   >A<A:*A<ra   rZ   r\   r[   rM   c                 (  K   ddl m} ddlm}m} ddlm}  ||      }t        |      } |d|j                  dd      t        | j                  j                        || ||	|
      ||||||||      } || j                  j                  |       y w)	Nr   )StreamingEventData) format_anthropic_streaming_input*format_anthropic_streaming_output_complete)capture_streaming_eventr7   modelunknown)providerrh   r=   r!   formatted_inputformatted_outputra   rZ   distinct_idtrace_id
propertiesprivacy_modegroupsrM   )posthog.ai.typesrd   (posthog.ai.anthropic.anthropic_converterre   rf   posthog.ai.utilsrg   r   r;   r8   r/   r=   r   )r    r0   r1   r2   r3   r4   r!   ra   rZ   r\   r[   rM   rd   re   rf   rg   rk   sanitized_input
event_datas                      r#   rR   z-AsyncWrappedMessages._capture_streaming_event   s      	8	
 	= ;6B,_=' **Wi0../+G 3 $+%)-!#!

( 	  7 7Ds   BB)NNNFNr%   )r&   r'   r(   r   r+   r   r8   r   r   boolr>   r6   r<   r   floatr   r
   rR   r,   r-   s   @r#   r   r   1   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   )$r7   anthropic.resourcesr   ImportErrorModuleNotFoundErrorrQ   r9   typingr   r   r   r   posthogr   posthog.ai.streamr	   rr   r
   r   r   rt   r   r   rs   r   r   r   r   r   posthog.ai.sanitizationr   posthog.clientr   r*   r   r   r   r$   r#   <module>r      s   1   , ,  0 N N  7 23Y-- 3$cE= cE[  
W s   
A9 9B