o
    RhN3                     @   s   d dl Z d dlZd dlZd dlmZmZmZ zd dlmZ W n e	y)   e
dw d dlmZmZmZ d dlmZ G dd dZG d	d
 d
ZdS )    N)AnyDictOptional)genaizTPlease install the Google Gemini SDK to use this feature: 'pip install google-genai')call_llm_and_track_usageget_model_paramswith_privacy_mode)Clientc                   @   sd   e Zd ZdZ						ddee dee dee deeeef  de	d	eeeef  fd
dZ
dS )r	   a;  
    A drop-in replacement for genai.Client that automatically sends LLM usage events to PostHog.

    Usage:
        client = Client(
            api_key="your_api_key",
            posthog_client=posthog_client,
            posthog_distinct_id="default_user",  # Optional defaults
            posthog_properties={"team": "ai"}    # Optional defaults
        )
        response = client.models.generate_content(
            model="gemini-2.0-flash",
            contents=["Hello world"],
            posthog_distinct_id="specific_user"  # Override default
        )
    NFapi_keyposthog_clientposthog_distinct_idposthog_propertiesposthog_privacy_modeposthog_groupsc              	   K   s2   |du rt dtd||||||d|| _dS )a  
        Args:
            api_key: Google AI API key. If not provided, will use GOOGLE_API_KEY or API_KEY environment variable
            posthog_client: PostHog client for tracking usage
            posthog_distinct_id: Default distinct ID for all calls (can be overridden per call)
            posthog_properties: Default properties for all calls (can be overridden per call)
            posthog_privacy_mode: Default privacy mode for all calls (can be overridden per call)
            posthog_groups: Default groups for all calls (can be overridden per call)
            **kwargs: Additional arguments (for future compatibility)
        N/posthog_client is required for PostHog tracking)r
   r   r   r   r   r    )
ValueErrorModelsmodelsselfr
   r   r   r   r   r   kwargsr   r   Z/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/posthog/ai/gemini/gemini.py__init__'   s   zClient.__init__NNNNFN)__name__
__module____qualname____doc__r   strPostHogClientr   r   boolr   r   r   r   r   r	      s*    r	   c                   @   s  e Zd ZU dZeed< 						d)dee dee dee deeee	f  d	e
d
eeee	f  fddZdee dee deeee	f  dee
 deeee	f  f
ddZ					d*dedee dee deeee	f  d	ee
 d
eeee	f  de	fddZde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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d%d& Z					d*dedee dee deeee	f  d	ee
 d
eeee	f  de	fd'd(ZdS )+r   zS
    Models interface that mimics genai.Client().models with PostHog tracking.
    
_ph_clientNFr
   r   r   r   r   r   c                 K   sz   |du rt d|| _|| _|pi | _|| _|| _|du r)tjdp(tjd}|du r1t dt	j
|d| _d| _dS )a  
        Args:
            api_key: Google AI API key. If not provided, will use GOOGLE_API_KEY or API_KEY environment variable
            posthog_client: PostHog client for tracking usage
            posthog_distinct_id: Default distinct ID for all calls
            posthog_properties: Default properties for all calls
            posthog_privacy_mode: Default privacy mode for all calls
            posthog_groups: Default groups for all calls
            **kwargs: Additional arguments (for future compatibility)
        Nr   GOOGLE_API_KEYAPI_KEYz_API key must be provided either as parameter or via GOOGLE_API_KEY/API_KEY environment variable)r
   z)https://generativelanguage.googleapis.com)r   r"   _default_distinct_id_default_properties_default_privacy_mode_default_groupsosenvirongetr   r	   _client	_base_urlr   r   r   r   r   P   s   

zModels.__init__call_distinct_idcall_trace_idcall_propertiescall_privacy_modecall_groupsc           
      C   sp   |dur|n| j }|dur|n| j}|dur|n| j}t| j}	|r'|	| |du r1tt }|||	||fS )z9Merge call-level PostHog parameters with client defaults.N)	r%   r'   r(   dictr&   updater   uuiduuid4)
