Ë
    ³Œjõf  ã                  ó¨  — d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ erd dlmZ  edede	f   ¬«      Z ej@                  e!«      Z"dd„Z#d d„Z$d!d„Z%d"d„Z&	 	 	 	 	 	 d#d„Z'd$d„Z(d%d„Z)d&d„Z*	 	 d'	 	 	 	 	 	 	 	 	 	 	 d(d„Z+ G d„ ded¬«      Z,edddœ	 	 	 	 	 	 	 d)d„«       Z-y)*é    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚTypeVarÚUnion)Ú	TypedDict)Úclient)Úrun_helpers)Ú	warn_beta)Údumps)ÚInputTokenDetailsÚOutputTokenDetailsÚUsageMetadata)ÚgenaiÚCzgenai.Client)Úboundc                ó\   — | j                  «       D ��ci c]  \  }}|€Œ	||“Œ c}}S c c}}w )z%Remove `None` values from dictionary.)Úitems)ÚdÚkÚvs      úd/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/wrappers/_gemini.pyÚ_strip_noner      s,   € àŸW™WœYÔ8™Y‘T�Q˜¨!©-ˆAˆq‰D˜YÒ8Ð8ùÓ8s   ”
(Ÿ(c                óX   — d| v r&t        | d   t        «      st        | d   «      | d<   yyy)zFConvert `GenerateContentConfig` to `dict` for LangSmith compatibility.ÚconfigN)Ú
isinstanceÚdictÚvars)Úkwargss    r   Ú_convert_config_for_tracingr#   $   s5   € à�6Ñ¤*¨V°HÑ-=¼tÔ"DÜ  xÑ 0Ó1ˆˆxÒð #EÐó    c                ó¦   — t        | t        t        f«      r| S t        | d«      r| j	                  «       S t        | d«      r| j                  «       S | S )zISerialize a Pydantic/model object to dict (or return as-is for dict/str).Ú
model_dumpÚto_dict)r   r    ÚstrÚhasattrr&   r'   )Úobjs    r   Ú_to_dictr+   *   sG   € ä�#œœc�{Ô#Øˆ
Üˆs�LÔ!Ø�~‰~ÓÐÜˆs�IÔØ�{‰{‹}ÐØ€Jr$   c                ót  — | j                  d«      }|s| S t        |t        «      rAd|dœg| j                  d«      dœ| j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}¥S t        |t        «      �r)t        d„ |D «       «      rN|D �cg c]  }d|dœ‘Œ	 c}| j                  d«      dœ| j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}¥S g }|D �]„  }t        |«      }t        |t        «      sŒ |j                  dd«      }|j                  d	g «      }g }	g }
|D �]÷  }t        |«      }t        |t        «      r&|	j                  |«       |
j                  d
|dœ«       ŒEt        |t        «      sŒVd
|v r1|d
   r,|	j                  |d
   «       |
j                  d
|d
   dœ«       Œ‹d|v r™t        |d   «      }t        |t        «      sŒ®|j                  dd«      }|j                  dd«      }t        |t        «      r%t        j                  |«      j                  d«      }n|}|
j                  dd|› d|› �ddœdœ«       �Œ(d|v r=|d   }|
j                  d|j                  d«      |j                  di «      dœdœ«       �Œid|v sd|v s�Œst        |j                  d«      xs |j                  d«      «      }t        |t        «      s�Œ²|
j                  d|j                  d «      |j                  d«      |j                  d!i «      d"œd#œ«       �Œú |
r$t        d$„ |
D «       «      rd%j                  |	«      }n|
r|
nd&}|j                  ||dœ«       �Œ‡ || j                  d«      dœ| j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}¥S | S c c}}w c c}w c c}}w c c}}w )'u»  Process Gemini inputs to normalize them for LangSmith tracing.

    Example:
        ```txt
        {"contents": "Hello", "model": "gemini-pro"}
        â†’ {"messages": [{"role": "user", "content": "Hello"}], "model": "gemini-pro"}
        {"contents": [{"role": "user", "parts": [{"text": "What is AI?"}]}], "model": "gemini-pro"}
        â†’ {"messages": [{"role": "user", "content": "What is AI?"}], "model": "gemini-pro"}
        ```
    ÚcontentsÚuser)ÚroleÚcontentÚmodel)Úmessagesr1   )r-   r1   c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­w)N)r   r(   )Ú.0Úitems     r   Ú	<genexpr>z)_process_gemini_inputs.<locals>.<genexpr>P   s   è ø€ Ð:±¨Œz˜$¤×$±ùs   ‚r/   ÚpartsÚtext©Útyper8   Úinline_dataÚ	mime_typeú
