+
    iHàj\â  ã                  ó–  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHtHtHtHtHt ^ RIt^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHtH t  ]PB                  ! ]"4      t#^ R	I$H%t% R
]%! 4       PL                   2t'Rt(Rt)Rt*Rt+Rt,Rt-Rt.Rt/Rt0]1! 4       t2^t3RRRRRR/t4RRRRRRR RR!RR"R/t5R#R$R%R&R'R(/t6R)t7R* R+ lt8R, R- lt9R. R/ lt:R0 R1 lt;R2 R3 lt<]Pz                  ! R4]P|                  4      t?R5 R6 lt@R7 R8 ltAR9 R: ltBR; R< ltC](3R=R>R?R@/RA RB llltDRC RD ltERE RF ltFRG RH ltGRÁRJRI/RK RL llltH ! RM RN]I4      tJRO RP ltKRQ RR ltLRS RT ltMRU RV ltNRW RX ltORY RZ ltPR[ R\ ltQRÂR^ R_ lltRR` Ra ltSRÃRbR]/Rc Rd llltTRe Rf ltURg Rh ltVRÂRbR]/Ri Rj llltWRkR]/Rl Rm lltXRkR]/Rn Ro lltYRp Rq ltZRrRs][]\3][3RtRu]]Rv 3RwRx]^Ry 33t_Rz R{ lt`R| R} ltaR~ R ltbRkR]/R€ R� lltcR‚RRƒRR„RR…RR†RRRR‡RRˆRR=RIR‰R]/
RŠ R‹ lltdRŒ R� lteRŽ R� ltfR� R‘ ltgR’ R“ lthR” R• lti]3R– R— lltjR˜ R™ ltkRš R› ltlRœ R� ltmRž RŸ ltnR  R¡ lto ! R¢ R£]4      tpR¤RIR¥RR¦RR§RIR¨R/R© Rª lltq]1! 4       trR« R¬ ltsR­ R® lttR¯ R° ltuR± R² ltvR³ R´ ltwRµ R¶ ltxR·RRJRIR¸RIR¹Rº/R» R¼ llty ! R½ R¾4      tz ! R¿ RÀ4      t{R# )Äa°  OpenAI-compatible facade over Google AI Studio's native Gemini API: the ``gemini``
provider keeps ``api_mode='chat_completions'`` so the agent loop stays OpenAI-shaped,
and this shim converts ``messages[]``/``tools[]`` into ``models/{model}:generateContent``
payloads and responses back. Google's OpenAI-compat endpoint is brittle for the
multi-turn tool loop (auth churn, tool-call replay, thought signatures); native is canonical.)ÚannotationsN©ÚSimpleNamespace)ÚAnyÚDictÚIteratorÚListÚOptional)Úread_streaming_error_body)Úcontinuation_tokenÚlong_decode_hopsÚmerge_hop_responsesÚmerge_hop_usageÚsplit_stream_continuation)Úparse_retry_after_seconds)Úprepare_gemini_tool_parametersÚsanitize_gemini_tool_parameters)Úget_version_infozhermes-agent/z0https://generativelanguage.googleapis.com/v1betaz;https://aiplatform.googleapis.com/v1beta1/publishers/googleiÿÿ  at  

Your Google API key is on the free tier (a few hundred requests/day for Gemini Flash models). 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/apikeyu˜  

Google Gemini rejected this API key's type â€” you do NOT need OAuth. Google began rejecting legacy 'Standard' Google Cloud keys for the Gemini API on June 19, 2026, and all Standard keys stop working in September 2026. Open https://aistudio.google.com/api-keys, check the key's type and status, and create a replacement Gemini API key (or, as a temporary bridge, restrict the Standard key to generativelanguage.googleapis.com). Then update GEMINI_API_KEY / GOOGLE_API_KEY in ~/.hermes/.env, delete any leftover Windows/system copy of those variables, and restart. A stale shell key can hide the .env value. Details: https://ai.google.dev/gemini-api/docs/api-keya’  

Google issues 'AQ.' keys for both Google AI Studio and Vertex AI express mode, and each surface only accepts its own keys: a Vertex express key always gets 403 PERMISSION_DENIED on generativelanguage.googleapis.com. If this key came from Google Cloud / Vertex (express mode), point the provider at the express surface, e.g. set base_url / GEMINI_BASE_URL to https://aiplatform.googleapis.com/v1beta1.uä   

