§
    ‰eîi„  ã                  óT  — d Z ddlmZ ddlZddlZddl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 ddlZddlmZ  ej        e¦  «        ZdZdad„Zefdddœdbd„Zdcd„ZdZ G d„ de¦  «        Zddd„Zded„Zdfd"„Z dgd#„Z!	 dhdid'„Z"djd*„Z#dkd,„Z$dld/„Z%dmd1„Z&dddddddd2œdnd:„Z'dod<„Z(dpd>„Z)dqd@„Z*drdB„Z+ G dC„ dDe
¦  «        Z,dEdddEdFœdsdJ„Z-dtdN„Z.dudS„Z/dvdT„Z0 G dU„ dV¦  «        Z1 G dW„ dX¦  «        Z2 G dY„ dZ¦  «        Z3 G d[„ d\¦  «        Z4 G d]„ d^¦  «        Z5 G d_„ d`¦  «        Z6dS )waÆ  OpenAI-compatible facade over Google AI Studio's native Gemini API.

Hermes keeps ``api_mode='chat_completions'`` for the ``gemini`` provider so the
main agent loop can keep using its existing OpenAI-shaped message flow.
This adapter is the transport shim that converts those OpenAI-style
``messages[]`` / ``tools[]`` requests into Gemini's native
``models/{model}:generateContent`` schema and converts the responses back.

Why this exists
---------------
Google's OpenAI-compatible endpoint has been brittle for Hermes's multi-turn
agent/tool loop (auth churn, tool-call replay quirks, thought-signature
requirements).  The native Gemini API is the canonical path and avoids the
OpenAI-compat layer entirely.
é    )ÚannotationsN)ÚSimpleNamespace)ÚAnyÚDictÚIteratorÚListÚOptional)Úsanitize_gemini_tool_parametersz0https://generativelanguage.googleapis.com/v1betaÚbase_urlÚstrÚreturnÚboolc                óÒ   — t          | pd¦  «                             ¦   «                              d¦  «                             ¦   «         }|sdS d|vrdS |                     d¦  «         S )z>Return True when the endpoint speaks Gemini's native REST API.Ú ú/Fz!generativelanguage.googleapis.comú/openai)r   ÚstripÚrstripÚlowerÚendswith)r   Ú
normalizeds     ú=/home/div/.hermes/hermes-agent/agent/gemini_native_adapter.pyÚis_native_gemini_base_urlr   %   sm   € å�X�^ Ñ$Ô$×*Ò*Ñ,Ô,×3Ò3°CÑ8Ô8×>Ò>Ñ@Ô@€JØð ØˆuØ*°*Ð<Ð<ØˆuØ×"Ò" 9Ñ-Ô-Ð-Ð-ó    úgemini-2.5-flashg      $@)ÚmodelÚtimeoutÚapi_keyr   r   Úfloatc               ó  — | pd                      ¦   «         }|sdS t          |pt          ¦  «                              ¦   «                              d¦  «        }|st          }|                     ¦   «                              d¦  «        r|dt          d¦  «         …         }|› d|› d�}dd	d
igdœgddidœ}	 t          j        |¬¦  «        5 }| 	                    |d|i|ddi¬¦  «        }	ddd¦  «         n# 1 swxY w Y   n3# t          $ r&}
t                               d|
¦  «         Y d}
~
dS d}
~
ww xY wd„ |	j                             ¦   «         D ¦   «         }|                     d¦  «        }|r>	 t!          |¦  «        }n# t"          t$          f$ r d}Y nw xY w|�|dk    rdS |�|dk    rdS |	j        dk    r9d}	 |	j        pd}n# t          $ r d}Y nw xY wd|                     ¦   «         v rdS dS d|	j        cxk    rdk     rn ndS dS )a  Probe a Google AI Studio API key and return its tier.

    Returns one of:

    - ``"free"``    -- key is on the free tier (unusable with Hermes)
    - ``"paid"``    -- key is on a paid tier
    - ``"unknown"`` -- probe failed; callers should proceed without blocking.
    r   Úunknownr   r   Nú/models/ú:generateContentÚuserÚtextÚhi©ÚroleÚpartsÚmaxOutputTokensé   )ÚcontentsÚgenerationConfig©r   ÚkeyúContent-Typeúapplication/json)ÚparamsÚjsonÚheadersz$probe_gemini_tier: network error: %sc                ó>   — i | ]\  }}|                      ¦   «         |“ŒS © ©r   )Ú.0ÚkÚvs      r   ú
<dictcomp>z%probe_gemini_tier.<locals>.<dictcomp>Z   s&   € ÐCÐCÐC¡d a¨�Q—W’W‘Y”Y ÐCÐCÐCr   z"x-ratelimit-limit-requests-per-dayiè  ÚfreeÚpaidé­  Ú	free_tieréÈ   i,  )r   r   ÚDEFAULT_GEMINI_BASE_URLr   r   r   ÚlenÚhttpxÚClientÚpostÚ	ExceptionÚloggerÚdebugr4   ÚitemsÚgetÚintÚ	TypeErrorÚ
ValueErrorÚstatus_coder%   )r   r   r   r   r/   Únormalized_baseÚurlÚpayloadÚclientÚrespÚexcÚheaders_lowerÚ
rpd_headerÚrpd_valÚ	body_texts                  r   Úprobe_gemini_tierrY   /   sï  € ð ˆ=�b×
Ò
Ñ
!Ô
!€CØð Øˆyå˜(Ð=Õ&=Ñ>Ô>×DÒDÑFÔF×MÒMÈcÑRÔR€OØð 2Ý1ˆØ×ÒÑÔ×'Ò'¨	Ñ2Ô2ð =Ø)Ð*;­S°©^¬^¨OÐ*;Ô<ˆàÐ
=Ð
= eÐ
=Ð
=Ð
=€Cà$°¸°Ð/?Ð@Ð@ÐAØ.°Ð2ðð €Gð

ÝŒ\ 'Ð*Ñ*Ô*ð 	¨fØ—;’;ØØ˜s�|ØØ'Ð);Ð<ð	 ñ ô ˆDð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð Ý�ŠÐ;¸SÑAÔAÐAØˆyˆyˆyˆyˆyøøøøðøøøð DÐC¨d¬l×.@Ò.@Ñ.BÔ.BÐCÑCÔC€MØ×"Ò"Ð#GÑHÔH€JØð ð	Ý˜*‘o”oˆGˆGøÝ�:Ð&ð 	ð 	ð 	ØˆGˆGˆGð	øøøð
 Ð 7¨d¢? ?Ø�6ØÐ 7¨T¢> >Ø�6àÔ˜3ÒÐØˆ	ð	Øœ	˜ RˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøà˜)Ÿ/š/Ñ+Ô+Ð+Ð+Ø�6Øˆvà
ˆdÔÐ$Ð$Ò$Ð$ Ò$Ð$Ð$Ð$Ð$Øˆvàˆ9s`   Â5D  Ã
C4Ã(D  Ã4C8Ã8D  Ã;C8Ã<D  Ä 
D0Ä
D+Ä+D0Å.E> Å>FÆFÆ9	G ÇGÇGÚerror_messagec                ó6   — | sdS d|                       ¦   «         v S )zEReturn True when a Gemini 429 message indicates free-tier exhaustion.Fr?   r7   )rZ   s    r   Úis_free_tier_quota_errorr\   y   s&   € àð ØˆuØ˜-×-Ò-Ñ/Ô/Ð/Ð/r   aj  

