
    ZiN3                         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 n# e	$ r  e
d          w xY wd dlmZmZmZ d dlmZ  G d d          Z G 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                       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
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           
      X    |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   kwargss           S/root/projects/butler/venv/lib/python3.11/site-packages/posthog/ai/gemini/gemini.py__init__zClient.__init__'   sT    ( !NOOO 
) 31!5)
 
 
 
    NNNNFN)__name__
__module____qualname____doc__r   strPostHogClientr   r   boolr   r   r   r   r
   r
      s         & "&26-17;%*37
 
#
 !/
 &c]	

 %T#s(^4
 #
 !c3h0
 
 
 
 
 
r   r
   c                   R   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Zdee         dee         deeee	f                  dee
         deeee	f                  f
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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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Z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!ZdS )$r   zS
    Models interface that mimics genai.Client().models with PostHog tracking.
    
_ph_clientNFr   r   r   r   r   r   c                 V   |t          d          || _        || _        |pi | _        || _        || _        |>t          j                            d          pt          j                            d          }|t          d          t          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
            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   s           r   r   zModels.__init__P   s    ( !NOOO( %8!#5#; %9"- ?jnn%566S"*..:S:SG?q   |G444Dr   call_distinct_idcall_trace_idcall_propertiescall_privacy_modecall_groupsc                     ||n| j         }||n| j        }||n| j        }t          | j                  }	|r|	                    |           | t          t          j                              }|||	||fS )z9Merge call-level PostHog parameters with client defaults.)	r+   r-   r.   dictr,   updater#   uuiduuid4)
r   r4   r5   r6   r7   r8   distinct_idprivacy_modegroups
propertiess
             r   _merge_posthog_paramszModels._merge_posthog_params{   s      + * 	 !, + 	
 !, 7T=Q $233
 	/o... 
--MM:|VKKr   modelposthog_trace_idr   c                     |                      |||||          \  }	}
}}}||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
        rC   contentsgemini)rB   r   r'   r3   r2   r   generate_content)r   rC   rG   r   rD   r   r   r   r   r>   trace_idrA   r?   r@   kwargs_with_contentss                  r   rI   zModels.generate_content   s    : &&# "$  	@Xz< */HOOO'ONL0
 
 #
 
 	
r   r>   rJ   rA   r?   r@   c                      t          j                     dddg d}	  j        j        j        di |	 fd}
 |
            S )Nr   input_tokensoutput_tokensrF   c               3   F  K   	 D ]{} t          | d          r4| j        r-t          | j        dd          t          | j        dd          dt          | d          r!| j        r                    | j                   | V  |	 t          j                    }|z
  }d                              }                    	
||           d S # t          j                    }|z
  }d                              }                    	
||           w xY w)Nusage_metadataprompt_token_countr   candidates_token_countrM   text )hasattrrQ   getattrrT   appendtimejoin_capture_streaming_event)chunkend_timelatencyoutputaccumulated_contentrG   r>   r@   r   rC   r?   rA   responser   
start_timerJ   usage_statss       r   	generatorz5Models._generate_content_streaming.<locals>.generator   s     "%    Eu&677 E<P ,3 % 46JA- - .5 % 46NPQ. .	' ' uf-- ?%* ?+225:>>>KKKK "  9;;"Z/!455--     	  9;;"Z/!455--    s   A>C AD r   )rY   r2   r   generate_content_stream)r   rC   rG   r>   rJ   rA   r?   r@   r   kwargs_without_streamrd   r`   ra   rb   rc   s   `````````  @@@@r   _generate_content_streamingz"Models._generate_content_streaming   s     Y[[
781&M&M */X P P P>4<&>WWAVWW%	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	 %	N y{{r   rc   r^   r_   c                    | t          t          j                              }d|t          |          t	          | j        ||                     |                    t	          | j        ||ddg          d|	                    dd          |	                    dd          |
|| j        d|pi }|d	|d
<   t          | j        d          r | j        
                    |d||           d S d S )NrH   	assistant)contentrole   rN   r   rO   )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)r>   eventrA   r@   )r#   r<   r=   r   r	   r'   _format_inputr1   r3   rV   rm   )r   rC   rG   r>   rJ   rA   r?   r@   r   rc   r^   r_   event_propertiess                r   r[   zModels._capture_streaming_event  s0    4:<<((H %$4V$<$<*""8,, 
 #4#[99:# #
  # + B B!,!!D!D"$ N'
 
( R)
. :?674?I.. 	O##'&+	 $     	 	r   c                    t          |t                    rd|dgS t          |t                    rg }|D ]}t          |t                    r|                    d|d           0t	          |d          r|                    d|j        d           ^|                    dt          |          d           |S dt          |          dgS )z*Format input contents for PostHog trackinguser)rk   rj   rT   )
isinstancer#   listrX   rV   rT   )r   rG   	formatteditems       r   ro   zModels._format_input>  s    h$$ 	@#99::$'' 	@I  M MdC(( M$$f%F%FGGGGT6** M$$f%K%KLLLL$$fT%K%KLLLL#H>>??r   c           	      h    |                      |||||          \  }	}
}}} | j        |||	|
|||fi |S )N)rB   rg   )r   rC   rG   r   rD   r   r   r   r   r>   rJ   rA   r?   r@   s                 r   re   zModels.generate_content_streamO  ss     &&# "$  	@Xz< 0t/	
 	
 	
 	
 		
r   r   )NNNNN)r   r    r!   r"   r$   __annotations__r   r#   r   r   r%   r   rB   rI   rg   intfloatr[   ro   re   r   r   r   r   r   I   s           "&26-17;%*37)E )E#)E !/)E &c]	)E
 %T#s(^4)E #)E !c3h0)E )E )E )EVL"3-L  }L "$sCx.1	L
 $D>L d38n-L L L LH .2*.7;/3373
 3
3
 &c]	3

 #3-3
 %T#s(^43
 'tn3
 !c3h03
 3
 3
 3
 3
j99 c]	9
 3-9 T#s(^,9 9 c3h(9 9 9 9 9v11 c]	1
 3-1 T#s(^,1 1 c3h(1 S#X1 #s(^1 1 1 1 1 1f@ @ @* .2*.7;/337
 

 &c]	

 #3-
 %T#s(^4
 'tn
 !c3h0
 
 
 
 
 
 
r   r   )r/   rY   r<   typingr   r   r   googler   ImportErrorModuleNotFoundErrorposthog.ai.utilsr   r   r	   posthog.clientr
   r$   r   r   r   r   <module>r      s6   				   & & & & & & & & & &   

^  
         
 3 2 2 2 2 21
 1
 1
 1
 1
 1
 1
 1
he
 e
 e
 e
 e
 e
 e
 e
 e
 e
s    0