§
    ~Štjõ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"d7d„Z#d8d„Z$d9d„Z%d:d„Z&d;d„Z'd<d„Z(d=d!„Z)d>d$„Z*	 	 d?d@d.„Z+ G d/„ d0ed%¬1¦  «        Z,edd2d3œdAd6„¦   «         Z-dS )Bé    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚTypeVarÚUnion)Ú	TypedDict)Úclient)Úrun_helpers)Ú	warn_beta)Údumps)ÚInputTokenDetailsÚOutputTokenDetailsÚUsageMetadata)ÚgenaiÚCzgenai.Client)ÚboundÚdÚdictÚreturnc                ó>   — d„ |                       ¦   «         D ¦   «         S )z%Remove `None` values from dictionary.c                ó   — i | ]
\  }}|®||“ŒS ©N© ©Ú.0ÚkÚvs      úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/wrappers/_gemini.pyú
<dictcomp>z_strip_none.<locals>.<dictcomp>!   s   € Ð8Ð8Ð8‘T�Q˜¨!¨-ˆAˆq¨-¨-¨-ó    )Úitems)r   s    r!   Ú_strip_noner%      s   € à8Ð8˜QŸWšW™YœYÐ8Ñ8Ô8Ð8r#   ÚkwargsÚNonec                ó|   — d| v r5t          | d         t          ¦  «        st          | d         ¦  «        | d<   dS dS dS )zFConvert `GenerateContentConfig` to `dict` for LangSmith compatibility.ÚconfigN)Ú
isinstancer   Úvars)r&   s    r!   Ú_convert_config_for_tracingr,   $   sL   € à�6ÐÐ¥*¨V°HÔ-=½tÑ"DÔ"DÐÝ  xÔ 0Ñ1Ô1ˆˆxÑÐÐð ÐÐÐr#   Úobjr   c                óÒ   — t          | t          t          f¦  «        r| S t          | d¦  «        r|                      ¦   «         S t          | d¦  «        r|                      ¦   «         S | S )zISerialize a Pydantic/model object to dict (or return as-is for dict/str).Ú
model_dumpÚto_dict)r*   r   ÚstrÚhasattrr/   r0   )r-   s    r!   Ú_to_dictr3   *   sd   € å�#��c�{Ñ#Ô#ð Øˆ
Ýˆs�LÑ!Ô!ð  Ø�~Š~ÑÔÐÝˆs�IÑÔð Ø�{Š{‰}Œ}ÐØ€Jr#   Úinputsc                óR  — |                       d¦  «        }|s| S t          |t          ¦  «        r:d|dœg|                       d¦  «        dœd„ |                      ¦   «         D ¦   «         ¥S t          |t          ¦  «        �r¨t          d„ |D ¦   «         ¦  «        r@d„ |D ¦   «         |                       d¦  «        dœd	„ |                      ¦   «         D ¦   «         ¥S g }|D �]}t          |¦  «        }t          |t          ¦  «        sŒ(|                      d
d¦  «        }|                      dg ¦  «        }g }g }|D �]h}t          |¦  «        }t          |t          ¦  «        r.|                     |¦  «         |                     d|dœ¦  «         ŒUt          |t          ¦  «        sŒkd|v rB|d         r:|                     |d         ¦  «         |                     d|d         dœ¦  «         Œ±d|v r¹t          |d         ¦  «        }	t          |	t          ¦  «        sŒà|	                      dd¦  «        }
|	                      dd¦  «        }t          |t          ¦  «        r(t          j        |¦  «                             d¦  «        }n|}|                     dd|
› d|› �ddœdœ¦  «         �Œnd|v rL|d         }|                     d|                      d¦  «        |                      di ¦  «        dœdœ¦  «         �Œ¾d |v sd!|v r¢t          |                      d ¦  «        p|                      d!¦  «        ¦  «        }t          |t          ¦  «        rV|                     d |                      d"¦  «        |                      d¦  «        |                      d#i ¦  «        d$œd%œ¦  «         �Œj|r/t          d&„ |D ¦   «         ¦  «        rd'                     |¦  «        }n|r|nd(}|                     ||dœ¦  «         �Œ||                       d¦  «        dœd)„ |                      ¦   «         D ¦   «         ¥S | S )*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)Úmessagesr;   c                ó"   — i | ]\  }}|d v¯	||“ŒS ©)r6   r;   r   r   s      r!   r"   z*_process_gemini_inputs.<locals>.<dictcomp>J   ó)   € ÐRÐRÐR™˜˜A°1Ð<QÐ3QÐ3Q��1Ð3QÐ3QÐ3Qr#   c              3  ó@   K  — | ]}t          |t          ¦  «        V — Œd S r   )r*   r1   ©r   Úitems     r!   ú	<genexpr>z)_process_gemini_inputs.<locals>.<genexpr>P   s,   è è € Ð:Ð:¨�z˜$¥Ñ$Ô$Ð:Ð:Ð:Ð:Ð:Ð:r#   c                ó   — g | ]}d |dœ‘ŒS )r7   r8   r   rA   s     r!   ú
<listcomp>z*_process_gemini_inputs.<locals>.<listcomp>S   s    € ÐTÐTÐTÀ4 f¸Ð>Ð>ÐTÐTÐTr#   c                ó"   — i | ]\  }}|d v¯	||“ŒS r>   r   r   s      r!   r"   z*_process_gemini_inputs.<locals>.<dictcomp>U   s)   € ÐVÐVÐV™T˜Q °qÐ@UÐ7UÐ7U�A�qÐ7UÐ7UÐ7Ur#   r9   ÚpartsÚtext©ÚtyperH   Úinline_dataÚ	mime_typeú
image/jpegÚdatar#   úutf-8Ú	image_urlúdata:ú;base64,Úhigh©ÚurlÚdetail©rJ   rP   ÚfunctionResponseÚfunction_responseÚnameÚresponse)rZ   r[   )rJ   rY   Úfunction_callÚfunctionCallÚidÚargs©r^   rZ   Ú	arguments©rJ   r\   c              3  óH   K  — | ]}|                      d ¦  «        dk    V — ŒdS )rJ   rH   N©Úget©r   Úps     r!   rC   z)_process_gemini_inputs.<locals>.<genexpr>�   s1   è è € Ð$TÐ$TÀ Q§U¢U¨6¡]¤]°fÒ%<Ð$TÐ$TÐ$TÐ$TÐ$TÐ$Tr#   ú
Ú c                ó"   — i | ]\  }}|d v¯	||“ŒS r>   r   r   s      r!   r"   z*_process_gemini_inputs.<locals>.<dictcomp>©   r?   r#   )re   r*   r1   r$   ÚlistÚallr3   r   ÚappendÚbytesÚbase64Ú	b64encodeÚdecodeÚjoin)r4   r6   r<   r:   r9   Ú	raw_partsÚ
text_partsÚcontent_partsÚpartrK   rL   rN   Údata_b64rY   ÚfcÚmessage_contents                   r!   Ú_process_gemini_inputsrz   5   së  € ð �zŠz˜*Ñ%Ô%€HØð Øˆõ �(�CÑ Ô ð 
à"(°XÐ>Ð>Ð?Ø—Z’Z Ñ(Ô(ð
ð 
ð SÐR §¢¡¤ÐRÑRÔRð
ð 	
õ �(�DÑ!Ô!ñ \
åÐ:Ð:°Ð:Ñ:Ô:Ñ:Ô:ð 	ð UÐTÈ8ÐTÑTÔTØŸš GÑ,Ô,ðð ð WÐV V§\¢\¡^¤^ÐVÑVÔVðð ð ˆØð K	Hñ K	HˆGÝ˜wÑ'Ô'ˆGÝ˜g¥tÑ,Ô,ð ØØ—;’;˜v vÑ.Ô.ˆDØŸš G¨RÑ0Ô0ˆIà$&ˆJØ24ˆMà!ð 7ñ 7�Ý ‘~”~�Ý˜d¥CÑ(Ô(ð Ø×%Ò% dÑ+Ô+Ð+Ø!×(Ò(°&À$Ð)GÐ)GÑHÔHÐHØÝ! $­Ñ-Ô-ð ØØ˜T�>�> d¨6¤l�>Ø×%Ò% d¨6¤lÑ3Ô3Ð3Ø!×(Ò(°&À$ÀvÄ,Ð)OÐ)OÑPÔPÐPÐPØ" dÐ*Ð*Ý"*¨4°Ô+>Ñ"?Ô"?�KÝ% kµ4Ñ8Ô8ð !Ø Ø +§¢°¸\Ñ JÔ J�IØ&Ÿ?š?¨6°3Ñ7Ô7�Då! $­Ñ.Ô.ð (Ý#)Ô#3°DÑ#9Ô#9×#@Ò#@ÀÑ#IÔ#I˜˜à#'˜à!×(Ò(à$/à'L¨yÐ'LÐ'LÀ(Ð'LÐ'LØ*0ð*ð *ðð ñô ð ñ ð (¨4Ð/Ð/Ø(,Ð-?Ô(@Ð%Ø!×(Ò(à$7à(9×(=Ò(=¸fÑ(EÔ(EØ,=×,AÒ,AÀ*ÈbÑ,QÔ,Qð2ð 2ðð ñô ð ñ ð %¨Ð,Ð,°À$Ð0FÐ0FÝ! $§(¢(¨?Ñ";Ô";Ð"W¸t¿xºxÈÑ?WÔ?WÑXÔX�BÝ! "¥dÑ+Ô+ð 
Ø%×,Ò,à(7à*,¯&ª&°©,¬,Ø,.¯FªF°6©N¬NØ13·²¸ÀÑ1CÔ1Cð2"ð 2"ðð ñ	ô 	ð 	ùð ð I¥Ð$TÐ$TÀmÐ$TÑ$TÔ$TÑ!TÔ!Tð IØDHÇIÂIØñEô E��ð 4AÐ"H - -Àb�à�OŠO T°oÐFÐFÑGÔGÐGÑGð !Ø—Z’Z Ñ(Ô(ð
ð 
ð SÐR §¢¡¤ÐRÑRÔRð
ð 	
ð €Mr#   Úprepopulated_invocation_paramsc                óx  — t          |¦  «        }|                     di ¦  «        }t          |d¦  «        r*|j        }t	          |dd¦  «        }t	          |dd¦  «        }n?|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }dd|                     d¦  «        |||| d	œS )
z*Extract invocation parameters for tracing.r)   ÚtemperatureÚmax_output_tokensNÚstop_sequencesÚgoogleÚchatr;   )Úls_providerÚls_model_typeÚls_model_nameÚls_temperatureÚls_max_tokensÚls_stopÚls_invocation_params)r%   re   r2   r}   Úgetattr)r{   r&   Ústrippedr)   r}   Ú
max_tokensÚstops          r!   Ú_infer_invocation_paramsr�   °   sÍ   € õ ˜6Ñ"Ô"€HØ�\Š\˜( BÑ'Ô'€Fõ ˆv�}Ñ%Ô%ð ,ØÔ(ˆÝ˜VÐ%8¸$Ñ?Ô?ˆ
Ý�vÐ/°Ñ6Ô6ˆˆà—j’j Ñ/Ô/ˆØ—Z’ZÐ 3Ñ4Ô4ˆ
Ø�zŠzÐ*Ñ+Ô+ˆð  ØØ!Ÿš gÑ.Ô.Ø%Ø#ØØ >ðð ð r#   Úgemini_usage_metadatar   c                ó|  — |                       d¦  «        pd}|                       d¦  «        pd}|                       d¦  «        pd}|                       d¦  «        pd}|                       d¦  «        p||z   }i }|rBt          |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 d„ |                     ¦   «         D ¦   «         ¤Žt          di d„ |                     ¦   «         D ¦   «         ¤Ž¬¦  «        S )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Ú	reasoningc                ó   — i | ]
\  }}|®||“ŒS r   r   r   s      r!   r"   z*_create_usage_metadata.<locals>.<dictcomp>ï   s   € ÐMÐMÐM™˜˜1¸q¸}ˆq�!¸}¸}¸}r#   c                ó   — i | ]
\  }}|®||“ŒS r   r   r   s      r!   r"   z*_create_usage_metadata.<locals>.<dictcomp>ò   s   € ÐNÐNÐN™˜˜1ÀÀˆq�!ÀÀÀr#   )Úinput_tokensÚoutput_tokensÚtotal_tokensÚinput_token_detailsÚoutput_token_detailsr   )re   ÚminÚmaxr   r   r$   r   )rŽ   r�   r‘   r’   r“   r”   rž   rŸ   s           r!   Ú_create_usage_metadatar¢   Ì   sÐ  € à.×2Ò2Ð3GÑHÔHÐMÈAÐØ2×6Ò6Ð7OÑPÔPÐUÐTUÐà×!Ò!Ð">Ñ?Ô?ÐDÀ1ð ð 1×4Ò4Ð5KÑLÔLÐQÐPQÐà×!Ò!Ð"5Ñ6Ô6ð 	7ØÐ 6Ñ6ð ð
 !#ÐØ!ð 