Your Google API key is on the free tier (<= 250 requests/day for gemini-2.5-flash). Hermes typically makes 3-10 API calls per user turn, so the free tier is exhausted in a handful of messages and cannot sustain an agent session. Enable billing on your Google Cloud project and regenerate the key in a billing-enabled project: https://aistudio.google.com/apikeyc                  ó2   ‡ — e Zd ZdZddddddœdˆ fd„Zˆ xZS )ÚGeminiAPIErrorz>Error shape compatible with Hermes retry/error classification.Úgemini_api_errorN©ÚcoderN   ÚresponseÚretry_afterÚdetailsÚmessager   ra   rN   úOptional[int]rb   úOptional[httpx.Response]rc   úOptional[float]rd   úOptional[Dict[str, Any]]r   ÚNonec               ó”   •— t          ¦   «                              |¦  «         || _        || _        || _        || _        |pi | _        d S ©N)ÚsuperÚ__init__ra   rN   rb   rc   rd   )Úselfre   ra   rN   rb   rc   rd   Ú	__class__s          €r   rn   zGeminiAPIError.__init__�   sJ   ø€ õ 	‰Œ×Ò˜Ñ!Ô!Ð!ØˆŒ	Ø&ˆÔØ ˆŒØ&ˆÔØ�} "ˆŒˆˆr   )re   r   ra   r   rN   rf   rb   rg   rc   rh   rd   ri   r   rj   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rn   Ú__classcell__)rp   s   @r   r^   r^   Š   s^   ø€ € € € € ØHÐHð 'Ø%)Ø-1Ø'+Ø,0ð%ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %r   r^   Úcontentr   c                óè  — | €dS t          | t          ¦  «        r| S t          | t          ¦  «        r´g }| D ]š}t          |t          ¦  «        r|                     |¦  «         Œ-t          |t          ¦  «        rX|                     d¦  «        dk    r?|                     d¦  «        }t          |t          ¦  «        r|                     |¦  «         Œ›d                     |¦  «        S t          | ¦  «        S )Nr   Útyper%   Ú
)Ú
isinstancer   ÚlistÚappendÚdictrJ   Újoin)rv   ÚpiecesÚpartr%   s       r   Ú_coerce_content_to_textr�   Ÿ   sì   € Ø€ØˆrÝ�'�3ÑÔð ØˆÝ�'�4Ñ Ô ð 	!ØˆØð 	(ð 	(ˆDÝ˜$¥Ñ$Ô$ð (Ø—’˜dÑ#Ô#Ð#Ð#Ý˜D¥$Ñ'Ô'ð (¨D¯HªH°VÑ,<Ô,<ÀÒ,FÐ,FØ—x’x Ñ'Ô'�Ý˜d¥CÑ(Ô(ð (Ø—M’M $Ñ'Ô'Ð'øØ�yŠy˜Ñ Ô Ð Ýˆw‰<Œ<Ðr   úList[Dict[str, Any]]c                óÞ  — t          | t          ¦  «        st          | ¦  «        }|rd|igng S g }| D �]¹}t          |t          ¦  «        r|                     d|i¦  «         Œ0t          |t
          ¦  «        sŒF|                     d¦  «        }|dk    rD|                     d¦  «        }t          |t          ¦  «        r|r|                     d|i¦  «         Œ¥|dk    �r|                     d¦  «        pi                      d¦  «        pd}t          |t          ¦  «        r|                     d¦  «        s�Œ	 |                     dd¦  «        \  }}|                     d	d¦  «        d                              d
d¦  «        d         }t          j
        |¦  «        }	n# t          $ r Y �Œvw xY w|                     d|t          j        |	¦  «                             d¦  «        dœi¦  «         �Œ»|S )Nr%   rx   Ú	image_urlrP   r   zdata:Ú,r+   ú:ú;r   Ú
inlineDataÚascii)ÚmimeTypeÚdata)rz   r{   r�   r   r|   r}   rJ   Ú
startswithÚsplitÚbase64Ú	b64decoderF   Ú	b64encodeÚdecode)
rv   r%   r)   ÚitemÚptyperP   ÚheaderÚencodedÚmimeÚraws
             r   Ú_extract_multimodal_partsr˜   ±   s  € Ý�g�tÑ$Ô$ð 0Ý& wÑ/Ô/ˆØ#'Ð/�˜�ÐÐ¨RÐ/à"$€EØð ñ ˆÝ�d�CÑ Ô ð 	Ø�LŠL˜& $˜Ñ(Ô(Ð(ØÝ˜$¥Ñ%Ô%ð 	ØØ—’˜Ñ Ô ˆØ�FŠ?ˆ?Ø—8’8˜FÑ#Ô#ˆDÝ˜$¥Ñ$Ô$ð -¨ð -Ø—’˜f d˜^Ñ,Ô,Ð,øØ�kÒ!Ñ!Ø—H’H˜[Ñ)Ô)Ð/¨R×4Ò4°UÑ;Ô;ÐA¸rˆCÝ˜c¥3Ñ'Ô'ð ¨s¯~ª~¸gÑ/FÔ/Fð ÙðØ"%§)¢)¨C°Ñ"3Ô"3‘�˜Ø—|’| C¨Ñ+Ô+¨AÔ.×4Ò4°S¸!Ñ<Ô<¸QÔ?�ÝÔ& wÑ/Ô/��øÝð ð ð Ø‘ðøøøà�LŠLà Ø$(Ý &Ô 0°Ñ 5Ô 5× <Ò <¸WÑ EÔ Eð#ð #ðñô ð ùð €Ls   Ä7A#FÆ
F)Æ(F)Ú	tool_callúDict[str, Any]úOptional[str]c                ó¶  — |                       d¦  «        pi }t          |t          ¦  «        sd S |                      d¦  «        p|                      d¦  «        }t          |t          ¦  «        rR|                      d¦  «        p|                      d¦  «        }t          |t          ¦  «        r|rt          |¦  «        nd S t          |t          ¦  «        r|r|S d S )NÚextra_contentÚgoogleÚthought_signatureÚthoughtSignature)rJ   rz   r}   r   )r™   Úextrarž   Úsigs       r   Ú_tool_call_extra_signaturer£   ×   sÐ   € Ø�MŠM˜/Ñ*Ô*Ð0¨b€EÝ�e�TÑ"Ô"ð ØˆtØ�YŠY�xÑ Ô ÐB E§I¢IÐ.AÑ$BÔ$B€FÝ�&�$ÑÔð BØ�jŠjÐ,Ñ-Ô-ÐO°·²Ð<NÑ1OÔ1OˆÝ% c­3Ñ/Ô/ÐA°CÐA�s�3‰xŒxˆx¸TÐAÝ�&�#ÑÔð  6ð ØˆØˆ4r   c                ó   — |                       d¦  «        pi }|                      dd¦  «        }	 t          |t          ¦  «        r|rt          j        |¦  «        ni }n# t          j        $ r d|i}Y nw xY wt          |t          ¦  «        sd|i}dt          |                      d¦  «        pd¦  «        |dœi}t          | ¦  «        }|r||d	<   |S )
NÚfunctionÚ	argumentsr   Ú_rawÚ_valueÚfunctionCallÚname)rª   Úargsr    )rJ   rz   r   r3   ÚloadsÚJSONDecodeErrorr}   r£   )r™   ÚfnÚargs_rawr«   r€   rŸ   s         r   Ú_translate_tool_call_to_geminir°   ä   sþ   € Ø	�Š�zÑ	"Ô	"Ð	( b€BØ�vŠv�k 2Ñ&Ô&€Hð"Ý'1°(½CÑ'@Ô'@ÐUÀXÐU�tŒz˜(Ñ#Ô#Ð#ÐSUˆˆøÝÔð "ð "ð "Ø˜Ð!ˆˆˆð"øøøå�d�DÑ!Ô!ð  Ø˜$Ðˆð 	Ý˜Ÿš˜v™œÐ,¨"Ñ-Ô-Øð
ð 
ð€Dõ 3°9Ñ=Ô=ÐØð 5Ø#4ˆÐÑ Ø€Ks   ¯-A ÁA3Á2A3re   Útool_name_by_call_idúOptional[Dict[str, str]]c                óü  — |pi }t          |                      d¦  «        pd¦  «        }t          |                      d¦  «        p|                     |¦  «        p|pd¦  «        }t          |                      d¦  «        ¦  «        }	 |                     ¦   «                              d¦  «        rt          j        |¦  «        nd }n# t
          j        $ r d }Y nw xY wt          |t          ¦  «        r|nd|i}d||d	œiS )