image/jpegÚdatar$   úutf-8Ú	image_urlúdata:ú;base64,Úhigh©ÚurlÚdetail©r:   r@   ÚfunctionResponseÚfunction_responseÚnameÚresponse)rJ   rK   )r:   rI   Úfunction_callÚfunctionCallÚidÚargs©rN   rJ   Ú	arguments©r:   rL   c              3  óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)r:   r8   N)Úget)r4   Úps     r   r6   z)_process_gemini_inputs.<locals>.<genexpr>�   s   è ø€ Ð$TÁmÀ Q§U¡U¨6£]°fÕ%<Ámùs   ‚ Ú
Ú )rT   r   r(   r   ÚlistÚallr+   r    ÚappendÚbytesÚbase64Ú	b64encodeÚdecodeÚjoin)Úinputsr-   r   r   r5   r2   r0   r/   Ú	raw_partsÚ
text_partsÚcontent_partsÚpartr;   r<   r>   Údata_b64rI   ÚfcÚmessage_contents                      r   Ú_process_gemini_inputsrh   5   sÙ  € ð �z‰z˜*Ó%€HÙØˆô �(œCÔ à"(°XÑ>Ð?Ø—Z‘Z Ó(ñ
ð "(§¡¤ÔR¡™˜˜A°1Ð<QÒ3Q��1‘ ÒRð
ð 	
ô �(œDÕ!äÑ:±Ó:Ô:ñ LTÓTÉ8À4 f¸Ó>È8ÑTØŸ™ GÓ,ñð &,§\¡\¤^ÔV¡^™T˜Q °qÐ@UÒ7U�A�q‘D ^ÒVðð ð ˆÜˆGÜ˜wÓ'ˆGÜ˜g¤tÔ,ØØ—;‘;˜v vÓ.ˆDØŸ™ G¨RÓ0ˆIà$&ˆJØ24ˆMä!�Ü “~�Ü˜d¤CÔ(Ø×%Ñ% dÔ+Ø!×(Ñ(°&À$Ñ)GÔHØÜ! $¬Ô-ØØ˜T‘> d¨6¢lØ×%Ñ% d¨6¡lÔ3Ø!×(Ñ(°&À$ÀvÁ,Ñ)OÕPØ" dÑ*Ü"*¨4°Ñ+>Ó"?�KÜ% k´4Ô8Ø Ø +§¡°¸\Ó J�IØ&Ÿ?™?¨6°3Ó7�Dä! $¬Ô.Ü#)×#3Ñ#3°DÓ#9×#@Ñ#@ÀÓ#I™à#'˜à!×(Ñ(à$/à).¨y¨k¸À(ÀÐ'LØ*0ñ*ñöð (¨4Ñ/Ø(,Ð-?Ñ(@Ð%Ø!×(Ñ(à$7à(9×(=Ñ(=¸fÓ(EØ,=×,AÑ,AÀ*ÈbÓ,Qñ2ñöð %¨Ñ,°À$Ó0FÜ! $§(¡(¨?Ó";Ò"W¸t¿x¹xÈÓ?WÓX�BÜ! "¤dÖ+Ø%×,Ñ,à(7à*,¯&©&°«,Ø,.¯F©F°6«NØ13·±¸ÀÓ1Cñ2"ñö	ð] "ñt ¤Ñ$TÁmÓ$TÔ!TØDHÇIÁIØóE‘ñ 4A¡-Àb�à�O‰O T°oÑFÖGðW  ð\ !Ø—Z‘Z Ó(ñ
ð "(§¡¤ÔR¡™˜˜A°1Ð<QÒ3Q��1‘ ÒRð
ð 	
ð €MùóG Sùò UùãVùóh Ss*   ÁN#ÁN#ÂN)ÃN.ÃN.Î
N4ÎN4c                ó:  — t        |«      }|j                  di «      }t        |d«      r'|j                  }t	        |dd«      }t	        |dd«      }n3|j                  d«      }|j                  d«      }|j                  d«      }dd|j                  d«      |||| d	œS )
z*Extract invocation parameters for tracing.r   ÚtemperatureÚmax_output_tokensNÚstop_sequencesÚgoogleÚchatr1   )Úls_providerÚls_model_typeÚls_model_nameÚls_temperatureÚls_max_tokensÚls_stopÚls_invocation_params)r   rT   r)   rj   Úgetattr)Úprepopulated_invocation_paramsr"   Ústrippedr   rj   Ú
max_tokensÚstops          r   Ú_infer_invocation_paramsr{   °   s©   € ô ˜6Ó"€HØ�\‰\˜( BÓ'€Fô ˆv�}Ô%Ø×(Ñ(ˆÜ˜VÐ%8¸$Ó?ˆ
Ü�vÐ/°Ó6‰à—j‘j Ó/ˆØ—Z‘ZÐ 3Ó4ˆ
Ø�z‰zÐ*Ó+ˆð  ØØ!Ÿ™ gÓ.Ø%Ø#ØØ >ñð r$   c                óx  — | j                  d«      xs d}| j                  d«      xs d}| j                  d«      xs d}| j                  d«      xs d}| j                  d«      xs ||z   }i }|r6t        |d«      |d<   t        d|dz
  «      |d	<   t        d||z
  dz
  «      |d
<   i }|r||d<   |rt        d|dz
  «      |d