If this 'AQ.' key came from Google AI Studio (https://aistudio.google.com/apikey), it only works on the default generativelanguage.googleapis.com host â€” remove the explicit aiplatform base_url so the default surface is used.z<[The previous response was interrupted before it completed.]Ú skip_thought_signature_validatorÚautoÚAUTOÚrequiredÚANYÚnoneÚNONEÚSTOPÚstopÚ
MAX_TOKENSÚlengthÚSAFETYÚcontent_filterÚ
RECITATIONÚOTHERÚCONTINUATIONé‘  Úgemini_unauthorizedé­  Úgemini_rate_limitedi”  Úgemini_model_not_foundz÷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.c               ó    € V ^8„  d   QhRRRR/# )é   ÚmodelÚstrÚreturn© )Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/agent/gemini_native_adapter.pyÚ__annotate__r1   a   s   € ÷ ñ  ð ¨ñ ó    c                óæ   € T ;'       g    RP                  4       pR FP  pVP                  4       P                  V4      '       g   K*  V\        V4      R P                  4       ;'       g    Tu # 	  V# )zEStrip Gemini's own provider prefix from an aggregator-style model id.Ú N)zgoogle/zgemini/)ÚstripÚlowerÚ
startswithÚlen)r+   ÚnameÚprefixs   &  r0   Úbare_gemini_model_idr;   a   s`   € à�KˆK�R×ÑÓ €DÛ(ˆØ�:‰:‹<×"Ñ" 6×*Ô*Øœ˜F›˜Ð%×+Ñ+Ó-×5Ð5°Ò5ñ )ð €Kr2   c               ó    € V ^8„  d   QhRRRR/# ©r*   r+   r,   r-   Úboolr.   )r/   s   "r0   r1   r1   j   s   € ÷ 	,ñ 	,¨ð 	,°ñ 	,r2   c                ó   € \        V 4      R8¬  # )uÛ  Gemini 3+ needs explicit functionCall/functionResponse ids so replayed parallel tool calls
pair with their responses; 2.x rejects the field.

Gemini 3+ models require explicit tool call IDs in replayed history â€” without them, multi-tool turns can
be rejected or mismatched. Older Gemini models (2.x) reject unexpected ``id`` fields, so this is gated
on the major version. Mirrors earendil-works/pi#7494 (their fix for the same class of bug in the
google-shared converter).
©é   é    ©Ú_gemini_version©r+   s   &r0   Úgemini_requires_tool_call_idsrF   j   s   € ô ˜5Ó! VÑ+Ð+r2   c               ó    € V ^8„  d   QhRRRR/# )r*   r+   r,   r-   ztuple[int, int]r.   )r/   s   "r0   r1   r1   v   s   € ÷ Pñ P˜3ð P ?ñ Pr2   c                óî   € \         P                  ! R\        V 4      P                  4       4      pV'       d?   \	        VP                  ^4      4      \	        VP                  ^4      ;'       g    ^ 4      3# R# )zÃ(major, minor) of a Gemini model id: ``gemini-4-argon`` -> (4, 0), ``google/gemini-3.8-flash`` ->
(3, 8); (0, 0) for non-Gemini and unversioned ids (``gemini-flash-latest``, ``gemini-exp-1206``).zgemini-(\d+)(?:\.(\d+))?)rB   rB   )ÚreÚmatchr;   r6   ÚintÚgroup)r+   rJ   s   & r0   rD   rD   v   sX   € ô �HŠHÐ0Ô2FÀuÓ2M×2SÑ2SÓ2UÓV€Eß>CŒC�—‘˜A“Ó¤ U§[¡[°£^×%8Ð%8°qÓ!9Ð:ÐOÈÐOr2   c               ó    € V ^8„  d   QhRRRR/# r=   r.   )r/   s   "r0   r1   r1   }   s   € ÷ hñ h cð h¨dñ hr2   c                ó´   € \        V 4      P                  4       pVP                  R4      ;'       d    VP                  R4      ;'       g    \	        V4      R8¬  # )a^  Gemini 3 and every later generation steer thinking with the ``thinkingLevel`` enum (``thinkingBudget``
is deprecated there), as do the ``gemini-*-latest`` aliases, which Google hot-swaps to the newest
release of each variant. A version-number gate, not a ``gemini-3`` prefix, so a new generation
(``gemini-4-argon``) isn't silently treated as legacy.zgemini-z-latestr@   )r;   r6   r7   ÚendswithrD   )r+   Úbares   & r0   Úgemini_uses_thinking_levelrQ   }   sK   € ô
   Ó&×,Ñ,Ó.€DØ�O‰O˜IÓ&×CÐC¨4¯=©=¸Ó+C×gÐgÌÐX\ÓH]ÐagÑHgÐgr2   c               ó    € V ^8„  d   QhRRRR/# r=   r.   )r/   s   "r0   r1   r1   †   s   € ÷ ,ñ , cð ,¨dñ ,r2   c                ó   € \        V 4      R8¬  # )zžGemini 3.6+ (Gemini 4 Argon included) ignores ``temperature``/``top_p``/``top_k`` and Google
slated them for removal; older families (2.x, 3.0-3.5) keep them.)rA   é   rC   rE   s   &r0   Úgemini_sampling_deprecatedrU   †   s   € ô ˜5Ó! VÑ+Ð+r2   z^v\d+(?:alpha|beta)?\d*$c               ó    € V ^8„  d   QhRRRR/# ©r*   Úbase_urlr,   r-   r>   r.   )r/   s   "r0   r1   r1   �   s   € ÷ Yñ Y¨ð Y°ñ Yr2   c                óˆ   € \        T ;'       g    R4      P                  4       P                  4       pRV9   ;'       d    RV9  # )u6  An aiplatform host speaking the native API with an API key: the bare express surface, or its
``â€¦/projects/{p}/locations/{l}`` form, which reaches models served only in ``global`` (Gemini 4).
The OAuth Vertex provider's ``â€¦/endpoints/openapi`` base is OpenAI-compatible and must stay off
the native adapter.r4   zaiplatform.googleapis.comz/endpoints/)r,   r5   r6   ©rX   Ú
normalizeds   & r0   Úis_vertex_express_base_urlr\   �   s>   € ô
 �X—^�^ Ó$×*Ñ*Ó,×2Ñ2Ó4€JØ&¨*Ñ4×XÐX¸ÈjÑ9XÐXr2   c               ó    € V ^8„  d   QhRRRR/# )r*   rX   úOptional[str]r-   r,   r.   )r/   s   "r0   r1   r1   ˜   s   € ÷ ñ ¨ð ¸#ñ r2   c                ót  € \        T ;'       g    R4      P                  4       P                  R4      p\        P                  ! RRV\        P
                  R7      P                  R4      pV'       g   \        p\        V4      '       dy   VP                  4       P                  R4      '       d   V# RVP                  4       9  d8   \        P                  VP                  R^4      R	,          4      '       g   V R2pV R2# \        P                  VP                  R^4      R	,          4      '       d   V# V R2# )
u:  Gemini native base URL with the API version segment guaranteed. Google's own client treats the
base as a host root and appends the version itself, so users configure ``GEMINI_BASE_URL`` (or a
proxy root like ``http://localhost:4000/gemini``) that way; our request builders expect
``{base}/models/{model}:generateContent`` â€” without ``/v1beta`` that is a guaranteed 404. Trailing
slashes and an ``/openai`` suffix are stripped; an existing version segment (``v1``, ``v1beta``,
``v1alpha``, ...) is kept; empty input returns ``DEFAULT_GEMINI_BASE_URL``. Only the LAST path
segment is inspected, so ``.../v1beta/extra`` still gets ``/v1beta`` appended; this does not
decide routing (see ``is_native_gemini_base_url``).

A Vertex express base (``aiplatform.googleapis.com``, ``â€¦/v1beta1`` or the full
``â€¦/v1beta1/publishers/google``) is completed to the ``publishers/google`` form. The key never
decides routing: Google issues ``AQ.â€¦`` keys for both AI Studio and Vertex express mode
(#115306), so an express key reaches aiplatform only through this explicit base configuration.r4   Ú/z	/openai\Z)Úflagsz/publishers/googlez
/projects/z/v1beta1ú/v1betaéÿÿÿÿ)r,   r5   ÚrstriprI   ÚsubÚ
IGNORECASEÚDEFAULT_GEMINI_BASE_URLr\   r6   rO   Ú_API_VERSION_SEGMENTrJ   Úrsplit)rX   Útrimmeds   & r0   Únormalize_gemini_base_urlrk   ˜   sý   € ô �(—.�.˜bÓ!×'Ñ'Ó)×0Ñ0°Ó5€GÜ�fŠf�\ 2 w´b·m±mÔD×KÑKÈCÓP€GßÜ)ˆÜ! '×*Ò*Ø�=‰=‹?×#Ñ#Ð$8×9Ò9ØˆNØ˜wŸ}™}›Ô.Ô7K×7QÑ7QÐRY×R`ÑR`ÐadÐfgÓRhÐikÕRl×7mÒ7mØ ˜	 Ð*ˆGØ�Ð,Ð-Ð-Ü×!Ñ! '§.¡.°°aÓ"8¸Õ"<×=Ò=ØˆØˆY�gÐÐr2   c               ó    € V ^8„  d   QhRRRR/# rW   r.   )r/   s   "r0   r1   r1   µ   s   € ÷ gñ g¨ð g°ñ gr2   c                óä   € \        T ;'       g    R4      P                  4       P                  R4      P                  4       pVP	                  R4      '       d   R# RV9   ;'       g    \        V4      # )zITrue when the endpoint speaks Gemini's native REST API (not ``/openai``).r4   r`   z/openaiFú!generativelanguage.googleapis.com)r,   r5   rd   r6   rO   r\   rZ   s   & r0   Úis_native_gemini_base_urlro   µ   s]   € ä�X—^�^ Ó$×*Ñ*Ó,×3Ñ3°CÓ8×>Ñ>Ó@€JØ×Ñ˜9×%Ò%ÙØ.°*Ñ<×fÐfÔ@ZÐ[eÓ@fÐfr2   c               ó    € V ^8„  d   QhRRRR/# rW   r.   )r/   s   "r0   r1   r1   ½   s   € ÷ Oñ O°Cð O¸Dñ Or2   c                ó    € \        T ;'       g    R4      P                  4       P                  R4      P                  4       P	                  R4      # )zã``FunctionDeclaration.parametersJsonSchema`` exists only in the ``v1beta`` surface of
generativelanguage (absent from ``v1`` / ``v1alpha`` content.proto); other versions and
unknown proxies get the legacy ``parameters`` subset.r4   r`   rb   )r,   r5   rd   r6   rO   )rX   s   &r0   Ú%gemini_accepts_parameters_json_schemarr   ½   s=   € ô ˆx�~ˆ~˜2Ó×$Ñ$Ó&×-Ñ-¨cÓ2×8Ñ8Ó:×CÑCÀIÓNÐNr2   r+   úgemini-3.7-flashÚtimeoutg      $@c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r*   Úapi_keyr,   rX   r+   rt   Úfloatr-   r.   )r/   s   "r0   r1   r1   Ä   s;   € ÷ Bñ BØðBØðBØEHðBØhmðBàñBr2   c          	     óR  € T ;'       g    RP                  4       pV'       g   R# \        V4      pRRRRRR/./.R	R
^//pRRR\        /p \        P                  ! VR7      ;_uu_ 4       pVP                  V RV R2RV/WgR7      p	RRR4       X	P                  P                  4        UUu/ uF  w  r¼TP                  4       TbK  	  uppP                  R4      p T'       d   \        T4      R8:  d   R# R#  T	P                   R8X  d#   R\#        T	4      P                  4       9   d   R# R# ^ÈT	P                   u;8:  d	   R8  d   R#  R#   + '       g   i     LË; i  \         d"   p
\        P                  RT
4        Rp
?
R# Rp
?
ii ; iu uppi   \        \        3 d     L¬i ; i)uz   Probe a Google AI Studio key â†’ ``"free"`` | ``"paid"`` | ``"unknown"`` (probe failed; callers proceed without blocking).r4   ÚunknownÚcontentsÚroleÚuserÚpartsÚtextÚhiÚgenerationConfigÚmaxOutputTokensúContent-Typeúapplication/jsonúX-Goog-Api-Client©rt   ú/models/z:generateContentÚkey)ÚparamsÚjsonÚheadersNz$probe_gemini_tier: network error: %sz"x-ratelimit-limit-requests-per-dayiè  ÚfreeÚpaidr&   Ú	free_tieri,  )r5   rk   Ú_API_CLIENTÚhttpxÚClientÚpostÚ	ExceptionÚloggerÚdebugrŠ   Úitemsr6   ÚgetrK   Ú	TypeErrorÚ
ValueErrorÚstatus_codeÚ_response_text)rv   rX   r+   rt   r‡   ÚbaseÚpayloadrŠ   ÚclientÚrespÚexcÚkÚvÚ
rpd_headers   &&$$          r0   Úprobe_gemini_tierr£   Ä   sž  € ð �=ˆ=�b×
Ñ
Ó
!€CßÙÜ$ XÓ.€DØ˜V V¨W¸À°~Ð6FÐGÐHÐJ\Ð_pÐrsÐ^tÐu€GØÐ1Ð3FÌÐT€GðÜ�\Š\ '×*Õ*¨fØ—;‘; $  x°¨wÐ6FÐGÐQVÐX[ÐP\Ðcj�;Ó|ˆD÷ +ð
 ,0¯<©<×+=Ñ+=Ô+?Ô@Ñ+?¡4 1�!—'‘'“)˜Q’,Ñ+?Ò@×DÑDÐEiÓj€JðßÜ  ›_°Ô4�6Ð@¸&Ð@ð ð ×Ñ˜3ÔØ$¬°tÓ(<×(BÑ(BÓ(DÔDˆvÐPÈ&ÐPØ˜D×,Ñ,Ö2¨sÔ2ˆ6ÐAÐ2¸	ÐA÷ +×*ûäô Ü�‰Ð;¸SÔAÝûðüó Aøô ”zÐ"ô ÙðúsZ   ÁE Á*E
ÂE Â,FÃF Ã$F Ã6F Å
E	ÅE ÅE ÅF	Å(FÆF	ÆF&Æ%F&c               ó    € V ^8„  d   QhRRRR/# )r*   Úresponser   r-   r,   r.   )r/   s   "r0   r1   r1   ß   s   € ÷ ñ ˜Sð  Sñ r2   c                óT   €  V P                   ;'       g    R #   \         d     R # i ; i©r4   )r~   r’   )r¥   s   &r0   rš   rš   ß   s+   € ðØ�}‰}×"Ð" Ð"øÜô Úðús   ‚ • ˜'¦'c               ó    € V ^8„  d   QhRRRR/# )r*   Úerror_messager,   r-   r>   r.   )r/   s   "r0   r1   r1   æ   s   € ÷ Hñ H¨Cð H°Dñ Hr2   c                óN   € \        V 4      ;'       d    RV P                  4       9   # )z>True when a Gemini 429 message indicates free-tier exhaustion.r�   )r>   r6   )r©   s   &r0   Úis_free_tier_quota_errorr«   æ   s#   € ä�Ó×GÐG ;°-×2EÑ2EÓ2GÑ#GÐGr2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r*   rX   r,   rv   Ú
err_statusr-   r.   )r/   s   "r0   r1   r1   ë   s)   € ÷ ñ ¨Cð ¸#ð È3ð ÐSVñ r2   c                óš  € T;'       g    RP                  4       P                  4       R8w  d   R# \        T ;'       g    R4      P                  4       P                  4       p\	        V4      '       d   \
        # RV9   dM   \        T;'       g    R4      P                  4       P                  4       P                  R4      '       d   \        # R# )uM  Guidance text for the 403 PERMISSION_DENIED key/host mismatches Google's AQ. rollout created.

Google issues ``AQ.â€¦`` keys for both AI Studio and Vertex express mode, so neither the key prefix
nor the host alone proves the pairing; on a PERMISSION_DENIED, point the user at the surface their
key likely belongs to: an AQ. key rejected by the Studio host may be an express key (the explicit
aiplatform base_url is that key's only route there), and any key rejected by an explicitly
configured aiplatform base may be an AI Studio key (#115306). Empty string when the shape matches
neither.r4   ÚPERMISSION_DENIEDrn   zAQ.)r5   Úupperr,   r6   r\   Ú_STUDIO_KEY_ON_EXPRESS_GUIDANCEr7   Ú_EXPRESS_KEY_ON_STUDIO_GUIDANCE)rX   rv   r­   r[   s   &&& r0   Úwrong_gemini_surface_guidancer³   ë   sœ   € ð 	×Ð�b×ÑÓ!×'Ñ'Ó)Ð-@Ô@ÙÜ�X—^�^ Ó$×*Ñ*Ó,×2Ñ2Ó4€JÜ! *×-Ò-Ü.Ð.Ø*¨jÔ8¼SÀÇÀÈBÓ=O×=UÑ=UÓ=W×=]Ñ=]Ó=_×=jÑ=jÐkp×=qÒ=qÜ.Ð.Ùr2   r4   rv   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r*   ÚstatusrK   r©   r,   Úreasonrv   r-   r>   r.   )r/   s   "r0   r1   r1   þ   s4   € ÷ ñ ØðØ #ðØ-0ðØCFðà	ñr2   c               óØ   € T;'       g    RP                  4       pV R8X  d   VR8X  g   RV9   d   R# V R8X  d2   T;'       g    RP                  R4      '       d   VR8X  g   R	V9   d   R# R
# )uÅ  True when Google rejected a legacy "Standard" (AIza) Cloud key.

Original shape (June 2026): 401 + ``ACCESS_TOKEN_TYPE_UNSUPPORTED`` / "expected OAuth 2
access token". After the September 2026 cutoff the same leftover AIza key often comes
back as 400 ``API_KEY_INVALID`` ("API key not valid") â€” attach migration guidance on
that 400 only when the presented key is still AIza-shaped, so a mistyped Auth (``AQ.``)
key keeps the raw invalid-key message.
r4   r$   ÚACCESS_TOKEN_TYPE_UNSUPPORTEDzexpected oauth 2 access tokenTi�  ÚAIzaÚAPI_KEY_INVALIDzapi key not validF)r6   r7   )rµ   r©   r¶   rv   Úmsgs   &&&$ r0   Úis_standard_key_auth_errorr¼   þ   sj   € ð ×Ð˜B×
%Ñ
%Ó
'€CØ�„}˜&Ð$CÔCÐGfÐjmÔGmÙà�#ŒØ�]ˆ]˜×&Ñ& v×.Ò.ØÐ(Ô(Ð,?À3Ô,FáÙr2   c            
      óJ   a € ] tR tRtRtRRRRRRRRR	R/R
 V 3R llltRtV ;t# )ÚGeminiAPIErrori  z>Error shape compatible with Hermes retry/error classification.ÚcodeÚgemini_api_errorr™   Nr¥   Úretry_afterÚdetailsc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r*   Úmessager,   r¿   r™   úOptional[int]r¥   zOptional[httpx.Response]rÁ   úOptional[float]rÂ   úOptional[dict[str, Any]]r.   )r/   s   "r0   r1   ÚGeminiAPIError.__annotate__  sF   € ÷ Dñ D ð D¨cð DÐUbð DØ3ðDØIXðDð kCñDr2   c               	ó€   <€ \         SV `  V4       W#VuV n        V n        V n        YV;'       g    / uV n        V n        R # ©N)ÚsuperÚ__init__r¿   r™   r¥   rÁ   rÂ   )ÚselfrÄ   r¿   r™   r¥   rÁ   rÂ   Ú	__class__s   &&$$$$$€r0   rÌ   ÚGeminiAPIError.__init__  s:   ø€ ä‰Ñ˜Ô!Ø59ÈÐ2ˆŒ	�4Ô# T¤]Ø)4·m°mÀÐ&ˆÔ˜$ž,r2   )r¿   rÂ   r¥   rÁ   r™   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÌ   Ú__static_attributes__Ú__classcell__)rÎ   s   @r0   r¾   r¾     sI   ø† ÙHðDÐ4Fð DÐeið DØ6:ðDØ[_ðDð FJ÷D÷ Dð Dr2   r¾   c               ó    € V ^8„  d   QhRRRR/# )r*   Úitemr   r-   r^   r.   )r/   s   "r0   r1   r1      s   € ÷ 3ñ 3�3ð 3˜=ñ 3r2   c                óê   € \        V \        4      '       dE   V P                  R4      R8X  d/   \        V P                  R4      \        4      '       d
   V R,          # \        V \        4      '       d   V # R# )zSText of an OpenAI content item (plain str or ``{"type": "text"}`` dict), else None.Útyper~   N)Ú
isinstanceÚdictr–   r,   )rØ   s   &r0   Ú_text_ofrÝ      sW   € ä�$œ×Ò $§(¡(¨6Ó"2°fÔ"<ÄÈDÏHÉHÐU[ÓL\Ô^a×AbÒAbØ�F�|ÐÜ˜d¤C×(Ò(ˆ4Ð2¨dÐ2r2   c               ó    € V ^8„  d   QhRRRR/# )r*   Úcontentr   r-   r,   r.   )r/   s   "r0   r1   r1   '  s   € ÷ 3ñ 3 Sð 3¨Sñ 3r2   c                óœ   € \        V \        4      '       d'   R P                  R \        \        V 4       4       4      # V f   R# \        V 4      # )Ú
c              3  ó0   "  € T F  qf   K  Vx € K  	  R # 5irÊ   r.   )Ú.0Úts   & r0   Ú	<genexpr>Ú*_coerce_content_to_text.<locals>.<genexpr>)  s   é € ÐLÑ$:˜qŸšÓ$:ùs   ‚Œ
r4   )rÛ   ÚlistÚjoinÚmaprÝ   r,   ©rß   s   &r0   Ú_coerce_content_to_textrë   '  s>   € Ü�'œ4× Ò Ø�y‰yÑL¤C¬°'Ô$:ÓLÓLÐLØ’ˆ2Ð2¤c¨'£lÐ2r2   c               ó    € V ^8„  d   QhRRRR/# )r*   rØ   údict[str, Any]r-   rÇ   r.   )r/   s   "r0   r1   r1   -  s   € ÷ 
ñ 
˜Nð 
Ð/Gñ 
r2   c                ó   € V P                  R4      ;'       g    / P                  R4      ;'       g    RpV P                  R4      R8w  g.   \        V\        4      '       d   VP                  R4      '       g   R#  VP	                  R^4      w  r#\
        P                  ! \
        P                  ! V4      4      P                  R4      pR	R
VP	                  R^4      ^,          P	                  R^4      ^ ,          RV//#   \         d     R# i ; i)zW``inlineData`` part for an ``image_url`` item carrying a ``data:`` URL; None otherwise.Ú	image_urlÚurlr4   rÚ   zdata:NÚ,ÚasciiÚ
inlineDataÚmimeTypeÚ:Ú;Údata)
r–   rÛ   r,   r7   ÚsplitÚbase64Ú	b64encodeÚ	b64decodeÚdecoder’   )rØ   rð   ÚheaderÚencodedr÷   s   &    r0   Ú_inline_data_partrÿ   -  sâ   € à�8‰8�KÓ ×&Ð& B×
+Ñ
+¨EÓ
2×
8Ð
8°b€CØ‡x�x�Ó˜;Ô&¬j¸¼c×.BÒ.BÈ#Ï.É.ÐY`×JaÒJaÙðØŸ)™) C¨Ó+‰ˆÜ×Ò¤× 0Ò 0°Ó 9Ó:×AÑAÀ'ÓJˆØ˜z¨6¯<©<¸¸QÓ+?ÀÕ+B×+HÑ+HÈÈaÓ+PÐQRÕ+SÐU[Ð]aÐbÐcÐcøÜô Úðús   Á;BC> Ã>DÄDc               ó    € V ^8„  d   QhRRRR/# )r*   rØ   r   r-   rÇ   r.   )r/   s   "r0   r1   r1   :  s   € ÷ Gñ G˜3ð GÐ#;ñ Gr2   c                ó¢   € \        V 4      pV'       g   \        V \        4      '       d   R V/# \        V \        4      '       d   \	        V 4      # R# )r~   N)rÝ   rÛ   r,   rÜ   rÿ   )rØ   r~   s   & r0   Ú_multimodal_partr  :  sA   € Ü�D‹>€DßŒz˜$¤×$Ò$Ø˜ˆ~ÐÜ&0°´t×&<Ò&<Ô˜TÓ"ÐFÀ$ÐFr2   c               ó    € V ^8„  d   QhRRRR/# )r*   rß   r   r-   úlist[dict[str, Any]]r.   )r/   s   "r0   r1   r1   A  s   € ÷ ,ñ , sð ,Ð/Cñ ,r2   c                ó¾   € \        V \        4      '       d*   \        \        V 4       Uu. uF  q'       g   K  VNK  	  up# \	        V 4      pV'       d   R V/.# . # u upi )r~   )rÛ   rç   ré   r  rë   )rß   Úpr~   s   &  r0   Ú_extract_multimodal_partsr  A  sV   € Ü�'œ4× Ò ÜÔ/°Ô9Ó?Ñ9�a»Q—�Ñ9Ñ?Ð?Ü" 7Ó+€Dß#ˆV�TˆNÐÐ+¨Ð+ùò @s
   ©	A·Ac               ó    € V ^8„  d   QhRRRR/# )r*   Ú	tool_callrí   r-   r^   r.   )r/   s   "r0   r1   r1   H  s   € ÷ 9ñ 9¨.ð 9¸]ñ 9r2   c                ó€  € V P                  R4      ;'       g    / p\        V\        4      '       d+   VP                  R4      ;'       g    VP                  R4      MRp\        V\        4      '       d+   VP                  R4      ;'       g    VP                  R4      p\        V\        4      '       d   V'       d   V# R# )z_Replayed Gemini thoughtSignature from ``extra_content`` (``google.thought_signature`` or flat).Úextra_contentÚgoogleÚthought_signatureNÚthoughtSignature)r–   rÛ   rÜ   r,   )r	  ÚextraÚsigs   &  r0   Ú_tool_call_extra_signaturer  H  s‘   € à�M‰M˜/Ó*×0Ð0¨b€EÜEOÐPUÔW[×E\ÒE\ˆ5�9‰9�XÓ×@Ð@ %§)¡)Ð,?Ó"@øÐbf€CÜ�#”t×ÒØ�g‰gÐ)Ó*×IÐI¨c¯g©gÐ6HÓ.IˆÜ˜S¤#×&Ò&¯3ˆ3Ð8°DÐ8r2   c               ó    € V ^8„  d   QhRRRR/# )r*   r	  rí   r-   r,   r.   )r/   s   "r0   r1   r1   Q  s   € ÷ Fñ F˜^ð F°ñ Fr2   c                ó|   € \        V P                  R 4      ;'       g    V P                  R4      ;'       g    R4      # )ÚidÚcall_idr4   )r,   r–   )r	  s   &r0   Ú_tool_call_idr  Q  s/   € Üˆy�}‰}˜TÓ"×DÐD i§m¡m°IÓ&>×DÐDÀ"ÓEÐEr2   Fc               ó$   € V ^8„  d   QhRRRRRR/# )r*   r	  rí   Úinclude_idsr>   r-   r.   )r/   s   "r0   r1   r1   U  s'   € ÷ 
pñ 
p¨nð 
pÈ4ð 
pÐ\jñ 
pr2   c                ó  € V P                  R 4      ;'       g    / pVP                  RR4      p \        V\        4      '       d   V'       d   \        P                  ! V4      M/ pR\        VP                  R4      ;'       g    R4      R\        V\        4      '       d   TMRV//pV'       d   \        V 4      ;p'       d   WeR&   RTR	\        V 4      ;'       g    \        /#   \        P
                   d    RT/p L™i ; i)
ÚfunctionÚ	argumentsr4   Ú_rawr9   ÚargsÚ_valuer  ÚfunctionCallr  )
r–   rÛ   r,   r‰   ÚloadsÚJSONDecodeErrorrÜ   r  r  Ú_SKIP_SIGNATURE)r	  r  ÚfnÚargs_rawr  Úcallr  s   &&     r0   Ú_translate_tool_call_to_geminir&  U  sâ   € Ø	�‰�zÓ	"×	(Ð	( b€BØ�v‰v�k 2Ó&€Hð"Ü'1°(¼C×'@Ò'@ÇXŒt�zŠz˜(Ô#ÐSUˆð #¤C¨¯©¨v«×(<Ð(<¸"Ó$=¸vÌzÐZ^Ô`d×OeÒOeÁtÐltÐvzÐk{Ð|€Dß¤=°Ó#;Ð;˜Ö;ØˆT‰
Ø˜DÐ"4Ô6PÐQZÓ6[×6nÐ6nÔ_nÐoÐoøô ×Ñô "Ø˜Ð!Šð"ús   ¯C# ÁC# Ã#C?Ã>C?c               ó    € V ^8„  d   QhRRRR/# )r*   Únoder   r-   r>   r.   )r/   s   "r0   r1   r1   b  s   € ÷ Zñ Z #ð Z¨$ñ Zr2   c                óf  € \        V \        4      '       dQ   \        ;QJ d*    R V P                  4        4       F  '       g   K   R# 	  R# ! R V P                  4        4       4      # \        V \        4      ;'       d5    \        ;QJ d    R V  4       F  '       g   K   R# 	  R# ! R V  4       4      # )ak  True if a parsed value contains a JSON-Schema ``$ref`` pointer (``#/...``): Gemini 3 resolves
``$ref``/``$defs`` inside functionResponse.response and rejects unknown pointers with HTTP 400, so a
tool result that is itself a JSON Schema (e.g. ``tool_describe`` output) is forwarded as opaque text.
False positives only lose the structured shape, never the content.c              3  ó¸   "  € T FP  w  rVR 8H  ;'       d2    \        V\        4      ;'       d    VP                  R4      ;'       g    \        V4      x € KR  	  R# 5i)z$refz#/N)rÛ   r,   r7   Ú_looks_like_json_schema)rã   r    r¡   s   &  r0   rå   Ú*_looks_like_json_schema.<locals>.<genexpr>h  sW   é € ð  Gñ  zFÑquÐqr�A˜‘K×MÐM¤J¨q´#Ó$6×MÐM¸1¿<¹<ÈÓ;M×lÐlÔRiÐjkÓRlÔló  zFùs   ‚A•A­AÁATFc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irÊ   )r+  )rã   rØ   s   & r0   rå   r,  i  s   é € Ð)YÑTXÈDÔ*AÀ$×*GÐ*GÓTXùs   ‚)rÛ   rÜ   Úanyr•   rç   )r(  s   &r0   r+  r+  b  s¸   € ô
 �$œ×Òß‹sñ  GÐy}÷  zDñ  zDô  zFó  G�sŒsð  	GŠsð  	Gˆsñ  GÐy}÷  zDñ  zDô  zFó  Gó  Gð  	GÜ�dœDÓ!×YÐY§c£cÑ)YÑTXÓ)Y§c¤cÐY¢cÐY cÑ)YÑTXÓ)YÓ&YÐYr2   Ú