NÚtool_call_idr   rª   Útoolrv   )Ú{Ú[ÚoutputÚfunctionResponse)rª   rb   )
r   rJ   r�   r   rŒ   r3   r¬   r­   rz   r}   )re   r±   r´   rª   rv   Úparsedrb   s          r   Ú _translate_tool_result_to_geminir»   ú   s&  € ð 0Ð5°2ÐÝ�w—{’{ >Ñ2Ô2Ð8°bÑ9Ô9€LÝØ�Š�FÑÔð 	Ø×#Ò# LÑ1Ô1ð	àð	ð ñ	ô €Dõ & g§k¢k°)Ñ&<Ô&<Ñ=Ô=€GðØ(/¯ª©¬×(BÒ(BÀ:Ñ(NÔ(NÐX•”˜GÑ$Ô$Ð$ÐTXˆˆøÝÔð ð ð Øˆˆˆðøøøå# F­DÑ1Ô1ÐJˆvˆv¸À'Ð7J€HàØØ ð
ð 
ðð s   Â=C ÃCÃCÚmessagesú5tuple[List[Dict[str, Any]], Optional[Dict[str, Any]]]c                ób  — g }g }i }| D �]æ}t          |t          ¦  «        sŒt          |                     d¦  «        pd¦  «        }|dk    r6|                     t          |                     d¦  «        ¦  «        ¦  «         Œy|dv r)|                     dt          ||¬¦  «        gdœ¦  «         Œ¦|dk    rd	nd}g }t          |                     d¦  «        ¦  «        }|                     |¦  «         |                     d
¦  «        pg }	t          |	t          ¦  «        r·|	D ]´}
t          |
t          ¦  «        r�t          |
                     d¦  «        p|
                     d¦  «        pd¦  «        }t          |
                     d¦  «        pi                      d¦  «        pd¦  «        }|r|r|||<   |                     t          |
¦  «        ¦  «         Œµ|r|                     ||dœ¦  «         �Œèd }d                     d„ |D ¦   «         ¦  «                             ¦   «         }|rdd|igi}||fS )Nr(   r$   Úsystemrv   >   rµ   r¥   )r±   r'   Ú	assistantr   Ú
tool_callsÚidÚcall_idr   r¥   rª   ry   c              3  ó   K  — | ]}|¯|V — Œ	d S rl   r6   )r8   r€   s     r   ú	<genexpr>z)_build_gemini_contents.<locals>.<genexpr>D  s'   è è € ÐIÐI tÀDÐI˜dÐIÐIÐIÐIÐIÐIr   r)   r%   )rz   r}   r   rJ   r|   r�   r»   r˜   Úextendr{   r°   r~   r   )r¼   Úsystem_text_partsr,   r±   Úmsgr(   Úgemini_roler)   Úcontent_partsrÁ   r™   r´   Ú	tool_nameÚsystem_instructionÚjoined_systems                  r   Ú_build_gemini_contentsrÎ     s†  € Ø#%ÐØ%'€HØ+-Ðàð (Cñ (CˆÝ˜#�tÑ$Ô$ð 	ØÝ�3—7’7˜6‘?”?Ð, fÑ-Ô-ˆà�8ÒÐØ×$Ò$Õ%<¸S¿WºWÀYÑ=OÔ=OÑ%PÔ%PÑQÔQÐQØàÐ'Ð'Ð'Ø�OŠOà"å8ØØ1Eðñ ô ððð ñ
ô 
ð 
ð à!%¨Ò!4Ð!4�g�g¸&ˆØ&(ˆå1°#·'²'¸)Ñ2DÔ2DÑEÔEˆØ�Š�]Ñ#Ô#Ð#à—W’W˜\Ñ*Ô*Ð0¨bˆ
Ý�j¥$Ñ'Ô'ð 	LØ'ð Lð L�	Ý˜i­Ñ.Ô.ð LÝ#& y§}¢}°TÑ':Ô':Ð'\¸i¿mºmÈIÑ>VÔ>VÐ'\ÐZ\Ñ#]Ô#]�LÝ # i§m¢m°JÑ&?Ô&?Ð&EÀ2×%JÒ%JÈ6Ñ%RÔ%RÐ%XÐVXÑ ZÔ Z�IØ#ð G¨	ð GØ=FÐ,¨\Ñ:Ø—L’LÕ!?À	Ñ!JÔ!JÑKÔKÐKøàð 	CØ�OŠO [¸5ÐAÐAÑBÔBÐBùàÐØ—I’IÐIÐIÐ/@ÐIÑIÔIÑIÔI×OÒOÑQÔQ€MØð BØ%¨°Ð(?Ð'@ÐAÐØÐ'Ð'Ð'r   Útoolsc                ó<  — t          | t          ¦  «        sg S g }| D ]ø}t          |t          ¦  «        sŒ|                     d¦  «        pi }t          |t          ¦  «        sŒE|                     d¦  «        }t          |t          ¦  «        r|sŒrd|i}|                     d¦  «        }t          |t          ¦  «        r|r||d<   |                     d¦  «        }t          |t          ¦  «        rt          |¦  «        |d<   |                     |¦  «         Œù|rd|igng S )Nr¥   rª   ÚdescriptionÚ
parametersÚfunctionDeclarations)rz   r{   r}   rJ   r   r
   r|   )rÏ   Údeclarationsrµ   r®   rª   ÚdeclrÑ   rÒ   s           r   Ú_translate_tools_to_geminirÖ   J  s;  € Ý�e�TÑ"Ô"ð Øˆ	Ø)+€LØð "ð "ˆÝ˜$¥Ñ%Ô%ð 	ØØ�XŠX�jÑ!Ô!Ð' RˆÝ˜"�dÑ#Ô#ð 	ØØ�vŠv�f‰~Œ~ˆÝ˜$¥Ñ$Ô$ð 	¨Dð 	ØØ &¨˜~ˆØ—f’f˜]Ñ+Ô+ˆÝ�k¥3Ñ'Ô'ð 	.¨Kð 	.Ø"-ˆD�ÑØ—V’V˜LÑ)Ô)ˆ
Ý�j¥$Ñ'Ô'ð 	MÝ!@ÀÑ!LÔ!LˆD�ÑØ×Ò˜DÑ!Ô!Ð!Ð!Ø7CÐKÐ# \Ð2Ð3Ð3ÈÐKr   Útool_choiceri   c                ó@  — | €d S t          | t          ¦  «        r$| dk    rdddiiS | dk    rdddiiS | dk    rdddiiS t          | t          ¦  «        rK|                      d	¦  «        pi }|                     d
¦  «        }t          |t          ¦  «        r
|rdd|gdœiS d S )NÚautoÚfunctionCallingConfigÚmodeÚAUTOÚrequiredÚANYÚnoneÚNONEr¥   rª   )rÛ   ÚallowedFunctionNames)rz   r   r}   rJ   )r×   r®   rª   s      r   Ú _translate_tool_choice_to_geminirâ   b  sÞ   € ØÐØˆtÝ�+�sÑ#Ô#ð ?Ø˜&Ò Ð Ø+¨f°fÐ-=Ð>Ð>Ø˜*Ò$Ð$Ø+¨f°e¨_Ð=Ð=Ø˜&Ò Ð Ø+¨f°fÐ-=Ð>Ð>Ý�+�tÑ$Ô$ð ^Ø�_Š_˜ZÑ(Ô(Ð.¨BˆØ�vŠv�f‰~Œ~ˆÝ�d�CÑ Ô ð 	^ Tð 	^Ø+°eÐVZÐU[Ð-\Ð-\Ð]Ð]Øˆ4r   Úconfigc                ój  — t          | t          ¦  «        r| sd S |                      d|                      d¦  «        ¦  «        }|                      d|                      d¦  «        ¦  «        }|                      d|                      d¦  «        ¦  «        }i }t          |t          t          f¦  «        rt          |¦  «        |d<   t          |t
          ¦  «        r||d<   t          |t          ¦  «        r=|                     ¦   «         r)|                     ¦   «                              ¦   «         |d<   |pd S )NÚthinkingBudgetÚthinking_budgetÚincludeThoughtsÚinclude_thoughtsÚthinkingLevelÚthinking_level)	rz   r}   rJ   rK   r   r   r   r   r   )rã   ÚbudgetÚincludeÚlevelr   s        r   Ú_normalize_thinking_configrî   t  s  € Ý�f�dÑ#Ô#ð ¨6ð ØˆtØ�ZŠZÐ(¨&¯*ª*Ð5FÑ*GÔ*GÑHÔH€FØ�jŠjÐ*¨F¯JªJÐ7IÑ,JÔ,JÑKÔK€GØ�JŠJ�¨¯
