o
    gT                     @   s   zd dl Z d dlmZ W n ey   ed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 de jZG d	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                       s0   e Zd ZU dZeed< def fddZ  ZS )AsyncAnthropiczi
    An async wrapper around the Anthropic SDK that automatically sends LLM usage events to PostHog.
    
_ph_clientposthog_clientc                    s&   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__r   [/var/www/visachat/venv/lib/python3.10/site-packages/posthog/ai/anthropic/anthropic_async.pyr      s   zAsyncAnthropic.__init__)__name__
__module____qualname____doc__PostHogClient__annotations__r   __classcell__r   r   r   r   r      s   
 r   c                       s^  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
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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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dZ  ZS )r   _clientNFposthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr   c              
      sp   |du r	t  }|ddr| j|||||fi |I dH S t|| jjd||||| jjt j	f	i |I dH 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)
uuiduuid4get_create_streamingr   r   r   base_urlr   creater   r    r!   r"   r#   r$   r   r   r   r   r,   $   s4   	
zAsyncWrappedMessages.createc                    s2   |d u r	t  }| j|||||fi |I d H S )N)r'   r(   r*   r-   r   r   r   r%   R   s   	zAsyncWrappedMessages.streamc                    sV   t   	ddd
g  t jdi I d H  	
fdd}| S )Nr   input_tokensoutput_tokensc                    s   zL2 z(3 d H W  t  dr jr fdddD t  dr) jr) j  V  q6 W t } | 
 }d}	||	I d H  d S t } | 
 }d}	||	I d H  w )Nusagec                    s   i | ]
}|t  j|d qS )r   )getattrr1   ).0keventr   r   
<dictcomp>{   s    zMAsyncWrappedMessages._create_streaming.<locals>.generator.<locals>.<dictcomp>r.   content )hasattrr1   r8   appendtimejoin_capture_streaming_event)end_timelatencyoutputaccumulated_contentr   r    r$   r#   r"   r!   responser   
start_timeusage_statsr5   r   	generatoru   sN   


z9AsyncWrappedMessages._create_streaming.<locals>.generatorr   )r<   r   r,   )r   r    r!   r"   r#   r$   r   rG   r   rB   r   r*   g   s   	
 $z&AsyncWrappedMessages._create_streamingrF   r@   rA   c
                    s   |d u r	t  }d|dt|t| jj|t|dt| jj||	ddgd|dd|dd||t| jj	d	|p=i }
|d u rGd
|
d< t
| jjdr]| jjj|pU|d|
|d d S d S )Nr&   model	assistant)r8   role   r/   r   r0   )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_idr6   
propertiesgroups)r'   r(   r)   r   r	   r   r   r   strr+   r:   rL   )r   r    r!   r"   r#   r$   r   rF   r@   rA   event_propertiesr   r   r   r>      sF   




z-AsyncWrappedMessages._capture_streaming_event)NNNFN)r   r   r   r   r   r   rP   r   r   boolr,   r%   r*   intfloatr>   r   r   r   r   r   r   !   s   
 0
4

	
r   )r&   anthropic.resourcesr   ImportErrorModuleNotFoundErrorr<   r'   typingr   r   r   posthog.ai.utilsr   r   r   r	   posthog.clientr
   r   r   r   r   r   r   r   <module>   s    