<   t        |||t	        di |j                  «       D ��	ci c]  \  }}	|	€Œ	||	“Œ c}	}¤Žt        di |j                  «       D ��	ci c]  \  }}	|	€Œ	||	“Œ c}	}¤Ž¬«      S c c}	}w c c}	}w )z2Convert Gemini usage metadata to LangSmith format.Úprompt_token_countr   Úcandidates_token_countÚcached_content_token_countÚthoughts_token_countÚtotal_token_counti@ Ú
cache_readÚcache_read_over_200kÚ	over_200kÚ	reasoning)Úinput_tokensÚoutput_tokensÚtotal_tokensÚinput_token_detailsÚoutput_token_details© )rT   ÚminÚmaxr   r   r   r   )
Úgemini_usage_metadatar}   r~   r   r€   r�   r‰   rŠ   r   r   s
             r   Ú_create_usage_metadatar�   Ì   s¤  € à.×2Ñ2Ð3GÓHÒMÈAÐØ2×6Ñ6Ð7OÓPÒUÐTUÐà×!Ñ!Ð">Ó?ÒDÀ1ð ð 1×4Ñ4Ð5KÓLÒQÐPQÐà×!Ñ!Ð"5Ó6ò 	7ØÐ 6Ñ6ð ð
 !#ÐÙ!Ü,/Ð0JÈFÓ,SÐ˜LÑ)Ü69ØÐ)¨FÑ2ó7
ÐÐ2Ñ3ô ,/ØÐ!Ð$>Ñ>ÀÑGó,
Ð˜KÑ(ð "$ÐÙØ,@Ð˜[Ñ)áÜ,/°Ð3IÈFÑ3RÓ,SÐ˜[Ñ)äØ'Ø,Ø&Ü-ñ 
Ø 3× 9Ñ 9Ô ;ÔMÑ ;™˜˜1¸q¹}ˆq�!‰tÐ ;ÒMñ
ô 0ñ 
Ø 4× :Ñ :Ô <ÔNÑ <™˜˜1ÀÁˆq�!‰tÐ <ÒNñ
ô
ð 
ùó
 Nùó Os   Ã&