ª
Ð3CÑ(DÔ(DÑEÔE€EØ!#€JÝ�&�3¥˜,Ñ'Ô'ð 3Ý'*¨6¡{¤{ˆ
Ð#Ñ$Ý�'�4Ñ Ô ð 0Ø(/ˆ
Ð$Ñ%Ý�%�ÑÔð < %§+¢+¡-¤-ð <Ø&+§k¢k¡m¤m×&9Ò&9Ñ&;Ô&;ˆ
�?Ñ#ØÐ˜Ðr   )rÏ   r×   ÚtemperatureÚ
max_tokensÚtop_pÚstopÚthinking_configrï   rh   rð   rf   rñ   rò   ró   c                óX  — t          | ¦  «        \  }}	d|i}
|	r|	|
d<   t          |¦  «        }|r||
d<   t          |¦  «        }|r||
d<   i }|�||d<   |�||d<   |�||d<   |r*t          |t          ¦  «        r|nt          |¦  «        g|d<   t          |¦  «        }|r||d	<   |r||
d
<   |
S )Nr,   ÚsystemInstructionrÏ   Ú
toolConfigrï   r*   ÚtopPÚstopSequencesÚthinkingConfigr-   )rÎ   rÖ   râ   rz   r{   r   rî   )r¼   rÏ   r×   rï   rð   rñ   rò   ró   r,   rÌ   ÚrequestÚgemini_toolsÚtool_configÚgeneration_configÚnormalized_thinkings                  r   Úbuild_gemini_requestrÿ   „  s  € õ $:¸(Ñ#CÔ#CÑ €HÐ Ø)¨8Ð4€GØð :Ø'9ˆÐ#Ñ$å-¨eÑ4Ô4€LØð (Ø'ˆ�Ñå2°;Ñ?Ô?€KØð ,Ø +ˆ�Ñà(*ÐØÐØ+6Ð˜-Ñ(ØÐØ/9ÐÐ+Ñ,ØÐØ$)Ð˜&Ñ!Øð ]Ý5?ÀÅdÑ5KÔ5KÐ-\¨T¨TÕRUÐVZÑR[ÔR[ÐQ\Ð˜/Ñ*Ý4°_ÑEÔEÐØð BØ.AÐÐ*Ñ+Øð 8Ø&7ˆÐ"Ñ#à€Nr   Úreasonc                ó€   — ddddddœ}|                      t          | pd¦  «                             ¦   «         d¦  «        S )Nrò   ÚlengthÚcontent_filter)ÚSTOPÚ
MAX_TOKENSÚSAFETYÚ
RECITATIONÚOTHERr   )rJ   r   Úupper)r   Úmappings     r   Ú_map_gemini_finish_reasonr  ®  sK   € àØØ"Ø&Øðð €Gð �;Š;•s˜6˜< RÑ(Ô(×.Ò.Ñ0Ô0°&Ñ9Ô9Ð9r   r€   c                ój   — |                       d¦  «        }t          |t          ¦  «        r|rdd|iiS d S )Nr    rž   rŸ   )rJ   rz   r   )r€   r¢   s     r   Ú_tool_call_extra_from_partr  ¹  sC   € Ø
�(Š(Ð%Ñ
&Ô
&€CÝ�#•sÑÔð 6 ð 6ØÐ.°Ð4Ð5Ð5Øˆ4r   r   c                ó<  — t          ddd d d d ¬¦  «        }t          d|d¬¦  «        }t          dddt          d¬¦  «        ¬¦  «        }t          d	t          j        ¦   «         j        d d
…         › �dt	          t          j        ¦   «         ¦  «        | |g|¬¦  «        S )NrÀ   r   ©r(   rv   rÁ   Ú	reasoningÚreasoning_contentÚreasoning_detailsr   rò   ©Úindexre   Úfinish_reason©Úcached_tokens©Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚprompt_tokens_detailsú	chatcmpl-é   úchat.completion©rÂ   ÚobjectÚcreatedr   ÚchoicesÚusage)r   ÚuuidÚuuid4ÚhexrK   Útime)r   re   Úchoicer$  s       r   Ú_empty_responser*  À  s¾   € ÝØØØØØØðñ ô €Gõ  1¨gÀVÐLÑLÔL€FÝØØØÝ-¸AÐ>Ñ>Ô>ð	ñ ô €Eõ Ø.•t”z‘|”|Ô'¨¨¨Ô,Ð.Ð.Ø Ý•D”I‘K”KÑ Ô ØØ�Øðñ ô ð r   rS   c                óp  — |                       d¦  «        pg }t          |t          ¦  «        r|st          |¦  «        S t          |d         t          ¦  «        r|d         ni }t          |t          ¦  «        r|                      d¦  «        ni }t          |t          ¦  «        r|                      d¦  «        ng }g }g }g }t          |pg ¦  «        D �]Ã\  }	}
t          |
t          ¦  «        sŒ|
                      d¦  «        du rDt          |
                      d¦  «        t          ¦  «        r|                     |
d         ¦  «         Œwt          |
                      d¦  «        t          ¦  «        r|                     |
d         ¦  «         Œ»|
                      d¦  «        }t          |t          ¦  «        rÞ|                      d	¦  «        rÉ	 t          j	        |                      d
¦  «        pi d¬¦  «        }n# t          t          f$ r d}Y nw xY wt          dt          j        ¦   «         j        d d…         › �d|	t          t          |d	         ¦  «        |¬¦  «        ¬¦  «        }t!          |
¦  «        }|r||_        |                     |¦  «         �ŒÅ|rdn0t%          t          |                      d¦  «        pd¦  «        ¦  «        }|                       d¦  «        pi }t          t'          |                      d¦  «        pd¦  «        t'          |                      d¦  «        pd¦  «        t'          |                      d¦  «        pd¦  «        t          t'          |                      d¦  «        pd¦  «        ¬¦  «        ¬¦  «        }d                     |¦  «        pd }t          d|rd                     |¦  «        nd |pd ||d ¬¦  «        }t          d||¬¦  «        }t          d t          j        ¦   «         j        d d…         › �d!t'          t+          j        ¦   «         ¦  «        ||g|¬"¦  «        S )#NÚ
candidatesr   rv   r)   ÚthoughtTr%   r©   rª   r«   F)Úensure_asciiú{}Úcall_r  r¥   ©rª   r¦   )rÂ   rx   r  r¥   rÁ   ÚfinishReasonr   ÚusageMetadataÚpromptTokenCountÚcandidatesTokenCountÚtotalTokenCountÚcachedContentTokenCountr  r  rÀ   r  r  r  r  r   )rJ   rz   r{   r*  r}   Ú	enumerater   r|   r3   ÚdumpsrL   rM   r   r%  r&  r'  r  r�   r  rK   r~   r(  )rS   r   r,  ÚcandÚcontent_objr)   Útext_piecesÚreasoning_piecesrÁ   r  r€   ÚfcÚargs_strr™   r�   r  Ú
usage_metar$  r  re   r)  s                        r   Útranslate_gemini_responserA  Ú  s'  € Ø—’˜,Ñ'Ô'Ð-¨2€JÝ�j¥$Ñ'Ô'ð &¨zð &Ý˜uÑ%Ô%Ð%å& z°!¤}µdÑ;Ô;ÐCˆ:�aŒ=ˆ=À€DÝ)3°D½$Ñ)?Ô)?ÐG�$—(’(˜9Ñ%Ô%Ð%ÀR€KÝ(2°;ÅÑ(EÔ(EÐMˆK�OŠO˜GÑ$Ô$Ð$È2€Eà€KØ"$ÐØ(*€Jå   ¨"Ñ-Ô-ð )ñ )‰ˆˆtÝ˜$¥Ñ%Ô%ð 	ØØ�8Š8�IÑÔ $Ð&Ð&­:°d·h²h¸vÑ6FÔ6FÍÑ+LÔ+LÐ&Ø×#Ò# D¨¤LÑ1Ô1Ð1ØÝ�d—h’h˜vÑ&Ô&­Ñ,Ô,ð 	Ø×Ò˜t Fœ|Ñ,Ô,Ð,ØØ�XŠX�nÑ%Ô%ˆÝ�b�$ÑÔð 	) B§F¢F¨6¡N¤Nð 	)ð Ýœ: b§f¢f¨V¡n¤nÐ&:¸ÈÐOÑOÔO��øÝ�zÐ*ð  ð  ð  Ø���ð øøøå'Ø2�4œ:™<œ<Ô+¨C¨R¨CÔ0Ð2Ð2ØØÝ(­c°"°V´*©o¬oÈÐRÑRÔRð	ñ ô ˆIõ 7°tÑ<Ô<ˆMØð 8Ø*7�	Ô'Ø×Ò˜iÑ(Ô(Ð(ùà$.Ðr�L�LÕ4MÍcÐRV×RZÒRZÐ[iÑRjÔRjÐRpÐnpÑNqÔNqÑ4rÔ4r€MØ—’˜/Ñ*Ô*Ð0¨b€JÝÝ˜*Ÿ.š.Ð);Ñ<Ô<ÐAÀÑBÔBÝ˜jŸnšnÐ-CÑDÔDÐIÈÑJÔJÝ˜ŸšÐ(9Ñ:Ô:Ð?¸aÑ@Ô@Ý-Ý˜jŸnšnÐ-FÑGÔGÐLÈ1ÑMÔMð
ñ 
ô 
ð	ñ ô €Eð —’Ð(Ñ)Ô)Ð1¨T€IÝØØ(3Ð=�—’˜Ñ$Ô$Ð$¸ØÐ% ØØ#Øðñ ô €Gõ  1¨gÀ]ÐSÑSÔS€FÝØ.•t”z‘|”|Ô'¨¨¨Ô,Ð.Ð.Ø Ý•D”I‘K”KÑ Ô ØØ�Øðñ ô ð s   Ç+G9Ç9HÈHc                  ó   — e Zd ZdS )Ú_GeminiStreamChunkN)rq   rr   rs   r6   r   r   rC  rC    s   € € € € € Ø€Dr   rC  r   )rv   Útool_call_deltar  r  rD  r  r  c                ó¼  — dd d d d dœ}|r||d<   |�Ít          |                     dd¦  «        |                     d¦  «        p"dt          j        ¦   «         j        d d…         › �d	t          |                     d
¦  «        pd|                     d¦  «        pd¬¦  «        ¬¦  «        }|                     d¦  «        }t          |t          ¦  «        r||_        |g|d<   |r
||d<   ||d<   t          di |¤Ž}t          d||¬¦  «        }	t          dt          j        ¦   «         j        d d…         › �dt          t          j
        ¦   «         ¦  «        | |	gd ¬¦  «        S )NrÀ   )r(   rv   rÁ   r  r  rv   r  r   rÂ   r0  r  r¥   rª   r   r¦   r1  )r  rÂ   rx   r¥   r�   rÁ   r  r  )r  Údeltar  r  zchat.completion.chunkr   r6   )r   rJ   r%  r&  r'  rz   r}   r�   rC  rK   r(  )
