ó
    üÞ jÄ	  ã                  ó4   • S r SSKJr  SSKJr  SS jrSS jrg)	z9Shared token-usage normalization for Gemini integrations.é    )Úannotations)ÚAnyc                ó0  • [        U [        [        45      (       d  gSnSnU  Hf  n[        USS5      n[        USU5      n[        USS5      n[	        U5      R                  5       S:X  d  MI  [        U[        5      (       d  M`  X-  nSnMh     U(       a  U$ S$ )	zBSum the audio token count from a Gemini modality-details sequence.Nr   FÚmodalityÚvalueÚtoken_countÚAUDIOT)Ú
isinstanceÚlistÚtupleÚgetattrÚstrÚupperÚint)ÚdetailsÚtotalÚfoundÚentryr   Úcounts         Ú^/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/integrations/_gemini_usage.pyÚ_audio_tokensr      s�   € ä�g¤¤e˜}×-Ñ-ØØ€EØ€EÛˆÜ˜5 *¨dÓ3ˆÜ˜8 W¨hÓ7ˆÜ˜˜}¨dÓ3ˆÜˆx‹=×ÑÓ  GÕ+´
¸5Ä#×0FÓ0FØ‰NˆEØŠEñ ö ˆ5Ð#˜tÐ#ó    c                ó  • U c  g0 nS H6  u  p#U H+  n[        XS5      n[        U[        5      (       d  M&  XQU'     M4     M8     0 n[        [        U SS5      5      =n b  XvS'   [        [        U SS5      =n[        5      (       a  X†S'   U(       a  XaS'   0 n	[        U SS5      n
U
c  [        U S	S5      n
[        U
5      =nb  XyS'   [        [        U S
S5      =n[        5      (       a  X¹S'   U	(       a  X‘S'   U=(       d    S$ )a#  Map a Gemini usage object onto LangSmith's canonical token metadata.

Gemini's direct Live API uses ``response_*`` output fields, while ADK and
older generated response types use ``candidates_*``. Only the known token
fields below are read so provider objects cannot add arbitrary metadata.
N))Úinput_tokens)Úprompt_token_count)Úoutput_tokens)Úresponse_token_countÚcandidates_token_count)Útotal_tokens)Útotal_token_countÚprompt_tokens_detailsÚaudioÚcached_content_token_countÚ
cache_readÚinput_token_detailsÚresponse_tokens_detailsÚcandidates_tokens_detailsÚthoughts_token_countÚ	reasoningÚoutput_token_details)r   r
   r   r   )ÚusageÚresultÚkeyÚattrsÚattrr   Úinput_detailsr"   ÚcachedÚoutput_detailsÚresponse_detailsr)   s               r   Únormalize_gemini_usage_metadatar4      s-  € ð �}Øà€Fó‰
ˆó
 ˆDÜ˜E¨Ó.ˆEÜ˜%¤×%Ó%Ø#�s‘Úó	 ñð %'€Mäœw uÐ.EÀtÓLÓMÐMˆØñð "'�gÑÜœG EÐ+GÈÓNÐN�&ÔPS×TÑTØ&,�lÑ#ÞØ(5Ð$Ñ%à%'€NÜ˜uÐ&?ÀÓFÐØÑÜ" 5Ð*EÀtÓLÐÜÐ/Ó0Ð0ˆÑ=Ø"'�wÑÜœw uÐ.DÀdÓKÐK�)ÌS×QÑQØ&/�{Ñ#ÞØ)7Ð%Ñ&à�>�TÐr   N)r   r   Úreturnz
int | None)r+   r   r5   zdict[str, Any] | None)Ú__doc__Ú
__future__r   Útypingr   r   r4   © r   r   Ú<module>r:      s   ðÙ ?å "å ô$õ +r   