o
    Rh                     @   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)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                       s0   e Zd ZU dZeed< def fddZ  ZS )	Anthropiczb
    A 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   WrappedMessagesmessages)selfr   kwargs	__class__r   `/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/posthog/ai/anthropic/anthropic.pyr      s   zAnthropic.__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              
      sf   |du r
t t }|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   r   r   r-   +   s2   	
zWrappedMessages.createc                 K   s.   |d u r
t t }| j|||||fi |S )N)r'   r(   r)   r+   r.   r   r   r   r%   Y   s   	zWrappedMessages.streamc                    sN   t   	ddd
g  t jdi  	
fdd}| S )Nr   )input_tokensoutput_tokensc                  3   s    zDD ]$ t  dr jr fdddD t  dr% jr% j  V  qW t } | 
 }d}	||	 d S t } | 
 }d}	||	 w )Nusagec                    s   i | ]
}|t  j|d qS )r   )getattrr1   ).0keventr   r   
<dictcomp>   s    zHWrappedMessages._create_streaming.<locals>.generator.<locals>.<dictcomp>)r/   r0   cache_read_input_tokenscache_creation_input_tokenscontent )hasattrr1   r:   appendtimejoin_capture_streaming_event)end_timelatencyoutputaccumulated_contentr   r    r$   r#   r"   r!   responser   
start_timeusage_statsr5   r   	generator|   sN   



z4WrappedMessages._create_streaming.<locals>.generatorr   )r>   r   r-   )r   r    r!   r"   r#   r$   r   rI   r   rD   r   r+   n   s   	
 &z!WrappedMessages._create_streamingrH   rB   rC   c
                 C   s   |d u r
t t }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|pHi }
|d u rRd|
d< t
| jjdrh| jjj|p`|d|
|d d S d S )Nr&   model	assistant)r:   role   r/   r   r0   r8   r9   )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_idr6   
propertiesgroups)r'   r(   r)   r*   r   r	   r   r   r   r,   r<   rN   )r   r    r!   r"   r#   r$   r   rH   rB   rC   event_propertiesr   r   r   r@      sP   




z(WrappedMessages._capture_streaming_event)NNNFN)r   r   r   r   r   r   r'   r   r   boolr-   r%   r+   intfloatr@   r   r   r   r   r   r   (   s   
 0
6

	
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    