r   rv   rD  r  r  Údelta_kwargsÚ
tool_deltar�   rF  r)  s
             r   Ú_make_stream_chunkrI  #  s¤  € ð ØØØØ!ð$ð $€Lð ð *Ø")ˆ�YÑØÐ"Ý$Ø!×%Ò% g¨qÑ1Ô1Ø×"Ò" 4Ñ(Ô(ÐKÐ,KµD´J±L´LÔ4DÀSÀbÀSÔ4IÐ,KÐ,KØÝ$Ø$×(Ò(¨Ñ0Ô0Ð6°BØ)×-Ò-¨kÑ:Ô:Ð@¸bðñ ô ð	
ñ 
ô 
ˆ
ð (×+Ò+¨OÑ<Ô<ˆÝ�m¥TÑ*Ô*ð 	5Ø'4ˆJÔ$Ø&0 \ˆ�\Ñ"Øð 6Ø$-ˆ�[Ñ!Ø,5ˆÐ(Ñ)ÝÐ+Ð+˜lÐ+Ð+€EÝ 1¨EÀÐOÑOÔO€FÝØ.•t”z‘|”|Ô'¨¨¨Ô,Ð.Ð.Ø&Ý•D”I‘K”KÑ Ô ØØ�Øðñ ô ð r   rb   úhttpx.ResponseúIterator[Dict[str, Any]]c              #  óÞ  K  — d}|                       ¦   «         D ]Ó}|sŒ||z  }d|v rÅ|                     dd¦  «        \  }}|                     d¦  «        }|sŒ5|                     d¦  «        sŒK|dd …         }|dk    r d S 	 t	          j        |¦  «        }n8# t          j        $ r& t                               d|d d	…         ¦  «         Y Œ¨w xY wt          |t          ¦  «        r|V — d|v °ÅŒÔd S )
Nr   ry   r+   úzdata: é   z[DONE]zNon-JSON Gemini SSE line: %sr@   )Ú	iter_textr�   r   rŒ   r3   r¬   r­   rG   rH   rz   r}   )rb   ÚbufferÚchunkÚliner‹   rQ   s         r   Ú_iter_sse_eventsrS  Q  s5  è è € Ø€FØ×#Ò#Ñ%Ô%ð ð ˆØð 	ØØ�%‰ˆØ�fˆnˆnØ!Ÿ<š<¨¨aÑ0Ô0‰LˆD�&Ø—;’;˜tÑ$Ô$ˆDØð ØØ—?’? 8Ñ,Ô,ð ØØ˜˜˜”8ˆDØ�xÒÐØ��ðÝœ* TÑ*Ô*��øÝÔ'ð ð ð Ý—’Ð;¸TÀ$À3À$¼ZÑHÔHÐHØ�ðøøøõ ˜'¥4Ñ(Ô(ð Ø���ð! �fˆnˆnøð	ð s   ÂBÂ2CÃCÚeventÚtool_call_indicesúDict[str, Dict[str, Any]]úList[_GeminiStreamChunk]c                ó‚  — |                       d¦  «        pg }|sg S t          |d         t          ¦  «        r|d         ni }t          |t          ¦  «        r,|                      d¦  «        pi                       d¦  «        pg ng }g }t          |¦  «        D �]Ë\  }}t          |t          ¦  «        sŒ|                      d¦  «        du rSt          |                      d¦  «        t          ¦  «        r+|                     t          ||d         ¬¦  «        ¦  «         Œ†t          |                      d¦  «        t          ¦  «        r2|d         r*|                     t          ||d         ¬	¦  «        ¦  «         |                      d
¦  «        }	t          |	t          ¦  «        �rÀ|	                      d¦  «        �rªt	          |	d         ¦  «        }
	 t          j        |	                      d¦  «        pi dd¬¦  «        }n# t          t          f$ r d}Y nw xY wt          |                      d¦  «        t          ¦  «        r|                      d¦  «        nd}t          j        ||