is_gemini3c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r*   rÄ   rí   Útool_name_by_call_idúOptional[dict[str, str]]r  r>   r/  r-   r.   )r/   s   "r0   r1   r1   l  s8   € ÷ 3ñ 3Øð3Ø3Kð3Øaeð3ð Cð3àñ3r2   c               óü  € \        V P                  R 4      ;'       g    R4      p\        T;'       g    / P                  V4      ;'       g&    V P                  R4      ;'       g    T;'       g    R4      pV P                  R4      p\        V4      p VP                  4       P	                  R4      '       d   \
        P                  ! V4      MRp\        V\        4      ;'       d    \        V4      '       * p	RTRV	'       d   TMRV//p
V'       d   V'       d   WJR&   V'       d%   \        V4       Uu. uF  pR	V9   g   K  VNK  	  upM. ;p'       d   WÊR
&   RV
/#   \
        P                   d    Rp L¥i ; iu upi )Útool_call_idr4   r9   Útoolrß   Nr¥   Úoutputr  ró   r}   ÚfunctionResponse)Ú{Ú[)r,   r–   rë   r5   r7   r‰   r   r!  rÛ   rÜ   r+  r  )rÄ   r1  r  r/  r4  r9   Úraw_contentrß   ÚparsedÚ
structuredÚfunction_responser  Úimage_partss   &&&$         r0   Ú _translate_tool_result_to_geminir?  l  sR  € ô �w—{‘{ >Ó2×8Ð8°bÓ9€Lô Ð$×*Ð*¨×/Ñ/°Ó=×nÐnÀÇÁÈVÓAT×nÐnÐXd×nÐnÐhnÓo€DØ—+‘+˜iÓ(€KÜ% kÓ2€GðØ(/¯©«×(BÑ(BÀ:×(NÒ(N”—’˜GÔ$ÐTXˆô ˜F¤DÓ)×QÐQÔ2IÈ&Ó2QÔ.Q€JØ)/°°zÏZÁ6Ð^fÐhoÐ]pÐ(qÐß—|Ø".˜$ÑçblÔ";¸KÔ"HÓ^Ñ"H˜QÈLÐ\]ÑL]—q�qÑ"HÒ^ÐrtÐt€{ÖtØ%0˜'Ñ"ØÐ 1Ð2Ð2øô ×Ñô ØŠðüò _s   Â=E Ä3	E9ÅE9ÅE6Å5E6c               ó    € V ^8„  d   QhRRRR/# )r*   rß   rí   r-   r>   r.   )r/   s   "r0   r1   r1   ‡  s   € ÷ kñ k Nð k°tñ kr2   c                óª   € \         ;QJ d,    R  V P                  R. 4       4       F  '       g   K   R# 	  R# ! R  V P                  R. 4       4       4      # )c              3  ó\   "  € T F"  p\        V\        4      ;'       d    R V9   x € K$  	  R# 5i)r7  N©rÛ   rÜ   ©rã   Úparts   & r0   rå   Ú)_has_function_response.<locals>.<genexpr>ˆ  s*   é € ÐjÑQiÈŒz˜$¤Ó%×DÐDÐ*<ÀÑ*DÔDÓQiùs   ‚,ž,r}   TF)r.  r–   rê   s   &r0   Ú_has_function_responserG  ‡  sK   € ß‹3ÑjÐQX×Q\ÑQ\Ð]dÐfhÔQiÓj�3Œ3ÐjŠ3Ðjˆ3ÑjÐQX×Q\ÑQ\Ð]dÐfhÔQiÓjÓjÐjr2   c               ó    € V ^8„  d   QhRRRR/# )r*   rz   r  r-   r.   )r/   s   "r0   r1   r1   ‹  s   € ÷ ñ Ð!5ð Ð:Nñ r2   c                óœ  € . pV  FÃ  pV'       d
   VR,          MRpVRJ;'       d    VR,          VR,          8H  pV'       dF   VR,          R8X  d8   \        V4      \        V4      8w  d   RpVP                  RRRR\        /./4       V'       d)   VR,          R,          P                  VR,          4       K²  VP                  V4       KÅ  	  V# )	u  Alternation contract for generateContent: 1) adjacent same-role contents merge (else HTTP 400
"multiturn requests [must] alternate"); 2) EXCEPT never fuse a human user text turn into a preceding
user content that only carries functionResponse parts (or vice versa) â€” Gemini 3 accepts the fold but
reads the text as a continuation of the tool result and returns an empty candidate (parallel
functionResponse + functionResponse still merge); 3) the split pair stays API-valid via an interposed
placeholder model turn.Nr{   r|   Fr+   r}   r~   rc   )rG  ÚappendÚ!_INTERRUPTED_RESPONSE_PLACEHOLDERÚextend)rz   Úmergedrß   ÚprevÚ	same_roles   &    r0   Ú_merge_alternatingrP  ‹  s¸   € ð $&€Fó ˆß#ˆv�bŽz¨ˆØ Ð$×HÐH¨¨f­¸À½Ñ)Hˆ	ß˜ �¨FÔ2Ô7MÈdÓ7SÔWmÐnuÓWvÔ7vØˆIØ�M‰M˜6 7¨G°vÔ?`Ð6aÐ5bÐcÔdßØ�2�J�wÕ×&Ñ& w¨wÕ'7Ö8à�M‰M˜'Ö"ñ ð €Mr2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r*   Úmessagesr  Úinclude_tool_call_idsr>   r/  r-   z5tuple[list[dict[str, Any]], Optional[dict[str, Any]]]r.   )r/   s   "r0   r1   r1   «  s2   € ÷  }ñ  }Ø"ð }Ø;?ð }ØX\ð }à:ñ }r2   c          	     ó`  € . p. p/ pV  EFÝ  p\        V\        4      '       g   K  \        VP                  R 4      ;'       g    R4      pVR8X  d,   VP	                  \        VP                  R4      4      4       Kr  VR9   d&   \        WeWR7      pVP	                  R RRV./4       Kž  \        VP                  R4      4      p	VP                  R4      ;'       g    . p
\        V
\        4      '       d
   R V
 4       MR Fz  p\        VP                  R4      ;'       g    / P                  R	4      ;'       g    R