D0Ã1D0Ä
D6Ä D6c                óÀ  — 	 t        | d«      r| j                  «       }n5t        | d«      r| j                  «       }ndt        | dt	        | «      «      i}d}g }d}d|v �r{|d   �ru|d   d   }d|v �r…|d   }d	|v �rO|d	   �rI|d	   D �]@  }d|v r%|d   r ||d   z  }|j                  d|d   d
œ«       Œ-d|v rƒ|d   �~|d   }|j                  dd«      }	|j                  dd«      }
t        |
t        «      r%t        j                  |
«      j                  d«      }n|
}|j                  dd|	› d|› �ddœdœ«       Œ´d|v sd|v sŒ½t        |j                  d«      xs |j                  d«      «      }t        |t        «      sŒû|j                  d|j                  d«      |j                  d«      |j                  di «      dœdœ«       �ŒC d|v r(|d   r#|d   }nd|v r|d   }|j                  d|d
œ«       |D �cg c]  }|j                  d«      dk(  sŒ|‘Œ }}|rl|xs dd |t        |«      D ��cg c]K  \  }}|d   j                  d«      xs d!|› �d"||d   d   t        |d   d#   «      j                  «       d$œd%œ‘ŒM c}}d&œ}n(t!        |«      d'kD  s|r|d   d   dk7  r|d |d(œ}n|d |d(œ}|j                  d)«      }t#        ddd¬*«      }|rt%        |«      }|j                  d+«      r|d   d ||d+   |d,œS t        |d   t        «      r
|d   d ||d-œS |d   d ||d-œS c c}w c c}}w # t&        $ r&}t(        j+                  d.|› �«       d/| icY d}~S d}~ww xY w)0z$Process Gemini response for tracing.r'   r&   r8   rW   NÚ
candidatesr   r0   r7   r9   r;   r<   r=   r>   r$   r?   r@   rA   rB   rC   rD   rG   rL   rM   rN   rJ   rO   rP   rR   Úfinish_reasonr:   Ú	assistantÚcall_ÚfunctionrQ   )rJ   rQ   )rN   r:   Úindexr•   )r0   r/   r’   Ú
tool_callsé   )r0   r/   r’   Úusage_metadata©r†   r‡   rˆ   r—   )r0   r/   r’   r—   r™   )r0   r/   r’   r™   z"Error processing Gemini response: Úoutput)r)   r'   r&   rv   r(   rZ   rT   r   r[   r\   r]   r^   r+   r    Ú	enumerateÚ_dumpsÚlenr   r�   Ú	ExceptionÚloggerÚdebug)rK   ÚrdictÚcontent_resultrc   r’   Ú	candidater0   rd   r;   r<   r>   re   rf   rU   r—   ÚiÚtcÚresultr™   Ú
usage_dictÚes                        r   Ú"_process_generate_content_responserª   ÷   s$  € ðN$ä�8˜YÔ'Ø×$Ñ$Ó&‰EÜ�X˜|Ô,Ø×'Ñ'Ó)‰EàœW X¨v´s¸8³}ÓEÐFˆEð ˆØˆØ'+ˆØ˜5Ò  U¨<Ó%8Ø˜lÑ+¨AÑ.ˆIØ˜IÒ%Ø# IÑ.�Ø˜gÒ%¨'°'Ó*:Ø '¨Õ 0˜à! T™>¨d°6ªlØ*¨d°6©lÑ:˜NØ)×0Ñ0¸&È$ÈvÉ,Ñ1WÕXà*¨dÑ2°t¸MÑ7JÐ7VØ*.¨}Ñ*=˜KØ(3¯©¸À\Ó(R˜IØ#.§?¡?°6¸3Ó#?˜Dô  *¨$´Ô6Ü+1×+;Ñ+;¸DÓ+A×+HÑ+HÈÓ+Q¡à+/ à)×0Ñ0à,7à16°y°kÀÈ(ÈÐ/TØ28ñ2&ñ!"õð -°Ñ4¸È$Ò8NÜ!)Ø $§¡¨Ó 9Ò U¸T¿X¹XÀnÓ=Uó"˜Bô  *¨"¬dÕ3Ø -× 4Ñ 4à0?à24·&±&¸³,Ø46·F±F¸6³NØ9;¿¹ÀÈÓ9Kñ:*ñ%&ö	!"ð? !1ðR # iÑ/°I¸oÒ4NØ$-¨oÑ$>‘MØ�u‰_Ø" 6™]ˆNØ× Ñ ¨&¸.Ñ!IÔJñ "/ÓS¡˜A°!·%±%¸³-À?Ó2R’a ˆ
ÐSÙð *Ò1¨TØ#Ø!.ô "+¨:Ô!6ôñ "7™˜˜2ð ! Ñ1×5Ñ5°dÓ;ÒJÀÀqÀc¸{Ø *Ø!"à$& Ñ$7¸Ñ$?Ü)/Ø " ?Ñ 3°KÑ @ó*ç$™f›hñ	%ó	
ð "7òñ	‰Fô& �Ó !Ò#Ù˜m¨AÑ.¨vÑ6¸&Ò@ð )Ø#Ø!.ñ‰Fð *Ø#Ø!.ñˆFð Ÿ™Ð#3Ó4ˆÜ$1Ø¨!¸!ô%
ˆ
ñ Ü/°Ó?ˆJð �:‰:�lÔ#ð " )Ñ,Ø#Ø!.Ø$ \Ñ2Ø",ñð ô ˜& Ñ+¬SÔ1à% iÑ0Ø'Ø%2Ø&0ñ	ð ð  & iÑ0Ø'Ø%2Ø&0ñ	ð ùòI TùóøôF ò $Ü�‰Ð9¸!¸Ð=Ô>Ø˜(Ð#Õ#ûð$ús]   ‚EL. Å=L. ÆA9L. Ç;L#ÈL#ÈL. È2AL(ÊA9L. Ë<L. Ì	L. Ì#L. Ì.	MÌ7MÍMÍMc           	     ód  — | sdt        ddd¬«      dœS d}d}| D ],  }	 t        |d«      r|j                  r||j                  z  }|}Œ. t        ddd¬«      }|r÷	 t        |d«      rê|j                  rÞt        |j                  d	«      r|j                  j                  «       }n¢t        |j                  d
«      r|j                  j                  «       }nqt        |j                  dd«      t        |j                  dd«      t        |j                  dd«      t        |j                  dd«      t        |j                  dd«      dœ}t        |«      }||dœS # t        $ r#}t        j                  d|› �«       Y d}~�Œbd}~ww xY w# t        $ r"}t        j                  d|› �«       Y d}~ŒZd}~ww xY w)z/Reduce streaming chunks into a single response.rW   r   rš   )r0   r™   Nr8   zError processing chunk: r™   r'   r&   r}   r~   r   r€   r�   )r}   r~   r   r€   r�   z+Error extracting metadata from last chunk: )r   r)   r8   rŸ   r    r¡   r™   r'   r&   rv   r�   )Ú
all_chunksÚ	full_textÚ
last_chunkÚchunkr©   r™   r¨   s          r   Ú_reduce_generate_content_chunksr°   Š  sÌ  € áàÜ+Ø¨a¸aôñ
ð 	
ð €IØ€Jãˆð	9Ü�u˜fÔ%¨%¯*ª*Ø˜UŸZ™ZÑ'�	Ø‰Jð	 ô %2Ø a°aô%€Nñ ð	LÜ�zÐ#3Ô4¸×9RÒ9RÜ˜:×4Ñ4°iÔ@Ø!+×!:Ñ!:×!BÑ!BÓ!D‘JÜ˜Z×6Ñ6¸ÔEØ!+×!:Ñ!:×!EÑ!EÓ!G‘Jô /6Ø&×5Ñ5Ð7KÈQó/ô 3:Ø&×5Ñ5Ð7OÐQRó3ô 7>Ø&×5Ñ5Ð7SÐUVó7ô 18Ø&×5Ñ5Ð7MÈqó1ô .5Ø&×5Ñ5Ð7JÈAó.ñ"�Jô$ "8¸
Ó!C�ð Ø(ñð øôO ò 	9Ü�L‰LÐ3°A°3Ð7×8Ò8ûð	9ûôF ò 	LÜ�L‰LÐFÀqÀcÐJ×KÑKûð	Lús0   ž)EÁC6F Å	FÅE<Å<FÆ	F/ÆF*Æ*F/Fc                óÎ   ‡ ‡‡‡‡— |xs i Št        j                  ‰ «      ˆˆˆ ˆˆfd„«       }t        j                  ‰ «      ˆˆˆ ˆˆfd„«       }t        j                  ‰ «      r|S |S )z9Create a wrapper for Gemini's `generate_content` methods.c                 óÆ   •— t        |«       t        j                  d‰d‰rt        nd t        ‰st
        nd t        j                  t        ‰«      dœ‰¤Ž}  |‰«      | i |¤ŽS ©NÚllm)rJ   Úrun_typeÚ	reduce_fnÚprocess_inputsÚprocess_outputsÚ_invocation_params_fnr‹   ©	r#   r   Ú	traceabler°   rh   rª   Ú	functoolsÚpartialr{   ©rO   r"   Ú	decoratorÚis_streamingrJ   Úoriginal_generaterw   Útextras      €€€€€r   Úgeneratez_get_wrapper.<locals>.generateÔ  ss   ø€ ô 	$ FÔ+ä×)Ñ)ð 
