
    KiN3                         S SK r S SKrS SKrS SKJrJrJr   S SKJr  S SKJrJrJr  S SKJr   " S S5      r " S	 S
5      rg! \	 a	    \
" S5      ef = f)    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                   |    \ rS rSrSr      SS\\   S\\   S\\   S\\\\	4      S\
S	\\\\	4      4S
 jjrSrg)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
    )
Napi_keyposthog_clientposthog_distinct_idposthog_propertiesposthog_privacy_modeposthog_groupsc           
      N    Uc  [        S5      e[        SUUUUUUS.UD6U l        g)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           Z/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/posthog/ai/gemini/gemini.py__init__Client.__init__'   sC    ( !NOO 
) 31!5)
 
    )r   NNNNFN)__name__
__module____qualname____firstlineno____doc__r   strPostHogClientr   r   boolr   __static_attributes__r   r   r   r
   r
      s    & "&26-17;%*37
#
 !/
 &c]	

 %T#s(^4
 #
 !c3h0
 
r   r
   c                   n   \ rS rSr% Sr\\S'         S#S\\   S\\   S\\   S\\	\\
4      S	\S
\\	\\
4      4S jjrS\\   S\\   S\\	\\
4      S\\   S\\	\\
4      4
S jr     S$S\S\\   S\\   S\\	\\
4      S	\\   S
\\	\\
4      S\
4S jjrS\S\\   S\\   S\\	\\
4      S\S\\	\\
4      S\
4S jrS\S\\   S\\   S\\	\\
4      S\S\\	\\
4      S\	\\
4   S\	\\4   S\S\4S jrS  r     S$S\S\\   S\\   S\\	\\
4      S	\\   S
\\	\\
4      S\
4S! jjrS"rg)%r   I   zK
Models interface that mimics genai.Client().models with PostHog tracking.

_ph_clientNr   r   r   r   r   r   c                 \   Uc  [        S5      eX l        X0l        U=(       d    0 U l        XPl        X`l        UcE  [        R                  R                  S5      =(       d    [        R                  R                  S5      nUc  [        S5      e[        R                  " US9U l        SU l        g)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   Models.__init__P   s    ( !NOO( %8!#5#; %9"- ?jjnn%56S"**..:SG?q  ||G4Dr   call_distinct_idcall_trace_idcall_propertiescall_privacy_modecall_groupsc                    Ub  UOU R                   nUb  UOU R                  nUb  UOU R                  n[        U R                  5      n	U(       a  U	R                  U5        Uc  [        [        R                  " 5       5      nXbXU4$ )z9Merge call-level PostHog parameters with client defaults.)	r0   r2   r3   dictr1   updater&   uuiduuid4)
r   r:   r;   r<   r=   r>   distinct_idprivacy_modegroups
propertiess
             r   _merge_posthog_paramsModels._merge_posthog_params{   s      + ** 	 !, ++ 	
 !, 7T=Q=Q $223
o. 

-M:VKKr   modelposthog_trace_idr   c                     U R                  UUUUU5      u  ppnXS.UEn[        U	U R                  SU
UUUU R                  U R                  R
                  R                  4	0 UD6$ )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
rJ   contentsgemini)rH   r   r,   r8   r7   r   generate_content)r   rJ   rN   r   rK   r   r   r   r   rD   trace_idrG   rE   rF   kwargs_with_contentss                  r   rP   Models.generate_content   s    : &&# "$ 	@z */OO'OONNLL00
 #
 	
r   rD   rQ   rG   rE   rF   c                    ^ ^^^^^^^^^^^^ [         R                   " 5       mSSS.m/ mTTS.TEn	T R                  R                  R                  " S0 U	D6mUUUUUUUUUU UUU4S jn
U
" 5       $ )Nr   input_tokensoutput_tokensrM   c               3   h  >#     T H  n [        U S5      (       a@  U R                  (       a/  [        U R                  SS5      [        U R                  SS5      S.m[        U S5      (       a,  U R                  (       a  TR	                  U R                  5        U v   M     [
        R
                  " 5       nUT-
  nSR                  T5      nTR                  T	TTTTT
TTTUU5        g ! [
        R
                  " 5       nUT-
  nSR                  T5      nTR                  T	TTTTT
TTTUU5        f = f7f)Nusage_metadataprompt_token_countr   candidates_token_countrU   text )hasattrrY   getattrr\   appendtimejoin_capture_streaming_event)chunkend_timelatencyoutputaccumulated_contentrN   rD   rF   r   rJ   rE   rG   responser   
start_timerQ   usage_statss       r   	generator5Models._generate_content_streaming.<locals>.generator   s8    "%Eu&677E<P<P,3 % 4 46JA- .5 % 4 46NPQ.	' uf--%**+225::>K &"  99;"Z/!45-- 	  99;"Z/!45-- s   D2BC'  AD2'AD//D2r   )ra   r7   r   generate_content_stream)r   rJ   rN   rD   rQ   rG   rE   rF   r   kwargs_without_streamrl   rh   ri   rj   rk   s   `````````  @@@@r   _generate_content_streaming"Models._generate_content_streaming   si     YY[
781&M */X P P<<&&>>WAVW%	 %	 %	N {r   rk   rf   rg   c                    Uc  [        [        R                  " 5       5      nSU[        U5      [	        U R
                  UU R                  U5      5      [	        U R
                  UUSS./5      SU	R                  SS5      U	R                  SS5      U
UU R                  S.U=(       d    0 EnUc  S	US
'   [        U R
                  S5      (       a  U R
                  R                  USUUS9  g g )NrO   	assistant)contentrole   rV   r   rW   )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)rD   eventrG   rF   )r&   rB   rC   r   r	   r,   _format_inputr6   r8   r^   rw   )r   rJ   rN   rD   rQ   rG   rE   rF   r   rk   rf   rg   event_propertiess                r   rc   Models._capture_streaming_event  s     4::<(H %$4V$<*""8,
 #4#[9:#
  # + B!,!!D"$ NN'
( R)
. :?674??I..OO##'&+	 $  /r   c                    [        U[        5      (       a  SUS./$ [        U[        5      (       a  / nU H|  n[        U[        5      (       a  UR                  SUS.5        M.  [	        US5      (       a   UR                  SUR
                  S.5        M_  UR                  S[        U5      S.5        M~     U$ S[        U5      S./$ )z*Format input contents for PostHog trackinguser)ru   rt   r\   )
isinstancer&   listr`   r^   r\   )r   rN   	formatteditems       r   ry   Models._format_input>  s    h$$#9::$''I dC(($$f%FGT6**$$f%KL$$fT%KL ! #H>??r   c           	      f    U R                  UUUUU5      u  ppnU R                  " UUU	U
UUU40 UD6$ )N)rH   rp   )r   rJ   rN   r   rK   r   r   r   r   rD   rQ   rG   rE   rF   s                 r   rn   Models.generate_content_streamO  sa     &&# "$ 	@z //	
 	
 		
r   )r8   r7   r0   r3   r2   r1   r,   r    )NNNNN)r!   r"   r#   r$   r%   r'   __annotations__r   r&   r   r   r(   r   rH   rP   rp   intfloatrc   ry   rn   r)   r   r   r   r   r   I   s     "&26-17;%*37)E#)E !/)E &c]	)E
 %T#s(^4)E #)E !c3h0)EVL"3-L  }L "$sCx.1	L
 $D>L d38n-LH .2*.7;/3373
3
 &c]	3

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

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