|dœd¬¦  «        }|                      |¦  «        }|€9t          |¦  «        dt          j        ¦   «         j        d d…         › �ddœ}|||<   |}t	          |                      d¦  «        pd¦  «        }|r5||k    rd}n,|                     |¦  «        r|t          |¦  «        d …         }||d<   |                     t          ||d         |d         |
|t!          |¦  «        dœ¬¦  «        ¦  «         �ŒÍt	          |                      d¦  «        pd¦  «        }|r7|rdnt#          |¦  «        }|                     t          ||¬¦  «        ¦  «         |S )Nr,  r   rv   r)   r-  Tr%   )r   r  )r   rv   r©   rª   r«   F)r.  Ú	sort_keysr/  r    r   )Ú
part_indexrª   rŸ   )rY  r0  r  )r  rÂ   Úlast_argumentsr[  r  rÂ   )r  rÂ   rª   r¦   r�   )r   rD  r2  rÁ   )r   r  )rJ   rz   r}   r8  r   r|   rI  r3   r9  rL   rM   rB   r%  r&  r'  rŒ   r  r  )rT  r   rU  r,  r:  r)   ÚchunksrZ  r€   r>  rª   r?  rŸ   Úcall_keyÚslotÚemitted_argumentsr[  Úfinish_reason_rawÚmappeds                      r   Útranslate_stream_eventrb  j  sõ  € Ø—’˜<Ñ(Ô(Ð.¨B€JØð Øˆ	Ý& z°!¤}µdÑ;Ô;ÐCˆ:�aŒ=ˆ=À€DÝ@JÈ4ÕQUÑ@VÔ@VÐ^ˆd�hŠh�yÑ!Ô!Ð' R×,Ò,¨WÑ5Ô5Ð;¸øÐ\^€EØ')€Få% eÑ,Ô,ð 3ñ 3Ñˆ
�DÝ˜$¥Ñ%Ô%ð 	ØØ�8Š8�IÑÔ $Ð&Ð&­:°d·h²h¸vÑ6FÔ6FÍÑ+LÔ+LÐ&Ø�MŠMÕ,°5ÀDÈÄLÐQÑQÔQÑRÔRÐRØÝ�d—h’h˜vÑ&Ô&­Ñ,Ô,ð 	Q°°f´ð 	QØ�MŠMÕ,°5À$ÀvÄ,ÐOÑOÔOÑPÔPÐPØ�XŠX�nÑ%Ô%ˆÝ�b�$ÑÔñ *	 B§F¢F¨6¡N¤Nñ *	Ý�r˜&”z‘?”?ˆDð Ýœ: b§f¢f¨V¡n¤nÐ&:¸ÈÐZ^Ð_Ñ_Ô_��øÝ�zÐ*ð  ð  ð  Ø���ð øøøå@JÈ4Ï8Ê8ÐTfÑKgÔKgÕilÑ@mÔ@mÐ u §¢Ð);Ñ <Ô <Ð <ÐsuÐÝ”zà",Ø Ø):ðð ð
 ðñ ô ˆHð %×(Ò(¨Ñ2Ô2ˆDØˆ|å Ð!2Ñ3Ô3Ø9¥$¤*¡,¤,Ô"2°3°B°3Ô"7Ð9Ð9Ø&(ðð �ð
 /3Ð! (Ñ+Ø (ÐÝ  §¢Ð*:Ñ!;Ô!;Ð!A¸rÑBÔBˆNØð GØ˜~Ò-Ð-Ø(*Ð%Ð%Ø×(Ò(¨Ñ8Ô8ð GØ(0µ°^Ñ1DÔ1DÐ1EÐ1EÔ(FÐ%Ø%-ˆDÐ!Ñ"Ø�MŠMÝ"Øà!% g¤Ø" 4œjØ $Ø%6Ý)CÀDÑ)IÔ)Ið%ð %ð	ñ 	ô 	ñô ð ùõ ˜DŸHšH ^Ñ4Ô4Ð:¸Ñ;Ô;ÐØð MØ!2Ðd��Õ8QÐRcÑ8dÔ8dˆØ�ŠÕ(¨uÀFÐKÑKÔKÑLÔLÐLØ€Ms   Ç,G9Ç9HÈHc                ó´  — | j         }d}i }	 | j        }n# t          $ r d}Y nw xY w|rF	 t          j        |¦  «        }t          |t          ¦  «        r|}n# t          t          f$ r i }Y nw xY wt          |t          ¦  «        r| 	                    d¦  «        nd }t          |t          ¦  «        si }t          | 	                    d¦  «        pd¦  «                             ¦   «         }t          | 	                    d¦  «        pd¦  «                             ¦   «         }| 	                    d¦  «        }t          |t          ¦  «        r|ng }	d}
d }i }|	D ]«}t          |t          ¦  «        sŒt          | 	                    d¦  «        pd¦  «        }|
sm|                     d¦  «        rX| 	                    d¦  «        }t          |t          ¦  «        r|}
| 	                    d	¦  «        }t          |t          ¦  «        r|}Œ¬| j         	                    d
¦  «        p| j         	                    d¦  «        }|r*	 t          |¦  «        }n# t          t          f$ r d }Y nw xY wd|› �}|dk    rd}n|dk    rd}n|dk    rd}|rd|› d|pd› d|› �}nd|› d|d d…         › �}|dk    rt!          |p|¦  «        r
|t"          z   }t%          |||| |||
||dœ¬¦  «        S )Nr   ÚerrorÚstatusre   rd   z@typez/google.rpc.ErrorInfor   ÚmetadatazRetry-Afterzretry-afterÚgemini_http_i‘  Úgemini_unauthorizedr>   Úgemini_rate_limitedi”  Úgemini_model_not_foundzGemini HTTP z (z): zGemini returned HTTP z: iô  )re  r   rf  re   r`   )rN   r%   rF   r3   r¬   rz   r}   rM   rL   rJ   r   r   r{   r   r4   r   r\   Ú_FREE_TIER_GUIDANCEr^   )rb   re  rX   Ú	body_jsonrº   Úerr_objÚ
err_statusÚerr_messageÚ_raw_detailsÚdetails_listr   rc   rf  ÚdetailÚtype_urlÚreason_valueÚmdÚheader_retryra   re   s                       r   Úgemini_http_errorrw  ®  sz  € ØÔ!€FØ€IØ "€IðØ”Mˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøàð ð	Ý”Z 	Ñ*Ô*ˆFÝ˜&¥$Ñ'Ô'ð #Ø"�	øøÝ�IÐ&ð 	ð 	ð 	ØˆIˆIˆIð	øøøõ )3°9½dÑ(CÔ(CÐMˆi�mŠm˜GÑ$Ô$Ð$È€GÝ�g�tÑ$Ô$ð ØˆÝ�W—[’[ Ñ*Ô*Ð0¨bÑ1Ô1×7Ò7Ñ9Ô9€JÝ�g—k’k )Ñ,Ô,Ð2°Ñ3Ô3×9Ò9Ñ;Ô;€KØ—;’;˜yÑ)Ô)€LÝ#-¨l½DÑ#AÔ#AÐI�<�<Àr€Là€FØ#'€KØ!€HØð 
ð 
ˆÝ˜&¥$Ñ'Ô'ð 	ØÝ�v—z’z 'Ñ*Ô*Ð0¨bÑ1Ô1ˆØð 	˜(×+Ò+Ð,CÑDÔDð 	Ø!Ÿ:š: hÑ/Ô/ˆLÝ˜,­Ñ,Ô,ð &Ø%�Ø—’˜JÑ'Ô'ˆBÝ˜"�dÑ#Ô#ð Ø�øØÔ#×'Ò'¨Ñ6Ô6Ð]¸(Ô:J×:NÒ:NÈ}Ñ:]Ô:]€LØð ð	Ý Ñ-Ô-ˆKˆKøÝ�:Ð&ð 	ð 	ð 	ØˆKˆKˆKð	øøøð #˜&Ð"Ð"€DØ�‚}€}Ø$ˆˆØ	�3ŠˆØ$ˆˆØ	�3ŠˆØ'ˆàð FØR ÐRÐR¨:Ð+@¸ÐRÐRÀ[ÐRÐRˆˆàE¨&ÐEÐE°I¸d¸s¸d´OÐEÐEˆð
 �‚}€}Õ1°+Ð2JÀÑKÔK€}ØÕ/Ñ/ˆåØØØØØà ØØ Ø"ð	
ð 
ðñ ô ð s/   � •$£$ª+A ÁA,Á+A,È7I ÉIÉIc                  ó   — e Zd Zd	d„Zd
d„ZdS )Ú_GeminiChatCompletionsrR   ú'GeminiNativeClient'c                ó   — || _         d S rl   ©Ú_client©ro   rR   s     r   rn   z_GeminiChatCompletions.__init__þ  ó   € ØˆŒˆˆr   Úkwargsr   r   c                ó&   —  | j         j        di |¤ŽS ©Nr6   ©r}  Ú_create_chat_completion©ro   r€  s     r   Úcreatez_GeminiChatCompletions.create  s   € Ø3ˆtŒ|Ô3Ð=Ð=°fÐ=Ð=Ð=r   N©rR   rz  ©r€  r   r   r   ©rq   rr   rs   rn   r†  r6   r   r   ry  ry  ý  s<   € € € € € ðð ð ð ð>ð >ð >ð >ð >ð >r   ry  c                  ó   — e Zd Zd	d„Zd
d„ZdS )Ú_AsyncGeminiChatCompletionsrR   ú'AsyncGeminiNativeClient'c                ó   — || _         d S rl   r|  r~  s     r   rn   z$_AsyncGeminiChatCompletions.__init__  r  r   r€  r   r   c              ‹  ó6   K  —  | j         j        di |¤Žƒ d {V —†S r‚  rƒ  r…  s     r   r†  z"_AsyncGeminiChatCompletions.create	  s3   è è € Ø9�T”\Ô9ÐCÐC¸FÐCÐCÐCÐCÐCÐCÐCÐCÐCr   N©rR   rŒ  rˆ  r‰  r6   r   r   r‹  r‹    sB   € € € € € ðð ð ð ðDð Dð Dð Dð Dð Dr   r‹  c                  ó   — e Zd Zdd„ZdS )Ú_GeminiChatNamespacerR   rz  c                ó.   — t          |¦  «        | _        d S rl   )ry  Úcompletionsr~  s     r   rn   z_GeminiChatNamespace.__init__  s   € Ý1°&Ñ9Ô9ˆÔÐÐr   Nr‡  ©rq   rr   rs   rn   r6   r   r   r‘  r‘    s(   € € € € € ð:ð :ð :ð :ð :ð :r   r‘  c                  ó   — e Zd Zdd„ZdS )Ú_AsyncGeminiChatNamespacerR   rŒ  c                ó.   — t          |¦  «        | _        d S rl   )r‹  r“  r~  s     r   rn   z"_AsyncGeminiChatNamespace.__init__  s   € Ý6°vÑ>Ô>ˆÔÐÐr   Nr�  r”  r6   r   r   r–  r–    s(   € € € € € ð?ð ?ð ?ð ?ð ?ð ?r   r–  c                  óŠ   — e Zd ZdZdddddœd2d„Zd3d„Zd„ Zd„ Zd4d„Ze	d5d„¦   «         Z
ddddddddddddœd6d-„Zdd.œd7d1„ZdS )8ÚGeminiNativeClientzCMinimal OpenAI-SDK-compatible facade over Gemini's native REST API.N)r   Údefault_headersr   Úhttp_clientr   r   r   r›   rš  r²   r   r   r›  úOptional[httpx.Client]Ú_r   rj   c               óÈ  — |pd                      ¦   «         st          d¦  «        ‚|| _        |pt                               d¦  «        }|                     d¦  «        r|d t          d¦  «         …         }|| _        t          |pi ¦  «        | _	        t          | ¦  «        | _        d| _        |p,t          j        |pt          j        dddd¬	¦  «        ¬
¦  «        | _        d S )Nr   z÷Gemini native client requires an API key, but none was provided. Set GOOGLE_API_KEY or GEMINI_API_KEY in your environment / ~/.hermes/.env (get one at https://aistudio.google.com/app/apikey), or run `hermes setup` to configure the Google provider.r   r   Fg      .@g     À‚@g      >@)ÚconnectÚreadÚwriteÚpoolr.   )r   ÚRuntimeErrorr   rA   r   r   rB   r   r}   Ú_default_headersr‘  ÚchatÚ	is_closedrC   rD   ÚTimeoutÚ_http)ro   r   r   rš  r   r›  r�  rO   s           r   rn   zGeminiNativeClient.__init__  sõ   € ð �˜2×$Ò$Ñ&Ô&ð 	Ýð4ñô ð ð ˆŒØ#Ð>Õ'>×FÒFÀsÑKÔKˆØ×#Ò# IÑ.Ô.ð 	AØ-Ð.?µ°Y±´°Ð.?Ô@ˆOØ'ˆŒÝ $ _Ð%:¸Ñ ;Ô ;ˆÔÝ(¨Ñ.Ô.ˆŒ	ØˆŒØ ð 
¥E¤LØÐ]�uœ}°TÀÈTÐX\Ð]Ñ]Ô]ð%
ñ %
ô %
ˆŒ
ˆ
ˆ
r   c                ój   — d| _         	 | j                             ¦   «          d S # t          $ r Y d S w xY w)NT)r¦  r¨  ÚcloserF   ©ro   s    r   rª  zGeminiNativeClient.close7  sJ   € ØˆŒð	ØŒJ×ÒÑÔÐÐÐøÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‰$ ¤
2±2c                ó   — | S rl   r6   r«  s    r   Ú	__enter__zGeminiNativeClient.__enter__>  s   € Øˆr   c                ó.   — |                       ¦   «          d S rl   )rª  )ro   Úexc_typeÚexc_valÚexc_tbs       r   Ú__exit__zGeminiNativeClient.__exit__A  s   € Ø�
Š
‰Œˆˆˆr   úDict[str, str]c                óR   — dd| j         ddœ}|                     | j        ¦  «         |S )Nr1   zhermes-agent (gemini-native))r0   ÚAcceptzx-goog-api-keyz
User-Agent)r   Úupdater¤  )ro   r4   s     r   Ú_headerszGeminiNativeClient._headersD  s8   € à.Ø(Ø"œlØ8ð	
ð 
ˆð 	�Š�tÔ,Ñ-Ô-Ð-Øˆr   ÚiteratorúIterator[_GeminiStreamChunk]ú)tuple[bool, Optional[_GeminiStreamChunk]]c                óH   — 	 dt          | ¦  «        fS # t          $ r Y dS w xY w)NF)TN)ÚnextÚStopIteration)r¸  s    r   Ú_advance_stream_iteratorz+GeminiNativeClient._advance_stream_iteratorN  s:   € ð	Ø�$˜x™.œ.Ð(Ð(øÝð 	ð 	ð 	Ø�:�:ð	øøøs   ‚ “
! !r   F)r   r¼   ÚstreamrÏ   r×   rï   rð   rñ   rò   Ú
extra_bodyr   r   r¼   úOptional[List[Dict[str, Any]]]r¿  r   rÏ   r×   rï   rh   rð   rf   rñ   rò   rÀ  ri   c          
     óB  — d }t          |
t          ¦  «        r*|
                     d¦  «        p|
                     d¦  «        }t          |pg ||||||	|¬¦  «        }|r|                      |||¬¦  «        S | j        › d|› d�}| j                             |||                      ¦   «         |¬¦  «        }|j	        dk    rt          |¦  «        ‚	 |                     ¦   «         }n.# t          $ r!}t          d	|› �d
|j	        |¬¦  «        |‚d }~ww xY wt          ||¬¦  «        S )Nró   rù   )r¼   rÏ   r×   rï   rð   rñ   rò   ró   )r   rú   r   r"   r#   ©r3   r4   r   r@   z%Invalid JSON from Gemini native API: Úgemini_invalid_json)ra   rN   rb   )r   )rz   r}   rJ   rÿ   Ú_stream_completionr   r¨  rE   r·  rN   rw  r3   rM   r^   rA  )ro   r   r¼   r¿  rÏ   r×   rï   rð   rñ   rò   rÀ  r   r�  ró   rú   rP   rb   rQ   rT   s                      r   r„  z*GeminiNativeClient._create_chat_completionU  sj  € ð  ˆÝ�j¥$Ñ'Ô'ð 	dØ(ŸnšnÐ->Ñ?Ô?ÐcÀ:Ç>Â>ÐRbÑCcÔCcˆOå&Ø�^ ØØ#Ø#Ø!ØØØ+ð	
ñ 	
ô 	
ˆð ð 	ZØ×*Ò*°ÀÐQXÐ*ÑYÔYÐYà”Ð?Ð?¨Ð?Ð?Ð?ˆØ”:—?’? 3¨W¸d¿mºm¹o¼oÐW^�?Ñ_Ô_ˆØÔ 3Ò&Ð&Ý# HÑ-Ô-Ð-ð	Ø—m’m‘o”oˆGˆGøÝð 	ð 	ð 	Ý Ø=¸Ð=Ð=Ø*Ø$Ô0Ø!ð	ñ ô ð
 ðøøøøð	øøøõ )¨¸Ð>Ñ>Ô>Ð>s   ÃC" Ã"
DÃ,DÄDr.   rú   rš   c               óž   ‡ ‡‡‡‡‡— ‰ j         › d‰› d�Št          ‰                      ¦   «         ¦  «        Šd‰d<   dˆˆˆ ˆˆˆfd„} |¦   «         S )	Nr"   z:streamGenerateContent?alt=sseztext/event-streamrµ  r   r¹  c               3  óŒ  •K  — 	 ‰j                              d‰
‰‰‰	¬¦  «        5 } | j        dk    r#|                      ¦   «          t	          | ¦  «        ‚i }t          | ¦  «        D ]}t          |‰|¦  «        D ]}|V — ŒŒ	 d d d ¦  «         d S # 1 swxY w Y   d S # t          j        $ r}t          d|› �d¬¦  «        |‚d }~ww xY w)NÚPOSTrÃ  r@   z!Gemini streaming request failed: Úgemini_stream_error)ra   )
r¨  r¿  rN   r   rw  rS  rb  rC   Ú	HTTPErrorr^   )rb   rU  rT  rQ  rT   r   rú   ro   Ústream_headersr   rP   s        €€€€€€r   Ú
_generatorz9GeminiNativeClient._stream_completion.<locals>._generator‹  sT  øè è € ðØ”Z×&Ò& v¨s¸È.ÐbiÐ&ÑjÔjð (ÐnvØÔ+¨sÒ2Ð2Ø Ÿš™œ˜Ý/°Ñ9Ô9Ð9ØCEÐ%Ý!1°(Ñ!;Ô!;ð (ð (˜Ý%;¸EÀ5ÐJ[Ñ%\Ô%\ð (ð (˜EØ"'˜K˜K˜K˜Kð(ð(ð(ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øõ ”?ð ð ð Ý$Ø=¸Ð=Ð=Ø.ðñ ô ð ðøøøøðøøøs;   …B ¤ABÂ B ÂBÂB ÂBÂB ÂCÂ)B>Â>C)r   r¹  )r   r}   r·  )ro   r   rú   r   rÌ  rË  rP   s   ```` @@r   rÅ  z%GeminiNativeClient._stream_completion†  s„   øøøøøø€ Ø”ÐMÐM¨ÐMÐMÐMˆÝ˜dŸmšm™oœoÑ.Ô.ˆØ#6ˆ�xÑ ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð  ˆz‰|Œ|Ðr   )r   r   r   r›   rš  r²   r   r   r›  rœ  r�  r   r   rj   ©r   rj   )r   r³  )r¸  r¹  r   rº  )r   r   r¼   rÁ  r¿  r   rÏ   r   r×   r   rï   rh   rð   rf   rñ   rh   rò   r   rÀ  ri   r   r   r�  r   r   r   )r   r   rú   rš   r   r   r   r¹  )rq   rr   rs   rt   rn   rª  r­  r²  r·  Ústaticmethodr¾  r„  rÅ  r6   r   r   r™  r™    s  € € € € € ØMÐMð #'Ø48ØØ.2ð
ð 
ð 
ð 
ð 
ð 
ð:ð ð ð ðð ð ðð ð ðð ð ð ð ðð ð ñ „\ðð (Ø37ØØØØ'+Ø$(Ø!%ØØ/3Øð/?ð /?ð /?ð /?ð /?ð /?ðb Y]ð ð ð ð ð ð ð ð r   r™  c                  ó*   — e Zd ZdZdd„Zdd„Zdd
„ZdS )ÚAsyncGeminiNativeClientz?Async wrapper used by auxiliary_client for native Gemini calls.Úsync_clientr™  c                ól   — || _         |j        | _        |j        | _        t          | ¦  «        | _        d S rl   )Ú_syncr   r   r–  r¥  )ro   rÑ  s     r   rn   z AsyncGeminiNativeClient.__init__¡  s0   € Ø ˆŒ
Ø"Ô*ˆŒØ#Ô,ˆŒÝ-¨dÑ3Ô3ˆŒ	ˆ	ˆ	r   r€  r   r   c              ‹  óÐ   ‡ ‡K  — t          |                     d¦  «        ¦  «        }t          j        ‰ j        j        j        j        fi |¤Žƒ d {V —†Š|s‰S dˆˆ fd„} |¦   «         S )Nr¿  r   r   c                ón   •K  — 	 t          j        ‰j        j        ‰¦  «        ƒ d {V —†\  } }| rd S |W V — Œ2rl   )ÚasyncioÚ	to_threadrÓ  r¾  )ÚdonerQ  Úresultro   s     €€r   Ú_async_streamzFAsyncGeminiNativeClient._create_chat_completion.<locals>._async_stream­  sW   øè è € ðÝ$+Ô$5°d´jÔ6YÐ[aÑ$bÔ$bÐbÐbÐbÐbÐbÐb‘��eØð Ø�EØ����ð	r   )r   r   )r   rJ   rÖ  r×  rÓ  r¥  r“  r†  )ro   r€  r¿  rÚ  rÙ  s   `   @r   r„  z/AsyncGeminiNativeClient._create_chat_completion§  s“   øøè è € Ý�f—j’j Ñ*Ô*Ñ+Ô+ˆÝÔ(¨¬¬Ô)DÔ)KÐVÐVÈvÐVÐVÐVÐVÐVÐVÐVÐVˆØð 	ØˆMð	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ}‰ŒÐr   rj   c              ƒ  óR   K  — t          j        | j        j        ¦  «        ƒ d {V —† d S rl   )rÖ  r×  rÓ  rª  r«  s    r   rª  zAsyncGeminiNativeClient.close¶  s4   è è € ÝÔ ¤
Ô 0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r   N)rÑ  r™  rˆ  rÍ  )rq   rr   rs   rt   rn   r„  rª  r6   r   r   rÐ  rÐ  ž  sV   € € € € € ØIÐIð4ð 4ð 4ð 4ðð ð ð ð2ð 2ð 2ð 2ð 2ð 2r   rÐ  )r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )rZ   r   r   r   )rv   r   r   r   )rv   r   r   r‚   )r™   rš   r   r›   )r™   rš   r   rš   rl   )re   rš   r±   r²   r   rš   )r¼   r‚   r   r½   )rÏ   r   r   r‚   )r×   r   r   ri   )rã   r   r   ri   )r¼   r‚   rÏ   r   r×   r   rï   rh   rð   rf   rñ   rh   rò   r   ró   r   r   rš   )r   r   r   r   )r€   rš   r   ri   )r   r   r   r   )rS   rš   r   r   r   r   )r   r   rv   r   rD  ri   r  r›   r  r   r   rC  )rb   rJ  r   rK  )rT  rš   r   r   rU  rV  r   rW  )rb   rJ  r   r^   )7rt   Ú
__future__r   rÖ  rŽ   r3   Úloggingr(  r%  Útypesr   Útypingr   r   r   r   r	   rC   Úagent.gemini_schemar
   Ú	getLoggerrq   rG   rA   r   rY   r\   rk  rF   r^   r�   r˜   r£   r°   r»   rÎ   rÖ   râ   rî   rÿ   r  r  r*  rA  rC  rI  rS  rb  rw  ry  r‹  r‘  r–  r™  rÐ  r6   r   r   ú<module>râ     sS  ððð ð  #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à €€€à ?Ð ?Ð ?Ð ?Ð ?Ð ?à	ˆÔ	˜8Ñ	$Ô	$€àLÐ ð.ð .ð .ð .ð ,ðGð $ØðGð Gð Gð Gð Gð GðT0ð 0ð 0ð 0ð)ð ð%ð %ð %ð %ð %�Yñ %ô %ð %ð*ð ð ð ð$#ð #ð #ð #ðL
ð 
ð 
ð 
ðð ð ð ð0 6:ðð ð ð ð ð43(ð 3(ð 3(ð 3(ðlLð Lð Lð Lð0ð ð ð ð$ð ð ð ð& ØØ#'Ø $Ø!ØØð'ð 'ð 'ð 'ð 'ð 'ðT:ð :ð :ð :ðð ð ð ðð ð ð ð4Bð Bð Bð BðJ	ð 	ð 	ð 	ð 	˜ñ 	ô 	ð 	ð Ø04Ø#'Øð+ð +ð +ð +ð +ð +ð\ð ð ð ð2Að Að Að AðHLð Lð Lð Lð^>ð >ð >ð >ð >ñ >ô >ð >ðDð Dð Dð Dð Dñ Dô Dð Dð:ð :ð :ð :ð :ñ :ô :ð :ð
?ð ?ð ?ð ?ð ?ñ ?ô ?ð ?ð
Dð Dð Dð Dð Dñ Dô Dð DðN2ð 2ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2r   