Ý,/Ð0JÈFÑ,SÔ,SÐ˜LÑ)Ý69ØÐ)¨FÑ2ñ7
ô 7
ÐÐ2Ñ3õ ,/ØÐ!Ð$>Ñ>ÀÑGñ,
ô ,
Ð˜KÑ(ð "$ÐØð AØ,@Ð˜[Ñ)àð TÝ,/°Ð3IÈFÑ3RÑ,SÔ,SÐ˜[Ñ)åØ'Ø,Ø&Ý-ð 
ð 
ØMÐMÐ 3× 9Ò 9Ñ ;Ô ;ÐMÑMÔMð
ð 
õ 0ð 
ð 
ØNÐNÐ 4× :Ò :Ñ <Ô <ÐNÑNÔNð
ð 
ð
ñ 
ô 
ð 
r#   r[   c           
     óB  — 	 t          | d¦  «        r|                      ¦   «         }nEt          | d¦  «        r|                      ¦   «         }n dt          | dt	          | ¦  «        ¦  «        i}d}g }d}d|v �rÕ|d         �rÌ|d         d         }d|v �r¸|d         }d	|v �r—|d	         �rŽ|d	         D �]„}d|v r2|d         r*||d         z  }|                     d|d         d
œ¦  «         Œ9d|v r�|d         �•|d         }|                     dd¦  «        }	|                     dd¦  «        }
t          |
t          ¦  «        r(t          j
        |
¦  «                             d¦  «        }n|
}|                     dd|	› d|› �ddœdœ¦  «         ŒÚd|v sd|v r¢t          |                     d¦  «        p|                     d¦  «        ¦  «        }t          |t          ¦  «        rV|                     d|                     d¦  «        |                     d¦  «        |                     di ¦  «        dœdœ¦  «         �Œ†d|v r|d         r|d         }n$d|v r |d         }|                     d|d
œ¦  «         d„ |D ¦   «         }|r!|pdd |d!„ t          |¦  «        D ¦   «         d"œ}n4t          |¦  «        d#k    s|r|d         d$         dk    r|d |d%œ}n|d |d%œ}|                     d&¦  «        }t!          ddd¬'¦  «        }|rt#          |¦  «        }|                     d(¦  «        r|d         d ||d(         |d)œS t          |d         t          ¦  «        r|d         d ||d*œS |d         d ||d*œS # t$          $ r+}t&                               d+|› �¦  «         d,| icY d}~S d}~ww xY w)-z$Process Gemini response for tracing.r0   r/   rH   ri   NÚ
candidatesr   r:   rG   rI   rK   rL   rM   rN   r#   rO   rP   rQ   rR   rS   rT   rW   r\   r]   r^   rZ   r_   r`   rb   Úfinish_reasonc                óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rb   rd   rf   s     r!   rE   z6_process_generate_content_response.<locals>.<listcomp>;  s,   € ÐSÐSÐS˜A°!·%²%¸±-´-À?Ò2RÐ2R�aÐ2RÐ2RÐ2Rr#   Ú	assistantc           
     óÒ   — g | ]d\  }}|d                                d¦  «        pd|› �d||d          d         t          |d          d         ¦  «                             ¦   «         dœdœ‘ŒeS )r\   r^   Úcall_ÚfunctionrZ   ra   )rZ   ra   )r^   rJ   Úindexrª   )re   Ú_dumpsrq   )r   ÚiÚtcs      r!   rE   z6_process_generate_content_response.<locals>.<listcomp>B  s–   € ð ð ð ñ ˜˜2ð ! Ô1×5Ò5°dÑ;Ô;ÐJ¸{Àq¸{¸{Ø *Ø!"à$& Ô$7¸Ô$?Ý)/Ø " ?Ô 3°KÔ @ñ*ô *ç$šf™hœhð	%ð %ð	
ð 
ðð ð r#   )r:   r9   r¥   Ú
tool_callsé   rJ   )r:   r9   r¥   Úusage_metadata©r›   rœ   r�   r¯   )r:   r9   r¥   r¯   r±   )r:   r9   r¥   r±   z"Error processing Gemini response: Úoutput)r2   r0   r/   r‰   r1   rm   re   r*   rn   ro   rp   rq   r3   r   Ú	enumerateÚlenr   r¢   Ú	ExceptionÚloggerÚdebug)r[   ÚrdictÚcontent_resultru   r¥   Ú	candidater:   rv   rK   rL   rN   rw   rx   r¯   Úresultr±   Ú
usage_dictÚes                     r!   Ú"_process_generate_content_responser¿   ÷   sî  € ðN$å�8˜YÑ'Ô'ð 	GØ×$Ò$Ñ&Ô&ˆEˆEÝ�X˜|Ñ,Ô,ð 	GØ×'Ò'Ñ)Ô)ˆEˆEà�W X¨vµs¸8±}´}ÑEÔ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Ð1WÑXÔXÐXÐXà*¨dÐ2Ð2°t¸MÔ7JÐ7VØ*.¨}Ô*=˜KØ(3¯ª¸À\Ñ(RÔ(R˜IØ#.§?¢?°6¸3Ñ#?Ô#?˜Dõ  *¨$µÑ6Ô6ð 0Ý+1Ô+;¸DÑ+AÔ+A×+HÒ+HÈÑ+QÔ+Q  à+/ à)×0Ò0à,7à/T°yÐ/TÐ/TÈ(Ð/TÐ/TØ28ð2&ð 2&ð!"ð !"ñô ð ð ð -°Ð4Ð4¸È$Ð8NÐ8NÝ!)Ø $§¢¨Ñ 9Ô 9Ð U¸T¿XºXÀnÑ=UÔ=Uñ"ô "˜Bõ  *¨"­dÑ3Ô3ð 
"Ø -× 4Ò 4à0?à24·&²&¸±,´,Ø46·F²F¸6±N´NØ9;¿ºÀÈÑ9KÔ9Kð:*ð :*ð%&ð %&ñ	!"ô 	!"ð 	!"ùð # iÐ/Ð/°I¸oÔ4NÐ/Ø$-¨oÔ$>�MøØ�uˆ_ˆ_Ø" 6œ]ˆNØ× Ò ¨&¸.Ð!IÐ!IÑJÔJÐJð TÐS ÐSÑSÔSˆ
Øð $	ð *Ð1¨TØ#Ø!.ðð õ "+¨:Ñ!6Ô!6ðñ ô ð	ð ˆFˆFõ& �ÑÔ !Ò#Ð#Øð $Ø+¨AÔ.¨vÔ6¸&Ò@Ð@ð )Ø#Ø!.ðð ˆFˆFð *Ø#Ø!.ðð ˆFð ŸšÐ#3Ñ4Ô4ˆÝ$1Ø¨!¸!ð%
ñ %
ô %
ˆ
ð ð 	@Ý/°Ñ?Ô?ˆJð �:Š:�lÑ#Ô#ð 	ð " )Ô,Ø#Ø!.Ø$ \Ô2Ø",ðð ð õ ˜& Ô+­SÑ1Ô1ð à% iÔ0Ø'Ø%2Ø&0ð	ð ð ð  & iÔ0Ø'Ø%2Ø&0ð	ð ð øõ ð $ð $ð $Ý�ŠÐ=¸!Ð=Ð=Ñ>Ô>Ð>Ø˜(Ð#Ð#Ð#Ð#Ð#Ð#Ð#øøøøð$øøøs*   ‚L1M) Ì4'M) ÍM) Í)
NÍ3 NÎNÎNÚ
all_chunksrk   c           	     ór  — | sdt          ddd¬¦  «        dœS d}d}| D ]Z}	 t          |d¦  «        r|j        r
||j        z  }|}Œ'# t          $ r'}t                               d|› �¦  «         Y d}~ŒSd}~ww xY wt          ddd¬¦  «        }|�r&	 t          |d¦  «        rà|j        rÙt          |j        d	¦  «        r|j                             ¦   «         }n›t          |j        d
¦  «        r|j                             ¦   «         }nlt          |j        dd¦  «        t          |j        dd¦  «        t          |j        dd¦  «        t          |j        dd¦  «        t          |j        dd¦  «        dœ}t          |¦  «        }n4# t          $ r'}t                               d|› �¦  «         Y d}~nd}~ww xY w||dœS )z/Reduce streaming chunks into a single response.ri   r   r²   )r:   r±   NrH   zError processing chunk: r±   r0   r/   r�   r‘   r’   r“   r”   )r�   r‘   r’   r“   r”   z+Error extracting metadata from last chunk: )r   r2   rH   r¶   r·   r¸   r±   r0   r/   r‰   r¢   )rÀ   Ú	full_textÚ
last_chunkÚchunkr¾   r±   r½   s          r!   Ú_reduce_generate_content_chunksrÅ   Š  ss  € àð 
àÝ+Ø¨a¸aðñ ô ð
ð 
ð 	
ð €IØ€Jàð 9ð 9ˆð	9Ý�u˜fÑ%Ô%ð (¨%¬*ð (Ø˜UœZÑ'�	ØˆJˆJøÝð 	9ð 	9ð 	9Ý�LŠLÐ7°AÐ7Ð7Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøõ %2Ø a°að%ñ %ô %€Nð ñ Lð	LÝ�zÐ#3Ñ4Ô4ð D¸Ô9Rð DÝ˜:Ô4°iÑ@Ô@ð Ø!+Ô!:×!BÒ!BÑ!DÔ!D�J�JÝ˜ZÔ6¸ÑEÔEð Ø!+Ô!:×!EÒ!EÑ!GÔ!G�J�Jõ /6Ø&Ô5Ð7KÈQñ/ô /õ 3:Ø&Ô5Ð7OÐQRñ3ô 3õ 7>Ø&Ô5Ð7SÐUVñ7ô 7õ 18Ø&Ô5Ð7MÈqñ1ô 1õ .5Ø&Ô5Ð7JÈAñ.ô .ð"ð "�Jõ$ "8¸
Ñ!CÔ!C�øøåð 	Lð 	Lð 	LÝ�LŠLÐJÀqÐJÐJÑKÔKÐKÐKÐKÐKÐKÐKøøøøð	Løøøð
 Ø(ðð ð s0   ¡#AÁ
A6ÁA1Á1A6ÂC0F  Æ 
F1Æ
F,Æ,F1FÚoriginal_generater   rZ   r1   Útracing_extraúOptional[TracingExtra]Úis_streamingÚboolc                óÐ   ‡ ‡‡‡‡— |pi Št          j        ‰ ¦  «        ˆˆˆ ˆˆfd„¦   «         }t          j        ‰ ¦  «        ˆˆˆ ˆˆfd„¦   «         }t          j        ‰ ¦  «        r|n|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)rZ   Úrun_typeÚ	reduce_fnÚprocess_inputsÚprocess_outputsÚ_invocation_params_fnr   ©	r,   r   Ú	traceablerÅ   rz   r¿   Ú	functoolsÚpartialr�   ©r_   r&   Ú	decoratorrÉ   rZ   rÆ   r{   Útextras      €€€€€r!   Úgeneratez_get_wrapper.<locals>.generateÔ  s–   ø€ õ 	$ FÑ+Ô+Ð+åÔ)ð 
ØØØ9EÐOÕ5Ð5È4Ý1à:FÐPÕ2Ð2ÈDå"+Ô"3Ý(Ð*Hñ#ô #ð
ð 
ð ð
ð 
ˆ	ð ,ˆyˆ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 {V —†S rÍ   rÔ   rØ   s      €€€€€r!   Ú	ageneratez_get_wrapper.<locals>.agenerateé  s¬   øè è € õ 	$ FÑ+Ô+Ð+åÔ)ð 
ØØØ9EÐOÕ5Ð5È4Ý1à:FÐPÕ2Ð2ÈDå"+Ô"3Ý(Ð*Hñ#ô #ð
ð 
ð ð
ð 
ˆ	ð 2�Y�YÐ0Ñ1Ô1°4ÐB¸6ÐBÐBÐBÐBÐBÐBÐBÐBÐBr#   )rÖ   Úwrapsr   Úis_async)rÆ   rZ   r{   rÇ   rÉ   rÛ   rÝ   rÚ   s   ``` `  @r!   Ú_get_wrapperrà   Ê  sÁ   øøøøø€ ð Ð ˜b€Få„_Ð&Ñ'Ô'ð=ð =ð =ð =ð =ð =ð =ð =ñ (Ô'ð=õ( „_Ð&Ñ'Ô'ðCð Cð Cð Cð Cð Cð Cð Cñ (Ô'ðCõ( $Ô,Ð->Ñ?Ô?ÐMˆ9ˆ9ÀXÐMr#   c                  ó.   — e Zd ZU ded<   ded<   ded<   dS )Ú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â     s6   € € € € € € Ø)Ð)Ð)Ñ)ØÐÐÑØ&Ð&Ð&Ñ&Ð&Ð&r#   râ   )ÚtotalÚChatGoogleGenerativeAI)rÇ   Ú	chat_namer   rë   c               ó`  — |pi }t          |                     d¦  «        pi ¦  «        }|                     di ¦  «        }d„ |                     ¦   «         D ¦   «         }|r||d<   t	          | d¦  «        r>t	          | j        d¦  «        r)t	          | j        j        d¦  «        rt          d¦  «        ‚t	          | d¦  «        r=t	          | j        d¦  «        r(t          | j        j        |||d¬	¦  «        | j        _        t	          | d¦  «        r=t	          | j        d
¦  «        r(t          | j        j	        |||d¬	¦  «        | j        _	        t	          | d¦  «        rat	          | j
        d¦  «        rLt	          | j
        j        d¦  «        r2t          | j
        j        j        |||d¬	¦  «        | j
        j        _        t	          | d¦  «        rat	          | j
        d¦  «        rLt	          | j
        j        d
¦  «        r2t          | j
        j        j	        |||d¬	¦  «        | j
        j        _	        | S )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ã   rˆ   c                ó&   — i | ]\  }}|d k    ¯||“ŒS )rã   r   r   s      r!   r"   zwrap_gemini.<locals>.<dictcomp>q  s*   € ð (ð (ð (Ù��A°!°z²/°/ˆˆ1°/°/°/r#   Ú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   re   Úpopr$   r2   rî   rï   Ú
