ó
    üÞ jõf  ã                  ó¾  • S SK Jr  S SKrS SKrS SKrS SKJr  S SKJrJ	r	J
r
JrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJr  \(       a  S SKJr  \" S\S\	4   S9r\R@                  " \!5      r"SS jr#S S jr$S!S jr%S"S jr&      S#S jr'S$S jr(S%S jr)S&S jr*  S'           S(S jjr+ " S S\SS9r,\SSS.       S)S jj5       r-g)*é    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚTypeVarÚUnion)Ú	TypedDict)Úclient)Úrun_helpers)Ú	warn_beta)Údumps)ÚInputTokenDetailsÚOutputTokenDetailsÚUsageMetadata)ÚgenaiÚCzgenai.Client)Úboundc                ó`   • U R                  5        VVs0 sH  u  pUc  M
  X_M     snn$ s  snnf )z%Remove `None` values from dictionary.)Úitems)ÚdÚkÚvs      ÚT/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/wrappers/_gemini.pyÚ_strip_noner      s(   € àŸW™WœYÔ8™Y‘T�Q¨!‹DˆAŠD™YÒ8Ð8ùÓ8s   ”* *c                óf   • SU ;   a+  [        U S   [        5      (       d  [        U S   5      U S'   ggg)zFConvert `GenerateContentConfig` to `dict` for LangSmith compatibility.ÚconfigN)Ú
isinstanceÚdictÚvars)Úkwargss    r   Ú_convert_config_for_tracingr#   $   s8   € à�6Ó¤*¨V°HÑ-=¼t×"DÑ"DÜ  xÑ 0Ó1ˆˆxÒð #EÐó    c                óÄ   • [        U [        [        45      (       a  U $ [        U S5      (       a  U R	                  5       $ [        U S5      (       a  U R                  5       $ U $ )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+   *   sP   € ä�#œœc�{×#Ñ#Øˆ
Üˆs�L×!Ñ!Ø�~‰~ÓÐÜˆs�I×ÑØ�{‰{‹}ÐØ€Jr$   c                óP  • U R                  S5      nU(       d  U $ [        U[        5      (       aD  SUS./U R                  S5      S.U R                  5        VVs0 sH  u  p#US;  d  M  X#_M     snnE$ [        U[        5      (       Ga…  [        S U 5       5      (       aS  U Vs/ sH  nSUS.PM
     snU R                  S5      S.U R                  5        VVs0 sH  u  p#US;  d  M  X#_M     snnE$ / nU GHÒ  n[        U5      n[        U[        5      (       d  M&  UR                  SS5      nUR                  S	/ 5      n/ n	/ n
U GH.  n[        U5      n[        U[        5      (       a'  U	R                  U5        U
R                  S
US.5        MK  [        U[        5      (       d  Mb  S
U;   a7  US
   (       a-  U	R                  US
   5        U
R                  S
US
   S.5        MŸ  SU;   a¦  [        US   5      n[        U[        5      (       d  MÊ  UR                  SS5      nUR                  SS5      n[        U[        5      (       a&  [        R                  " U5      R                  S5      nOUnU
R                  SSU SU 3SS.S.5        GMK  SU;   a>  US   nU
R                  SUR                  S5      UR                  S0 5      S.S.5        GM�  SU;   d	  SU;   d  GMž  [        UR                  S5      =(       d    UR                  S5      5      n[        U[        5      (       d  GMè  U
R                  SUR                  S 5      UR                  S5      UR                  S!0 5      S".S#.5        GM1     U
(       a)  [        S$ U
 5       5      (       a  S%R                  U	5      nOU
(       a  U
OS&nUR                  UUS.5        GMÕ     UU R                  S5      S.U R                  5        VVs0 sH  u  p#US;  d  M  X#_M     snnE$ U $ s  snnf s  snf s  snnf s  snnf )'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  ó@   #   • U H  n[        U[        5      v •  M     g 7f)N)r   r(   )Ú.0Úitems     r   Ú	<genexpr>Ú)_process_gemini_inputs.<locals>.<genexpr>P   s   é € Ð:±¨Œz˜$¤×$Ð$²ùs   ‚r/   ÚpartsÚtext©Útyper9   Úinline_dataÚ	mime_typeú
image/jpegÚdatar$   úutf-8Ú	image_urlúdata:ú;base64,Úhigh©ÚurlÚdetail©r;   rA   ÚfunctionResponseÚfunction_responseÚnameÚresponse)rK   rL   )r;   rJ   Úfunction_callÚfunctionCallÚidÚargs©rO   rK   Ú	arguments©r;   rM   c              3  óF   #   • U H  oR                  S 5      S:H  v •  M     g7f)r;   r9   N)Úget)r4   Úps     r   r6   r7   �   s   é € Ð$TÁmÀ§U¡U¨6£]°fÖ%<Âmùs   ‚!Ú
Ú )rU   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_b64rJ   ÚfcÚmessage_contents                      r   Ú_process_gemini_inputsri   5   sñ  € ð �z‰z˜*Ó%€HÞØˆô �(œC× Ñ à"(°XÑ>Ð?Ø—Z‘Z Ó(ñ
ð "(§¡¤ÔR¡™˜°1Ð<QÑ3Q“�’¡ÒRð
ð 	
ô �(œD×!Ò!äÑ:±Ó:×:Ñ:ñ LTÓTÉ8À4 f¸Ô>É8ÑTØŸ™ GÓ,ñð &,§\¡\¤^ÔV¡^™T˜Q°qÐ@UÑ7U“D�A’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Ñ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Ñ!TØDHÇIÁIØóE‘ö 4A¡-Àb�à�O‰O T°oÑF×GñW  ð\ !Ø—Z‘Z Ó(ñ
ð "(§¡¤ÔR¡™˜°1Ð<QÑ3Q“�’¡ÒRð
ð 	
ð €MùóG Sùò UùãVùóh Ss*   ÁPÁ)PÂ%PÃPÃ)PÏ5P"ÐP"c                óD  • [        U5      nUR                  S0 5      n[        US5      (       a'  UR                  n[	        USS5      n[	        USS5      nO3UR                  S5      nUR                  S5      nUR                  S5      nSSUR                  S5      UUUU 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   rU   r)   rk   Úgetattr)Úprepopulated_invocation_paramsr"   Ústrippedr   rk   Ú
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                óÄ  • U R                  S5      =(       d    SnU R                  S5      =(       d    SnU R                  S5      =(       d    SnU R                  S5      =(       d    SnU R                  S5      =(       d    X-   n0 nU(       a5  [        US5      US'   [        SUS-
  5      US	'   [        SX-
  S-
  5      US
'   0 nU(       a  XGS'   U(       a  [        SUS-
  5      US
'   [        UUU[	        S0 UR                  5        VV	s0 sH  u  p‰U	c  M
  X‰_M     sn	nD6[        S0 UR                  5        VV	s0 sH  u  p‰U	c  M
  X‰_M     sn	nD6S9$ s  sn	nf s  sn	nf )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© )rU   Ú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ð ð
 !#ÐÞ!Ü,/Ð0JÈFÓ,SÐ˜LÑ)Ü69ØÐ)¨FÑ2ó7
ÐÐ2Ñ3ô ,/ØÐ!Ñ>ÀÑGó,
Ð˜KÑ(ð "$ÐÞØ,@˜[Ñ)æÜ,/°Ð3IÈFÑ3RÓ,SÐ˜[Ñ)äØ'Ø,Ø&Ü-ñ 
Ø 3× 9Ñ 9Ô ;ÔMÑ ;™˜¸q‹tˆqŠtÑ ;ÒMñ
ô 0ñ 
Ø 4× :Ñ :Ô <ÔNÑ <™˜À‹tˆqŠtÑ <ÒNñ
ñ
ð 
ùó
 Nùó Os   ÄEÄEÄ<EÅEc                óž  •  [        U S5      (       a  U R                  5       nO:[        U S5      (       a  U R                  5       nOS[        U S[	        U 5      5      0nSn/ nSnSU;   Ga´  US   (       Ga©  US   S   nSU;   Ga™  US   nS	U;   Gax  US	   (       Gam  US	    GHc  nSU;   a*  US   (       a   X'S   -  nUR                  SUS   S
.5        M4  SU;   a‹  US   b…  US   nUR                  SS5      n	UR                  SS5      n
[        U
[        5      (       a&  [        R                  " U
5      R                  S5      nOU
nUR                  SSU	 SU 3SS.S.5        MÅ  SU;   d  SU;   d  MÓ  [        UR                  S5      =(       d    UR                  S5      5      n[        U[        5      (       d  GM  UR                  SUR                  S5      UR                  S5      UR                  S0 5      S.S.5        GMf     SU;   a  US   (       a  US   nOSU;   a  US   nUR                  SUS
.5        U Vs/ sH  oÝR                  S5      S:X  d  M  UPM     nnU(       ax  U=(       d    SS U[        U5       VVs/ sHQ  u  nnUS   R                  S5      =(       d    S!U 3S"UUS   S   [        US   S#   5      R                  5       S$.S%.PMS     snnS&.nO/[!        U5      S':”  d  U(       a  US   S   S:w  a  US US(.nOUS US(.nUR                  S)5      n[#        SSSS*9nU(       a  [%        U5      nUR                  S+5      (       a  US   S UUS+   US,.$ [        US   [        5      (       a
  US   S UUS-.$ US   S UUS-.$ s  snf s  snnf ! [&         a&  n[(        R+                  S.U 35        S/U 0s SnA$ SnAff = f)0z$Process Gemini response for tracing.r'   r&   r9   rX   NÚ
candidatesr   r0   r8   r:   r<   r=   r>   r?   r$   r@   rA   rB   rC   rD   rE   rH   rM   rN   rO   rK   rP   rQ   rS   Úfinish_reasonr;   Ú	assistantÚcall_ÚfunctionrR   )rK   rR   )rO   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&   rw   r(   r[   rU   r   r\   r]   r^   r_   r+   r    Ú	enumerateÚ_dumpsÚlenr   r�   Ú	ExceptionÚloggerÚdebug)rL   ÚrdictÚcontent_resultrd   r“   Ú	candidater0   re   r<   r=   r?   rf   rg   rV   r˜   ÚiÚtcÚresultrš   Ú
usage_dictÚes                        r   Ú"_process_generate_content_responser«   ÷   s9  € ðN$ä�8˜Y×'Ñ'Ø×$Ñ$Ó&‰EÜ�X˜|×,Ñ,Ø×'Ñ'Ó)‰EàœW X¨v´s¸8³}ÓEÐFˆEð ˆØˆØ'+ˆØ˜5Ô  U¨<×%8Ð%8Ø˜lÑ+¨AÑ.ˆIØ˜IÔ%Ø# IÑ.�Ø˜gÔ%¨'°'×*:Ð*:Ø '¨Õ 0˜à! T›>¨d°6¯lØ*°6©lÑ:˜NØ)×0Ñ0¸&È$ÈvÉ,Ñ1WÖXà*¨dÓ2°t¸MÑ7JÑ7VØ*.¨}Ñ*=˜KØ(3¯©¸À\Ó(R˜IØ#.§?¡?°6¸3Ó#?˜Dô  *¨$´×6Ñ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Ô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Ñ1à% iÑ0Ø'Ø%2Ø&0ñ	ð ð  & iÑ0Ø'Ø%2Ø&0ñ	ð ùòI TùóøôF ó $Ü�‰Ð9¸!¸Ð=Ô>Ø˜(Ð#Õ#ûð$ús^   ‚E.N Å4AN Æ>BN ÉNÉNÉ##N ÊANËBN Í%!N Î	N ÎN Î
OÎ&OÏOÏOc           	     ó²  • U (       d  S[        SSSS9S.$ SnSnU  H6  n [        US5      (       a  UR                  (       a  XR                  -  nUnM8     [        SSSS9nU(       Ga   [        US5      (       aù  UR                  (       aè  [        UR                  S	5      (       a  UR                  R                  5       nO§[        UR                  S
5      (       a  UR                  R                  5       nOq[        UR                  SS5      [        UR                  SS5      [        UR                  SS5      [        UR                  SS5      [        UR                  SS5      S.n[        U5      nUUS.$ ! [         a$  n[        R                  SU 35         SnAGM†  SnAff = f! [         a"  n[        R                  SU 35         SnAN]SnAff = f)z/Reduce streaming chunks into a single response.rX   r   r›   )r0   rš   Nr9   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)   r9   r    r¡   r¢   rš   r'   r&   rw   r�   )Ú
all_chunksÚ	full_textÚ
last_chunkÚchunkrª   rš   r©   s          r   Ú_reduce_generate_content_chunksr±   Š  sÖ  € æàÜ+Ø¨a¸aññ
ð 	
ð €IØ€Jãˆð	9Ü�u˜f×%Ñ%¨%¯*¯*ØŸZ™ZÑ'�	ØŠJñ	 ô %2Ø a°añ%€N÷ ð	LÜ�zÐ#3×4Ñ4¸×9R×9RÜ˜:×4Ñ4°i×@Ñ@Ø!+×!:Ñ!:×!BÑ!BÓ!D‘JÜ˜Z×6Ñ6¸×EÑ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    2E9Á*D
F* Å9
F'ÆF"Æ"F'Æ*
GÆ4GÇGFc                óì   ^ ^^^^• U=(       d    0 m[         R                  " T 5      UUU UU4S j5       n[         R                  " T 5      UUU UU4S j5       n[        R                  " T 5      (       a  U$ U$ )z9Create a wrapper for Gemini's `generate_content` methods.c                 óÞ   >• [        U5        [        R                  " STST(       a  [        OS [        T(       d  [
        OS [        R                  " [        T5      S.TD6nU" T5      " U 0 UD6$ ©NÚllm)rK   Úrun_typeÚ	reduce_fnÚprocess_inputsÚprocess_outputsÚ_invocation_params_fnrŒ   ©	r#   r   Ú	traceabler±   ri   r«   Ú	functoolsÚpartialr|   ©rP   r"   Ú	decoratorÚis_streamingrK   Úoriginal_generaterx   Útextras      €€€€€r   ÚgenerateÚ_get_wrapper.<locals>.generateÔ  sq   ø€ ô 	$ FÔ+ä×)Ò)ð 
ØØÞ9EÕ5È4Ü1æ:FÕ2ÈDä"+×"3Ò"3Ü(Ð*Hó#ñ
ð ñ
ˆ	ñ Ð*Ô+¨TÐ<°VÑ<Ð<r$   c               Ÿ  óú   >#   • [        U5        [        R                  " STST(       a  [        OS [        T(       d  [
        OS [        R                  " [        T5      S.TD6nU" T5      " U 0 UD6I S h  v•N $  N7fr´   r»   r¿   s      €€€€€r   Ú	agenerateÚ_get_wrapper.<locals>.agenerateé  sz   øé € ô 	$ FÔ+ä×)Ò)ð 
ØØÞ9EÕ5È4Ü1æ:FÕ2ÈDä"+×"3Ò"3Ü(Ð*Hó#ñ
ð ñ
ˆ	ñ Ð0Ô1°4ÐB¸6ÑB×BÐBÑBùs   ƒA1A;Á4A9Á5A;)r½   Úwrapsr   Úis_async)rÂ   rK   rx   Útracing_extrarÁ   rÄ   rÇ   rÃ   s   ``` `  @r   Ú_get_wrapperrÌ   Ê  st   ü€ ð × ˜b€Fä‡_‚_Ð&Ó'÷=ð =ó (ð=ô( ‡_‚_Ð&Ó'÷Cð Có (ðCô( $×,Ò,Ð->×?Ñ?ˆ9ÐMÀXÐMr$   c                  ó4   • \ rS rSr% S\S'   S\S'   S\S'   Srg	)
ÚTracingExtrai  zOptional[Mapping[str, Any]]ÚmetadatazOptional[list[str]]ÚtagszOptional[ls_client.Client]r   rŒ   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__rŒ   r$   r   rÎ   rÎ     s   ‡ Ø)Ó)Ø
ÓØ&Ö&r$   rÎ   )ÚtotalÚChatGoogleGenerativeAI)rË   Ú	chat_namec               óz  • U=(       d    0 n[        UR                  S5      =(       d    0 5      nUR                  S0 5      nUR                  5        VVs0 sH  u  pVUS:w  d  M  XV_M     nnnU(       a  X7S'   [	        U S5      (       aK  [	        U R
                  S5      (       a0  [	        U R
                  R                  S5      (       a  [        S5      e[	        U S5      (       aK  [	        U R
                  S5      (       a0  [        U R
                  R                  UUUSS9U R
                  l        [	        U S5      (       aK  [	        U R
                  S	5      (       a0  [        U R
                  R                  UUUS
S9U R
                  l	        [	        U S5      (       a„  [	        U R                  S5      (       ai  [	        U R                  R
                  S5      (       aD  [        U R                  R
                  R                  UUUSS9U R                  R
                  l        [	        U S5      (       a„  [	        U R                  S5      (       ai  [	        U R                  R
                  S	5      (       aD  [        U R                  R
                  R                  UUUS
S9U R                  R
                  l	        U $ s  snnf )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Ï   rv   Ú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    rU   Úpopr   r)   rÛ   rÜ   Ú
ValueErrorrÌ   rÞ   rß   )r   rË   rÙ   rÏ   rx   r   r   Útracing_extra_rests           r   Úwrap_geminirã     sF  € ðF "×' R€Mô �M×%Ñ% jÓ1×7°RÓ8€HØ%-§\¡\Ð2HÈ"Ó%MÐ"ð '×,Ñ,Ô.ô(Ù.‘�°!°z±/‹ˆŠÑ.ð ñ (ö Ø)1˜:Ñ&ô 	�˜×!Ñ!Ü�F—M‘MÐ#5×6Ñ6Ü�F—M‘M×2Ñ2°M×BÑBäðAó
ð 	
ô ˆv�x× Ñ ¤W¨V¯]©]Ð<N×%OÑ%OÜ)5Ø�M‰M×*Ñ*ØØ*Ø,Øñ*
ˆ�‰Ô&ô ˆv�x× Ñ ¤W¨V¯]©]Ð<U×%VÑ%VÜ0<Ø�M‰M×1Ñ1ØØ*Ø,Øñ1
ˆ�‰Ô-ô 	�˜×ÑÜ�F—J‘J ×)Ñ)Ü�F—J‘J×%Ñ%Ð'9×:Ñ:ä-9Ø�J‰J×Ñ×.Ñ.ØØ*Ø,Øñ.
ˆ�
‰
×ÑÔ*ô 	�˜×ÑÜ�F—J‘J ×)Ñ)Ü�F—J‘J×%Ñ%Ð'@×AÑAä4@Ø�J‰J×Ñ×5Ñ5ØØ*Ø,Øñ5
ˆ�
‰
×ÑÔ1ð €Mùó(s   ÁJ7Á#J7)r   r    Úreturnr    )r"   r    rä   ÚNone)r*   r   rä   r   )ra   r    rä   r    )rx   r    r"   r    rä   r    )r�   r    rä   r   )rL   r   rä   r    )r­   rY   rä   r    )NF)rÂ   r   rK   r(   rx   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   rn   r   r   Ú	getLoggerrÑ   r¡   r   r#   r+   ri   r|   r�   r«   r±   rÌ   rÎ   rã   rŒ   r$   r   Ú<module>ró      sJ  ðÝ "ã Û Û Ý #÷÷ õ (å )Ý !Ý 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$   