ØØÙ9EÕ5È4Ü1á:FÕ2ÈDä"+×"3Ñ"3Ü(Ð*Hó#ñ
ð ñ
ˆ	ð ,‰yÐ*Ó+¨TÐ<°VÑ<Ð<r$   c               Ÿ  óâ   •K  — t        |«       t        j                  d‰d‰rt        nd t        ‰st
        nd t        j                  t        ‰«      dœ‰¤Ž}  |‰«      | i |¤Žƒ d {  –—† S 7 Œ­wr³   rº   r¾   s      €€€€€r   Ú	ageneratez_get_wrapper.<locals>.agenerateé  s}   øè ø€ ô 	$ FÔ+ä×)Ñ)ð 
ØØÙ9EÕ5È4Ü1á:FÕ2ÈDä"+×"3Ñ"3Ü(Ð*Hó#ñ
ð ñ
ˆ	ð 2‘YÐ0Ó1°4ÐB¸6ÑB×BÐBÐBús   ƒA%A/Á(A-Á)A/)r¼   Úwrapsr   Úis_async)rÁ   rJ   rw   Útracing_extrarÀ   rÃ   rÅ   rÂ   s   ``` `  @r   Ú_get_wrapperrÉ   Ê  sf   ü€ ð Ò ˜b€Fä‡_�_Ð&Ó'÷=ó (ð=ô( ‡_�_Ð&Ó'÷Có (ðCô( $×,Ñ,Ð->Ô?ˆ9ÐMÀXÐMr$   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚTracingExtrazOptional[Mapping[str, Any]]ÚmetadatazOptional[list[str]]ÚtagszOptional[ls_client.Client]r   N)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r‹   r$   r   rË   rË     s   … Ø)Ó)Ø
ÓØ&Ô&r$   rË   )ÚtotalÚChatGoogleGenerativeAI)rÈ   Ú	chat_namec               óð  — |xs i }t        |j                  d«      xs i «      }|j                  di «      }|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}|r||d<   t	        | d«      rAt	        | j
                  d«      r+t	        | j
                  j                  d«      rt        d«      ‚t	        | d«      rIt	        | j
                  d«      r3t        | j
                  j                  |||d¬«      | j
                  _        t	        | d«      rIt	        | j
                  d	«      r3t        | j
                  j                  |||d