ValueErrorrà   rñ   rò   )r   rÇ   rë   rã   r{   Útracing_extra_rests         r!   Úwrap_geminirö     s‚  € ðF "Ð' R€Mõ �M×%Ò% jÑ1Ô1Ð7°RÑ8Ô8€HØ%-§\¢\Ð2HÈ"Ñ%MÔ%MÐ"ð(ð (Ø&×,Ò,Ñ.Ô.ð(ñ (ô (Ðð ð 2Ø)1Ð˜:Ñ&õ 	�˜Ñ!Ô!ð
å�F”MÐ#5Ñ6Ô6ð
õ �F”MÔ2°MÑBÔBð
õ
 ðAñ
ô 
ð 	
õ ˆv�xÑ Ô ð 
¥W¨V¬]Ð<NÑ%OÔ%Oð 
Ý)5ØŒMÔ*ØØ*Ø,Øð*
ñ *
ô *
ˆŒÔ&õ ˆv�xÑ Ô ð 
¥W¨V¬]Ð<UÑ%VÔ%Vð 
Ý0<ØŒMÔ1ØØ*Ø,Øð1
ñ 1
ô 1
ˆŒÔ-õ 	�˜ÑÔð
å�F”J Ñ)Ô)ð
õ �F”JÔ%Ð'9Ñ:Ô:ð
õ
 .:ØŒJÔÔ.ØØ*Ø,Øð.