4      p\        V4      ;p'       d   V'       d   WÅV&   V	P	                  \        W±R7      4       K|  	  VR8X  d<   V	'       d4   RV	R,          9  d&   \        V4      ;p'       d   / V	R,          CRV/CV	R&   V	'       g   EK¿  TP	                  R VR8X  d   RMRRV	/4       EKà  	  RP                  R V 4       4      P                  4       p\        V4      V'       d   R RRRV/./3# R3# )r{   r|   Úsystemrß   r  )r/  r}   Ú
tool_callsc              3  óV   "  € T F  p\        V\        4      '       g   K  Vx € K!  	  R # 5irÊ   rC  )rã   Útcs   & r0   rå   Ú)_build_gemini_contents.<locals>.<genexpr>¾  s   é € ÐJ¡z ´ZÀÄD×5IŸ"š"£zùs   ‚)Ÿ
)r9   r4   )r  Ú	assistantr  r  r+   rá   c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irÊ   r.   rD  s   & r0   rå   rY  Ê  s   é € ÐIÑ/@ tÃDŸdšdÓ/@ùs   ‚	�
r~   N>   r5  r  r.   rc   )rÛ   rÜ   r,   r–   rJ  rë   r?  r  rç   r  r&  r  rè   r5   rP  )rR  rS  r/  Úsystem_text_partsrz   r1  r»   r{   rE  r}   rV  r	  Ú	tool_namer  r  Újoined_systems   &&$             r0   Ú_build_gemini_contentsr_  «  sý  € ð $&ÐØ%'€HØ+-ÐÜˆÜ˜#œt×$Ò$ÙÜ�3—7‘7˜6“?×,Ð, fÓ-ˆØ�8ÔØ×$Ñ$Ô%<¸S¿W¹WÀYÓ=OÓ%PÔQÙØÐ'Ô'Ü3°CÐOdÔ|ˆDØ�O‰O˜V V¨W°t°fÐ=Ô>ÙÜ)¨#¯'©'°)Ó*<Ó=ˆØ—W‘W˜\Ó*×0Ð0¨bˆ
ÜNXÐYcÔei×NjÒNjÑJ¡zÔJÐprÒrˆIÜ˜YŸ]™]¨:Ó6×<Ð<¸"×AÑAÀ&ÓI×OÐOÈRÓPˆIÜ(¨Ó3Ð3�Ö3¿Ø09 WÑ-Ø�L‰LÔ7¸	ÔeÖfñ	 sð �;Ô§5¨^À5ÈÅ9Ô-LÜ1°#Ó6Ð6�Ö6Ø>˜5 �9Ð>Ð&8¸#Ñ>ˆE�"‰IßŠ5Ø�O‰O˜V°¸Ô0C¡WÈÐQXÐZ_Ð`×añ1 ð2 —I‘IÑIÑ/@ÓIÓI×OÑOÓQ€MÜ˜hÓ'×dq¨6°8¸WÈÐP]ÐG^ÐF_Ð*`Ð|Ð|Ðw{Ð|Ð|r2   Újson_schemac               ó$   € V ^8„  d   QhRRRRRR/# )r*   r5  r   r`  r>   r-   rÇ   r.   )r/   s   "r0   r1   r1   Î  s"   € ÷ ñ  ð °Tð ÐF^ñ r2   c               óL  € \        V \        4      '       d   V P                  R 4      ;'       g    / MRp\        V\        4      '       d5   \        VP                  R4      \        4      '       d   VR,          '       g   R# RVR,          /p\        VP                  R4      \        4      '       d   VR,          '       d   VR,          VR&   \        VP                  R4      \        4      '       d5   V'       d   \	        VR,          4      VR&   V# \        VR,          4      VR&   V# )r  Nr9   ÚdescriptionÚ
parametersÚparametersJsonSchema)rÛ   rÜ   r–   r,   r   r   )r5  r`  r#  Údecls   &$  r0   Ú_function_declarationrg  Î  sã   € Ü)3°D¼$×)?Ò)?ˆ$�(‰(�:Ó
×
$Ð
$ "øÀT€BÜ�bœ$×Ò¬
°2·6±6¸&³>Ä3×(GÒ(GÈBÈvÏJÌJÙØ" B v¥JÐ/€DÜ�"—&‘&˜Ó'¬×-Ò-°"°]×2CÔ2CØ  Õ/ˆˆ]ÑÜ�"—&‘&˜Ó&¬×-Ò-÷ Ü+IÈ"È\ÕJZÓ+[ˆDÐ'Ñ(ð €Kô "AÀÀLÕAQÓ!RˆD�ÑØ€Kr2   c               ó$   € V ^8„  d   QhRRRRRR/# )r*   Útoolsr   r`  r>   r-   r  r.   )r/   s   "r0   r1   r1   ß  s'   € ÷ Lñ L cð L¸4ð LÐL`ñ Lr2   c               ó¦   a€ V3R  l\        V \        4      '       d   T M.  4        Uu. uF  pV'       g   K  VNK  	  ppV'       d   RV/.# . # u upi )c              3  ó>   <"  € T F  p\        VSR 7      x € K  	  R# 5i)©r`  N)rg  )rã   rä   r`  s   & €r0   rå   Ú-_translate_tools_to_gemini.<locals>.<genexpr>à  s#   øé € ð  UÙ*R Aô !6°aÀ[× QÑ QÛ*Rùs   ƒÚfunctionDeclarations)rÛ   rç   )ri  r`  ÚdÚdeclarationss   &d  r0   Ú_translate_tools_to_geminirq  ß  sg   ø€ ô UÜ3=¸eÄT×3JÒ3J©%ÐPRÐ*Rô Uó [ñ  U˜!ÜXY÷ �Añ  U€Lð [ç7CÐ# \Ð2Ð3ÐKÈÐKùò[s
   ¨
A·Ac               ó    € V ^8„  d   QhRRRR/# )r*   Útool_choicer   r-   rÇ   r.   )r/   s   "r0   r1   r1   å  s   € ÷ Bñ B°#ð BÐ:Rñ Br2   c                ó<  € \        V \        4      '       d   V \        9   d   R R\        V ,          //# \        V \        4      '       d+   V P	                  R4      ;'       g    / P	                  R4      MRp\        V\        4      '       d   V'       d
   R RRRV.//# R# )ÚfunctionCallingConfigÚmoder  r9   Nr   ÚallowedFunctionNames)rÛ   r,   Ú_TOOL_CHOICE_MODESrÜ   r–   )rs  r9   s   & r0   Ú _translate_tool_choice_to_geminiry  å  s—   € Ü�+œs×#Ò#¨Ô7IÔ(IØ'¨&Ô2DÀ[Õ2QÐ)RÐSÐSÜ>HÈÔVZ×>[Ò>[ˆK�O‰O˜JÓ'×-Ð-¨2×2Ñ2°6Ô:Ðae€DÜYcÐdhÔjm×YnÒYn×swÐ# f¨eÐ5KÈdÈVÐ%TÐUð  Bð  ~Bð  Br2   ÚthinkingBudgetÚthinking_budgetÚincludeThoughtsÚinclude_thoughtsc                ó   € V # rÊ   r.   ©r¡   s   &r0   Ú<lambda>r€  ï  s   € ¹Ar2   ÚthinkingLevelÚthinking_levelc                ó>   € V P                  4       P                  4       # rÊ   )r5   r6   r  s   &r0   r€  r€  ð  s   € °q·w±w³y·±Ô7Hr2   c               ó    € V ^8„  d   QhRRRR/# )r*   Úconfigr   r-   rÇ   r.   )r/   s   "r0   r1   r1   ô  s   € ÷ ñ  sð Ð/Gñ r2   c                óÞ  € \        V \        4      '       g   R # \         UUUu/ uF'  w  r q1V P                  WP                  V4      4      bK)  	  pppp\         UUUUu/ uFj  w  rrV\        WA,          V4      '       g   K   \        WA,          \        4      '       d    WA,          P                  4       '       g   KZ  M W! WA,          4      bKl  	  pppppT;'       g    R # u upppi u uppppi rÊ   )rÛ   rÜ   Ú_THINKING_KEYSr–   r,   r5   )r…  r‡   ÚaliasÚ_ÚvaluesÚtypesÚnormr[   s   &       r0   Ú_normalize_thinking_configr�  ô  sÅ   € Ü�fœd×#Ò#ÙÝN\Õ]ÉnÑ:J¸#ÀaÈ�6—:‘:˜c§:¡:¨eÓ#4Ó5Ò5Én€FÒ]ÝDRö yÁNÑ-@¨S°UÜ ¥¨U×3ô )ÜPZÐ[aÕ[fÔhk×PlÒPl¸½×9JÑ9J×9Lô )Ø9LÐrvð �t˜F�KÓ(Ò(ÁN€Jó yà×Ð˜Ðùô ^ùõys   £-C ÁC'
Â5C'
Â;C'
c               ó    € V ^8„  d   QhRRRR/# )r*   Úthinking_configr   r-   r>   r.   )r/   s   "r0   r1   r1   ý  s   € ÷ `ñ `¸ð `Àñ `r2   c                ó  € \        V 4      ;'       g    / pVP                  R4      RJ d   R# VP                  R4      pRV9   p\        V4      ;'       d2    \        V\        4      ;'       d    V^ 8*  ;'       d    V'       * '       * # )zÖTrue when Gemini will spend output tokens on thinking: thought tokens bill against ``maxOutputTokens``,
so a global 4096/16384 cap can be consumed entirely by high thinking (``finishReason=MAX_TOKENS``, no answer).r|  Frz  r�  )r�  r–   r>   rÛ   rK   )r�  r[   ÚbudgetÚ	has_levels   &   r0   Ú"_thinking_requests_output_headroomr“  ý  s{   € ô ,¨OÓ<×BÐBÀ€JØ‡~�~Ð'Ó(¨EÓ1ñ
 Ø�^‰^Ð,Ó-€FØ :Ñ-€IÜ�
Ó×_Ð_¤Z°¼Ó%<×%^Ð%^ÀÈ1Á×%^Ð%^ÐU^ÔQ^Ô _Ð_r2   c               ó$   € V ^8„  d   QhRRRRRR/# )r*   Ú
max_tokensrÅ   r�  r   r-   rK   r.   )r/   s   "r0   r1   r1     s#   € ÷ 
ñ 
°Mð 
ÐTWð 
Ð\_ñ 
r2   c                ó    €  \        V 4      pV^ 8:  g   \        V4      '       d   \	        V\
        4      # V#   \        \        3 d    ^ p L?i ; i)zçNative ``maxOutputTokens``: an omitted/invalid cap becomes the published ceiling (Gemini
truncates on its low internal default); an explicit cap is raised to the ceiling when
thinking is enabled so thoughts don't starve the answer.)rK   r—   r˜   r“  ÚmaxÚ GEMINI_DEFAULT_MAX_OUTPUT_TOKENS)r•  r�  Ú	requesteds   && r0   Ú#_effective_gemini_max_output_tokensrš    sS   € ðÜ˜
“Oˆ	ð �A„~Ô;¸O×LÒLÜ�9Ô>Ó?Ð?ØÐøô	 ”zÐ"ô ØŠ	ðús   ‚7 ·AÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r*   Úresponse_formatr   r`  r>   r-   rí   r.   )r/   s   "r0   r1   r1     s'   € ÷ Gñ G°ð GÀTð GÐVdñ Gr2   c               ó€  € \        V \        4      '       d   V P                  R4      R	9  d   / # V P                  R4      R8X  d   V P                  R4      MRp\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   RR/# V'       d	   R\        3MR\        3w  rERRWE! V4      /# )
uN  OpenAI ``response_format`` â†’ Gemini ``generationConfig`` JSON-output keys.

