o
    3in:                     @   s   d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	 d dl
mZ zd dlmZ W n ey7   edw d dlmZ d dl
mZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ G dd dZG dd dZdS )    N)AnyDictOptional)
TokenUsageStreamingEventDatamerge_system_prompt)genaizTPlease install the Google Gemini SDK to use this feature: 'pip install google-genai')setup)call_llm_and_track_usagecapture_streaming_eventmerge_usage_stats)extract_gemini_usage_from_chunk!extract_gemini_content_from_chunkformat_gemini_streaming_output)sanitize_gemini)Clientc                   @   s   e Zd ZU dZeed< 												ddee dee dee	 dee d	ee d
ee	 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
        )
    
_ph_clientNFapi_keyvertexaicredentialsprojectlocationdebug_confighttp_optionsposthog_clientposthog_distinct_idposthog_propertiesposthog_privacy_modeposthog_groupsc                 K   sN   |pt  | _| jdu rtdtd|||||||| j|	|
||d|| _dS )a  
        Args:
            api_key: Google AI API key. If not provided, will use GOOGLE_API_KEY or API_KEY environment variable (not required for Vertex AI)
            vertexai: Whether to use Vertex AI authentication
            credentials: Vertex AI credentials object
            project: GCP project ID for Vertex AI
            location: GCP location for Vertex AI
            debug_config: Debug configuration for the client
            http_options: HTTP options for the client
            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   r   r   r   r   r   r    )r
   r   
ValueErrorModelsmodels)selfr   r   r   r   r   r   r   r   r   r   r   r   kwargsr!   r!   f/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/posthog/ai/gemini/gemini.py__init__3   s&   !
zClient.__init__NNNNNNNNNNFN)__name__
__module____qualname____doc__PostHogClient__annotations__r   strboolr   r   r(   r!   r!   r!   r'   r      sP   
 	
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 d	ee d
ee	 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					d0d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d'ed(e	fd)d*Zd+d, Z					d0d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 )1r#   zS
    Models interface that mimics genai.Client().models with PostHog tracking.
    r   NFr   r   r   r   r   r   r   r   r   r   r   r   c                 K   s  |pt  | _| jdu rtd|	| _|
pi | _|| _|| _i }|dur'||d< |dur/||d< |dur7||d< |dur?||d< |durG||d< |durO||d< |rZ|durY||d	< n|du rjtj	d
pitj	d}|du rrtd||d	< t
jdi || _d| _dS )au  
        Args:
            api_key: Google AI API key. If not provided, will use GOOGLE_API_KEY or API_KEY environment variable (not required for Vertex AI)
            vertexai: Whether to use Vertex AI authentication
            credentials: Vertex AI credentials object
            project: GCP project ID for Vertex AI
            location: GCP location for Vertex AI
            debug_config: Debug configuration for the client
            http_options: HTTP options for the client
            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    r   r   r   r   r   r   r   GOOGLE_API_KEYAPI_KEYz_API key must be provided either as parameter or via GOOGLE_API_KEY/API_KEY environment variablez)https://generativelanguage.googleapis.comr!   )r
   r   r"   _default_distinct_id_default_properties_default_privacy_mode_default_groupsosenvirongetr	   r   _client	_base_url)r%   r   r   r   r   r   r   r   r   r   r   r   r   r&   client_argsr!   r!   r'   r(   q   sB   !


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)	r4   r6   r7   dictr5   updater0   uuiduuid4)
r%   r>   r?   r@   rA   rB   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
        rL   contentsgemini)rK   r   r   r<   r;   r$   generate_content)r%   rL   rO   r   rM   r   r   r   r&   rG   trace_idrJ   rH   rI   kwargs_with_contentsr!   r!   r'   rQ      s,   

zModels.generate_contentrG   rR   rJ   rH   rI   c                    sd   t   
tdddg  d}		jjjdi |	 	
fdd}
|
 S )Nr   )input_tokensoutput_tokensrN   c                  3   s    z<D ]} t | }|rt|dd t| }|d ur  | | V  qW t }|
 }	|  d S t }|
 }	|  w )N
cumulative)mode)r   r   r   appendtime_capture_streaming_event)chunkchunk_usagecontent_blockend_timelatencyaccumulated_contentrO   rG   rI   r&   rL   rH   rJ   responser%   
start_timerR   usage_statsr!   r'   	generator1  sR   
z5Models._generate_content_streaming.<locals>.generatorr!   )rY   r   r;   r$   generate_content_stream)r%   rL   rO   rG   rR   rJ   rH   rI   r&   kwargs_without_streamre   r!   r`   r'   _generate_content_streaming  s   $&z"Models._generate_content_streamingrd   r_   outputc                 C   sR   | j |fi |}t|}td|| j||t||	|
|||||d}t| j| d S )NrP   )providerrL   base_urlr&   formatted_inputformatted_outputrd   r_   rG   rR   rJ   rH   rI   )_format_inputr   r   r<   r   r   r   )r%   rL   rO   rG   rR   rJ   rH   rI   r&   rd   r_   ri   rl   sanitized_input
event_datar!   r!   r'   rZ   Y  s$   zModels._capture_streaming_eventc                 K   s   d|i|}t |dS )z*Format input contents for PostHog trackingrO   rP   r   )r%   rO   r&   input_kwargsr!   r!   r'   rn   ~  s   
zModels._format_inputc                 K   s:   |  |||||\}	}
}}}| j|||	|
|||fi |S )N)rK   rh   )r%   rL   rO   r   rM   r   r   r   r&   rG   rR   rJ   rH   rI   r!   r!   r'   rf     s&   
zModels.generate_content_streamr)   )NNNNN)r*   r+   r,   r-   r.   r/   r   r0   r1   r   r   r(   rK   rQ   rh   r   floatrZ   rn   rf   r!   r!   r!   r'   r#   j   s   
 	

V
&	
6	
:
	

%	r#   )r8   rY   rE   typingr   r   r   posthog.ai.typesr   r   posthog.ai.utilsr   googler	   ImportErrorModuleNotFoundErrorposthogr
   r   r   r   "posthog.ai.gemini.gemini_converterr   r   r   posthog.ai.sanitizationr   posthog.clientr   r.   r#   r!   r!   r!   r'   <module>   s(    K