r   r.   r/   r0   r1   r2   distinct_idprivacy_modegroups
propertiesr   r   r   _merge_posthog_params{   s   

zModels._merge_posthog_paramsmodelposthog_trace_idr   c              
   K   sT   |  |||||\}	}
}}}||d|}t|	| jd|
|||| j| jjjf	i |S )a  
        Generate content using Gemini's API while tracking usage in PostHog.

        This method signature exactly matches genai.Client().models.generate_content()
        with additional PostHog tracking parameters.

        Args:
            model: The model to use (e.g., 'gemini-2.0-flash')
            contents: The input content for generation
            posthog_distinct_id: ID to associate with the usage event (overrides client default)
            posthog_trace_id: Trace UUID for linking events (auto-generated if not provided)
            posthog_properties: Extra properties to include in the event (merged with client defaults)
            posthog_privacy_mode: Whether to redact sensitive information (overrides client default)
            posthog_groups: Group analytics properties (overrides client default)
            **kwargs: Arguments passed to Gemini's generate_content
        r<   contentsgemini)r;   r   r"   r-   r,   r   generate_content)r   r<   r?   r   r=   r   r   r   r   r7   trace_idr:   r8   r9   kwargs_with_contentsr   r   r   rA      s,   

zModels.generate_contentr7   rB   r:   r8   r9   c                    sb   t   
dddg  d}		jjjdi |	 	
fdd}
|
 S )Nr   input_tokensoutput_tokensr>   c                  3   s    zLD ]*} t | dr| jrt| jddt| jdddt | dr+| jr+ | j | V  qW t }|
 }d }	|| d S t }|
 }d }	|| w )Nusage_metadataprompt_token_countr   candidates_token_countrD   text )hasattrrG   getattrrJ   appendtimejoin_capture_streaming_event)chunkend_timelatencyoutputaccumulated_contentr?   r7   r9   r   r<   r8   r:   responser   
start_timerB   usage_statsr   r   	generator   s^   	

z5Models._generate_content_streaming.<locals>.generatorr   )rO   r,   r   generate_content_stream)r   r<   r?   r7   rB   r:   r8   r9   r   kwargs_without_streamr[   r   rV   r   _generate_content_streaming   s   
$'z"Models._generate_content_streamingrZ   rT   rU   c                 C   s   |d u r
t t }d|t|t| j|| |t| j||ddgd|	dd|	dd|
|| jd|p6i }|d u r@d	|d
< t	| jdrR| jj
|d||d d S d S )Nr@   	assistant)contentrole   rE   r   rF   )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)r7   eventr:   r9   )r   r5   r6   r   r   r"   _format_inputr+   r-   rL   rc   )r   r<   r?   r7   rB   r:   r8   r9   r   rZ   rT   rU   event_propertiesr   r   r   rQ     sD   



zModels._capture_streaming_eventc                 C   s   t |trd|dgS t |tr@g }|D ])}t |tr$|d|d qt|dr3|d|jd q|dt|d q|S dt|dgS )z*Format input contents for PostHog trackinguser)ra   r`   rJ   )
isinstancer   listrN   rL   rJ   )r   r?   	formatteditemr   r   r   re   >  s   



zModels._format_inputc                 K   s:   |  |||||\}	}
}}}| j|||	|
|||fi |S )N)r;   r^   )r   r<   r?   r   r=   r   r   r   r   r7   rB   r:   r8   r9   r   r   r   r\   O  s&   
zModels.generate_content_streamr   )NNNNN)r   r   r   r   r    __annotations__r   r   r   r   r!   r   r;   rA   r^   intfloatrQ   re   r\   r   r   r   r   r   I   s   
 
+
$	
5	
;
	


3	r   )r)   rO   r5   typingr   r   r   googler   ImportErrorModuleNotFoundErrorposthog.ai.utilsr   r   r   posthog.clientr	   r    r   r   r   r   r   <module>   s    4