Full-JSON-Schema ``responseJsonSchema`` exists only on the generativelanguage ``v1beta``
surface (same gate as ``parametersJsonSchema``); ``v1`` / ``v1alpha``, Vertex express
``v1beta1`` and unknown proxies take the OpenAPI-subset ``responseSchema`` path.
rÚ   r`  NÚschemaÚresponseMimeTyperƒ   ÚresponseJsonSchemaÚresponseSchema)Újson_objectr`  )rÛ   rÜ   r–   r   r   )rœ  r`  Úspecrž  r‡   Úpreps   &$    r0   Ú_translate_response_formatr¥    s»   € ô �o¤t×,Ò,°×0CÑ0CÀFÓ0KÐSqÔ0qØˆ	Ø1@×1DÑ1DÀVÓ1LÐP]Ô1]ˆ?×Ñ˜}Ô-Ðcg€Dô $.¨d´D×#9Ò#9ˆT�X‰X�hÔ¸t€FÜ�fœd×#Ò#Ø"Ð$6Ð7Ð7ßJUÐ%Ô'EÑFÐ\lô  oNð  \O�I€CØÐ 2°C¸¸f»ÐFÐFr2   ri  rs  Útemperaturer•  Útop_pr�  rœ  Útools_as_json_schemac               óH   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRRRRRRRR/# )r*   rR  r  ri  r   rs  r¦  rÆ   r•  rÅ   r§  r   r�  rœ  r+   r,   r¨  r>   r-   rí   r.   )r/   s   "r0   r1   r1   ,  sv   € ÷ ñ Ø%ðØ.1ðØGJðØ`oðàðà-<ðàKNðàhkðð ðð ),ðð IMðð ñ	r2   c                óÂ  € \        V	4      p\        WVR 7      w  rÍ\        WR7      p\        V4      pRV3RV3RV33pRV/V UUu/ uF  w  ppV'       g   K  VVbK  	  uppCpRV3R\	        WG4      3RV3R	V'       d%   \        V\        4      '       d   TM\        V4      .MR
3R\        V4      33p\        WŠR7      pT;'       g    / P                  R/ 4      P                  R4      R8H  pV'       d;   V'       g   V'       d+   V'       g#   \        P                  RV'       d   RMR4       / p/ V UUu/ uF  w  ppVf   K  VVbK  	  uppCVCVR&   V# u uppi u uppi ))rS  r/  rl  ÚsystemInstructionri  Ú
toolConfigrz   r¦  r�   ÚtopPÚstopSequencesNÚthinkingConfigru  rv  r   u,   Gemini: dropping JSON response_format â€” %sz.tool_choice forces function calling (mode ANY)zpre-Gemini-3 model with toolsr€   )rF   r_  rq  ry  rš  rÛ   rç   r,   r�  r¥  r–   r“   r”   )rR  ri  rs  r¦  r•  r§  r   r�  rœ  r+   r¨  r/  rz   Úsystem_instructionÚgemini_toolsÚtool_configÚoptionalr    r¡   ÚrequestÚ
generationÚjson_outputÚforced_calls   $$$$$$$$$$$            r0   Úbuild_gemini_requestr¸  ,  sx  € ô /¨uÓ5€JÜ#9¸(Ðq{Ô#|Ñ €HÜ-¨eÔV€LÜ2°;Ó?€KØ$Ð&8Ð9¸GÀ\Ð;RÐUaÐcnÐToÐp€HØ)¨8ÐXÉÔ7WÉÁÀÀAÔUV¼¸¸1ºÉÒ7WÐX€Gð 
˜Ð$Ð'8Ô:]Ð^hÓ:zÐ&{Ø	�ˆ˜/×`d´J¸tÄT×4JÒ4J©DÔQTÐUYÓQZÑP[ÐjnÐoØ	Ô5°oÓFÐGð€Jô
 -¨_Ô_€Kð ×$Ð$ "×)Ñ)Ð*AÀ2ÓF×JÑJÈ6ÓRÐV[Ñ[€KßŸ¯¿ZÜ�‰ÐCßITÑEÐZyô	{àˆØ"c±zÔ%S±z©t¨q°!ÀQ¤d a¨¢d±zÒ%SÐ"cÐWbÐ"c€GÐÑØ€Nùó' 8Xùó$ &Ts   ÁEÁEÄ4	EÅEc               ó    € V ^8„  d   QhRRRR/# ©r*   rE  rí   r-   rÇ   r.   )r/   s   "r0   r1   r1   N  s   € ÷ \ñ \ ^ð \Ð8Pñ \r2   c                óp   € V P                  R 4      p\        V\        4      '       d   V'       d   RRV//# R# )r  r  r  N©r–   rÛ   r,   ©rE  r  s   & r0   Ú_tool_call_extra_from_partr¾  N  s6   € Ø