ñ .
ô .
ˆŒ
ÔÔ*õ 	�˜ÑÔð
å�F”J Ñ)Ô)ð
õ �F”JÔ%Ð'@ÑAÔAð
õ
 5AØŒJÔÔ5ØØ*Ø,Øð5
ñ 5
ô 5
ˆŒ
ÔÔ1ð €Mr#   )r   r   r   r   )r&   r   r   r'   )r-   r   r   r   )r4   r   r   r   )r{   r   r&   r   r   r   )rŽ   r   r   r   )r[   r   r   r   )rÀ   rk   r   r   )NF)rÆ   r   rZ   r1   r{   r   rÇ   rÈ   rÉ   rÊ   r   r   )r   r   rÇ   rÈ   rë   r1   r   r   ).Ú
__future__r   ro   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   r€   r   r   Ú	getLoggerrå   r·   r%   r,   r3   rz   r�   r¢   r¿   rÅ   rà   râ   rö   r   r#   r!   ú<module>r     s£  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'à )Ð )Ð )Ð )Ð )Ð )Ø !Ð !Ð !Ð !Ð !Ð !Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ Ràð ØÐÐÐÐÐà€GˆC�u˜^¨SÐ0Ô1Ð2Ñ2Ô2€Ø	ˆÔ	˜8Ñ	$Ô	$€ð9ð 9ð 9ð 9ð
2ð 2ð 2ð 2ðð ð ð ðxð xð xð xðvð ð ð ð8(ð (ð (ð (ðVP$ð P$ð P$ð P$ðf=ð =ð =ð =ðH -1Øð4Nð 4Nð 4Nð 4Nð 4Nðn'ð 'ð 'ð 'ð '�9 Eð 'ñ 'ô 'ð 'ð ð -1Ø-ð	hð hð hð hð hñ „ðhð hð hr#   