¬«      | j
                  _	        t	        | d«      r}t	        | j                  d«      rgt	        | j                  j
                  d«      rGt        | j                  j
                  j                  |||d¬«      | j                  j
                  _        t	        | d«      r}t	        | j                  d«      rgt	        | j                  j
                  d	«      rGt        | j                  j
                  j                  |||d
¬«      | j                  j
                  _	        | S c c}}w )aº  Patch the Google Gen AI client to make it traceable.

    !!! warning

        **BETA**: This wrapper is in beta.

    Supports:
        - `generate_content` and `generate_content_stream` methods
        - Sync and async clients
        - Streaming and non-streaming responses
        - Tool/function calling with proper UI rendering
        - Multimodal inputs (text + images)
        - Image generation with `inline_data` support
        - Token usage tracking including reasoning tokens

    Args:
        client: The Google Gen AI client to patch.
        tracing_extra: Extra tracing information.
        chat_name: The run name for the chat endpoint.

    Returns:
        The patched client.

    Example:
        ```python
        from google import genai
        from google.genai import types
        from langsmith import wrappers

        # Use Google Gen AI client same as you normally would.
        client = wrappers.wrap_gemini(genai.Client(api_key="your-api-key"))

        # Basic text generation:
        response = client.models.generate_content(
            model="gemini-2.5-flash",
            contents="Why is the sky blue?",
        )
        print(response.text)

        # Streaming:
        for chunk in client.models.generate_content_stream(
            model="gemini-2.5-flash",
            contents="Tell me a story",
        ):
            print(chunk.text, end="")

        # Tool/Function calling:
        schedule_meeting_function = {
            "name": "schedule_meeting",
            "description": "Schedules a meeting with specified attendees.",
            "parameters": {
                "type": "object",
                "properties": {
                    "attendees": {"type": "array", "items": {"type": "string"}},
                    "date": {"type": "string"},
                    "time": {"type": "string"},
                    "topic": {"type": "string"},
                },
                "required": ["attendees", "date", "time", "topic"],
            },
        }

        tools = types.Tool(function_declarations=[schedule_meeting_function])
        config = types.GenerateContentConfig(tools=[tools])

        response = client.models.generate_content(
            model="gemini-2.5-flash",
            contents="Schedule a meeting with Bob and Alice tomorrow at 2 PM.",
            config=config,
        )

        # Image generation:
        response = client.models.generate_content(
            model="gemini-2.5-flash-image",
            contents=["Create a picture of a futuristic city"],
        )

        # Save generated image
        from io import BytesIO
        from PIL import Image

        for part in response.candidates[0].content.parts:
            if part.inline_data is not None:
                image = Image.open(BytesIO(part.inline_data.data))
                image.save("generated_image.png")
        ```

    !!! version-added "Added in `langsmith` 0.4.33"

        Initial beta release of Google Gemini wrapper.

    rÌ   ru   ÚmodelsÚgenerate_contentÚ__wrapped__zfThis Google Gen AI client has already been wrapped. Wrapping a client multiple times is not supported.F)rÈ   rÀ   Úgenerate_content_streamTÚaio)r    rT   Úpopr   r)   rÖ   r×   Ú