�(‰(Ð%Ó
&€CÜ5?ÀÄS×5IÒ5IÏcˆHÐ*¨CÐ0Ð1Ð[ÐW[Ð[r2   c               ó    € V ^8„  d   QhRRRR/# )r*   Úfcrí   r-   r^   r.   )r/   s   "r0   r1   r1   S  s   € ÷ ?ñ ?˜.ð ?¨]ñ ?r2   c                óh   € V P                  R 4      p\        V\        4      '       d   V'       d   V# R# )r  Nr¼  )rÀ  Úfc_ids   & r0   Ú_provider_call_idrÃ  S  s(   € Ø�F‰F�4‹L€EÜ˜u¤c×*Ò*¯uˆ5Ð>¸$Ð>r2   c               ó    € V ^8„  d   QhRRRR/# )r*   rÀ  rí   r-   r,   r.   )r/   s   "r0   r1   r1   X  s   € ÷ Dñ D�^ð D¨ñ Dr2   c                óz   € \        V 4      ;'       g*    R\        P                  ! 4       P                  R,           2# )zOEcho the functionCall/delta ``id`` when present, else mint an OpenAI-style one.Úcall_ºNé   N)rÃ  ÚuuidÚuuid4Úhex)rÀ  s   &r0   Ú_new_call_idrÌ  X  s.   € ä˜RÓ ×CÐC e¬D¯JªJ«L×,<Ñ,<¸SÕ,AÐ+BÐ$CÐCr2   c               ó$   € V ^8„  d   QhRRRRRR/# )r*   rÀ  rí   Úkwargsr   r-   r,   r.   )r/   s   "r0   r1   r1   ]  s!   € ÷ ñ ˜ð °#ð ¸#ñ r2   c                ó˜   €  \         P                  ! V P                  R 4      ;'       g    / 3RR/VB #   \        \        3 d     R# i ; i)r  Úensure_asciiFz{})r‰   Údumpsr–   r—   r˜   )rÀ  rÎ  s   &,r0   Ú_dump_call_argsrÒ  ]  sG   € ðÜ�zŠz˜"Ÿ&™& ›.×.Ð.¨BÑM¸UÐMÀfÑMÐMøÜ”zÐ"ô Úðús   ‚'4 ª	4 ´A	ÁA	c               ó    € V ^8„  d   QhRRRR/# )r*   Ú
usage_metarí   r-   r   r.   )r/   s   "r0   r1   r1   d  s   € ÷ ñ  ^ð ¸ñ r2   c                óæ   a € V 3R lpV! R4      pRS 9   d   RV! R4      RV! R4      /M/ p\        RRV! R4      R	V! R
4      V,           RV! R4      R\        V! R4      R7      R\        VR7      /VB # )uH  Gemini ``usageMetadata`` â†’ OpenAI-shaped usage.

Hidden thinking is reported separately in ``thoughtsTokenCount``:
``candidatesTokenCount`` counts visible output only, while ``totalTokenCount``
already includes thoughts. OpenAI's ``completion_tokens`` covers reasoning, so
thoughts are folded in (otherwise a thinking turn bills a few percent of its
real output and ``prompt + completion != total``) and also surfaced under
``completion_tokens_details.reasoning_tokens``, where ``normalize_usage`` reads
them. Absent on non-thinking/older responses, which keeps their numbers as-is.c                óL   <€ \        SP                  V 4      ;'       g    ^ 4      # )rB   )rK   r–   )r‡   rÔ  s   &€r0   r€  Ú&_usage_from_metadata.<locals>.<lambda>n  s   ø€ œ˜JŸN™N¨3Ó/×4Ð4°1Ô5r2   ÚthoughtsTokenCountÚinitialPromptTokenCountÚinitial_prompt_tokensÚinitial_cached_tokensÚinitialCachedContentTokenCountÚprompt_tokensÚpromptTokenCountÚcompletion_tokensÚcandidatesTokenCountÚtotal_tokensÚtotalTokenCountÚprompt_tokens_detailsÚcachedContentTokenCount)Úcached_tokensÚcompletion_tokens_details)Úreasoning_tokensr.   r   )rÔ  Úcountrç  Úinitials   f   r0   Ú_usage_from_metadatarê  d  sÆ   ø€ ô 6€EÙÐ1Ó2Ðð UnÐq{ÔT{ð '©Ð.GÓ(HØ&©Ð.NÓ(OñQð BDð äñ ÙÐ.Ó/ðÙCHÐI_ÓC`ÐcsÕCsðáÐ,Ó-ðäETÑchð  jCó  dDô  FEðô #2ÐCSÔ"Tðð Y`ñð r2   c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r*   r+   r,   Úobject_Úchoicer   Úusager   ÚclsrÚ   r-   r.   )r/   s   "r0   r1   r1   z  s8   € ÷ .ñ .�Sð . 3ð .°ð .Èð .ÐRVð .Ðmpñ .r2   c           	     ó¦   € V! R\         P                  ! 4       P                  R,           2V\        \        P                  ! 4       4      V V.VR7      # )zJOpenAI chat.completion / chat.completion.chunk envelope around one choice.z	chatcmpl-rÇ  )r  ÚobjectÚcreatedr+   Úchoicesrî  )rÉ  rÊ  rË  rK   Útime)r+   rì  rí  rî  rï  s   &&&&&r0   Ú	_enveloperõ  z  sG   € á�IœdŸjšj›l×.Ñ.¨sÕ3Ð4Ð5¸gÌsÔSW×S\ÒS\ÓS^ÓO_ÐglØ�x uô.ð .r2   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r*   r9   r,   r  ÚindexrK   r  r  r   r-   r   r.   )r/   s   "r0   r1   r1   €  s@   € ÷ Hñ H˜ð H¨ð H°Cð HÀ#ð HÐVYð HÐ^mñ Hr2   c                ót   € \        V\        4      '       d   RV/M/ p\        RRVRRRVR\        WR7      /VB # )zKOpenAI-shaped tool call; ``extra_content`` attached only when it is a dict.r  r  rÚ   r  r÷  )r9   r  r.   )rÛ   rÜ   r   )r9   r  r÷  r  r  r  s   &&&&& r0   Ú_tool_call_nsrù  €  s]   € ä0:¸=Ì$×0OÒ0Oˆ_˜mÑ,ÐUW€EÜñ  H˜gð  H¨Jð  H¸eð  HÌoÐcgÔN}ð  Hð  BGñ  Hð  Hr2   c               ó    € V ^8„  d   QhRRRR/# )r*   rE  rí   r-   ztuple[Optional[str], bool]r.   )r/   s   "r0   r1   r1   †  s   € ÷ [ñ [�^ð [Ð(Bñ [r2   c                ó|   € V P                  R4      p\        V\        4      '       d   WP                  R4      RJ 3# R# )zW``(text, is_thought)`` for a candidate part; ``(None, False)`` when it carries no text.r~   ÚthoughtT©NFr¼  )rE  r~   s   & r0   Ú
_part_textrþ  †  s8   € à�8‰8�FÓ€DÜ2<¸TÄ3×2GÒ2GˆD—(‘(˜9Ó%¨Ð-Ð.ÐZÈ]ÐZr2   c               ó    € V ^8„  d   QhRRRR/# )r*   rE  rí   r-   r^   r.   )r/   s   "r0   r1   r1   Œ  s   € ÷ Xñ X˜~ð X°-ñ Xr2   c                óv   € V P                  R4      p\        V\        4      '       d   V'       d
   RV 9  d   V# R# )a  ``thoughtSignature`` on a non-functionCall part (a text turn's last part; in streams an empty-text
part). Replay is optional, but the server rehydrates the turn's thoughts from it (live: 31 -> 237
prompt tokens), so it is kept as the message-level ``extra_content`` signature.r  r  Nr¼  r½  s   & r0   Ú_text_part_signaturer  Œ  s4   € ð �(‰(Ð%Ó
&€CÜ˜S¤#×&Ò&¯3°>ÈÔ3Mˆ3ÐWÐSWÐWr2   c               ó    € V ^8„  d   QhRRRR/# rº  r.   )r/   s   "r0   r1   r1   ”  s   € ÷ Cñ C˜nð CÐ1Iñ Cr2   c                ó†   € V P                  R 4      p\        V\        4      '       d   VP                  R4      '       d   V# R# )r  r9   N)r–   rÛ   rÜ   )rE  rÀ  s   & r0   Ú_part_function_callr  ”  s3   € Ø	�‰�.Ó	!€BÜ˜B¤×%Ò%¨"¯&©&°¯.ª.ˆ2ÐB¸dÐBr2   c               ó$   € V ^8„  d   QhRRRRRR/# )r*   rž   rí   r+   r,   r-   r   r.   )r/   s   "r0   r1   r1   ™  s&   € ÷ ~ñ ~ Nð ~¸3ð ~À?ñ ~r2   c                ó   € V P                  R 4      ;'       g    . pR;r4\        V\        4      '       dk   V'       dc   \        V^ ,          \        4      '       d
   V^ ,          M/ pVP                  R4      p\        V\        4      '       d   VP                  R4      M. pR. R. /p. pRp\	        T;'       g    . 4       Fº  w  rš\        V
\        4      '       g   K  \        V
4      w  r¼Ve/   Wl,          P                  V4       \        V
4      ;'       g    TpK\  \        V
4      ;p'       g   Kq  VP                  \        \        VR,          4      \        V4      V	\        V4      \        V
4      4      4       K¼  	  V'       d   RMO\        P                  \        T;'       g    / P                  R4      ;'       g    R	4      P                  4       R
4      p\!        Ve   V P                  R4      ;'       g    / M/ 4      pR	P#                  VR,          4      ;'       g    Rp\%        RVR,          '       d   R	P#                  VR,          4      MVf   R	MRT;'       g    RVVR\        RV/4      R7      p\'        VR\%        ^ VVR7      V4      # )Ú
candidatesNrß   r}   FTr9   rV  ÚfinishReasonr4   r   ÚusageMetadatarZ  r  )r{   rß   rV  Ú	reasoningÚreasoning_contentÚreasoning_detailsr  zchat.completion)r÷  rÄ   Úfinish_reason)r–   rÛ   rç   rÜ   Ú	enumeraterþ  rJ  r  r  rù  r,   rÒ  rÌ  r¾  Ú_FINISH_REASON_MAPr°   rê  rè   r   rõ  )rž   r+   r  Úcandr}   Úcontent_objÚpiecesrV  Útext_signaturer÷  rE  r~   Ú
is_thoughtrÀ  r  rî  r
  rÄ   s   &&                r0   Útranslate_gemini_responser  ™  sO  € Ø—‘˜,Ó'×-Ð-¨2€JØÐ€DÜ�*œd×#Ò#¯
Ü *¨:°a­=¼$× ?Ò ?ˆz˜!Ž}ÀRˆØ—h‘h˜yÓ)ˆÜ,6°{ÄD×,IÒ,I�—‘ Ô(ÈrˆØ%*¨B°°bÐ$9€FØ(*€JØ€NÜ  § ¨"Ö-‰ˆÜ˜$¤×%Ò%ÙÜ% dÓ+ÑˆØÒØÕ×%Ñ% dÔ+Ü1°$Ó7×IÐI¸>ŠNÜ& tÓ,Ð,ˆR×,Ð,Ø×Ñœm¬C°°6µ
«O¼_ÈRÓ=PÐRWÔYeÐfhÓYiô  lFð  GKó  lLó  Mö  Nñ .÷ %/‘LÔ4F×4JÑ4JÌ3ÐPT×PZÐPZÐXZ×O_ÑO_Ð`nÓOo×OuÐOuÐsuÓKv×K|ÑK|ÓK~ð  AGó  5H€MÜ ÀdÒFV $§(¡(¨?Ó";×"AÐ"A¸røÐ\^Ó_€EØ—‘˜˜t�Ó%×-Ð-¨€IÜ ;ÐRXÐY^×R_ÔR_¸¿¹ÀÀuÅÔ8NÐlpÒlxÑfhð  CØ)3×);Ð);°tÀyÐdmð  BFÜ,FÐHZÐ\jÐGkÓ,lôn€Gô �UÐ-¬ÀQÐPWÐgtÔ/uÐw|Ó}Ð}r2   c                  ó   € ] tR tRtRtR# )Ú_GeminiStreamChunkiµ  r.   N)rÐ   rÑ   rÒ   rÓ   rÕ   r.   r2   r0   r  r  µ  s   † «3r2   r  rß   Útool_call_deltar  r
  r  c               ó4   € V ^8„  d   QhRRRRRRRRRRR	RR
R/# )r*   r+   r,   rß   r  rÇ   r  r^   r
  r  r-   r  r.   )r/   s   "r0   r1   r1   ¸  sS   € ÷ [ñ [Øð[Øð[Ø7Oð[Øgtð[ð ILð[à!ð[ð ñ[r2   c                óš  € TpVf   R Mi\        VP                  R4      ;'       g    RVP                  R4      ;'       g    RVP                  R^ 4      \        V4      VP                  R4      4      .p\        RT;'       g    R Yt;'       g    R T;'       g    R \	        RV/4      R7      p\        ^ WƒR	7      p	\        V R
V	R \        R7      # )Nr9   r4   r  r÷  r  rZ  r  )r{   rß   rV  r
  r  r  )r÷  Údeltar  zchat.completion.chunk)rï  )rù  r–   rÌ  r   r¾  rõ  r  )
r+   rß   r  r  r
  r  ro  rV  r  rí  s
   $$$$$$    r0   Ú_make_stream_chunkr  ¸  sË   € ð 	€AØš‘Ü�a—e‘e˜F“m×)Ð) r¨1¯5©5°Ó+=×+CÐ+CÀÀQÇUÁUÈ7ÐTUÓEVÔXdÐefÓXgÐij×inÑinÐo~Óió  	Að)€Jô  °g·o°oÀÐR\×hyÐhyÐuyØ.7×.?Ð.?¸4Ü*DÐFXÐZhÐEiÓ*jôl€Eô  1¨EÔO€FÜ�UÐ3°V¸TÔGYÔZÐZr2   c               ó    € V ^8„  d   QhRRRR/# )r*   Úliner,   r-   r   r.   )r/   s   "r0   r1   r1   Ê  s   € ÷ :ñ :˜#ð : #ñ :r2   c                óV  € V P                  R4      p V P                  R4      '       g   R# V R,          ;pR8X  d   \        #  \        P                  ! V4      p\        T\        4      '       d   T# R#   \        P
                   d"    \        P                  RTR,          4        R# i ; i)uM   One SSE line â†’ payload dict, ``_SSE_DONE`` for the terminal frame, or None.Úzdata: N:rT   NNz[DONE]zNon-JSON Gemini SSE line: %s:NéÈ   N)
rd   r7   Ú	_SSE_DONEr‰   r   r!  r“   r”   rÛ   rÜ   )r  r÷   rœ   s   &  r0   Ú_parse_sse_liner#  Ê  s’   € à�;‰;�tÓ€DØ�?‰?˜8×$Ò$ÙØ�R•Ðˆ˜XÔ%ÜÐðÜ—*’*˜TÓ"ˆô ! ¬$×/Ò/ˆ7Ð9°TÐ9øô ×Ñô Ü�‰Ð3°T¸$µZÔ@Úðús   ÁA2 Á22B(Â'B(c               ó    € V ^8„  d   QhRRRR/# )r*   r¥   úhttpx.Responser-   zIterator[dict[str, Any]]r.   )r/   s   "r0   r1   r1   Ù  s   € ÷ ñ ˜~ð Ð2Jñ r2   c              #  ó8  "  € R pV P                  4        FT  pY;'       g    R ,          pRV9   g   K  VP                  R^4      w  r1\        V4      pV\        J d    R# Vf   K;  Vx € KA  	  V'       d$   \        V4      pVe   V\        Jd   Vx € R# R# R# R# 5i)r4   rá   N)Ú	iter_textrø   r#  r"  )r¥   ÚbufferÚchunkr  rœ   s   &    r0   Ú_iter_sse_eventsr*  Ù  s’   é € Ø€FØ×#Ñ#Ö%ˆØ—+�+˜2ÕˆØ�fŽnØ!Ÿ<™<¨¨aÓ0‰LˆDÜ% dÓ+ˆGØœ)Ó#ÚØÔ"Ø”ñ &÷ Ü! &Ó)ˆØÒ 7´)Ó#;ØŒMñ $<Ññ ùs   ‚B¡B³-BÁ%BÁ5%Bc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r*   rÀ  rí   rE  Ú
part_indexrK   Úargs_strr,   Útool_call_indicesúdict[str, dict[str, Any]]r-   z$tuple[str, Optional[dict[str, Any]]]r.   )r/   s   "r0   r1   r1   ì  s9   € ÷ 3ñ 3˜ð 3¨nð 3È#ð 3ÐY\ð 3Ø'@ð3ØEiñ3r2   c                óz  € \        V 4      ;p'       d-   \        P                  ! RV/RR7      pWdP                  V4      3# \	        VP                  R4      \
        4      '       d   VP                  R4      MRp\        P                  ! RVRV R,          RV/RR7      pVP                  V4      pVe   VP                  VR
,          4      '       d   Wh3# VP                  4        FD  w  ršV	P                  V R24      '       g   K!  VP                  V
R
,          4      '       g   KA  Wš3u # 	  V R\        V4       2R	3# )ao  ``(key, existing slot or None)`` for a streamed functionCall.

Gemini 3 ids each tool call, so the id is the slot identity (``part_index`` and the thought
signature drift across events of one call). Gemini 2.5 sends no id and ``part_index`` restarts
at 0 per event, so two different calls to one tool in separate events would share a slot and
have their arguments concatenated into unparseable JSON: Gemini re-sends full arguments, so a
payload that is not a prefix-extension (or resend) of the slot's accumulated arguments is a
different call and gets its own ``key#N`` slot, kept reachable so its own resend lands on it.
Úprovider_call_idT©Ú	sort_keysr  r4   r,  r9   r  NÚlast_argumentsÚ#)	rÃ  r‰   rÑ  r–   rÛ   r,   r7   r•   r8   )rÀ  rE  r,  r-  r.  rÂ  r‡   r  ÚslotÚ	other_keyÚothers   &&&&&      r0   Ú_tool_call_slotr9  ì  s*  € ô " "Ó%Ð%€uÖ%Ü�jŠjÐ,¨eÐ4ÀÔEˆØ×)Ñ)¨#Ó.Ð.Ð.Ü8BÀ4Ç8Á8ÐL^ÓC_Ôad×8eÒ8e˜Ÿ™Ð!3Ô4ÐkmÐÜ
�*Š*�l J°¸¸6½
ÐDWÐYjÐkÐw{Ô
|€CØ× Ñ  Ó%€DØ‚|�x×*Ñ*¨4Ð0@Õ+A×BÒBØˆyÐØ-×3Ñ3Ö5Ñˆ	Ø×Ñ 3 % q 	×*Ô*¨x×/BÑ/BÀ5ÐIYÕCZ×/[Ô/[ØÐ#Ò#ñ 6ð ˆU�!”CÐ)Ó*Ð+Ð,¨dÐ2Ð2r2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r*   Úeventrí   r+   r,   r.  r/  r-   zlist[_GeminiStreamChunk]r.   )r/   s   "r0   r1   r1     s.   € ÷ $ñ $ .ð $¸ð $ÐQjð $ð  pHñ $r2   c                óH  € V P                  R 4      ;'       g    . pV'       g   . # \        V^ ,          \        4      '       d
   V^ ,          M/ pVP                  R4      ;'       g    / P                  R4      ;'       g    . p. p\        V4       EFc  w  rx\        V\        4      '       g   K  \	        V4      w  ršV
'       d   VP                  \        WR7      4       KP  V	'       d   VP                  \        WR7      4       \        V4      ;p'       d   VP                  \        WR7      4       \        V4      ;p'       g   K¶  \        VR,          4      p\        VRR7      p\        WÈW~V4      w  ppVf   R	\        V4      R
\        V4      RR/;pW/&   VR,          pVVR&   R	VR	,          R
VR
,          RVR\        V4      RVP                  V4      /pVP                  \        VVR7      4       EKf  	  \        VP                  R4      ;'       g    R4      ;p'       d€   V'       d   RM#\         P                  VP#                  4       R4      p\        VVR7      pV P                  R4      ;'       g    / ;p'       d   \%        V4      Vn        VP                  V4       V# )r  rß   r}   )r+   r
  )r+   rß   )r+   r  r9   Tr2  r÷  r  r4  r4   r  r  )r+   r  r  rV  r   )r+   r  r	  )r–   rÛ   rÜ   r  rþ  rJ  r  r  r  r,   rÒ  r9  r8   rÌ  r¾  Úremoveprefixr  r°   rê  rî  )r;  r+   r.  r  r  r}   Úchunksr,  rE  r~   r  r  rÀ  r9   r-  Úcall_keyr6  r4  r  Úfinish_reason_rawr  Úfinish_chunkrÔ  s   &&&                    r0   Útranslate_stream_eventrB    sN  € Ø—‘˜<Ó(×.Ð.¨B€JßØˆ	Ü& z°!¥}´d×;Ò;ˆ:�aŽ=À€DØ�X‰X�iÓ ×&Ð& B×+Ñ+¨GÓ4×:Ð:¸€EØ')€FÜ% e×,Ñˆ
Ü˜$¤×%Ò%ÙÜ% dÓ+ÑˆßØ�M‰MÔ,°5ÔIÔJÙßØ�M‰MÔ,°5ÔGÔHÜ& tÓ,Ð,ˆ3Ö,Ø�M‰MÔ,°5ÔMÔNÜ$ TÓ*Ð*ˆ2×*Ð*Ü�r˜&•z“?ˆDÜ& r°TÔ:ˆHÜ,¨R°zÐM^Ó_‰NˆH�dØŠ|Ø6=¼sÐCTÓ?UÐW[Ô]iÐjlÓ]mÐoð  BDð  6Eð  E�Ð(Ñ2à!Ð"2Õ3ˆNØ%-ˆDÐ!Ñ"Ø˜d 7�m¨T°4¸µ:¸vÀtÈ_Ô^xÐy}Ó^~Ø  (×"7Ñ"7¸Ó"GðIˆEà�M‰MÔ,°5È%ÔP×Qñ- -ô.   §¡¨Ó 8× >Ð >¸BÓ?Ð?ÐÖ?ß(9™Ô?Q×?UÑ?UÐVg×VmÑVmÓVoÐqwÓ?xˆÜ)°À]ÔSˆØŸ™ ?Ó3×9Ð9°rÐ9ˆ:Ö9Ü!5°jÓ!AˆLÔØ�‰�lÔ#Ø€Mr2   c               ó    € V ^8„  d   QhRRRR/# )r*   Úerr_objrí   r-   ztuple[str, dict[str, Any]]r.   )r/   s   "r0   r1   r1   ,  s   € ÷ ñ ˜ð Ð,Fñ r2   c                óì  € R/ r!V P                  R4      p\        V\        4      '       d   TM.  FÀ  p\        V\        4      '       g   K  V'       d   K%  \	        VP                  R4      ;'       g    R4      P                  R4      '       g   K`  \        VP                  R4      \        4      '       d
   VR,          MTp\        VP                  R4      \        4      '       d
   VR,          MTpKÂ  	  W3# )zm``(reason, metadata)`` from the first google.rpc.ErrorInfo detail (later ones fill gaps until reason is set).r4   rÂ   z@typez/google.rpc.ErrorInfor¶   Úmetadata)r–   rÛ   rç   rÜ   r,   rO   )rD  r¶   rF  rÂ   Údetails   &    r0   Ú_error_inforH  ,  s»   € à˜2ˆHØ�k‰k˜)Ó$€GÜ'¨´×6Ò6‘'¸BÒ>ˆÜ�fœd×#Ô#¯F©F´s¸6¿:¹:ÀgÓ;N×;TÐ;TÐRTÓ7U×7^Ñ7^Ð_v×7wÔ7wÜ)3°F·J±J¸xÓ4HÌ#×)NÒ)N�V˜HÖ%ÐTZˆFÜ-7¸¿
¹
À:Ó8NÔPT×-UÒ-U�v˜jÖ)Ð[cŠHñ ?ð ÐÐr2   c               ó    € V ^8„  d   QhRRRR/# )r*   Ú	body_textr,   r-   rí   r.   )r/   s   "r0   r1   r1   7  s   € ÷ 8ñ 8˜Sð 8 ^ñ 8r2   c                óü   €  V '       d   \         P                  ! V 4      MRp\	        T\
        4      '       d   TP                  R4      MRp\	        T\
        4      '       d   T# / #   \        \        3 d    / u # i ; i)z<The ``error`` object of a Google JSON error body, or ``{}``.NÚerror)r‰   r   r˜   r—   rÛ   rÜ   r–   )rJ  r;  rD  s   &  r0   Ú_error_objectrM  7  si   € ðß*3”—’˜IÔ&¸ˆô &0°¼×%=Ò%=ˆf�j‰j˜Ô!À4€GÜ  ¬$×/Ò/ˆ7Ð7°RÐ7øô œ	Ð"ô ØŠ	ðús   ‚A% ŠA% Á%A;Á:A;rJ  rX   Úkey_guidanceTc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r*   r¥   r%  rJ  r^   rv   r,   rX   rN  r>   r-   r¾   r.   )r/   s   "r0   r1   r1   A  s>   € ÷ ñ ØðØ,9ðØKNðØ_bðàðð ñr2   c               ó”  a€ V P                   pVf   \        V 4      MT;'       g    Rp\        V4      oV3R lR 4       w  rg\        S4      w  r‰\	        V P
                  4      p
V'       d   RT RT;'       g    R RV 2MR	V R
VR,           2pV'       d0   VR8X  d)   \        T;'       g    T4      '       d   V\        ,          pV'       d+   \        YW;'       g    TW‚R7      '       d   V\        ,          pV'       d   VR8X  d   V\        W2V4      ,          p\        V\        P                  VRV 24      WPV
RVRVRV	RV/R7      # )z´``key_guidance=False`` for OAuth-bearer callers: the API-key fixes (free tier, Standard key, wrong
key surface) are wrong advice when the credential is a user's OAuth access token.r4   c              3  óˆ   <"  € T F7  p\        SP                  V4      ;'       g    R 4      P                  4       x € K9  	  R# 5i)r4   N)r,   r–   r5   )rã   r    rD  s   & €r0   rå   Ú$gemini_http_error.<locals>.<genexpr>J  s4   øé € Ð`ÑJ_ÀQœs 7§;¡;¨q£>×#7Ð#7°RÓ8×>Ñ>×@Ð@ÓJ_ùs
   ƒ!A¥Arµ   rÄ   zGemini HTTP z (rL  z): zGemini returned HTTP z: :Niô  Nr&   ©rv   i“  Úgemini_http_r¶   rF  )r¿   r™   r¥   rÁ   rÂ   )rµ   rÄ   )r™   rš   rM  rH  r   rŠ   r«   Ú_FREE_TIER_GUIDANCEr¼   Ú_STANDARD_KEY_GUIDANCEr³   r¾   Ú_HTTP_ERROR_CODESr–   )r¥   rJ  rv   rX   rN  rµ   r­   Úerr_messager¶   rF  rÁ   rÄ   rD  s   &$$$$       @r0   Úgemini_http_errorrY  A  sG  ø€ ð ×!Ñ!€FØ-6Ò->” Ô)ÀI×TÐTÐRT€IÜ˜IÓ&€GÜ`ÑJ_Ó`Ñ€JÜ" 7Ó+Ñ€FÜ+¨H×,<Ñ,<Ó=€KçLWˆ,�v�h˜b ×!6Ð!6¨wÐ 7°s¸;¸-ÑHØ$ V H¨B¨y¸­Ð.?Ð@ð ÷ ˜ #œÔ*BÀ;×C[ÐC[ÐR[×*\Ò*\ØÔ&Õ&ˆßÔ2°6×;SÐ;SÈ)ÐU[×mÓmØÔ)Õ)ˆß˜ #œØÔ0°ÀJÓOÕOˆÜØÔ'×+Ñ+¨F°lÀ6À(Ð4KÓLÐZ`Ø¨(°JÀÈ&ÐR\Ð^fÐhqÐs~Ð)ôð r2   c                  óú   € ] tR tRtRtRtRRutt]t	RRRRR	RR
R/R R llt
R R ltR tR tR R ltR R ltR-R R llt]R R l4       tRRRRRRRRRRR RR!RR"RR#RR$RR%RR	R/R& R' lltR( R) ltR* R+ ltR,tR# ).ÚGeminiNativeClienti`  zrMinimal OpenAI-SDK-compatible facade (``client.chat.completions.create(**kwargs)``) over Gemini's native REST API.TÚgenerateContentÚstreamGenerateContentrX   NÚdefault_headersrt   Úhttp_clientc               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r*   rv   r,   rX   r^   r^  r2  rt   r   r_  zOptional[httpx.Client]r‰  r-   ÚNoner.   )r/   s   "r0   r1   ÚGeminiNativeClient.__annotate__k  sO   € ÷ Eñ EØðEØ)6ðEØPhðEàðEà*@ðEàNQðEð 
ñEr2   c          	     	ó¼  € T;'       g    R P                  4       '       g   \        V P                  4      hVRuV n        V n        \        V4      V n        \        T;'       g    / 4      V n        \        \        V P                  R7      R7      V n        T;'       g:    \        P                  ! T;'       g    \        P                  ! RRRRR7      R7      V n        R	# )
r4   F©Úcreate©Úcompletionsg      .@g     À’@g      >@)ÚconnectÚreadÚwriteÚpoolr…   N)r5   ÚRuntimeErrorÚMISSING_KEY_ERRORrv   Ú	is_closedrk   rX   rÜ   Ú_default_headersr   Ú_create_chat_completionÚchatr�   r�   ÚTimeoutÚ_http)rÍ   rv   rX   r^  rt   r_  r‰  s   &$$$$$,r0   rÌ   ÚGeminiNativeClient.__init__k  s¾   € ð —�˜2×$Ñ$×&Ò&Ü˜t×5Ñ5Ó6Ð6Ø'.°Ð$ˆŒ�d”nÜ1°(Ó;ˆŒÜ $ _×%:Ð%:¸Ó ;ˆÔÜ#´Àt×GcÑGcÔ0dÔeˆŒ	ð !÷  Eð  E¤E§L¢L¸÷  :Dð  :DÄEÇMÂMÐZ^ÐekÐswð  Cô  EDô  %EˆŽ
r2   c               ó   € V ^8„  d   QhRR/# ©r*   r-   ra  r.   )r/   s   "r0   r1   rb  y  s   € ÷ ñ �tñ r2   c                	óÆ   € R V n         \        P                  ! \        4      ;_uu_ 4        V P                  P                  4        RRR4       R#   + '       g   i     R# ; i©TN)rn  Ú
contextlibÚsuppressr’   rs  Úclose©rÍ   s   &r0   r{  ÚGeminiNativeClient.closey  s9   € ØˆŒÜ× Ò ¤×+Õ+Ø�J‰J×ÑÔ÷ ,×+×+Ò+ús   ªAÁA 	c                	ó   € V # rÊ   r.   r|  s   &r0   Ú	__enter__ÚGeminiNativeClient.__enter__  s   € Øˆr2   c                	ó&   € V P                  4        R # rÊ   )r{  )rÍ   Úexc_typeÚexc_valÚexc_tbs   &&&&r0   Ú__exit__ÚGeminiNativeClient.__exit__‚  s   € Ø�
‰
Žr2   c               ó   € V ^8„  d   QhRR/# ©r*   r-   zdict[str, str]r.   )r/   s   "r0   r1   rb  …  s   € ÷ 0ñ 0˜~ñ 0r2   c                	ó   € R V P                   /# )zx-goog-api-keyrS  r|  s   &r0   Ú_auth_headersÚ GeminiNativeClient._auth_headers…  s   € Ø  $§,¡,Ð/Ð/r2   c               ó   € V ^8„  d   QhRR/# rˆ  r.   )r/   s   "r0   r1   rb  ˆ  s   € ÷ {ñ {˜.ñ {r2   c                	óh   € R RRR/V P                  4       CR\         R2R\        /CV P                  C# )r‚   rƒ   ÚAcceptz
User-Agentz (gemini-native)r„   )rŠ  rŽ   ro  r|  s   &r0   Ú_headersÚGeminiNativeClient._headersˆ  sS   € ØÐ 2°HÐ>Pð {ÐTX×TfÑTfÓThð {Ø¤ Ð-=Ð>Ð@SÔU`ñ{Ødh×dyÑdyð{ð 	{r2   c               ó$   € V ^8„  d   QhRRRRRR/# )r*   r¥   r%  rJ  r^   r-   r¾   r.   )r/   s   "r0   r1   rb  Œ  s'   € ÷ nñ n Nð n¸}ð nÐXfñ nr2   c                	óF   € \        WV P                  V P                  R 7      # ))rJ  rv   rX   )rY  rv   rX   )rÍ   r¥   rJ  s   &&&r0   Ú_http_errorÚGeminiNativeClient._http_errorŒ  s   € Ü  ÈÏÉÐ_c×_lÑ_lÔmÐmr2   c               ó    € V ^8„  d   QhRRRR/# )r*   ÚiteratorúIterator[_GeminiStreamChunk]r-   z)tuple[bool, Optional[_GeminiStreamChunk]]r.   )r/   s   "r0   r1   rb  �  s    € ÷ Añ AÐ+Gð AÐLuñ Ar2   c                	óB   € \        V \        4      pV\        J d   R# RV3# )TFrx  )ÚnextÚ_END)r–  r)  s   & r0   Ú_advance_stream_iteratorÚ+GeminiNativeClient._advance_stream_iterator�  s#   € ä�XœtÓ$ˆØ$¬›}ˆ|Ð@°5¸%°.Ð@r2   r+   rs   rR  ÚstreamFri  rs  r¦  r•  r§  r   rœ  Ú
extra_bodyc               óP   € V ^8„  d   QhRRRRRRRRR	RR
RRRRRRRRRRRRRRRRR/# )r*   r+   r,   rR  zOptional[list[dict[str, Any]]]r�  r>   ri  r   rs  r¦  rÆ   r•  rÅ   r§  r   rœ  rž  rÇ   rt   r‰  r-   r.   )r/   s   "r0   r1   rb  ”  sž   € ÷ oñ oØðoØ<ZðoØkoðoàðoà(+ðoàAPðoàerðoð ðoð .1ðoð KNðoð c{ðoð ð	oð #&ð	oð
 
ñor2   c               	óü  € \        V\        4      '       d   TM/ pVP                  R 4      p\        V\        4      '       d   T\        T;'       g    ^ 4      8”  d   Tp\	        T;'       g    . YEYgY‰VP                  R4      ;'       g    VP                  R4      T
;'       g    VP                  R4      V\        V P                  4      R7      p\        V4      pV P                   RV R2pV'       d$   V P                  VV V P                   R2VV4      # V P                  VV P                  ,           VV4      .p\        VR,          P                  R	4      4      ^,           p\        VR,          4      ;p'       dL   \        V4      V8  d<   VP                  V P                  VV P                  ,           / VCR
V/CV4      4       Ke  \!        \        V4      ^8”  d   \#        V4      VR7      # V^ ,          VR7      # )Úmax_output_tokensr�  r¯  rœ  )rR  ri  rs  r¦  r•  r§  r   r�  rœ  r+   r¨  r†   rõ   z?alt=sser€   r�   ÚcontinuationTokenrE   rc   )rÛ   rÜ   r–   rK   r¸  rr   rX   r;   Ú_stream_completionÚSTREAM_METHODÚ	_generateÚGENERATE_METHODr   r   r8   rJ  r  r   )rÍ   r+   rR  r�  ri  rs  r¦  r•  r§  r   rœ  rž  rt   r‰  r  r‘  r´  rð   ÚhopsÚmax_hopsÚtokens   &$$$$$$$$$$$$,       r0   rp  Ú*GeminiNativeClient._create_chat_completion”  sÂ  € ô )¨´T×:Ò:‘
Àˆà—‘Ð.Ó/ˆÜ�fœc×"Ò" v´°J·O°OÀ!Ó0DÔ'DØˆJÜ&Ø—^�^ ¨5ÐWbØ°E·I±IÐ>OÓ4P×4oÐ4oÐTY×T]ÑT]Ð^nÓToØ+×KÐK¨u¯y©yÐ9JÓ/KÐSXÜ!FÀtÇ}Á}Ó!Uô	
ˆô % UÓ+ˆØ—‘�˜x¨ w¨aÐ0ˆßØ×*Ñ*¨5°S°E¸$×:LÑ:LÐ9MÈXÐ2VÐX_ÐahÓiÐiØ—‘˜s T×%9Ñ%9Õ9¸7ÀGÓLÐMˆÜ# GÐ,>Õ$?×$CÑ$CÐDUÓ$VÓWÐZ[Õ[ˆô +¨4°­8Ó4Ð4ˆuÖ4¼#¸d»)ÀhÔ:NØ�K‰K˜Ÿ™ s¨T×-AÑ-AÕ'AÐCjÀgÐCjÐObÐdiÑCjÐlsÓtÖuÜ(ÄcÈ$ÃiÐRSÄmÔ)<¸TÓ)BÐhmÔnÐnÐY]Ð^_ÕY`ÐhmÔnÐnr2   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r*   rð   r,   r´  rí   rt   r   r-   r.   )r/   s   "r0   r1   rb  ±  s(   € ÷ 	ñ 	˜Sð 	¨>ð 	ÀCð 	ÈNñ 	r2   c                	ó   € V P                   P                  WV P                  4       VR 7      pVP                  ^È8w  d   V P	                  V4      h VP                  4       #   \         d#   p\        RT 2RTP                  TR7      ThRp?ii ; i)©r‰   rŠ   rt   z%Invalid JSON from Gemini native API: Úgemini_invalid_json)r¿   r™   r¥   N)rs  r‘   r�  r™   r“  r‰   r˜   r¾   )rÍ   rð   r´  rt   r¥   rŸ   s   &&&&  r0   r¥  ÚGeminiNativeClient._generate±  sŽ   € Ø—:‘:—?‘? 3¸d¿m¹m»oÐW^�?Ó_ˆØ×Ñ 3Ô&Ø×"Ñ" 8Ó,Ð,ð	Ø—=‘=“?Ð"øÜô 	Ü Ø7¸°uÐ=ÐDYÐgo×g{Ñg{ð  GOôàðûð	ús   ÁA  Á BÁ+BÂBc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r*   r+   r,   rð   r´  rí   rt   r   r-   r—  r.   )r/   s   "r0   r1   rb  ¼  s8   € ÷ Nñ N¨ð N°#ð NÀð NÐY\ð NÐa}ñ Nr2   c           
   #  	óâ  "  € / p. p\        VR ,          P                  R4      4      ^,           pTpR^ r©  / V P                  4       CRR/CpV P                  P	                  RW(W´R7      ;_uu_ 4       pVP
                  ^È8w  d   V P                  V\        V4      4      h\        V4       F   p\        V4      p\        WÖ4      w  rßV'       dL   \        V4      V8”  d<   \        V4      V8¼  d,   / VR,          ^ ,          CRR	/Cp/ VCRV.R
\        V4      /CRrý\        WÑV4      pV'       g	   V'       d   Yÿ'       d   ^ MT
r©T Rj  x€L
  K¢  	  RRR4       T	'       d   T
\        8¼  d   R# / TCRT	/CT
^,           r¨EKJ   L8  + '       g   i     L:; i  \        P                   dE   pT	'       d   T
\        8¼  d   \!        RT 2RR7      Th\"        P%                  RT4        Rp?L‘Rp?ii ; i5i)r€   r�   NrŽ  ztext/event-streamÚPOSTr­  r  r  r   r	  z!Gemini streaming request failed: Úgemini_stream_error)r¿   z=Gemini stream dropped (%s); resuming from its last checkpointr¢  )r   r–   r�  rs  r�  r™   r“  r
   r*  r8   r   r   rB  r�   Ú	HTTPErrorÚ_MAX_TOKEN_SENDSr¾   r“   Úwarning)rÍ   r+   rð   r´  rt   r.  Ú	hop_usager¨  ÚbodyÚresumeÚsendsrŠ   r¥   r;  Ú	hops_doner©  r  r>  rŸ   s   &&&&&              r0   r£  Ú%GeminiNativeClient._stream_completion¼  sÒ  é € Ø79ÐØ*,ˆ	Ü# GÐ,>Õ$?×$CÑ$CÐDUÓ$VÓWÐZ[Õ[ˆØ&ˆð ˜a�ØðeØL˜TŸ]™]›_ÐL¨hÐ8KÑL�Ø—Z‘Z×&Ñ& v¨sÀwÐ&×`Ô`ÐdlØ×+Ñ+¨sÔ2Ø"×.Ñ.¨xÔ9RÐS[Ó9\Ó]Ð]Ü!1°(Ö!;˜Ü$'¨	£N˜	Ü'@ÀÓ'R™˜ß ¤S¨£^°iÔ%?ÄCÈ	ÃNÐV^ÔD^à#[ e¨LÕ&9¸!Õ&<Ð#[¸nÈlÑ#[˜DØ+w¨eÐ+w°\ÀDÀ6È?Ô\kÐluÓ\vÑ+wÐy} 5Ü!7¸ÐFWÓ!X˜ß §FØ,1¾±1À5 EØ#)×)Ò)ñ "<÷ a÷$ ˜UÔ&6Ô6ÙØB˜WÐBÐ&9¸6ÑBÀEÈAÅI“%ñ *÷ a×`ûô —?‘?ô eß Ô*:Ô!:Ü(Ð+LÈSÈEÐ)RÐYnÔoÐuxÐxÜ—‘Ð^Ð`c×dÑdûðeüsq   ‚3G/¶<F Á2CF Ä4F ÅE>
ÅF ÅF ÅG/Å G/Å>F Æ F	ÆF ÆG/ÆF ÆG,Æ(:G'Ç"G/Ç'G,Ç,G/)ro  rs  rv   rX   rq  rn  rÊ   )rÐ   rÑ   rÒ   rÓ   rÔ   ÚHERMES_SKIP_TRANSPORT_WRAPr¦  r¤  Ú_MISSING_KEY_ERRORrm  rÌ   r{  r  r…  rŠ  r�  r“  Ústaticmethodr›  rp  r¥  r£  rÕ   r.   r2   r0   r[  r[  `  s  † Ù|ð "&Ðð &7Ð8OÐ"€O�]Ø*ÐðEØ9=ðEØkoðEàðEàCG÷Eõòòõ0õ{÷nð ôAó ðAðoØ0ðoØ]aðoØrwðoàðoà.2ðoàSWðoàuyðoð "&ðoð 48ðoð QUðoð ~Bðoð ÷	oõ:	÷Nñ Nr2   r[  c                  óJ   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltRt	R# )ÚAsyncGeminiNativeClientiÞ  z?Async wrapper used by auxiliary_client for native Gemini calls.c               ó   € V ^8„  d   QhRR/# )r*   Úsync_clientr[  r.   )r/   s   "r0   r1   Ú$AsyncGeminiNativeClient.__annotate__á  s   € ÷ fñ fÐ$6ñ fr2   c                	ó²   € V;V n         V n        VP                  VP                  uV n        V n        \	        \	        V P
                  R 7      R7      V n        R# )rd  rf  N)Ú_syncÚ_real_clientrv   rX   r   rp  rq  )rÍ   rÃ  s   &&r0   rÌ   Ú AsyncGeminiNativeClient.__init__á  sD   € à)4Ð4ˆŒ
�TÔ&Ø&1×&9Ñ&9¸;×;OÑ;OÐ#ˆŒ�d”mÜ#´Àt×GcÑGcÔ0dÔeˆŽ	r2   c               ó    € V ^8„  d   QhRRRR/# )r*   rÎ  r   r-   r.   )r/   s   "r0   r1   rÄ  ë  s   € ÷ Nñ N°cð N¸cñ Nr2   c              ‹  	óð   "  € \         P                  ! V P                  P                  P                  P
                  3/ VB G R j  x€L
 pVP                  R4      '       d   V P                  V4      # T#  L.5i)Nr�  )ÚasyncioÚ	to_threadrÆ  rq  rg  re  r–   Ú_async_stream)rÍ   rÎ  Úresults   &, r0   rp  Ú/AsyncGeminiNativeClient._create_chat_completionë  s[   é € Ü×(Ò(¨¯©¯©×)DÑ)D×)KÑ)KÑVÈvÑV×VˆØ-3¯Z©Z¸×-AÒ-Aˆt×!Ñ! &Ó)ÐMÀvÐMñ Wùs   ‚AA6ÁA4ÁA6Á!A6c               ó    € V ^8„  d   QhRRRR/# )r*   r–  r—  r-   r   r.   )r/   s   "r0   r1   rÄ  ï  s   € ÷ ñ Ð,Hð ÈSñ r2   c               	ó²   "  € \         P                  ! V P                  P                  V4      G R j  x€L
 ;p^ ,          '       g   V^,          5x € KP  R #  L#5irÊ   )rË  rÌ  rÆ  r›  )rÍ   r–  Ústeps   && r0   rÍ  Ú%AsyncGeminiNativeClient._async_streamï  sC   é € Ü!(×!2Ò!2°4·:±:×3VÑ3VÐX`Ó!a×aÐa�4Ðcd×eÔeØ�q•'�Mñ fÑaùs   ‚/A±A²AÁAc               ó   € V ^8„  d   QhRR/# rv  r.   )r/   s   "r0   r1   rÄ  ó  s   € ÷ 2ñ 2˜Tñ 2r2   c              ƒ  	óv   "  € \         P                  ! V P                  P                  4      G R j  x€L
  R #  L5irÊ   )rË  rÌ  rÆ  r{  r|  s   &r0   r{  ÚAsyncGeminiNativeClient.closeó  s#   é € Ü×Ò §
¡
× 0Ñ 0Ó1×1Ô1ùs   ‚.9°7±9)rÇ  rÆ  rv   rX   rq  N)
rÐ   rÑ   rÒ   rÓ   rÔ   rÌ   rp  rÍ  r{  rÕ   r.   r2   r0   rÁ  rÁ  Þ  s    † ÙIõfõNõ÷2ñ 2r2   rÁ  r§   )Frý  )|rÔ   Ú
__future__r   rË  rù   ry  r‰   ÚloggingrI   rô  rÉ  r‹  r   Útypingr   r   r   r   r	   r�   Úagent.bounded_responser
   Úagent.gemini_long_decoder   r   r   r   r   Úagent.retry_utilsr   Úagent.gemini_schemar   r   Ú	getLoggerrÐ   r“   Úhermes_cli.version_infor   Úbase_versionrŽ   rg   ÚVERTEX_EXPRESS_BASE_URLr˜  rU  rV  r²   r±   rK  r"  rñ  rš  rµ  rx  r  rW  r¾  r;   rF   rD   rQ   rU   Úcompilerf   rh   r\   rk   ro   rr   r£   rš   r«   r³   r¼   r’   r¾   rÝ   rë   rÿ   r  r  r  r  r&  r+  r?  rG  rP  r_  rg  rq  ry  rK   rw   r>   r,   r‡  r�  r“  rš  r¥  r¸  r¾  rÃ  rÌ  rÒ  rê  rõ  rù  rþ  r  r  r  r  r  r"  r#  r*  r9  rB  rH  rM  rY  r[  rÁ  r.   r2   r0   Ú<module>rã     sï  ðñaõ #ã Û Û Û Û Û 	Û Û Ý !ß 6Õ 6ã å <÷ Kõ  KÝ 7ß _à	×	Ò	˜8Ó	$€å 4àÑ.Ó0×=Ñ=Ð>Ð?€àLÐ ð XÐ ð $)Ð  ðZð ðMð ð1ð  ð#ð  ð %cÐ !ð 5€Ùƒx€ØÐ Ø˜f j°%¸ÀÐHÐ à