ValueErrorrÉ   rÙ   rÚ   )r   rÈ   rÔ   rÌ   rw   r   r   Útracing_extra_rests           r   Úwrap_geminirÞ     s$  € ðF "Ò' R€Mô �M×%Ñ% jÓ1Ò7°RÓ8€HØ%-§\¡\Ð2HÈ"Ó%MÐ"ð '×,Ñ,Ô.ô(Ù.‘��A°!°z³/ˆˆ1‰Ð.ð ñ (ñ Ø)1Ð˜:Ñ&ô 	�˜Ô!Ü�F—M‘MÐ#5Ô6Ü�F—M‘M×2Ñ2°MÔBäðAó
ð 	
ô ˆv�xÔ ¤W¨V¯]©]Ð<NÔ%OÜ)5Ø�M‰M×*Ñ*ØØ*Ø,Øô*
ˆ�‰Ô&ô ˆv�xÔ ¤W¨V¯]©]Ð<UÔ%VÜ0<Ø�M‰M×1Ñ1ØØ*Ø,Øô1
ˆ�‰Ô-ô 	�˜ÔÜ�F—J‘J Ô)Ü�F—J‘J×%Ñ%Ð'9Ô:ä-9Ø�J‰J×Ñ×.Ñ.ØØ*Ø,Øô.
ˆ�
‰
×ÑÔ*ô 	�˜ÔÜ�F—J‘J Ô)Ü�F—J‘J×%Ñ%Ð'@ÔAä4@Ø�J‰J×Ñ×5Ñ5ØØ*Ø,Øô5
ˆ�
‰
×ÑÔ1ð €Mùó(s   Á
I2ÁI2)r   r    Úreturnr    )r"   r    rß   ÚNone)r*   r   rß   r   )r`   r    rß   r    )rw   r    r"   r    rß   r    )rŽ   r    rß   r   )rK   r   rß   r    )r¬   rX   rß   r    )NF)rÁ   r   rJ   r(   rw   r    rÈ   úOptional[TracingExtra]rÀ   Úboolrß   r   )r   r   rÈ   rá   rÔ   r(   rß   r   ).Ú
__future__r   r\   r¼   ÚloggingÚcollections.abcr   Útypingr   r   r   r   r	   r
   Útyping_extensionsr   Ú	langsmithr   Ú	ls_clientr   Ú#langsmith._internal._beta_decoratorr   Úlangsmith._internal._orjsonr   r�   Úlangsmith.schemasr   r   r   rm   r   r   Ú	getLoggerrÎ   r    r   r#   r+   rh   r{   r�   rª   r°   rÉ   rË   rÞ   r‹   r$   r   Ú<module>rî      sL  ðÝ "ã Û Û Ý #÷÷ õ (å )Ý !Ý 9Ý 7ß RÑ RáÝáˆC�u˜^¨SÐ0Ñ1Ô2€Ø	ˆ×	Ñ	˜8Ó	$€ó9ó
2óóxðvØ$(ðØ26ðà	óó8(óVP$óf=ðH -1Øð4NØð4Nà
ð4Nð %)ð4Nð *ð	4Nð
 ð4Nð ó4Nôn'�9 Eõ 'ð ð -1Ø-ñ	hØðhð *ðhð ð	hð
 òhó ñhr$   