ˆF�L (¨HÐ6FÈÐVfÐhoÐqwØ�HðÐ ð Ð/°Ð6KÈSÐRjÐkÐ ð%ð õõ	,õPõhõ,ð —z’zÐ"=¸r¿}¹}ÓMÐ õYõõ:gõOð #:ñBØK]ðBØpt÷Bð Bõ6õHõ
ñ&ØIK÷ð ô.D�Yô Dõ3õ3õ
õGõ,õ9õF÷
põZñ3ð FK÷3ð 3õ6kõñ@ }Ø_d÷ }ð  }ðF¸E÷ ð"LÀ%÷ LõBð Ð(¨3°¨,¸Ð<ØÐ*¨D±+Ð>ØÐ&¨Ñ-HÐIð€õõ`õ
ðGÈE÷ Gð&Ø48ðØMQðØrvðà $ðà?CðàQUðànrðð  ðð /1ðð PU÷õD\õ
?õ
Dõ
õð, Zi÷ .õHõ[õXõCõ
~ô8 /˜Ô .ð[Ø"$ð[ØRVð[Øw{ð[ð OQð[à$(÷[ñ ‹H€	õ:õõ&3õ2$õNõ8ðØ<@ðØQSðØegðà÷÷>{Nñ {N÷|2ó 2r2   