§
    ÷žyjÁ… ã                  ó�  — 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	Z	ddl
Z
ddlZddlmZ ddlmZmZmZ ddlmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2  ej3        e4¦  «        Z5h d£Z6dZ7d„ Z8d„ Z9dkd„Z:dld„Z;dmd „Z<dnd#„Z=dod%„Z>dpd(„Z?dqd,„Z@drd.„ZAdsd8„ZBdtd9„ZCdud;„ZDdud<„ZEd=dd>œdvdB„ZFdwdC„ZGdudD„ZHdxdE„ZIdydI„ZJdzdJ„ZKdldK„ZLdLZMdxdM„ZNdzdN„ZOdzdO„ZPd{d|dT„ZQd}dV„ZRd~dY„ZSdd\„ZTd€d]„ZUd{d�d`„ZVd‚dc„ZWdƒde„ZXddfœdg„ZYddhœdzdi„ZZg dj¢Z[dS )„uu  Helper functions for the chat-completions code path.

Extracted from :class:`AIAgent` for cleanliness â€” bodies of the
non-streaming API call, request kwargs builder, assistant-message
materializer, provider-fallback activator, max-iterations handler,
and per-turn resource cleanup.

Each function takes the parent ``AIAgent`` as its first argument
(``agent``).  :class:`AIAgent` keeps thin forwarder methods so call
sites unchanged.  Symbols that tests patch on ``run_agent`` (e.g.
``cleanup_vm`` / ``cleanup_browser`` in
``test_zombie_process_cleanup.py``) are resolved through
:func:`_ra` so the patch contract is preserved.
é    )ÚannotationsN)ÚSimpleNamespace)ÚAnyÚDictÚOptional)Úget_provider_request_timeoutÚget_provider_stale_timeout)ÚPARTIAL_STREAM_STUB_IDÚFINISH_REASON_LENGTH)ÚFailoverReason)ÚEmptyStreamError)Úsubstitute_api_content)Úis_native_gemini_base_url)Úis_local_endpoint)Úflatten_message_text)Ú_sanitize_surrogatesÚ_repair_tool_call_arguments)Úseparate_glued_reasoning_blocks)Úclaim_stream_writerÚstream_writer_is_current)Úis_persistent_env)Úbase_url_host_matchesÚbase_url_hostnameÚ	env_floatÚenv_int>   ÚpriceÚlatencyÚ
throughputg      @c                ó8   ‡ ‡— t          j        ¦   «         Šˆ ˆfd„S )z=Bind a no-argument thread target to the caller's ContextVars.c                 ó.   •— ‰                      ‰ ¦  «        S ©N)Úrun©ÚcallbackÚcontexts   €€úC/home/ragecks/.hermes/hermes-agent/agent/chat_completion_helpers.pyú<lambda>z(_context_thread_target.<locals>.<lambda>A   s   ø€ �7—;’;˜xÑ(Ô(€ ó    )ÚcontextvarsÚcopy_contextr#   s   `@r&   Ú_context_thread_targetr+   >   s$   øø€ åÔ&Ñ(Ô(€GØ(Ð(Ð(Ð(Ð(Ð(r(   c                 ó   — ddl } | S )z×Lazy ``run_agent`` reference.

    Used to honor test patches like
    ``patch("run_agent.cleanup_vm")`` / ``patch("run_agent.cleanup_browser")``
    that target symbols imported into ``run_agent``'s namespace.
    r   N©Ú	run_agentr-   s    r&   Ú_rar/   D   s   € ð ÐÐÐØÐr(   Úapi_payloadr   ÚreturnÚintc                óŒ  ‡— dd„Šdˆfd„}t          | t          ¦  «        r || ¦  «        dz  S t          | t          ¦  «        rô|                      d¦  «        }t          |t          ¦  «        r5 ||¦  «        }d	| v r!| ‰|                      d	¦  «        ¦  «        z  }|dz  S d
| v ra ‰|                      d
¦  «        ¦  «         ‰|                      d¦  «        ¦  «        z    ‰|                      d	¦  «        ¦  «        z   }|dz  S t	          ˆfd„|                      ¦   «         D ¦   «         ¦  «        dz  S  ‰| ¦  «        dz  S )a   Estimate context/load tokens from an API payload, dict or messages list.

    The stale-call detectors historically assumed a Chat Completions request:
    they pulled ``api_kwargs["messages"]`` and ran a cheap char/4 estimate.
    Codex / Responses API requests carry the conversational payload in
    ``input`` (with additional load in ``instructions`` and ``tools``), so the
    legacy estimator reported ~0 tokens for every Codex turn and the
    context-tier scaling never fired.

    This helper handles both shapes:
      - bare list -> treat as Chat Completions ``messages``
      - dict with ``messages`` -> Chat Completions (+ ``tools`` if present)
      - dict with ``input`` -> Responses API (+ ``instructions``/``tools``)
      - any other dict -> fall back to summing string values
    Úvaluer   r1   r2   c                óŠ   — | €dS t          | t          ¦  «        rt          | ¦  «        S t          t          | ¦  «        ¦  «        S ©Nr   )Ú
isinstanceÚstrÚlen©r4   s    r&   Ú_charsz/estimate_request_context_tokens.<locals>._chars`   s<   € Øˆ=Ø�1Ý�e�SÑ!Ô!ð 	Ý�u‘:”:ÐÝ•3�u‘:”:‰ŒÐr(   Úmessagesc                óz   •— t          | t          ¦  «        s ‰| ¦  «        S t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r!   © )Ú.0Úitemr;   s     €r&   ú	<genexpr>zJestimate_request_context_tokens.<locals>._message_chars.<locals>.<genexpr>j   s+   øè è € Ð5Ð5 D�6�6˜$‘<”<Ð5Ð5Ð5Ð5Ð5Ð5r(   )r7   ÚlistÚsum)r<   r;   s    €r&   Ú_message_charsz7estimate_request_context_tokens.<locals>._message_charsg   sH   ø€ Ý˜(¥DÑ)Ô)ð 	$Ø�6˜(Ñ#Ô#Ð#ÝÐ5Ð5Ð5Ð5¨HÐ5Ñ5Ô5Ñ5Ô5Ð5r(   é   ÚtoolsÚinputÚinstructionsc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r!   r?   )r@   r4   r;   s     €r&   rB   z2estimate_request_context_tokens.<locals>.<genexpr>   s+   øè è € ÐCÐC U�6�6˜%‘=”=ÐCÐCÐCÐCÐCÐCr(   )r4   r   r1   r2   )r<   r   r1   r2   )r7   rC   ÚdictÚgetrD   Úvalues)r0   rE   r<   Útotal_charsr;   s       @r&   Úestimate_request_context_tokensrO   O   s”  ø€ ð"ð ð ð ð6ð 6ð 6ð 6ð 6ð 6õ
 �+�tÑ$Ô$ð 0Øˆ~˜kÑ*Ô*¨aÑ/Ð/å�+�tÑ$Ô$ð IØ—?’? :Ñ.Ô.ˆÝ�h¥Ñ%Ô%ð 	$Ø(˜.¨Ñ2Ô2ˆKØ˜+Ð%Ð%Ø˜v˜v k§o¢o°gÑ&>Ô&>Ñ?Ô?Ñ?�Ø !Ñ#Ð#à�kÐ!Ð!à��{—’ wÑ/Ô/Ñ0Ô0Ø�&˜Ÿš¨Ñ8Ô8Ñ9Ô9ñ:à�&˜Ÿš¨Ñ1Ô1Ñ2Ô2ñ3ð ð
  !Ñ#Ð#åÐCÐCÐCÐC¨k×.@Ò.@Ñ.BÔ.BÐCÑCÔCÑCÔCÀqÑHÐHàˆ6�+ÑÔ !Ñ#Ð#r(   Úboolc                óÀ   — t          t          | dd¦  «        pd¦  «        }t          t          | dd¦  «        pd¦  «        }t          | dd ¦  «        dk    p	|dk    od|v S )NÚ_base_url_lowerÚ Ú_base_url_hostnameÚproviderúopenai-codexúchatgpt.comú/backend-api/codex)r8   Úgetattr)ÚagentÚbase_url_lowerr   s      r&   Ú_is_openai_codex_backendr\   „   st   € Ý� Ð(9¸2Ñ>Ô>ÐDÀ"ÑEÔE€NÝ�G EÐ+?ÀÑDÔDÐJÈÑKÔKÐå��z 4Ñ(Ô(¨NÒ:ð 	
à Ò.ð 7Ø$¨Ð6ð	r(   Ú
est_tokensÚfloatc                ó6   — | dk    rdS | dk    rdS | dk    rdS dS )u  Minimum wall-clock stale timeout for openai-codex by estimated context.

    Gateway/Telegram sessions routinely ship ~15â€“25k tokens of tools +
    instructions before the first user message. Subscription-backed Codex can
    legitimately spend several minutes in backend admission/prefill at that
    size; the generic 90s non-stream stale default aborts healthy calls. The
    floor engages above 10k estimated tokens so those gateway-scale payloads
    are covered; smaller requests keep the generic default.
    é † g     À’@éPÃ  ç      Œ@é'  g     À‚@ç        r?   )r]   s    r&   Ú openai_codex_stale_timeout_floorre   �   s9   € ð �GÒÐØˆvØ�FÒÐØˆuØ�FÒÐØˆuØˆ3r(   Úraw_sortúOptional[str]c           	     ó   — t          | t          ¦  «        sdS |                      ¦   «                              ¦   «         }|sdS |t          v r|S t
                               d| d                     t          t          ¦  «        ¦  «        ¦  «         dS )z;Return a normalized OpenRouter provider.sort value or None.Nz@Ignoring invalid OpenRouter provider.sort value %r (allowed: %s)ú, )	r7   r8   ÚstripÚlowerÚ _OPENROUTER_PROVIDER_SORT_VALUESÚloggerÚwarningÚjoinÚsorted)rf   Ú
sort_values     r&   Ú#_validated_openrouter_provider_sortrr   £   sŽ   € å�h¥Ñ$Ô$ð ØˆtØ—’Ñ!Ô!×'Ò'Ñ)Ô)€JØð ØˆtØÕ5Ð5Ð5ØÐÝ
‡N‚NØJØØ�	Š	•&Õ9Ñ:Ô:Ñ;Ô;ñô ð ð
 ˆ4r(   úDict[str, Any]c                óà   — i }| j         r
| j         |d<   | j        r
| j        |d<   | j        r
| j        |d<   t          | j        ¦  «        }|r||d<   | j        rd|d<   | j        r
| j        |d<   |S )zDBuild the validated provider-routing object shared by request paths.ÚonlyÚignoreÚorderÚsortTÚrequire_parametersÚdata_collection)Úproviders_allowedÚproviders_ignoredÚproviders_orderrr   Úprovider_sortÚprovider_require_parametersÚprovider_data_collection)rZ   Úpreferencesr~   s      r&   Ú_provider_preferences_for_agentr‚   ´   s§   € à"$€KØÔð 6Ø#Ô5ˆ�FÑØÔð 8Ø %Ô 7ˆ�HÑØÔð 5Ø$Ô4ˆ�GÑÝ7¸Ô8KÑLÔL€MØð ,Ø+ˆ�FÑØÔ(ð 1Ø,0ˆÐ(Ñ)ØÔ%ð HØ).Ô)GˆÐ%Ñ&ØÐr(   Úanthropic_kwargsrK   c           	     óV  — t          | dd¦  «        dvr|S 	 ddlm}  |d¦  «        }|�L|                     di ¦  «                             |                     t          | dd¦  «        ¬	¦  «        ¦  «         n2# t          $ r%}t                               d
|¦  «         Y d}~nd}~ww xY w|S )uŠ  Merge Portal ``tags`` / ``session_id`` onto an Anthropic Messages kwargs dict.

    The Nous provider profile is only consulted by the OpenAI-wire transport;
    anthropic_messages callers must merge it themselves. Passes ``session_id``
    only â€” not ``provider_preferences`` (those become a top-level ``provider``
    routing object on the OpenAI wire). Never blocks a turn on tagging.
    rU   N>   ÚnousÚnousresearchúnous-portalr   ©Úget_provider_profiler…   Ú
extra_bodyÚ
session_id)r‹   z'Nous Portal extra_body merge failed: %s)	rY   Ú	providersr‰   Ú
setdefaultÚupdateÚbuild_extra_bodyÚ	Exceptionrm   Údebug)rZ   rƒ   r‰   Únous_profileÚexcs        r&   Ú&_merge_nous_portal_messages_extra_bodyr”   Ç   sï   € õ ˆu�j $Ñ'Ô'Ð/VÐVÐVØÐðEØ2Ð2Ð2Ð2Ð2Ð2à+Ð+¨FÑ3Ô3ˆØÐ#Ø×'Ò'¨°bÑ9Ô9×@Ò@Ø×-Ò-Ý& u¨l¸DÑAÔAð .ñ ô ñô ð øøõ
 ð Eð Eð EÝ�ŠÐ>ÀÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøàÐs   —AA7 Á7
B&ÂB!Â!B&Únamer8   Údefaultc                ó”   — 	 t          t          j        | t          |¦  «        ¦  «        ¦  «        S # t          t
          f$ r |cY S w xY wr!   )r^   ÚosÚgetenvr8   Ú	TypeErrorÚ
ValueError)r•   r–   s     r&   Ú
_env_floatrœ   à   sP   € ðÝ•R”Y˜t¥S¨¡\¤\Ñ2Ô2Ñ3Ô3Ð3øÝ•zÐ"ð ð ð Øˆˆˆðøøøs   ‚.1 ±AÁAÚchunkc                óÐ  — d}	 t          | dd¦  «        }|ròt          |d         dd¦  «        }|�ØdD ]:}t          ||d¦  «        }t          |t          ¦  «        r|t          |¦  «        z  }Œ;t          |dd¦  «        }|rˆ|D ]…}t          |dd¦  «        }|�pt          |d	d¦  «        }	t          |	t          ¦  «        r|t          |	¦  «        z  }t          |d
d¦  «        }
t          |
t          ¦  «        r|t          |
¦  «        z  }Œ†nLdD ]I}t          t          | dd¦  «        |d¦  «        }t          |t          ¦  «        r|t          |¦  «        z  }ŒJn# t          $ r Y nw xY w|S )u   Cheap per-chunk size estimate for the stream diagnostic counters.

    The previous implementation used ``len(repr(chunk))`` â€” a full recursive
    repr of a pydantic model on EVERY streaming chunk (5.5-8.8 Âµs each,
    ~20-30 ms of pure CPU on a 3,000-chunk response, in the hottest loop in
    the agent). The counter only feeds a retry-diagnostic log line, so an
    estimate based on the delta payload lengths is plenty (2.1-2.4 Âµs, ~3x
    cheaper, and independent of model/pydantic field count). Chat Completions
    chunks are sized from their delta content/reasoning/tool-argument strings
    plus a small framing constant; anything shape-unknown (Anthropic events,
    stub providers) falls back to a flat constant so `bytes` stays monotonic
    and roughly proportional to traffic.
    é(   ÚchoicesNr   Údelta)ÚcontentÚreasoning_contentÚ	reasoningÚ
tool_callsÚfunctionÚ	argumentsr•   )ÚtextÚpartial_json)rY   r7   r8   r9   r�   )r�   Úsizer    r¡   ÚattrÚvr¥   ÚtcÚfnÚargsr•   s              r&   Ú_estimate_chunk_bytesr°   ç   s   € ð €DðÝ˜% ¨DÑ1Ô1ˆØð 	#Ý˜G AœJ¨°Ñ6Ô6ˆEØÐ ØIð 'ð '�DÝ  t¨TÑ2Ô2�AÝ! !¥SÑ)Ô)ð 'Ø¥ A¡¤™˜øÝ$ U¨L¸$Ñ?Ô?�
Øð 	2Ø(ð 2ð 2˜Ý$ R¨°TÑ:Ô:˜Ø˜>Ý#*¨2¨{¸DÑ#AÔ#A˜DÝ)¨$µÑ4Ô4ð 2Ø $­¨D©	¬	Ñ 1 Ý#*¨2¨v°tÑ#<Ô#<˜DÝ)¨$µÑ4Ô4ð 2Ø $­¨D©	¬	Ñ 1 øøð 1ð #ð #�Ý�G E¨7°DÑ9Ô9¸4ÀÑFÔF�Ý˜a¥Ñ%Ô%ð #Ø�C ™FœF‘N�DøøøÝð ð ð Øˆðøøøà€Ks   „EE Å
E#Å"E#Ústale_timeoutÚttfb_enabledÚttfb_timeoutÚlast_event_tsúOptional[float]Ú
call_startÚidle_enabledÚidle_timeoutÚelapsedc                ó   — g }t          j        | ¦  «        r|                     | ¦  «         |€,|r)t          j        |¦  «        r|                     |¦  «         n?|r=t          j        |¦  «        r)|                     t          d||z
  ¦  «        |z   ¦  «         |rt	          |¦  «        |k    rdS dt          t	          |¦  «        ¦  «        › d�S )zBDescribe the earliest enabled Codex watchdog on the call timeline.Nrd   rS   ú; auto-reconnect at Ús)ÚmathÚisfiniteÚappendÚmaxÚminr2   )	r±   r²   r³   r´   r¶   r·   r¸   r¹   Ú	deadliness	            r&   Ú_codex_wait_notice_recoveryrÃ     sâ   € ð  €IÝ„}�]Ñ#Ô#ð (Ø×Ò˜Ñ'Ô'Ð'ØÐØð 	+�DœM¨,Ñ7Ô7ð 	+Ø×Ò˜\Ñ*Ô*Ð*øØ	ð N�$œ-¨Ñ5Ô5ð NØ×Ò�˜S -°*Ñ"<Ñ=Ô=ÀÑLÑMÔMÐMØð �˜I™œ¨'Ò1Ð1ØˆrØ8¥#¥c¨)¡n¤nÑ"5Ô"5Ð8Ð8Ð8Ð8r(   c                óf   — 	 t          t          | dd¦  «        pd¦  «        S # t          $ r Y dS w xY w)NÚ_consecutive_stale_streamsr   )r2   rY   r�   ©rZ   s    r&   Ú_stale_streakrÇ   :  sI   € ðÝ•7˜5Ð">ÀÑBÔBÐGÀaÑHÔHÐHøÝð ð ð Øˆqˆqðøøøs   ‚" ¢
0¯0ÚNonec                óX   — 	 t          | ¦  «        dz   | _        d S # t          $ r Y d S w xY w)Né   )rÇ   rÅ   r�   rÆ   s    r&   Ú_bump_stale_streakrË   A  sD   € ðÝ+8¸Ñ+?Ô+?À!Ñ+CˆÔ(Ð(Ð(øÝð ð ð Øˆˆðøøøs   ‚ ›
)¨)c                ó8   — 	 d| _         d S # t          $ r Y d S w xY wr6   )rÅ   r�   rÆ   s    r&   Ú_reset_stale_streakrÍ   H  s7   € ðØ+,ˆÔ(Ð(Ð(øÝð ð ð Øˆˆðøøøs   ‚ ‹
˜F)ÚinlineÚhintÚ
api_kwargsrÎ   rÏ   c          
     óL  — |                      dd¦  «        }t                               d|rdnd|||t          |¦  «        d›¦  «         	 |                      dt          |¦  «        › d|› d	|pd
› �¦  «         dS # t          $ r  t                               dd¬¦  «         Y dS w xY w)u�  Emit the user/operator-facing trio for a stale non-streaming kill.

    Shared by the interrupt-worker poll loop and the inline
    ``direct_api_call`` watchdog so the log line, status message, and
    activity token stay identical across both paths. Only reporting lives
    here â€” the kill/state sequences differ deliberately between the two
    callers (locking models are not the same).
    ÚmodelÚunknownzk%son-streaming API call stale for %.0fs (threshold %.0fs). model=%s context=~%s tokens. Killing connection.zInline nÚNÚ,õ%   âš ï¸� No response from provider for zs (non-streaming, model: z). zAborting call.zstale status buffering failedT©Úexc_infoN)rL   rm   rn   rO   Ú_buffer_statusr2   r�   r‘   )rZ   rÐ   r¹   r±   rÎ   rÏ   rÒ   s          r&   Ú_report_stale_nonstream_killrÚ   O  sÿ   € ð" �NŠN˜7 IÑ.Ô.€EÝ
‡N‚Nð	;àÐ%ˆ
ˆ
 #ØØØÝ*¨:Ñ6Ô6Ð:Ð:ñô ð ðEØ×ÒðKµC¸±L´Lð Kð KØ&+ðKð KØ04Ð0HÐ8HðKð Kñ	
ô 	
ð 	
ð 	
ð 	
øõ ð Eð Eð EÝ�ŠÐ4¸tˆÑDÔDÐDÐDÐDÐDðEøøøs   Á
-A9 Á9&B#Â"B#c                ó®   — 	 |                       dt          |¦  «        › d�¦  «         d S # t          $ r  t                               dd¬¦  «         Y d S w xY w)Nz&stale non-streaming call killed after r¼   zstale activity touch failedTr×   )Ú_touch_activityr2   r�   rm   r‘   )rZ   r¹   s     r&   Ú_touch_stale_kill_activityrÝ   s  s   € ðCØ×ÒØDµS¸±\´\ÐDÐDÐDñ	
ô 	
ð 	
ð 	
ð 	
øõ ð Cð Cð CÝ�ŠÐ2¸TˆÑBÔBÐBÐBÐBÐBðCøøøs   ‚&* ª&AÁAc                ó†   — t          dd¦  «        }t          | ¦  «        }|dk    r||k    rt          d|› d�¦  «        ‚dS dS )u„   Raise immediately when the consecutive-stale streak is past the
    give-up threshold â€” no network attempt, no stale-timeout wait.ÚHERMES_STREAM_STALE_GIVEUPé   r   z:Provider has been unresponsive (no response received) for u‚    consecutive stale attempts â€” aborting this call to avoid an indefinite stall. Switch models or start a new session, then retry.N)r   rÇ   ÚRuntimeError)rZ   Ú_giveupÚ_streaks      r&   Ú_check_stale_giveuprä   |  sj   € õ Ð2°AÑ6Ô6€GÝ˜EÑ"Ô"€GØ�‚{€{�w 'Ò)Ð)Ýð#Øð#ð #ð #ñ
ô 
ð 	
ð €{Ð)Ð)r(   c                óØ  — t          | j        | j        ¦  «        }|�|}nt          dd¦  «        }t	          |¦  «        }|dk    rt          |d¦  «        }n|dk    rt          |d¦  «        }n|}dd	lm} |                     d
¦  «        p|                     d¦  «        pd} ||¦  «        }|€*|                     d¦  «        rt          |d         ¦  «        }|�t          ||¦  «        }|S )uò  Stale-stream patience for a provider that is never a local endpoint.

    Mirrors the main streaming path's derivation â€” provider config â†’ env base
    â†’ context-size scaling â†’ reasoning-model floor â€” minus the local-endpoint
    ``float('inf')``/900s disable branch, which cannot apply to Bedrock (its
    endpoint is always the AWS cloud). Factored so the Bedrock streaming
    watchdog shares the exact same patience budget as the OpenAI/Anthropic
    stale-stream detector below.
    NÚHERMES_STREAM_STALE_TIMEOUTç     €f@r`   ç     Àr@ra   ç      n@r   ©Ú!get_reasoning_stale_timeout_floorrÒ   ÚmodelIdrS   )
r	   rU   rÒ   r   rO   rÀ   Úagent.reasoning_timeoutsrë   rL   Ú_bedrock_reasoning_stale_floor)	rZ   rÐ   Ú
_cfg_staleÚ_baseÚ_est_tokensÚ_timeoutrë   Ú	_model_idÚ_reasoning_floors	            r&   Ú_derive_stream_stale_timeoutrõ   Š  s  € õ ,¨E¬N¸E¼KÑHÔH€JØÐØˆˆåÐ7¸Ñ?Ô?ˆÝ1°*Ñ=Ô=€KØ�WÒÐÝ�u˜eÑ$Ô$ˆˆØ	�vÒ	Ð	Ý�u˜eÑ$Ô$ˆˆàˆØJÐJÐJÐJÐJÐJð —’˜wÑ'Ô'ÐJ¨:¯>ª>¸)Ñ+DÔ+DÐJÈ€IØ8Ð8¸ÑCÔCÐØÐ J§N¢N°9Ñ$=Ô$=ÐÝ9¸*ÀYÔ:OÑPÔPÐØÐ#Ý�xÐ!1Ñ2Ô2ˆØ€Or(   Úmodel_idÚobjectú'float | None'c                óŠ  — ddl m} | rt          | t          ¦  «        sdS |                      ¦   «                              ¦   «         }dD ]0}|                     |¦  «        r|t          |¦  «        d…         } nŒ1|g}d|v rY|                     | 	                    dd¦  «        d         ¦  «         |                     | 
                    ddd¦  «        ¦  «         g }|D ]O}t          j        dd|¦  «        }t          j        d	d|¦  «        }|||fD ]}	|	|vr|                     |	¦  «         ŒŒP|D ]} ||¦  «        }
|
�|
c S ŒdS )
u¨  Map a Bedrock inference-profile id to its reasoning stale-timeout floor.

    Bedrock carries the model as a dotted, region-prefixed id such as
    ``us.anthropic.claude-opus-4-6-v1:0``, whereas
    :func:`get_reasoning_stale_timeout_floor` anchors its slug patterns at the
    start of a bare slug (``claude-opus-4``). Strip the region prefix
    (``us.``/``eu.``/``apac.``/...) and try two candidate slugs against the
    floor:

    * the segment after the provider namespace (``claude-opus-4-6-v1:0``) â€”
      matches Anthropic-style slugs whose floor key excludes the provider
      (``claude-opus-4``); and
    * the region-stripped id with the provider dot rewritten to a dash
      (``deepseek-r1-v1:0``) â€” matches provider-qualified floor keys
      (``deepseek-r1``).

    The floor's right-anchor (``$`` or ``-``/``.``/``_``) tolerates the
    trailing date-stamp / ``-v1:0`` version suffix, so no suffix stripping is
    needed. First non-None wins; returns None for unknown models.

    The floor table mixes version-separator conventions: some keys are
    keyed with a dashed version (``claude-opus-4``) while others embed a
    dotted version (``claude-sonnet-4.5``, ``claude-sonnet-4.6``). Bedrock
    always dashes the version (``claude-sonnet-4-5-v1:0``), so for every
    candidate slug we also try the alternate version-separator form â€”
    digit-dash-digit rewritten to digit-dot-digit and vice-versa â€” so a
    dashed Bedrock id matches a dotted floor key (and the reverse). The
    rewrite only touches version-number separators (a dash/dot flanked by
    digits), never other dashes in the slug, so ``claude-sonnet`` is left
    intact while ``4-5`` becomes ``4.5``.
    r   rê   N)zglobal.zus.zeu.zapac.zap.zau.zjp.zca.zsa.zme.zaf.ú.rÊ   Ú-z(?<=\d)-(?=\d)z(?<=\d)\.(?=\d))rí   rë   r7   r8   rj   rk   Ú
startswithr9   r¿   ÚrsplitÚreplaceÚreÚsub)rö   rë   r•   ÚprefixÚbase_candidatesÚ
candidatesÚcandÚdashed_to_dottedÚdotted_to_dashedÚformÚfloors              r&   rî   rî   °  sª  € ð@ KÐJÐJÐJÐJÐJàð �: hµÑ4Ô4ð ØˆtØ�>Š>ÑÔ×!Ò!Ñ#Ô#€Dðð ð ˆð �?Š?˜6Ñ"Ô"ð 	Ø�˜F™œ˜˜Ô%ˆDØˆEð	ð �f€OØ
ˆd€{€{Ø×Ò˜tŸ{š{¨3°Ñ2Ô2°1Ô5Ñ6Ô6Ð6Ø×Ò˜tŸ|š|¨C°°aÑ8Ô8Ñ9Ô9Ð9Ø€JØð (ð (ˆõ œ6Ð"3°S¸$Ñ?Ô?ÐÝœ6Ð"4°c¸4Ñ@Ô@ÐØÐ+Ð-=Ð>ð 	(ð 	(ˆDØ˜:Ð%Ð%Ø×!Ò! $Ñ'Ô'Ð'øð	(ð ð ð ˆØ1Ð1°$Ñ7Ô7ˆØÐØˆLˆLˆLð àˆ4r(   c          	     óŽ  — | j         dk    r2 |d¦  «        }|                      ||t          | dd¦  «        ¬¦  «        S | j         dk    r$ |dd¬¦  «        }|                      ||¬	¦  «        S | j         d
k    r†ddlm}m}m}m} | 	                    dd¦  «        }| 	                    dd¦  «          ||¦  «        }		  |	j
        di |¤Ž}
n)# t          $ r} ||¦  «        r ||¦  «         ‚ d}~ww xY w ||
¦  «        S | j        dk    r | j        j        j        j        di |¤ŽS  |d¦  «        } |j        j        j        di |¤ŽS )um  Run one non-streaming LLM request for the active api_mode and return it.

    Shared by the interrupt-worker path (``interruptible_api_call``) and the
    inline path (``direct_api_call``) so the per-api_mode dispatch â€” codex /
    anthropic / bedrock / MoA / OpenAI-compatible â€” lives in exactly one place.

    ``make_client(reason, kind=...)`` builds the per-request client for the
    codex / OpenAI-compatible (``kind="openai"``) and anthropic
    (``kind="anthropic_messages"``) branches; the worker path uses it to
    register the client with its stranger-thread abort machinery, the inline
    path uses it to capture the client for its own ``finally`` close. The
    bedrock / MoA branches manage their own clients and never call it. All
    interrupt, abort, cancellation, and close semantics stay in the callers â€”
    this helper only issues the request.
    Úcodex_responsesÚcodex_stream_requestÚ_codex_on_first_deltaN)ÚclientÚon_first_deltaÚanthropic_messagesÚanthropic_messages_request©Úkind)r  Úbedrock_converser   )Ú_get_bedrock_runtime_clientÚinvalidate_runtime_clientÚis_stale_connection_errorÚnormalize_converse_responseÚ__bedrock_region__ú	us-east-1Ú__bedrock_converse__ÚmoaÚchat_completion_requestr?   )Úapi_modeÚ_run_codex_streamrY   Ú_anthropic_messages_createÚagent.bedrock_adapterr  r  r  r  ÚpopÚconverser�   rU   r  ÚchatÚcompletionsÚcreate)rZ   rÐ   Úmake_clientÚrequest_clientr  r  r  r  Úregionr  Úraw_responseÚ_bedrock_excs               r&   Ú"_dispatch_nonstreaming_api_requestr+  ñ  sû  € ð  „~Ð*Ò*Ð*Ø$˜Ð%;Ñ<Ô<ˆØ×&Ò&ØØ!Ý" 5Ð*AÀ4ÑHÔHð 'ñ 
ô 
ð 	
ð
 „~Ð-Ò-Ð-ð %˜Ø(Ð/Cð
ñ 
ô 
ˆð ×/Ò/°
À>Ð/ÑRÔRÐRØ„~Ð+Ò+Ð+ð
	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð —’Ð 4°kÑBÔBˆØ�ŠÐ-¨tÑ4Ô4Ð4Ø,Ð,¨VÑ4Ô4ˆð	Ø*˜6œ?Ð8Ð8¨ZÐ8Ð8ˆLˆLøÝð 	ð 	ð 	ð )Ð(¨Ñ6Ô6ð 2Ø)Ð)¨&Ñ1Ô1Ð1Øøøøøð	øøøð +Ð*¨<Ñ8Ô8Ð8Ø„~˜ÒÐð 4ˆuŒ|Ô Ô,Ô3ÐAÐA°jÐAÐAÐAØ �[Ð!:Ñ;Ô;€NØ1ˆ>ÔÔ*Ô1Ð?Ð?°JÐ?Ð?Ð?s   Â<C
 Ã

C0ÃC+Ã+C0c                óþ   — t          | dd¦  «        dk    rdS t          | dd¦  «        dk    rdS t          | dd¦  «        dk    rd	S 	 d
dlm}  |¦   «         rd	S n# t          $ r Y nw xY wt          | dd¦  «        dk    S )u
  Whether an OpenAI-wire request should skip the interrupt worker.

    Two nested-pool contexts wedge before the socket opens when the request
    is pushed onto yet another daemon worker thread:

    - Gateway cron turns (#62151): gateway asyncio loop â†’ cron thread â†’
      interrupt worker. Fixed by running inline.
    - Delegated children (#60203): gateway loop â†’ async-delegation executor
      (module-lifetime daemon pool) â†’ per-child timeout executor â†’ interrupt
      worker. Same fingerprint after multi-day gateway uptime â€” children hang
      at their FIRST API call with zero stale-detector output (the worker
      never reaches dispatch), all providers, restart cures it. The cron fix
      originally excluded delegation "for lack of evidence"; #60203 is that
      evidence.

    Running inline drops the deepest thread layer (whose only job is
    interactive-interrupt responsiveness). Interrupts still work: the inline
    path registers ``agent._active_request_abort``, which ``interrupt()``
    invokes cross-thread to shut the active sockets â€” the same mechanism the
    async-delegation stall monitor (#72227) relies on.

    Keep native/Codex/Bedrock/MoA transports on their established workers:
    their cancellation and client ownership differ.
    r  NÚchat_completionsFrU   r  ÚplatformÚcronTr   )Úis_delegated_child_contextÚsubagent)rY   Úagent.delegation_contextr0  r�   )rZ   r0  s     r&   Úshould_use_direct_api_callr3  0  sÂ   € õ2 ˆu�j $Ñ'Ô'Ð+=Ò=Ð=ØˆuÝˆu�j $Ñ'Ô'¨5Ò0Ð0ØˆuÝˆu�j $Ñ'Ô'¨6Ò1Ð1ØˆtðØGÐGÐGÐGÐGÐGà%Ð%Ñ'Ô'ð 	Ø�4ð	øåð ð ð Øˆðøøøå�5˜* dÑ+Ô+¨zÒ9Ð9s   ÁA Á
A'Á&A'g      .@c                ó  — t          | dd¦  «        }t          |¦  «        st          d¦  «        S  ||¦  «        }t          |t          ¦  «        st          |t
          t          f¦  «        st          d¦  «        S t          |¦  «        S )u+  Stale budget for the inline non-streaming call.

    Same derivation the interrupt-worker path uses for its stale-call
    detector (provider ``stale_timeout_seconds`` â†’
    ``HERMES_API_CALL_STALE_TIMEOUT`` â†’ reasoning-model floor â†’ context-size
    scaling, ``inf`` for a local endpoint on the implicit default), so cron and
    delegated turns get exactly the patience every other non-streaming request
    already gets.

    A non-numeric result â€” an agent stub that never implements the resolver â€”
    leaves the watchdog disarmed rather than arming it on a bogus budget.
    A resolver that *raises* propagates, exactly as it does on the worker
    path's stale detector: swallowing it into ``inf`` would silently disarm
    the watchdog and reinstate the unbounded hang this exists to fix.
    Ú!_compute_non_stream_stale_timeoutNÚinf)rY   Úcallabler^   r7   rP   r2   )rZ   rÐ   Úresolverr4   s       r&   Ú_resolve_direct_stale_timeoutr9  d  s€   € õ  �uÐAÀ4ÑHÔH€HÝ�HÑÔð Ý�U‰|Œ|ÐØˆH�ZÑ Ô €EÝ�%�ÑÔð ¥j°½½e¸Ñ&EÔ&Eð Ý�U‰|Œ|ÐÝ�‰<Œ<Ðr(   c           	     óB  ‡ ‡‡‡‡‡‡‡— t          ‰ ¦  «         ‰                      d¦  «         dddddœŠt          j        ¦   «         Št          j        ¦   «         Šd$ˆ ˆˆfd	„Šd%d&ˆˆ ˆˆˆˆfd„}d'ˆˆ fd„}t          j        |dd¬¦  «        }t          j        ¦   «         Št          ‰ ‰¦  «        Š|                     ¦   «          d'ˆˆ ˆˆˆfd„}d}t          j
        ‰¦  «        r=‰dk    r7t          j        ‰|¦  «        }d|_        d|_        |                     ¦   «          d}	 t          ‰ ‰|¬¦  «        }t          ‰ dd¦  «        rt!          d¦  «        ‚‰5  d‰d<   ddd¦  «         n# 1 swxY w Y   t#          ‰ ¦  «         d}||�|                     ¦   «          ‰5  d‰d<   ddd¦  «         n# 1 swxY w Y   ‰                     ¦   «          |                     d¬¦  «         t          ‰ dd¦  «        ‰u rd‰ _        ‰5  ‰d         }	d‰d<   ddd¦  «         n# 1 swxY w Y   |	�‰                      |	|rdnd¬¦  «         S S # t.          $ rŒ t          ‰ dd¦  «        rt!          d¦  «        d‚‰5  ‰d          }
ddd¦  «         n# 1 swxY w Y   |
rEt1          d!t3          t          j        ¦   «         ‰z
  ¦  «        › d"t3          ‰¦  «        › d#�¦  «        d‚‚ w xY w# |�|                     ¦   «          ‰5  d‰d<   ddd¦  «         n# 1 swxY w Y   ‰                     ¦   «          |                     d¬¦  «         t          ‰ dd¦  «        ‰u rd‰ _        ‰5  ‰d         }	d‰d<   ddd¦  «         n# 1 swxY w Y   |	�‰                      |	|rdnd¬¦  «         w w xY w)(uj  Run a non-streaming LLM call inline on the conversation thread.

    Used when ``should_use_direct_api_call`` is True (cron turns and
    delegated children). Skips the interrupt worker (whose only job is
    interactive-interrupt responsiveness, which these contexts do not have)
    so the nested-pool deadlock (#62151, #60203) cannot occur.

    While the inline request blocks, a lightweight activity heartbeat keeps
    ``last_activity_ts`` advancing. Subagents use this path (non-streaming),
    and without mid-call ticks the async stall monitor / sync heartbeat treat
    a slow-but-healthy local model wait as "no progress" and interrupt around
    450s â€” surfacing as ``Operation interrupted: waiting for model response``.

    A stale-call watchdog bounds the request the same way the interrupt
    worker's poll loop does (#80759). The httpx read timeout alone is not a
    usable bound: it defaults to 1800s and a provider that accepts the request
    and then goes silent (connection held open, zero bytes, no error) never
    trips it, so a cron run hangs until something external kills it â€” which
    also orphans the execution row. The watchdog aborts the in-flight sockets
    through the already-registered abort hook and surfaces a retryable
    ``TimeoutError`` so the outer retry loop reconnects with backoff /
    credential rotation / provider fallback.
    ú&waiting for non-streaming API responseNF)r  ÚdoneÚstaleÚ	cancelledÚreasonr8   r1   rP   c                ó¤  •— ‰5  ‰d         r	 ddd¦  «         dS | dk    r‰d         r	 ddd¦  «         dS | dk    rd‰d<   | dk    o‰d          }|rd‰d<   t          ‰¦  «         ‰d         }|�F	 ‰                     || ¬	¦  «         n-# t          $ r  t                               d
| d¬¦  «         Y nw xY w|cddd¦  «         S # 1 swxY w Y   dS )zùAbort the inline request from a watchdog/interrupt thread.

        Returns True when this call owned the stale transition (so the
        timer callback only reports/bumps once, and never after an
        interrupt or a completed request).
        r<  NFÚstale_call_killr>  Tr=  r  ©r?  z Inline request abort failed (%s)r×   )rË   Ú_abort_request_openai_clientr�   rm   r‘   )r?  Únewly_staler'  rZ   Úrequest_client_lockÚrequest_states      €€€r&   Ú_abort_active_requestz.direct_api_call.<locals>._abort_active_request¡  s»  ø€ ð !ð 	ð 	Ø˜VÔ$ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð Ð*Ò*Ð*¨}¸[Ô/IÐ*Øð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð
 Ð*Ò*Ð*ð
 .2�˜kÑ*Ø Ð$5Ò5ÐT¸mÈGÔ>TÐ:TˆKØð *Ø)-�˜gÑ&õ
 # 5Ñ)Ô)Ð)Ø*¨8Ô4ˆNØÐ)ðØ×6Ò6°~ÈfÐ6ÑUÔUÐUÐUøÝ ð ð ð Ý—L’LØ:¸FÈTð !ñ ô ð ð ð ðøøøð ð7	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s?   „
C›C·:CÁ2B
Â	CÂ
'B4Â1CÂ3B4Â4CÃC	ÃC	Úopenair  c                óh  •— ‰                      | ‰¬¦  «        }d}‰5  |‰d<   ‰d         rGd}	 ‰                     |d¬¦  «         n,# t          $ r t                               dd¬	¦  «         Y nw xY wd d d ¦  «         n# 1 swxY w Y   |r t          d
t          ‰	¦  «        › d�¦  «        ‚‰‰_        |S )N©r?  rÐ   Fr  r=  TrA  rB  z2Inline abort after late client registration failedr×   zENon-streaming API call timed out before request dispatch (threshold: ús))Ú_create_request_openai_clientrC  r�   rm   r‘   ÚTimeoutErrorr2   Ú_active_request_abort)
r?  r  r  Ústale_before_dispatchrG  rZ   rÐ   rE  rF  r±   s
       €€€€€€r&   Ú_make_clientz%direct_api_call.<locals>._make_clientË  s\  ø€ ð
 ×4Ò4¸FÈzÐ4ÑZÔZˆØ %ÐØ ð 	ð 	Ø&,ˆM˜(Ñ#Ø˜WÔ%ð ð )-Ð%ðØ×6Ò6ØÐ'8ð 7ñ ô ð ð øõ !ð ð ð Ý—L’LØLØ!%ð !ñ ô ð ð ð ðøøøð!	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð* !ð 	Ýð6Ý" =Ñ1Ô1ð6ð 6ð 6ñô ð ð '<ˆÔ#Øˆs4   �A>®AÁA>Á&A/Á,A>Á.A/Á/A>Á>BÂBrÈ   c                 óÂ   •— ‰                       t          ¦  «        sC	 ‰                     d¦  «         n# t          $ r Y nw xY w‰                       t          ¦  «        ¯Ad S d S )Nr;  )ÚwaitÚ&_DIRECT_API_ACTIVITY_HEARTBEAT_SECONDSrÜ   r�   )Úactivity_hb_stoprZ   s   €€r&   Ú_activity_heartbeatz,direct_api_call.<locals>._activity_heartbeatï  s†   ø€ ð #×'Ò'Õ(NÑOÔOð 	ðØ×%Ò%Ð&NÑOÔOÐOÐOøÝð ð ð Ø�ðøøøð #×'Ò'Õ(NÑOÔOð 	ð 	ð 	ð 	ð 	s   �3 ³
A ¿A zdirect-api-activity-hbT)Útargetr•   Údaemonc                 ó–   •—  ‰d¦  «        sd S t          j         ¦   «         ‰z
  } t          ‰‰| ‰d¬¦  «         t          ‰| ¦  «         d S )NrA  T)rÎ   )ÚtimerÚ   rÝ   )r¹   rG  rZ   rÐ   r¶   r±   s    €€€€€r&   Ú	_on_stalez"direct_api_call.<locals>._on_stale  sh   ø€ ð %Ð$Ð%6Ñ7Ô7ð 	ØˆFÝ”)‘+”+ 
Ñ*ˆÝ$Ø�:˜w¨¸dð	
ñ 	
ô 	
ð 	
õ 	# 5¨'Ñ2Ô2Ð2Ð2Ð2r(   r   zdirect-api-stale-watchdog©r&  Ú_interrupt_requestedú!Agent interrupted during API callr<  ç       @©ÚtimeoutrN  r  Úrequest_completeÚrequest_error_cleanuprB  r=  ú'Non-streaming API call timed out after ús with no response (threshold: rK  )r?  r8   r1   rP   ©rH  )r?  r8   r  r8   ©r1   rÈ   )rä   rÜ   Ú	threadingÚLockÚEventÚThreadrY  r9  Ústartr½   r¾   ÚTimerr•   rW  r+  rY   ÚInterruptedErrorrÍ   ÚcancelÚsetro   rN  Ú_close_request_openai_clientr�   rM  r2   )rZ   rÐ   rP  rU  Úactivity_hbrZ  Ústale_watchdogÚ	succeededÚresponser'  Ú	was_stalerG  rT  r¶   rE  rF  r±   s   ``         @@@@@@r&   Údirect_api_callrv  }  s�  øøøøøøøø€ õ0 ˜ÑÔÐØ	×ÒÐBÑCÔCÐCð  $¨U¸UÐQVÐWÐW€MÝ#œ.Ñ*Ô*ÐÝ ”Ñ(Ô(Ðð(ð (ð (ð (ð (ð (ð (ð (ðT"ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ð "ðHð ð ð ð ð ð õ Ô"Ø"Ø%Øðñ ô €Kõ ”‘”€JÝ1°%¸ÑDÔD€MØ×ÒÑÔÐð3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð €NÝ„}�]Ñ#Ô#ð ¨¸Ò(9Ð(9Ý"œ¨¸	ÑBÔBˆØ9ˆÔØ $ˆÔØ×ÒÑÔÐð
 €Ið3Ý5Ø�:¨<ð
ñ 
ô 
ˆõ( �5Ð0°%Ñ8Ô8ð 	HÝ"Ð#FÑGÔGÐGð !ð 	)ð 	)Ø$(ˆM˜&Ñ!ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)å˜EÑ"Ô"Ð"Øˆ	ØàÐ%Ø×!Ò!Ñ#Ô#Ð#Ø ð 	)ð 	)Ø$(ˆM˜&Ñ!ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)à×ÒÑÔÐØ×Ò ÐÑ%Ô%Ð%Ý�5Ð1°4Ñ8Ô8Ð<QÐQÐQØ*.ˆEÔ'Ø ð 	+ð 	+Ø*¨8Ô4ˆNØ&*ˆM˜(Ñ#ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð Ð%Ø×.Ò.ØØ-6ÐSÐ)Ð)Ð<Sð /ñ ô ð ð ð &øõW ð ð ð Ý�5Ð0°%Ñ8Ô8ð 	RÝ"Ð#FÑGÔGÈTÐQØ ð 	/ð 	/Ø% gÔ.ˆIð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/àð 		õ
 ð6Ý•t”y‘{”{ ZÑ/Ñ0Ô0ð6ð 6å" =Ñ1Ô1ð6ð 6ð 6ñô ð ð	ð
 	ðøøøøð@ Ð%Ø×!Ò!Ñ#Ô#Ð#Ø ð 	)ð 	)Ø$(ˆM˜&Ñ!ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)à×ÒÑÔÐØ×Ò ÐÑ%Ô%Ð%Ý�5Ð1°4Ñ8Ô8Ð<QÐQÐQØ*.ˆEÔ'Ø ð 	+ð 	+Ø*¨8Ô4ˆNØ&*ˆM˜(Ñ#ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð Ð%Ø×.Ò.ØØ-6ÐSÐ)Ð)Ð<Sð /ñ ô ð ð ð &øøøsÔ   Ä#I Ä5"K ÅE)ÅK Å)E-Å-K Å0E-Å1K ÆF0Æ0F4	Æ7F4	ÈHÈH	È"H	É-KÉ2	JÉ;KÊJ	ÊKÊJ	ÊAKËK ËNË7L	Ë=NÌ	LÌNÌLÌA	NÍM4Í(NÍ4M8Í8NÍ;M8Í<"Nc           
     ó²  ‡ ‡‡‡‡‡‡‡ ‡!— t          ‰ ¦  «        rt          ‰ ‰¦  «        S dddœŠ!t          ‰ ¦  «         dddœŠddiŠt          j        ¦   «         Š ddiŠddœdYˆˆˆ fd
„ŠdZˆ ˆˆˆ fd„Šˆˆˆˆ ˆˆ!fd„}‰                      ‰¦  «        }‰ j        dk    }t          ‰ ¦  «        }t          ‰¦  «        }|r#|r!t          |¦  «        }|rt          ||¦  «        }t          dd¦  «        }|r|r|dk    rt          ||¦  «        }|dk    rd}	n|dk    rd}	n|dk    rd}	nd}	|}
t          dd¦  «        }|dk    rd}
nÍ|rËt          dd¦  «        }t          j                             dd¦  «                             ¦   «                              ¦   «         d v }|s6|dk    r0||k    r*|	}||k     r"t$                               d!|||d"›|¦  «         |}t          d#d¦  «        }|dk    r'||k    r!t$                               d$|||d"›¦  «         |}|}t          d%|	¦  «        }|dk    rd}|rd‰ _        d‰ _        t-          j        ¦   «         }‰                      d&¦  «         t          j        t3          |¦  «        d'¬(¦  «        }|                     ¦   «          d}|                     ¦   «         �rý|                     d)¬*¦  «         |d+z  }|d,z  dk    rªt-          j        ¦   «         |z
  }	 t;          ||
|t=          ‰ d-d¦  «        ||||¬.¦  «        }‰                      d/‰                     d0d1¦  «        › d2tA          |¦  «        › d3|› d4�¦  «         n,# tB          $ r t$           "                    d5d'¬6¦  «         Y nw xY wt-          j        ¦   «         |z
  }|
�r||k    �rt=          ‰ d-d¦  «        �€d}t=          ‰ d7d¦  «        }tG          |¦  «        r3	  |‰                     d0¦  «        ¬8¦  «        }n# tB          $ r d}Y nw xY wt$           $                    d9||‰                     d0d:¦  «        ¦  «         |r@‰  %                    d;tA          |¦  «        › d<‰                     d0d:¦  «        › d=|› �¦  «         n=‰  %                    d;tA          |¦  «        › d<‰                     d0d:¦  «        › d>�¦  «         	  ‰d?¦  «         n# tB          $ r Y nw xY w‰                      d@tA          |¦  «        › dA�¦  «         ‰                      dBtA          |¦  «        › dC�¦  «         |                     dD¬*¦  «         ‰!dE         €s‰!dF         €k|r6tM          dGtA          |¦  «        › dHtA          |¦  «        › dI|› �¦  «        ‰!dE<   n3tM          dGtA          |¦  «        › dHtA          |¦  «        › dJ�¦  «        ‰!dE<   �nüt=          ‰ d-d¦  «        }|�rC|��@t-          j        ¦   «         |z
  |k    �r%t-          j        ¦   «         |z
  }t$           $                    dK||‰                     d0d:¦  «        |d"›¦  «         ‰  %                    dLtA          |¦  «        › dM‰                     d0d:¦  «        › d>�¦  «         	  ‰dN¦  «         n# tB          $ r Y nw xY w‰                      dBtA          |¦  «        › dO�¦  «         |                     dD¬*¦  «         ‰!dE         €;‰!dF         €3tM          dPtA          |¦  «        › dQtA          |¦  «        › dJ�¦  «        ‰!dE<   �n¥||k    �r7d}t=          ‰ d7d¦  «        }tG          |¦  «        r3	  |‰                     d0¦  «        ¬8¦  «        }n# tB          $ r d}Y nw xY wtO          ‰ ‰|||¬R¦  «         	  ‰dS¦  «         n# tB          $ r Y nw xY wtQ          ‰ ¦  «         tS          ‰ |¦  «         |                     dD¬*¦  «         ‰!dE         €s‰!dF         €k|r6tM          dTtA          |¦  «        › dUtA          |¦  «        › dI|› �¦  «        ‰!dE<   n3tM          dTtA          |¦  «        › dUtA          |¦  «        › dJ�¦  «        ‰!dE<   ng‰ j*        rKd'‰d<   t$           "                    dV¦  «         	  ‰dW¦  «         n# tB          $ r Y nw xY wtW          dX¦  «        ‚|                     ¦   «         �°ý‰!dE         �‰!dE         ‚‰!dF         �tY          ‰ ¦  «         ‰!dF         S )[a=  
    Run the API call in a background thread so the main conversation loop
    can detect interrupts without waiting for the full HTTP round-trip.

    Each worker thread gets its own OpenAI client instance. Interrupts only
    close that worker-local client, so retries and other requests never
    inherit a closed transport.

    Includes a stale-call detector: if no response arrives within the
    configured timeout, the connection is killed and an error raised so
    the main retry loop can try again with backoff / credential rotation /
    provider fallback.
    N©rt  Úerror)r  Ú	owner_tidr4   rH  Fr  r  r8   c               ó|   •— ‰5  | ‰d<   |‰d<   t          j        ¦   «         ‰d<   d d d ¦  «         n# 1 swxY w Y   | S ©Nr  r4   rz  ©rg  Ú	get_ident©r  r  Úrequest_client_holderÚrequest_client_kindrE  s     €€€r&   Ú_set_request_clientz3interruptible_api_call.<locals>._set_request_client‚  s¢   ø€ Ø ð 	Gð 	GØ.4Ð! (Ñ+Ø+/Ð Ñ(õ 2;Ô1DÑ1FÔ1FÐ! +Ñ.ð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð ˆó   „!1±5¸5r?  r1   rÈ   c                ó0  •— ‰5  ‰                      d¦  «        }‰                      d¦  «        }|d uo|d uo|t          j        ¦   «         k    }|rW‰                      dd¦  «        dk    r‰                     || ¬¦  «         n‰                     || ¬¦  «         	 d d d ¦  «         d S d ‰d<   d ‰d<   d d d ¦  «         n# 1 swxY w Y   |€d S ‰                      dd¦  «        dk    r‰                     || ¬¦  «         d S ‰                     || ¬¦  «         d S )Nr  rz  r4   rH  r  rB  ©rL   rg  r~  Ú_abort_request_anthropic_clientrC  Ú_close_request_anthropic_clientrp  )r?  r'  rz  Ústranger_threadrZ   r€  r�  rE  s       €€€€r&   Ú_close_request_client_oncez:interruptible_api_call.<locals>._close_request_client_onceŒ  sÊ  ø€ ð !ð 	6ð 	6Ø2×6Ò6°xÑ@Ô@ˆNØ-×1Ò1°+Ñ>Ô>ˆIà dÐ*ð 7Ø TÐ)ð7à¥Ô!4Ñ!6Ô!6Ò6ð ð
 ð ð '×*Ò*¨7°HÑ=Ô=ÐAUÒUÐUØ×9Ò9Ø&¨vð :ñ ô ð ð ð ×6Ò6°~ÈfÐ6ÑUÔUÐUØð-	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð0 /3Ð! (Ñ+Ø15Ð! +Ñ.ð3	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð4 Ð!ØˆFØ×"Ò" 7¨HÑ5Ô5Ð9MÒMÐMØ×1Ò1°.ÈÐ1ÑPÔPÐPÐPÐPà×.Ò.¨~ÀfÐ.ÑMÔMÐMÐMÐMs   „BB=Â'
B=Â=CÃCc                 óx  •— 	 t          ‰‰d
ˆˆˆfd„	¬¦  «        ‰d<   nl# t          $ r_} ‰d         rHt                               dt	          | ¦  «        j        ¦  «         Y d } ~  ‰‰d         �dnd¦  «         d S | ‰d	<   Y d } ~ nd } ~ ww xY w ‰‰d         �dnd¦  «         d S #  ‰‰d         �dnd¦  «         w xY w)NrH  c                ó€   •—  ‰|dk    r‰                      | ¬¦  «        n‰                     | ‰¬¦  «        |¬¦  «        S )Nr  rB  rJ  r  )Ú _create_request_anthropic_clientrL  )r?  r  r‚  rZ   rÐ   s     €€€r&   r'   z7interruptible_api_call.<locals>._call.<locals>.<lambda>Ä  sa   ø€ Ð:MÐ:MàÐ3Ò3Ð3ð ×:Ò:À&Ð:ÑIÔIÐIà×<Ò<Ø%°*ð =ñ ô ð ð;ñ ;ô ;€ r(   r[  rt  r4   uh   Non-streaming worker caught %s after request cancellation â€” exiting without surfacing a network error.ra  rb  ry  re  )r+  r�   rm   r‘   ÚtypeÚ__name__)Úer‰  Ú_request_cancelledr‚  rZ   rÐ   Úresults    €€€€€€r&   Ú_callz%interruptible_api_call.<locals>._callº  sj  ø€ ð(	õ "DØØðð ð ð ð ð ð ð"ñ "ô "ˆF�:ÑÐøõ ð 	 ð 	 ð 	 ð
 " 'Ô*ð Ý—’ðAå˜‘G”GÔ$ñô ð ð
 ���ð 'Ð&à˜*Ô%Ð1ð #Ð"à,ñô ð ð ð ð  ˆF�7‰OˆOˆOˆOˆOˆOøøøøð	 øøøð$ 'Ð&à˜*Ô%Ð1ð #Ð"à,ñô ð ð ð øÐ&Ð&à˜*Ô%Ð1ð #Ð"à,ñô ð ð øøøs7   ƒ žB" Ÿ
B©5BÁB" Á9BÁ>B" ÂBÂB" Â"B9r
  Ú!HERMES_CODEX_HARD_TIMEOUT_SECONDSg     p—@r   r`   rç   ra   ç      ^@rc   ç      N@g      (@Ú!HERMES_CODEX_TTFB_TIMEOUT_SECONDSÚ&HERMES_CODEX_TTFB_DISABLE_ABOVE_TOKENSg     ˆÃ@ÚHERMES_CODEX_TTFB_STRICTrS   >   Ú1ÚonÚyesÚtruez©Scaling openai-codex no-byte TTFB watchdog from %.0fs to %.0fs for large request (context=~%s tokens >= %.0f). Set HERMES_CODEX_TTFB_STRICT=1 to keep the smaller cutoff.rÕ   ÚHERMES_CODEX_TTFB_MAX_SECONDSz~Capping openai-codex no-byte TTFB timeout from %.0fs to %.0fs (context=~%s tokens). Set HERMES_CODEX_TTFB_MAX_SECONDS to tune.Ú(HERMES_CODEX_EVENT_STALE_TIMEOUT_SECONDSr;  T©rV  rW  ç333333Ó?r_  rÊ   éd   Ú_codex_stream_last_event_ts)r±   r²   r³   r´   r¶   r·   r¸   r¹   õ   â�³ waiting on rÒ   úthe providerõ    â€” z:s with no response yet (provider may be slow or overloadedú)zwait-notice construction failedr×   Ú_codex_silent_hang_hint©rÒ   z»Codex stream produced no bytes within TTFB cutoff (%.0fs > %.0fs, model=%s). Backend accepted the connection but sent no stream events. Killing connection so the retry loop can reconnect.rÓ   u&   âš ï¸� No first byte from provider in zs (codex stream, model: z). Reconnecting. z). Reconnecting.Úcodex_ttfb_killu!   âš  no response from provider in õ   s â€” reconnecting...zcodex stream killed after zs with no first byter^  ry  rt  z&Codex stream produced no bytes within zs (TTFB threshold: zs). rK  z£Codex stream produced no SSE events for %.0fs after first byte (threshold %.0fs, model=%s, context=~%s tokens). Killing connection so the retry loop can reconnect.u'   âš ï¸� Codex stream sent no events for zs after first byte (model: Úcodex_stream_idle_killzs with no SSE eventsz(Codex stream produced no SSE events for zs after first byte (threshold: )rÏ   rA  rc  rd  zBForce-closing httpx client due to interrupt (not a network error).Úinterrupt_abortr]  ©r  r8   ©r?  r8   r1   rÈ   )-r3  rv  rä   rg  rh  r5  r  r\   rO   re   rÀ   rœ   rÁ   r˜   ÚenvironrL   rj   rk   rm   Úinfor¢  Ú_codex_stream_last_progress_tsrY  rÜ   rj  r+   rk  Úis_alivero   rÃ   rY   Ú_emit_wait_noticer2   r�   r‘   r7  rn   rÙ   rM  rÚ   rË   rÝ   r\  rm  rÍ   )"rZ   rÐ   r’  Ú_stale_timeoutÚ_codex_watchdog_enabledÚ_openai_codex_backendÚ_est_tokens_for_codex_watchdogÚ_codex_floorÚ_codex_hard_timeoutÚ_codex_idle_timeout_defaultÚ_ttfb_enabledÚ_ttfb_timeoutÚ_ttfb_disable_aboveÚ_ttfb_strictÚ_large_request_ttfb_timeoutÚ	_ttfb_capÚ_codex_idle_enabledÚ_codex_idle_timeoutÚ_call_startÚtÚ_poll_countÚ_elapsedÚ	_recoveryÚ_silent_hintÚ_hint_fnÚ_last_codex_event_tsÚ_event_stale_elapsedr‰  r�  r‚  r€  r�  rE  r‘  s"   ``                         @@@@@@@r&   Úinterruptible_api_callrÌ  V  sˆ  øøøøøøøøø€ õ" " %Ñ(Ô(ð 2Ý˜u jÑ1Ô1Ð1à¨Ð.Ð.€Fõ ˜ÑÔÐà'+¸$Ð?Ð?Ðð # HÐ-ÐÝ#œ.Ñ*Ô*Ðð " 5Ð)Ðà3;ð ð ð ð ð ð ð ð ð ð ð,Nð ,Nð ,Nð ,Nð ,Nð ,Nð ,Nð ,Nð ,Nð\)ð )ð )ð )ð )ð )ð )ð )ð )ð )ðb ×<Ò<¸ZÑHÔH€Nð$ $œnÐ0AÒAÐÝ4°UÑ;Ô;ÐÝ%DÀZÑ%PÔ%PÐ"Øð ?Ð#8ð ?Ý7Ð8VÑWÔWˆØð 	?Ý  °Ñ>Ô>ˆNõ" %Ð%HÈ&ÑQÔQÐàðBà!ðBð   !Ò#Ð#å˜^Ð-@ÑAÔAˆà%¨Ò/Ð/Ø&+Ð#Ð#Ø	'¨&Ò	0Ð	0Ø&+Ð#Ð#Ø	'¨&Ò	0Ð	0Ø&*Ð#Ð#à&*Ð#ð ,€MÝÐBÀEÑJÔJ€MØ˜ÒÐØˆˆØ	ð &Ý(Ð)QÐS[Ñ\Ô\ÐÝ”z—~’~Ð&@À"ÑEÔE×KÒKÑMÔM×SÒSÑUÔUð Z
ð 
ˆð ð	<à# aÒ'Ð'Ø.Ð2EÒEÐEà*EÐ'ØÐ:Ò:Ð:Ý—’ðQð "Ø/Ø5Ð9Ð9Ø'ñô ð ð !<�ÝÐ>ÀÑFÔFˆ	Ø�qŠ=ˆ=˜]¨YÒ6Ð6Ý�KŠKðSàØØ1Ð5Ð5ñô ð ð &ˆMà1ÐÝ$Ø2Ø#ñô Ðð ˜aÒÐØ#Ðàð 4ð -1ˆÔ)Ø/3ˆÔ,å”)‘+”+€KØ	×ÒÐBÑCÔCÐCåÔÕ 6°uÑ =Ô =ÀdÐKÑKÔK€AØ‡G‚G�I„I€IØ€KØ
�*Š*‰,Œ,ñ BHØ	�Š�sˆÑÔÐØ�qÑˆð ˜Ñ Ò!Ð!Ý”y‘{”{ [Ñ0ˆHðOÝ7Ø"0Ø!.Ø!.Ý")ØÐ<¸dñ#ô #ð  +Ø!4Ø!4Ø$ðñ ô �	ð ×'Ò'ð1 j§n¢n°W¸nÑ&MÔ&Mð 1ð 1Ý˜8‘}”}ð1ð 1à$-ð1ð 1ð 1ñô ð ð øõ
 ð Oð Oð OÝ—’Ð>È�ÑNÔNÐNÐNÐNðOøøøõ ”9‘;”; Ñ,ˆð ñ7	à˜=Ò(Ñ(Ý˜Ð<¸dÑCÔCÑKà*.ˆLÝ˜uÐ&?ÀÑFÔFˆHÝ˜Ñ!Ô!ð (ð(Ø#+ 8°*·.².ÀÑ2IÔ2IÐ#JÑ#JÔ#J�L�LøÝ ð (ð (ð (Ø#'�L�L�Lð(øøøå�NŠNð&ð ˜-¨¯ª¸ÀÑ)KÔ)Kñô ð ð ð Ø×$Ò$ð4½SÀ¹]¼]ð 4ð 4Ø-7¯^ª^¸GÀYÑ-OÔ-Oð4ð 4à%1ð4ð 4ñô ð ð ð ×$Ò$ð%½SÀ¹]¼]ð %ð %Ø-7¯^ª^¸GÀYÑ-OÔ-Oð%ð %ð %ñô ð ð
Ø*Ð*Ð+<Ñ=Ô=Ð=Ð=øÝð ð ð Ø�ðøøøà×#Ò#ð#µC¸±M´Mð #ð #ð #ñô ð ð ×!Ò!ØP­S°©]¬]ÐPÐPÐPñô ð ð �FŠF˜3ˆFÑÔÐØ�gŒÐ&¨6°*Ô+=Ð+EØð 	Ý&2ðSÅÀXÁÄð Sð SÝ,/°Ñ,>Ô,>ðSð SØDPðSð Sñ'ô '�F˜7‘O�Oõ
 '3ðCÅÀXÁÄð Cð CÝ,/°Ñ,>Ô,>ðCð Cð Cñ'ô '�F˜7‘Oñ õ
  ' uÐ.KÈTÑRÔRÐàñ!	à$Ñ0Ý”‘”Ð3Ñ3Ð7JÒJÑJå#'¤9¡;¤;Ð1EÑ#EÐ Ý�NŠNð>ð %Ø#Ø—’˜w¨	Ñ2Ô2Ø1Ð5Ð5ñô ð ð × Ò ð!½#Ð>RÑ:SÔ:Sð !ð !Ø,6¯NªN¸7ÀIÑ,NÔ,Nð!ð !ð !ñô ð ð
Ø*Ð*Ð+CÑDÔDÐDÐDøÝð ð ð Ø�ðøøøà×!Ò!Ø\­SÐ1EÑ-FÔ-FÐ\Ð\Ð\ñô ð ð �FŠF˜3ˆFÑÔÐØ�gŒÐ&¨6°*Ô+=Ð+EÝ".ðQ½sÐCWÑ?XÔ?Xð Qð QÝ47Ð8KÑ4LÔ4LðQð Qð Qñ#ô #��w‘ñ ð �nÒ$Ñ$Ø*.ˆLÝ˜uÐ&?ÀÑFÔFˆHÝ˜Ñ!Ô!ð (ð(Ø#+ 8°*·.².ÀÑ2IÔ2IÐ#JÑ#JÔ#J�L�LøÝ ð (ð (ð (Ø#'�L�L�Lð(øøøå(Ø�z 8¨^À,ðñ ô ð ðð +Ð*Ð+<Ñ=Ô=Ð=Ð=øÝð ð ð Ø�ðøøøõ ˜uÑ%Ô%Ð%Ý& u¨hÑ7Ô7Ð7à�FŠF˜3ˆFÑÔÐØ�gŒÐ&¨6°*Ô+=Ð+EØð 
Ý&2ð*Å#ÀhÁ-Ä-ð *ð *Ý8;¸NÑ8KÔ8Kð*ð *à'ð*ð *ñ'ô '�F˜7‘O�Oõ '3ðPÅ#ÀhÁ-Ä-ð Pð PÝ8;¸NÑ8KÔ8KðPð Pð Pñ'ô '�F˜7‘Oð àÔ%ð 	Hð
 +/Ð˜wÑ'Ý�LŠLØTñô ð ðØ*Ð*Ð+<Ñ=Ô=Ð=Ð=øÝð ð ð Ø�ðøøøå"Ð#FÑGÔGÐGðE �*Š*‰,Œ,ñ BHðF ˆg„Ð"Ø�WŒoÐð ˆjÔÐ%Ý˜EÑ"Ô"Ð"Ø�*ÔÐs   Ë(A&M Í&M8Í7M8ÏO0 Ï0O?Ï>O?Ò3R? Ò?
SÓSÙ(Y4 Ù4
ZÚ ZÜ/] Ý]Ý]Ý6^ Þ
^Þ^á*a6 á6
bâbÚapi_messagesrC   Útools_for_apiúlist | Nonec                óø  ‡-— |€| j         }| j        dk    �r|                      ¦   «         }|                      |¦  «        }t	          | dd¦  «        }|r|j        nd}t	          | dd¦  «        }|�d| _        |                     | j        |||�|n| j	        | j
        | j        |                      ¦   «         |t	          | dd¦  «        | j        pi                      d¦  «        dk    t          t	          | dd	¦  «        ¦  «        ¬
¦  «        }t!          | |¦  «        S | j        dk    r_|                      ¦   «         }t	          | dd¦  «        pd}	t	          | dd¦  «        }
|                     | j        ||| j	        pd|	|
¬¦  «        S | j        dk    �r¾|                      ¦   «         }t#          | j        d¦  «        pt#          | j        d¦  «        }| j        dk    p| j        dk    od| j        v }| j        dv p
| j        dk    }|                      |¦  «        }ddlm}  || |||¬¦  «        }|r�	 ddl}ddlm}m} |                     |¦  «        } ||¦  «        \  }} ||¦  «        \  }}nB# t<          $ r5}t>                                dt	          | dd¦  «        |¦  «         Y d}~nd}~ww xY w|                     | j        ||| j
        t	          | d d¦  «        | j        | j	        |  !                    ¦   «         | j        t	          | d!d¦  «        ||||r|  "                    ¦   «         ndt          t	          | d"d#¦  «        ¦  «        |¬$¦  «        S |                      ¦   «         }|  #                    ¦   «         }|  $                    ¦   «         }t#          | j        d¦  «        pt#          | j        d¦  «        }d%| j        v }d&| j        v }t#          | j        d'¦  «        p)t#          | j        d(¦  «        pt#          | j        d)¦  «        }t#          | j        d*¦  «        }| j        pd %                    ¦   «          &                    ¦   «         d+k    }	 dd,l'm(}m)}   || j        | j        ¦  «        }!|!| u }"|"s|!nd}#n# t<          $ r d	}"d}#Y nw xY wtU          | ¦  «        }$d}%	 dd-l+m,}&m-}' | j        pd &                    ¦   «          .                    d.d/¦  «        Š-t_          ˆ-fd0„|'D ¦   «         ¦  «        r |&| j        ¦  «        }%n# t<          $ r Y nw xY wd}(|r*| j0        pd1tc          te          j3        ¦   «         ¦  «        d2œ}(	 dd3l4m5})  |)| j        ¦  «        }*n# t<          $ r d}*Y nw xY w|*r³t	          | dd¦  «        }+|+�d| _        |                      |¦  «        }|                     | j        ||| j        |  !                    ¦   «         | j	        |+| j6        | j
        | j        t	          | d d¦  «        |*| j7        |$pd| j8        |%|  9                    ¦   «         |(¬4¦  «        S t	          | dd¦  «        }+|+�d| _        |                      |¦  «        }, |j        dWi d5| j        “d6|,“d7|“d8| j        “d9|  !                    ¦   «         “d:| j	        “d;|+“d<| j6        “d=| j
        “d>| j        “d t	          | d d¦  «        “d?| j        pd &                    ¦   «         “d@|“dA|“dB|“dC|“dD|“dE|“dF|“dG|“dH| j        dIk    “dJ| j7        “dK|$pd“dL| j8        “dM|r| j:        nd“dN|r| j;        nd“dO|(“dP|#“dQ|"“dR|  9                    ¦   «         “dS|r|  "                    ¦   «         nd“dT|r|  <                    ¦   «         nd“dU|%“dV| j        “ŽS )Xz9Build the keyword arguments dict for the active API mode.Nr  Úcontext_compressorÚ_ephemeral_max_output_tokensÚ_anthropic_base_urlÚspeedÚfastÚ_oauth_1m_beta_disabledF)rÒ   r<   rG   Ú
max_tokensÚreasoning_configÚis_oauthÚpreserve_dotsÚcontext_lengthÚbase_urlÚ	fast_modeÚdrop_context_1m_betar  Ú_bedrock_regionr  Ú_bedrock_guardrail_configi   )rÒ   r<   rG   r×  r(  Úguardrail_configr
  zmodels.github.aizgithubcopilot.comrV   rW   rX   >   ú	xai-oauthÚxaizapi.x.air   )Ú$native_compaction_context_management)Úis_codex_backendÚis_xai_responsesÚis_github_responses)Ústrip_pattern_and_formatÚstrip_slash_enumu4   %sâš ï¸� Failed to sanitize tool schemas for xAI: %sÚ
log_prefixrS   r‹   rU   Ú_codex_reasoning_replay_enabledT)rÒ   r<   rG   rØ  r‹   rÜ  r×  r`  Úrequest_overridesrU   rç  rå  ræ  Úgithub_reasoning_extraÚreplay_encrypted_reasoningÚcontext_managementr†   zintegrate.api.nvidia.comzapi.kimi.comzmoonshot.aizmoonshot.cnztokenhub.tencentmaas.comÚlmstudio©Ú_fixed_temperature_for_modelÚOMIT_TEMPERATURE)Ú_get_anthropic_max_outputÚ_ANTHROPIC_OUTPUT_LIMITSrú   rû   c              3  ó    •K  — | ]}|‰v V — Œ	d S r!   r?   )r@   ÚkeyÚ_model_norms     €r&   rB   z#build_api_kwargs.<locals>.<genexpr>ä  s(   øè è € ÐFÐF cˆs�kÐ!ÐFÐFÐFÐFÐFÐFr(   Úhermes)Ú	sessionIdÚpromptIdrˆ   )rÒ   r<   rG   rÜ  r`  r×  Úephemeral_max_output_tokensÚmax_tokens_param_fnrØ  rì  r‹   Úprovider_profileÚollama_num_ctxÚprovider_preferencesÚopenrouter_min_coding_scoreÚanthropic_max_outputÚsupports_reasoningÚqwen_session_metadatarÒ   r<   rG   rÜ  r`  r×  rü  rý  rØ  rì  Úmodel_lowerÚis_openrouterÚis_nousÚis_qwen_portalÚis_github_modelsÚis_nvidia_nimÚis_kimiÚis_tokenhubÚis_lmstudioÚis_custom_providerÚcustomrÿ  r   r  Úqwen_prepare_fnÚqwen_prepare_inplace_fnr  Úfixed_temperatureÚomit_temperaturer  rí  Úlmstudio_reasoning_optionsr  Úprovider_namer?   )=rG   r  Ú_get_transportÚ#_prepare_anthropic_messages_for_apirY   rÛ  rÒ  Úbuild_kwargsrÒ   r×  rØ  Ú_is_anthropic_oauthÚ_anthropic_preserve_dotsrì  rL   rP   r”   r   rÜ  rU   rT   rR   Ú&_prepare_messages_for_non_vision_modelÚagent.native_compactionrä  ÚcopyÚtools.schema_sanitizerrè  ré  Údeepcopyr�   rm   rn   Ú_resolved_api_call_timeoutÚ#_github_models_reasoning_extra_bodyÚ_is_qwen_portalÚ_is_openrouter_urlrj   rk   Úagent.auxiliary_clientrò  ró  r‚   Úagent.anthropic_adapterrô  rõ  rþ   Úanyr‹   r8   ÚuuidÚuuid4rŒ   r‰   Ú_max_tokens_paramÚ_ollama_num_ctxr  Ú_supports_reasoning_extra_bodyÚ_qwen_prepare_chat_messagesÚ#_qwen_prepare_chat_messages_inplaceÚ"_lmstudio_reasoning_options_cached).rZ   rÍ  rÎ  Ú
_transportr  Úctx_lenÚephemeral_outrƒ   Ú_btr(  Ú	guardrailÚ_ctrç  rå  ræ  Ú_msgs_for_codexrä  Ú_context_managementÚ_copyrè  ré  Ú_r“   Ú_is_qwenÚ_is_orÚ_is_ghÚ_is_nousÚ
_is_nvidiaÚ_is_kimiÚ_is_tokenhubÚ_is_lmstudiorò  ró  Ú_ftÚ
_omit_tempÚ_fixed_tempÚ_prefsÚ_ant_maxrô  rõ  Ú
_qwen_metar‰   Ú_profileÚ_ephemeral_outÚ_msgs_for_chatrø  s.                                                @r&   Úbuild_api_kwargsrJ  2  sb
  ø€ àÐØœˆà„~Ð-Ò-Ñ-Ø×)Ò)Ñ+Ô+ˆ
Ø"×FÒFÀ|ÑTÔTÐÝ˜%Ð!5°tÑ<Ô<ˆØ,3Ð=�'Ô(Ð(¸ˆÝ Ð'EÀtÑLÔLˆØÐ$Ø15ˆEÔ.Ø%×2Ò2Ø”+Ø'ØØ(5Ð(A�}�}ÀuÔGWØ"Ô3ØÔ.Ø×8Ò8Ñ:Ô:Ø"Ý˜UÐ$9¸4Ñ@Ô@ØÔ.Ð4°"×9Ò9¸'ÑBÔBÀfÒLÝ!%¥g¨eÐ5NÐPUÑ&VÔ&VÑ!WÔ!Wð 3ñ 
ô 
Ðõ$ 6°eÐ=MÑNÔNÐNð „~Ð+Ò+Ð+Ø×"Ò"Ñ$Ô$ˆÝ˜Ð 1°4Ñ8Ô8ÐG¸KˆÝ˜EÐ#>ÀÑEÔEˆ	Ø×ÒØ”+Ø!ØØÔ'Ð/¨4ØØ&ð  ñ 
ô 
ð 	
ð „~Ð*Ò*Ñ*Ø×"Ò"Ñ$Ô$ˆå! %¤.Ð2DÑEÔEð JÝ$ U¤^Ð5HÑIÔIð 	ð
 ŒN˜nÒ,ð àÔ(¨MÒ9ð BØ(¨EÔ,AÐAð	 	ð !œ>Ð-AÐAÐkÀUÔE]ÐakÒEkÐØ×FÒFÀ|ÑTÔTˆð
 	QÐPÐPÐPÐPÐPØBÐBØØ-Ø-Ø 3ð	
ñ 
ô 
Ðð. ð 	ðØ$Ð$Ð$Ð$ðð ð ð ð ð ð ð ð !&§¢¨}Ñ =Ô =�Ø#;Ð#;¸MÑ#JÔ#JÑ �˜qØ#3Ð#3°MÑ#BÔ#BÑ �˜q˜qøÝð ð ð Ý—’ØJÝ˜E <°Ñ4Ô4°cñô ð ð ð ð ð ð øøøøðøøøð ×ÒØ”+Ø$ØØ"Ô3Ý˜u l°DÑ9Ô9Ø”^ØÔ'Ø×4Ò4Ñ6Ô6Ø#Ô5Ý˜U J°Ñ5Ô5Ø 3Ø-Ø-ØReÐ#o 5×#LÒ#LÑ#NÔ#NÐ#NÐkoÝ'+Ý˜Ð@À$ÑGÔGñ(ô (ð  3ð%  ñ 
ô 
ð 	
ð, ×
Ò
Ñ
 Ô
 €Cð ×$Ò$Ñ&Ô&€HØ×%Ò%Ñ'Ô'€Få˜eÔ3Ð5GÑHÔHð 	MÝ  Ô!6Ð8KÑLÔLð ð  Ô!6Ð6€HØ+¨uÔ/DÐD€Jå˜eœn¨nÑ=Ô=ð 	@Ý  ¤°Ñ?Ô?ð	@å  ¤°Ñ?Ô?ð õ
 )¨Ô)>Ð@ZÑ[Ô[€LØ”NÐ( b×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9¸ZÒG€LðØYÐYÐYÐYÐYÐYÐYÐYØ*Ð*¨5¬;¸¼ÑGÔGˆØÐ,Ð,ˆ
Ø!+Ð5�c�c°ˆˆøÝð ð ð Øˆ
Øˆˆˆðøøøõ
 -¨UÑ3Ô3€Fð €Hð	ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ”{Ð( b×/Ò/Ñ1Ô1×9Ò9¸#¸sÑCÔCˆÝÐFÐFÐFÐFÐ-EÐFÑFÔFÑFÔFð 	>Ø0Ð0°´Ñ=Ô=ˆHøøÝð ð ð Øˆðøøøð €JØð 
àÔ)Ð5¨XÝ�DœJ™LœLÑ)Ô)ð
ð 
ˆ
ðØ2Ð2Ð2Ð2Ð2Ð2Ø'Ð'¨¬Ñ7Ô7ˆˆøÝð ð ð Øˆˆˆðøøøð ð 
Ý  Ð(FÈÑMÔMˆØÐ%Ø15ˆEÔ.ð
 ×CÒCÀLÑQÔQˆà×ÒØ”+Ø!ØØ”^Ø×4Ò4Ñ6Ô6ØÔ'Ø(6Ø %Ô 7Ø"Ô3Ø#Ô5Ý˜u l°DÑ9Ô9Ø%Ø Ô0à!' ¨4Ø(-Ô(IØ!)Ø$×CÒCÑEÔEØ",ð'  ñ 
ô 
ð 	
õ2 ˜UÐ$BÀDÑIÔI€NØÐ!Ø-1ˆÔ*ð ×AÒAÀ,ÑOÔO€Nàˆ3Ôð #ð #ð #ØŒkˆkð#à�ð#ð ˆmð#ð ”�ð	#ð
 ×0Ò0Ñ2Ô2Ð2ð#ð Ô#Ð#ð#ð %3 Nð#ð "Ô3Ð3ð#ð Ô/Ð/ð#ð  Ô1Ð1ð#õ ˜5 ,°Ñ5Ô5Ð5ð#ð ”[Ð& B×-Ò-Ñ/Ô/Ð/ð#ð �fð#ð �ð#ð  �xð#ð   ˜ð!#ð" !�jð##ð$ �ð%#ð& !�Lð'#ð( !�Lð)#ð* !œ>¨XÒ5Ð5ð+#ð, Ô,Ð,ð-#ð. $˜^ tøð/#ð0 %*Ô$EÐ$Eð1#ð2 >FÐO˜Ô9Ð9È4øð3#ð4 NVÐ _ Ô IÐ IÐ[_øð5#ð6 )˜jð7#ð8 &˜+ð9#ð: $˜ð;#ð< !×?Ò?ÑAÔAÐAð=#ð> OUÐ^˜u×HÒHÑJÔJÐJÐZ^øð?#ð@ R^Ð#g 5×#KÒ#KÑ#MÔ#MÐ#MÐcgøðA#ðB &˜XðC#ðD ”n�nðE#ð #sO   È-=I+ É+
J*É5+J%Ê%J*Ñ(Q4 Ñ4RÒRÒA"S= Ó=
T
Ô	T
Ô<U ÕU"Õ!U"Úfinish_reasonc                óê  — t          |dd¦  «        }|                      |¦  «        }t          |¦  «        }|sdt          t          |dd¦  «        ¦  «        }t	          j        d|t          j        ¬¦  «        }|r#d                     d„ |D ¦   «         ¦  «        }|pd}|r.| j        r't          j
        dt          |¦  «        › d	|› �¦  «         |r<| j        r5| j        s.| j        s'	 |                      |¦  «         n# t          $ r Y nw xY wt          t          |dd¦  «        ¦  «        }	t!          |	¦  «        }
|rt!          |¦  «        }t#          |
t$          ¦  «        r)|
r'|                      |
¦  «                             ¦   «         }
t#          |
t$          ¦  «        r|
rd
dlm}  ||
¦  «        }
d|
||dœ}t          |dd¦  «        }|€Dt/          |d¦  «        r4t          |dd¦  «        pi }t#          |t0          ¦  «        rd|v r|d         }|�t!          |¦  «        |d<   n|r|                      ¦   «         r|pd|d<   d|vr|r||d<   t/          |d¦  «        rä|j        rÝ|j        }g }|D ]Ê}t#          |t0          ¦  «        r|                     |¦  «         Œ-t/          |d¦  «        r|                     |j        ¦  «         ŒXt/          |d¦  «        rb	 |                     |                     d¬¦  «        ¦  «         Œ“# t<          $ r* |                     |                     ¦   «         ¦  «         Y ŒÆw xY wŒË|r||d<   t          |dd¦  «        }|r||d<   t          |dd¦  «        }|r||d<   t          |dd¦  «        }|r||d<   |�rkg }|D �]`}t          |dd¦  «        }t          |dd¦  «        }t#          |t$          ¦  «        r|                     ¦   «         s|                      |¦  «        \  }}|}t#          |t$          ¦  «        r|                     ¦   «         s�t#          |t$          ¦  «        r)|                     ¦   «         r|                     ¦   «         }n_t          |dd¦  «        }|rt          |dd¦  «        nd}|rt          |dd¦  «        nd}|                       ||t          |¦  «        ¦  «        }|                     ¦   «         }t          |d d¦  «        }t#          |t$          ¦  «        r|                     ¦   «         s|                      |¦  «        \  }}|}|  !                    |t#          |t$          ¦  «        r|nd¦  «        }||||j"        |j#        j$        |j#        j%        d!œd"œ} t          |d#d¦  «        }!|!�Qt/          |!d¦  «        r<	 |!                     d¬¦  «        }!n$# t<          $ r |!                     ¦   «         }!Y nw xY w|!| d#<   |                     | ¦  «         �Œb||d<   |S )$zèBuild a normalized assistant message dict from an API response message.

    Handles reasoning extraction, reasoning_details, and optional tool_calls
    so both the tool-call path and the final-response path share one builder.
    r¥   Nr¢   z<think>(.*?)</think>©Úflagsú

c              3  óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S r!   )rj   )r@   Úbs     r&   rB   z*build_assistant_message.<locals>.<genexpr>\  s7   è è € Ð"PÐ"P°ÀaÇgÂgÁiÄiÐ"P 1§7¢7¡9¤9Ð"PÐ"PÐ"PÐ"PÐ"PÐ"Pr(   zCaptured reasoning (z	 chars): r   )Úredact_sensitive_textÚ	assistant)Úroler¢   r¤   rK  r£   Úmodel_extraÚ Úreasoning_detailsÚ__dict__Ú
model_dumpF©ÚwarningsÚanthropic_content_blocksÚcodex_reasoning_itemsÚcodex_message_itemsÚidÚcall_idr¦   r•   rS   r§   ú{}Úresponse_item_id©r•   r§   )r_  r`  rb  r�  r¦   Úextra_content)&rY   Ú_extract_reasoningrP   r   rÿ   ÚfindallÚDOTALLro   Úverbose_loggingÚloggingr‘   r9   Úreasoning_callbackÚstream_delta_callbackÚ_stream_callbackr�   r   r7   r8   Ú_strip_think_blocksrj   Úagent.redactrR  ÚhasattrrK   Ú_needs_thinking_reasoning_padrW  r¿   rX  rY  rš   Ú_split_responses_tool_idÚ_deterministic_call_idÚ"_derive_responses_function_call_idr�  r¦   r•   r§   )"rZ   Úassistant_messagerK  Úassistant_tool_callsÚreasoning_textÚ_from_structuredr¢   Úthink_blocksÚcombinedÚ_raw_contentÚ_san_contentrR  ÚmsgÚraw_reasoning_contentrU  Úraw_detailsÚ	preservedÚdÚordered_blocksÚcodex_itemsr^  r¥   Ú	tool_callÚraw_idr`  Úembedded_call_idr8  Ú_fnÚ_fn_nameÚ_fn_argsrb  Úembedded_response_item_idÚtc_dictÚextras"                                     r&   Úbuild_assistant_messagerŒ  K  s@  € õ #Ð#4°lÀDÑIÔIÐØ×-Ò-Ð.?Ñ@Ô@€NÝ˜NÑ+Ô+Ðð
 ð .Ý&¥wÐ/@À)ÈTÑ'RÔ'RÑSÔSˆÝ”zÐ"9¸7Í"Ì)ÐTÑTÔTˆØð 	.Ø—{’{Ð"PÐ"P°lÐ"PÑ"PÔ"PÑPÔPˆHØ%Ð-¨ˆNàð ]˜%Ô/ð ]ÝŒÐ[­S°Ñ-@Ô-@Ð[Ð[È>Ð[Ð[Ñ\Ô\Ð\àð ˜%Ô2ð ð Ô*ð 	°5Ô3Ið 	ðØ×(Ò(¨Ñ8Ô8Ð8Ð8øÝð ð ð Ø�ðøøøõ
 (­Ð0AÀ9ÈdÑ(SÔ(SÑTÔT€LÝ'¨Ñ5Ô5€LØð >Ý-¨nÑ=Ô=ˆõ �,¥Ñ$Ô$ð G¨ð GØ×0Ò0°Ñ>Ô>×DÒDÑFÔFˆõ �,¥Ñ$Ô$ð ;¨ð ;Ø6Ð6Ð6Ð6Ð6Ð6Ø,Ð,¨\Ñ:Ô:ˆð ØØ#Ø&ð	ð €Cõ $Ð$5Ð7JÈDÑQÔQÐØÐ$­Ð1BÀMÑ)RÔ)RÐ$ÝÐ/°ÀÑEÔEÐKÈˆÝ�k¥4Ñ(Ô(ð 	EÐ-@ÀKÐ-OÐ-OØ$/Ð0CÔ$DÐ!ØÐ(Ý#7Ð8MÑ#NÔ#NˆÐÑ Ð Ø	ð 9 %×"EÒ"EÑ"GÔ"Gð 9ð $2Ð#8°SˆÐÑ ð0  #Ð%Ð%¨.Ð%Ø#1ˆÐÑ åÐ Ð"5Ñ6Ô6ð 1Ð;LÔ;^ð 1ð
 (Ô9ˆØˆ	Øð 	5ð 	5ˆAÝ˜!�TÑ"Ô"ð 
5Ø× Ò  Ñ#Ô#Ð#Ð#Ý˜˜JÑ'Ô'ð 5Ø× Ò  ¤Ñ,Ô,Ð,Ð,Ý˜˜LÑ)Ô)ð 5ð5ð ×$Ò$ Q§\¢\¸5 \Ñ%AÔ%AÑBÔBÐBÐBøÝ ð 5ð 5ð 5Ø×$Ò$ Q§\¢\¡^¤^Ñ4Ô4Ð4Ð4Ð4ð5øøøð5ð ð 	1Ø'0ˆCÐ#Ñ$õ Ð.Ð0JÈDÑQÔQ€NØð 9Ø*8ˆÐ&Ñ'õ Ð+Ð-DÀdÑKÔK€KØð 3Ø'2ˆÐ#Ñ$õ
 "Ð"3Ð5JÈDÑQÔQÐØð 9Ø%8ˆÐ!Ñ"àñ C'Øˆ
Ø-ð @	'ñ @	'ˆIÝ˜Y¨¨dÑ3Ô3ˆFÝ˜i¨°DÑ9Ô9ˆGÝ˜g¥sÑ+Ô+ð +°7·=²=±?´?ð +Ø&+×&DÒ&DÀVÑ&LÔ&LÑ#Ð  !Ø*�Ý˜g¥sÑ+Ô+ð `°7·=²=±?´?ð `Ý˜f¥cÑ*Ô*ð `¨v¯|ª|©~¬~ð `Ø$Ÿlšl™nœn�G�Gå! )¨Z¸Ñ>Ô>�CØ;>ÐF�w s¨F°BÑ7Ô7Ð7ÀB�HØBEÐO�w s¨K¸Ñ>Ô>Ð>È4�HØ#×:Ò:¸8ÀXÍsÐS]ÉÌÑ_Ô_�GØ—m’m‘o”oˆGå& yÐ2DÀdÑKÔKÐÝÐ.µÑ4Ô4ð =Ð<L×<RÒ<RÑ<TÔ<Tð =Ø/4×/MÒ/MÈfÑ/UÔ/UÑ,�Ð,Ø#<Ð à$×GÒGØÝ$.Ð/?ÅÑ$EÔ$EÐOÐ Ð È4ñ ô  Ðð Ø"Ø$4Ø!œà%Ô.Ô3Ø!*Ô!3Ô!=ðð ð	ð 	ˆGõ< ˜I ¸Ñ=Ô=ˆEØÐ Ý˜5 ,Ñ/Ô/ð 3ð3Ø %× 0Ò 0¸%Ð 0Ñ @Ô @˜˜øÝ$ð 3ð 3ð 3Ø %× 0Ò 0Ñ 2Ô 2˜˜˜ð3øøøà+0�˜Ñ(Ø×Ò˜gÑ&Ô&Ð&Ñ&Ø&ˆˆLÑà€Js6   Ã$C: Ã:
DÄDË)K>Ë>1L2Ì1L2ÖV.Ö.W×WrÒ   rU   c                óh  — t          | dd¦  «        }t          |t          ¦  «        r|sdS d|fd|ffD ]w\  }}|sŒt          t	          j        d|› d�|¦  «        ¦  «        }|rG|d         }|d|                     ¦   «         …         › |› d|› ||                     ¦   «         d…         › �}Œx|| _        dS )	u-  Point the cached system prompt's ``Model:``/``Provider:`` lines at
    the active runtime after a provider switch.

    The system prompt is session-stable and replayed verbatim for prefix-cache
    warmth, but after a failover the new backend's cache is cold anyway â€”
    while a stale identity line makes the agent misreport which model it is
    when asked.  Rewrite the lines in place WITHOUT persisting to the session
    DB: the stored row keeps the primary's labels, so when the primary is
    restored the prompt is byte-identical to the stored copy again and its
    prefix cache still matches.

    Only the LAST occurrence of each line is touched â€” the identity lines
    live in the volatile tail of the prompt, and earlier matches could be
    user content (memory snapshots, context files).
    Ú_cached_system_promptNÚModelÚProviderz(?m)^z: .*$éÿÿÿÿz: )	rY   r7   r8   rC   rÿ   Úfinditerrk  ÚendrŽ  )rZ   rÒ   rU   ÚspÚlabelr4   ÚmatchesÚlasts           r&   Úrewrite_prompt_model_identityr˜  I  sç   € õ  
�Ð/°Ñ	6Ô	6€BÝ�b�#ÑÔð  bð ØˆØ! 5Ð)¨J¸Ð+AÐBð Ið I‰ˆˆuØð 	ØÝ•r”{Ð#8¨EÐ#8Ð#8Ð#8¸"Ñ=Ô=Ñ>Ô>ˆØð 	IØ˜2”;ˆDØ�}˜Ÿ
š
™œ�}Ô%ÐH uÐHÐH°ÐH°r¸$¿(º(¹*¼*¸+¸+´ÐHÐHˆBøØ"$€EÔÐÐr(   Úfbútuple[str, str, str]c                óŽ  — t          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         t          |                      d¦  «        pd¦  «                             ¦   «         t          |                      d¦  «        pd¦  «                             ¦   «                              d¦  «        fS )NrU   rS   rÒ   rÜ  ú/)r8   rL   rj   rk   Úrstrip)r™  s    r&   Ú_fallback_entry_keyrž  f  sœ   € åˆB�FŠF�:ÑÔÐ$ "Ñ%Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5ÝˆB�FŠF�7‰OŒOÐ!˜rÑ"Ô"×(Ò(Ñ*Ô*ÝˆB�FŠF�:ÑÔÐ$ "Ñ%Ô%×+Ò+Ñ-Ô-×4Ò4°SÑ9Ô9ðð r(   c                óJ  — |                      d¦  «        pd                     ¦   «                              ¦   «         }|dk    rdS 	 ddlm}  |d¦  «        pi }n.# t
          $ r!}dt          |¦  «        j        › �cY d}~S d}~ww xY w|                      d¦  «        }|                      d	¦  «        }t          |t          ¦  «        o t          |                     ¦   «         ¦  «        }t          |t          ¦  «        o t          |                     ¦   «         ¦  «        }	|s|	sd
S dS )zGReturn a skip reason for fallback entries known to be unusable locally.rU   rS   r…   Nr   )Úget_provider_auth_stateznous_auth_unreadable:Úaccess_tokenÚrefresh_tokenÚnous_token_missing)rL   rj   rk   Úhermes_cli.authr   r�   r�  rŽ  r7   r8   rP   )
rZ   r™  Úfb_providerr   Ústater“   Úaccess_valueÚrefresh_valueÚ
has_accessÚhas_refreshs
             r&   Ú+_fallback_entry_unavailable_without_networkr«  n  s?  € à—6’6˜*Ñ%Ô%Ð+¨×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<€KØ�fÒÐØˆtð<Ø;Ð;Ð;Ð;Ð;Ð;à'Ð'¨Ñ/Ô/Ð5°2ˆˆøÝð <ð <ð <Ø;¥t¨C¡y¤yÔ'9Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð<øøøà—9’9˜^Ñ,Ô,€LØ—I’I˜oÑ.Ô.€MÝ˜L­#Ñ.Ô.ÐMµ4¸×8JÒ8JÑ8LÔ8LÑ3MÔ3M€JÝ˜]­CÑ0Ô0ÐPµT¸-×:MÒ:MÑ:OÔ:OÑ5PÔ5P€KØð $˜+ð $Ø#Ð#Øˆ4s   ÁA Á
BÁ#A?Á9BÁ?Br?  ú'FailoverReason | None'c                ó&  — |t           j        t           j        t           j        hv �rt	          t          | dd¦  «        ¦  «        }t          | dd¦  «        pd                     ¦   «                              ¦   «         }| j        pi  	                    d¦  «        pd                     ¦   «                              ¦   «         }|r|rp||k    rjt          | dd¦  «        }|dz   | _
        t          dd	|z  z  d
¦  «        }t          j        ¦   «         |z   | _        t          j        d|||dz  |dz   ¦  «         | j        t%          | j        ¦  «        k    r€t%          | j        ¦  «        dk    rf|t           j        t           j        t           j        hvrAt          | dd¦  «        pd}t)          |t          j        ¦   «         t*          z   ¦  «        | _        dS | j        | j                 }| xj        dz  c_        t-          |¦  «        }	t          | dd¦  «        }
|
€t/          ¦   «         }
|
| _        |	|
v r0t2                               d|	¦  «         |                      |¦  «        S | 	                    d¦  «        pd                     ¦   «                              ¦   «         }| 	                    d¦  «        pd                     ¦   «         }|r|s|                      |¦  «        S t9          | |¦  «        }|rG|
                     |	¦  «         t2                               d|||¦  «         |                      |¦  «        S ddlm }m!} | "                    t          | dd¦  «        t          | dd¦  «        tG          t          | dd¦  «        pd¦  «        ¬¦  «        }| "                    ||| 	                    d¦  «        pd¬¦  «        } |||¦  «        r>t2                               d|||j$        p|j%        ¦  «         |                      |¦  «        S 	 ddl&m'} ddl(m)} | 	                    d¦  «        pd                     ¦   «         pd} ||¦  «        }|r%tU          |d¦  «        r|sddl+m,}  |d¦  «        pd} |||d||¬¦  «        \  }}|€Et2                               d|¦  «         |
                     |	¦  «         |                      |¦  «        S 	 ddl-m.}  |||¦  «        }n4# t^          $ r'}t2                               d|||¦  «         Y d}~nd}~ww xY wd }tG          |j$        ¦  «        }|  0                    |¦  «        }|d!k    rd"}nÝ|d#v rdd$l1m2}  ||¦  «        }nÇ|d%k    sM| 3                    d&¦  «                             ¦   «          4                    d'¦  «        stk          |¦  «        d(k    rd)}nq|rd }nl|  6                    |¦  «        rd"}nT|  7                    ||¬*¦  «        rd"}n:|d+k    s2tk          |¦  «         8                    d,¦  «        rtU          |d-¦  «        rd.}| j9        }| j%        } d| _:        || _9        || _%        || _;        || _$        || _<        t{          | d/¦  «        r| j>         ?                    ¦   «          d| _@        t          | d0d¦  «        }!|!�jt          |!dd¦  «        pd                     ¦   «                              ¦   «         }"|"r1|"|k    r+t2                               d1|||"¦  «         d| _A        d| _B        t          | d0d¦  «        €€	 dd2lCmD}#  |#|¦  «        }$|$r7|$ E                    ¦   «         r#|$| _A        t2                               d3||¦  «         n4# t^          $ r'}%t2                               d4|||%¦  «         Y d}%~%nd}%~%ww xY wt�          ||¦  «        }&|d)k    r€dd5lGmH}'mI}(mJ}) |d%k    r|jK        p |(¦   «         pdn|jK        pd}*|*| _K        |*| _L        || _M         |'|*| jM        |&¬6¦  «        | _N        |d%k    r |)|*¦  «        nd| _O        d| _P        i | _Q        n}|jK        | _K        || _P        t          |d7d¦  «        }+|+st          |d8d¦  «        }+|jK        |d9œ|+rd8t¥          |+¦  «        ini ¥| _Q        |&� |&| jQ        d:<   |  S                    d;¬<¦  «         dd=lTmU},  |,| ¦  «         |  V                    ||||¬>¦  «        \  | _W        | _X        |  Y                    ¦   «          t{          | d?¦  «        r±| jZ        rªdd@l[m\}- t»          | jK        tF          ¦  «        r| jK        nd}. |-| j9        | j$        |.| j%        t          | dAd¦  «        t          | dBd¦  «        ¬C¦  «        }/| jZ         ^                    | j9        |/| j$        t          | dDd¦  «        | j%        | j<        ¬E¦  «         	 ddFl_m`}0 ddGlamb}1  |1 |0¦   «         pi | j9        ¦  «        | _c        t2                               dH| j9        | jc        ¦  «         n8# t^          $ r+}2t2                               dI| j9        |2¦  «         Y d}2~2nd}2~2ww xY wtÉ          | ||¦  «         |  e                    dJ|› dK|› �¦  «         dL|› dK| › dM|› dK|› �| _f        t2                               dN|||¦  «         tÏ          | ¦  «         dS # t^          $ rV}3|dOk    r|
                     |	¦  «         t2           h                    dP||3¦  «         |                      |¦  «        cY d}3~3S d}3~3ww xY w)Quâ  Switch to the next fallback model/provider in the chain.

    Called when the current model is failing after retries.  Swaps the
    OpenAI client, model slug, and provider in-place so the retry loop
    can continue with the new backend.  Advances through the chain on
    each call; returns False when exhausted.

    Uses the centralized provider router (resolve_provider_client) for
    auth resolution and client construction â€” no duplicated providerâ†’key
    mappings.
    Ú_fallback_activatedFrU   rS   Ú_rate_limit_backoff_countr   rÊ   é<   é   i@8  zARate-limit backoff level %d: cooldown %d s (%.1f min, backoff#%d)Ú_rate_limited_untilÚ_unavailable_fallback_keysNz/Fallback skip: %s previously marked unavailablerÒ   zMFallback skip: %s/%s is not locally usable (%s); suppressing for this session)ÚBackendIdentityÚshould_skip_candidaterÜ  )rU   rÒ   rÜ  zUFallback skip: chain entry %s/%s resolves to the same backend as the current one (%s))Úresolve_provider_client)Úresolve_entry_api_keyz
ollama.com)Ú
get_secretÚOLLAMA_API_KEYT)rÒ   Ú	raw_codexÚexplicit_base_urlÚexplicit_api_keyz.Fallback to %s failed: provider not configured)Únormalize_model_for_providerz9Could not normalize fallback model %r for provider %r: %sr-  rV   r
  >   r…   r†   r‡   )Únous_api_modeÚ	anthropicrœ  z
/anthropiczapi.anthropic.comr  )rU   Úbedrockzbedrock-runtime.zamazonaws.comr  Ú_transport_cacheÚ_credential_poolznFallback to %s/%s: clearing primary credential pool (pool_provider=%s) to prevent cross-provider contamination)Ú	load_poolz4Fallback to %s/%s: attached fallback credential poolz7Fallback to %s/%s: could not attach credential pool: %s)Úbuild_anthropic_clientÚresolve_anthropic_tokenÚ_is_oauth_tokenr_  Ú_custom_headersÚdefault_headers)Úapi_keyrÜ  r`  Úfallback_timeout_applyrB  )Úsync_credential_pool_entry_id)rU   rÜ  r  rÒ   rÑ  )Úget_model_context_lengthÚ_config_context_lengthÚ_custom_providers)rÜ  rÉ  rU   Úconfig_context_lengthÚcustom_providersrÉ  )rÒ   rÛ  rÜ  rÉ  rU   r  )Úload_config)Úresolve_reasoning_configz*Fallback %s: reasoning_config resolved: %szGFailed to resolve reasoning_config for fallback %s; keeping current: %su5   ðŸ”„ Primary model failed â€” switching to fallback: z via u!   ðŸ”„ Switched to fallback model: u    â†’ u"   Fallback activated: %s â†’ %s (%s)r…   z"Failed to activate fallback %s: %s)ir   Ú
rate_limitÚbillingÚupstream_rate_limitrP   rY   rj   rk   Ú_primary_runtimerL   r¯  rÁ   rY  Ú	monotonicr²  ri  r°  Ú_fallback_indexr9   Ú_fallback_chainrÀ   Ú_FALLBACK_EXHAUSTED_COOLDOWN_Srž  ro  r³  rm   r‘   Ú_try_activate_fallbackr«  Úaddrn   Úagent.backend_identityr´  rµ  Úbuildr8   rÜ  rU   r$  r¶  Úhermes_cli.fallback_configr·  r   Úagent.secret_scoper¸  Úhermes_cli.model_normalizer½  r�   Ú_is_azure_openai_urlÚhermes_cli.providersr¾  r�  Úendswithr   Ú_is_direct_openai_urlÚ&_provider_model_requires_responses_apirü   rÒ   rÍ  Úrequested_providerr  ro  rÁ  Úclearr®  rÂ  Ú_credential_pool_entry_idÚagent.credential_poolrÃ  Úhas_credentialsr   r%  rÄ  rÅ  rÆ  rÉ  Ú_anthropic_api_keyrÓ  Ú_anthropic_clientr  r  Ú_client_kwargsrK   Ú_replace_primary_openai_clientÚagent.agent_runtime_helpersrË  Ú_anthropic_prompt_cache_policyÚ_use_prompt_cachingÚ_use_native_cache_layoutÚ_ensure_lmstudio_runtime_loadedrÑ  Úagent.model_metadatarÌ  r7   Úupdate_modelÚhermes_cli.configrÑ  Úhermes_constantsrÒ  rØ  r˜  rÙ   Ú_pending_fallback_noticerÍ   ry  )4rZ   r?  Úfallback_already_activeÚcurrent_providerÚprimary_providerÚbackoff_countÚbackoff_secondsÚ_existing_cooldownr™  Úfb_keyÚunavailabler¥  Úfb_modelÚlocal_skip_reasonr´  rµ  Úcurrent_identÚfb_identr¶  r·  Úfb_base_url_hintÚfb_api_key_hintr¸  Ú	fb_clientÚ_resolved_fb_modelr½  Ú	_norm_errÚfb_api_modeÚfb_base_urlÚ_fb_is_azurer¾  Ú	old_modelÚold_providerÚ_existing_poolÚ_pool_providerrÃ  Úfallback_poolr“   Ú_fb_timeoutrÄ  rÅ  rÆ  Úeffective_keyÚ
fb_headersrË  rÌ  Ú_fb_ctx_api_keyÚfb_context_lengthrÑ  rÒ  Ú_reasoning_errr�  s4                                                       r&   Útry_activate_fallbackr  ƒ  s  € ð •.Ô+­^Ô-CÅ^ÔEgÐhÐhÑhõ #'¥w¨uÐ6KÈUÑ'SÔ'SÑ"TÔ"TÐÝ# E¨:°rÑ:Ô:Ð@¸b×GÒGÑIÔI×OÒOÑQÔQÐØ"Ô3Ð9°r×>Ò>¸zÑJÔJÐPÈb×WÒWÑYÔY×_Ò_ÑaÔaÐØ'ð 	Ð-=ð 	ÐBRÐVfÒBfÐBfõ $ EÐ+FÈÑJÔJˆMØ.;¸aÑ.?ˆEÔ+Ý! "¨¨]Ñ(:Ñ";¸UÑCÔCˆOÝ(,¬Ñ(8Ô(8¸?Ñ(JˆEÔ%ÝŒLØSØ˜°À"Ñ0DÀmÐVWÑFWñô ð ð Ô¥ EÔ$9Ñ :Ô :Ò:Ð:õ �Ô%Ñ&Ô&¨Ò*Ð*Ø�~Ô8½.Ô:PÕR`ÔRtÐuÐuÐuå!(¨Ð0EÀqÑ!IÔ!IÐ!NÈQÐÝ(+Ø"Ý”Ñ Ô Õ#AÑAñ)ô )ˆEÔ%ð ˆuØ	Ô	˜uÔ4Ô	5€BØ	ÐÔ˜QÑÐÔÝ  Ñ$Ô$€FÝ˜%Ð!=¸tÑDÔD€KØÐÝ‘e”eˆØ+6ˆÔ(Ø�ÐÐÝ�ŠÐFÈÑOÔOÐOØ×+Ò+¨FÑ3Ô3Ð3Ø—6’6˜*Ñ%Ô%Ð+¨×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<€KØ—’�w‘”Ð% 2×,Ò,Ñ.Ô.€HØð 4˜hð 4Ø×+Ò+¨FÑ3Ô3Ð3åCÀEÈ2ÑNÔNÐØð 4Ø�Š˜ÑÔÐÝ�ŠØ[ØØØñ		
ô 	
ð 	
ð ×+Ò+¨FÑ3Ô3Ð3ð NÐMÐMÐMÐMÐMÐMÐMà#×)Ò)Ý˜ 
¨BÑ/Ô/Ý�e˜W bÑ)Ô)Ý•W˜U J°Ñ3Ô3Ð9°rÑ:Ô:ð *ñ ô €Mð
 ×$Ò$ØØØ—&’&˜Ñ$Ô$Ð*¨ð %ñ ô €Hð
 Ð˜X }Ñ5Ô5ð 4Ý�Šð&à˜ =Ô#9Ð#S¸]Ô=Sñ	
ô 	
ð 	
ð
 ×+Ò+¨FÑ3Ô3Ð3ð
X4ØBÐBÐBÐBÐBÐBð 	EÐDÐDÐDÐDÐDàŸFšF :Ñ.Ô.Ð4°"×;Ò;Ñ=Ô=ÐEÀÐØ/Ð/°Ñ3Ô3ˆð ð 	CÕ 5Ð6FÈÑ UÔ Uð 	CÐ^mð 	CØ5Ð5Ð5Ð5Ð5Ð5à(˜jÐ)9Ñ:Ô:ÐB¸dˆOØ(?Ð(?Ø˜x°4Ø.Ø,ð).ñ ).ô ).Ñ%ˆ	Ð%ð ÐÝ�NŠNØ@Øñô ð ð �OŠO˜FÑ#Ô#Ð#Ø×/Ò/°Ñ7Ô7Ð7ð	ØOÐOÐOÐOÐOÐOà3Ð3°H¸kÑJÔJˆHˆHøÝð 	ð 	ð 	Ý�NŠNØKØ˜+ yñô ð ð ð ð ð ð øøøøð	øøøð )ˆÝ˜)Ô,Ñ-Ô-ˆØ×1Ò1°+Ñ>Ô>ˆØ˜.Ò(Ð(Ø+ˆKˆKØÐCÐCÐCð
 ;Ð:Ð:Ð:Ð:Ð:à'˜-¨Ñ1Ô1ˆKˆKà˜;Ò&Ð&Ø×!Ò! #Ñ&Ô&×,Ò,Ñ.Ô.×7Ò7¸ÑEÔEð 'å  Ñ-Ô-Ð1DÒDÐDð /ˆKˆKØð 	-ð -ˆKˆKØ×(Ò(¨Ñ5Ô5ð 	-Ø+ˆKˆKØ×9Ò9ØØ ð :ñ 
ô 
ð 	-ð ,ˆKˆKØ˜IÒ%Ð%Ý˜kÑ*Ô*×5Ò5Ð6HÑIÔIð &å% k°?ÑCÔCð &ð -ˆKà”Kˆ	Ø”~ˆð
 (,ˆÔ$ØˆŒØ$ˆŒØ#.ˆÔ Ø$ˆŒØ$ˆŒÝ�5Ð,Ñ-Ô-ð 	+ØÔ"×(Ò(Ñ*Ô*Ð*Ø$(ˆÔ!õ ! Ð(:¸DÑAÔAˆØÐ%Ý% n°jÀ"ÑEÔEÐKÈ×RÒRÑTÔT×ZÒZÑ\Ô\ˆNØð 7 .°KÒ"?Ð"?Ý—’ðQà ¨>ñô ð ð
 *.�Ô&Ø26�Ô/Ý�5Ð,¨dÑ3Ô3Ð;ðØ;Ð;Ð;Ð;Ð;Ð;à ) 	¨+Ñ 6Ô 6�Ø ð  ]×%BÒ%BÑ%DÔ%Dð Ø-:�EÔ*Ý—K’KØNØ# Xñô ð øøõ ð ð ð Ý—’ØMØ ¨3ñô ð ð ð ð ð ð øøøøðøøøõ 3°;ÀÑIÔIˆàÐ.Ò.Ð.àpÐpÐpÐpÐpÐpÐpÐpÐpÐpØVaÐepÒVpÐVp˜YÔ.ÐQÐ2IÐ2IÑ2KÔ2KÐQÈrøð  xAô  xIð  xOð  MOˆMØ)ˆEŒMØ'4ˆEÔ$Ø(3ˆEÔ%Ø&<Ð&<Ø˜uÔ8À+ð'ñ 'ô 'ˆEÔ#ð KVÐYdÒJdÐJd¨¨¸Ñ(FÔ(FÐ(FÐjoˆEÔ%ØˆEŒLØ#%ˆEÔ Ð ð &Ô-ˆEŒMØ$ˆEŒLõ ! Ð,=¸tÑDÔDˆJØð IÝ$ YÐ0AÀ4ÑHÔH�
à$Ô,Ø'ð$ð $ð =GÐNÐ%¥t¨JÑ'7Ô'7Ð8Ð8ÈBð$ˆEÔ ð
 Ð&Ø2=�Ô$ YÑ/ð ×4Ò4Ð<TÐ4ÑUÔUÐUàMÐMÐMÐMÐMÐMØ%Ð% eÑ,Ô,Ð,ð ×0Ò0Ø$Ø$Ø$Øð	 1ñ ô ñ 	BˆÔ! 5Ô#Að 	×-Ò-Ñ/Ô/Ð/õ �5Ð.Ñ/Ô/ð 	°EÔ4Lð 	ØEÐEÐEÐEÐEÐEõ
 0:¸%¼-ÍÑ/MÔ/MÐU˜eœm˜mÐSUˆOØ 8Ð 8Ø” e¤nØ'°%´.Ý&-¨eÐ5MÈtÑ&TÔ&TÝ!(¨Ð0CÀTÑ!JÔ!Jð	!ñ !ô !Ðð Ô$×1Ò1Ø”kØ0ØœÝ  y°"Ñ5Ô5ØœØœð 2ñ ô ð ð	Ø5Ð5Ð5Ð5Ð5Ð5ØAÐAÐAÐAÐAÐAà%=Ð%=Ø�‘”Ð#  U¤[ñ&ô &ˆEÔ"õ �KŠKØ<Ø”˜UÔ3ñô ð ð øõ ð 	ð 	ð 	Ý�LŠLØYØ”˜^ñô ð ð ð ð ð ð øøøøð	øøøõ 	& e¨X°{ÑCÔCÐCà×Òð,Øð,ð ,Ø)ð,ð ,ñ	
ô 	
ð 	
ð0°	ð 0ð 0Àð 0ð 0Øð0ð 0Ø"-ð0ð 0ð 	Ô&õ 	�ŠØ0Ø�x ñ	
ô 	
ð 	
õ 	˜EÑ"Ô"Ð"ØˆtøÝð 4ð 4ð 4Ø˜&Ò Ð Ø�OŠO˜FÑ#Ô#Ð#Ý�ŠÐ9¸8ÀQÑGÔGÐGØ×+Ò+¨FÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð	4øøøs£   ÐCj0 Ó
S Ój0 Ó
TÓ'T	Ôj0 Ô	TÔH
j0 ÜA
]$ Ý#j0 Ý$
^Ý.^Þj0 Þ^ÞH"j0 æ8Ah è
j0 è
i è!h;è6j0 è;i é A.j0 ê0
lê:Alìlìlr<   Úapi_call_countc                ó¨  ‡ ‡5‡6— ‰                       d‰ j        › d�¦  «         dt          j        ¦   «         › �Š5d}dIˆ ˆ5fd„}dd	lm} |}|                     d
|dœ¦  «         	 ‰                      ¦   «         }g }|D ]ô}	|	                     ¦   «         }
‰  	                    |	|
¦  «         dD ]}|
 
                    |d¦  «         ŒdD ]}|
 
                    |d¦  «         Œt          |
¦  «         |rl‰ j        }‰ j        dk    rCt          ‰ dd¦  «        }|�0t          |dd¦  «        }|r|                     d¦  «        r|d         }‰                      |
|¬¦  «         |                     |
¦  «         Œõ‰ j        pd}‰ j        r|dz   ‰ j        z                        ¦   «         }|r	d|dœg|z   }‰ j        rK|rdnd}t+          ‰ j        ¦  «        D ]0\  }}|                     ||z   |                     ¦   «         ¦  «         Œ1‰                      |¦  «        }‰                      |¦  «        }|D ]<}
t3          |
t4          ¦  «        r%d„ |
D ¦   «         D ]}|
 
                    |d¦  «         ŒŒ=i }	 ddlm}m} n# t<          $ r d}d}Y nw xY w|� |‰ j        ‰ j        ¦  «        nd}||u }|rdn|}d‰ j         v }‰ j        pd                     ¦   «          !                    ¦   «         dk    o‰  "                    ¦   «         }|r‰  #                    ¦   «         nd}|s.‰  "                    ¦   «         r‰ j$        �‰ j$        |d<   ndddœ|d<   |rdd l%m&}  |¦   «         |d!<   ‰ j'        d"k    r†‰  (                    |¦  «        }| 
                    d#d¦  «         ‰  )                    |¦  «        } ‰  *                    ¦   «         }!|! +                    | ¦  «        }"|"j,        pd                     ¦   «         }#�n‰ j        |d$œ}$|�||$d%<   ‰ j-        �-|$ .                    ‰  /                    ‰ j-        ¦  «        ¦  «         |�||$d&<   ta          ‰ ¦  «        }%i }&	 dd'l1m2}'  |'‰ j        ¦  «        }(|(�:|( 3                    t          ‰ d(d¦  «        |%pd‰ j        ‰ j        ‰ j$        ¬)¦  «        }&n# t<          $ r Y nw xY w|&r| .                    |&¦  «         |%rNd*|&vrJ‰ j        pd                     ¦   «          !                    ¦   «         d+k    s‰  4                    ¦   «         r|%|d*<   ‰ j        d,k    r¡‰ j        pd                     ¦   «          !                    ¦   «         d+k    s‰  4                    ¦   «         r\‰ j5        �U‰ j5        dk    rJ	 tm          ‰ j5        ¦  «        })n# tn          tp          f$ r d})Y nw xY w|)�d-|)cxk    rd.k    rn n	d/|)d0œg|d1<   |r||$d2<   ‰ j'        d3k    rÁ‰  *                    ¦   «         }*|* 9                    ‰ j        |d‰ j-        ‰ j$        ‰ j:        ‰  ;                    ¦   «         t          ‰ d4d¦  «        ¬5¦  «        }+ty          ‰ |+¦  «        }+ ||+‰ j=        d¬6¦  «        } |* +                    | ‰ j:        ¬7¦  «        },|,j,        pd                     ¦   «         }#ni‰  >                    d8¬9¦  «        Š6 ||$ˆ6fd:„d¬6¦  «        } ‰  *                    ¦   «          +                    | ¦  «        },|,j,        pd                     ¦   «         }#|#rZd;|#v r4t          j@        d<d|#t~          jA        ¬=¦  «                             ¦   «         }#|#rd>}|                     d?|#dœ¦  «         �nyd@}#�nu‰ j'        d"k    r†‰  (                    |¦  «        }| 
                    d#d¦  «         ‰  )                    |¦  «        }-‰  *                    ¦   «         }.|. +                    |-¦  «        }/|/j,        pd                     ¦   «         }#�nˆ‰ j'        d3k    rÁ‰  *                    ¦   «         }0|0 9                    ‰ j        |d‰ j:        ‰ j-        ‰ j$        ‰  ;                    ¦   «         t          ‰ d4d¦  «        ¬A¦  «        }1ty          ‰ |1¦  «        }1 ||1‰ j=        d¬6¦  «        }-|0 +                    |-‰ j:        ¬7¦  «        }2|2j,        pd                     ¦   «         }#n¼‰ j        |d$œ}$|�||$d%<   ‰ j-        �-|$ .                    ‰  /                    ‰ j-        ¦  «        ¦  «         |�||$d&<   |r||$d2<   ‰  >                    dB¬9¦  «        Š6 ||$ˆ6fdC„d¬6¦  «        } ‰  *                    ¦   «          +                    | ¦  «        }2|2j,        pd                     ¦   «         }#|#rXd;|#v r4t          j@        d<d|#t~          jA        ¬=¦  «                             ¦   «         }#|#rd>}|                     d?|#dœ¦  «         nd@}#nd@}#nL# t<          $ r?}3t„           C                    dD|3¦  «         dE‰ j        › dFt‰          |3¦  «        › �}#Y d}3~3nd}3~3ww xY wddGlEmF}4 |4 G                    ‰5|¬H¦  «         n"# ddGlEmF}4 |4 G                    ‰5|¬H¦  «         w xY w|#S )JzSRequest a summary when max iterations are reached. Returns the final response text.u$   âš ï¸�  Reached maximum iterations (z). Requesting summary...ziteration-summary:ÚfailedÚretry_countr2   c               ó  •— ddl m} |                     | |t          t	          ‰dd¦  «        pd¦  «        t          t	          ‰dd¦  «        pd¦  «        t          t	          ‰dd¦  «        pd¦  «        ‰d|d	œd
¬¦  «        S )Nr   ©Ú	relay_llmrU   rS   rÒ   r  r-  Úiteration_summary)r  Úapi_request_idÚ	call_roler  T)r•   Ú
model_nameÚmetadataÚdefer_logical_completion)rZ   r   Úexecute_currentr8   rY   )Úrequestr$   r  r   rZ   Úsummary_api_request_ids       €€r&   Ú_managed_summary_callz4handle_max_iterations.<locals>._managed_summary_call	  s¬   ø€ Ø#Ð#Ð#Ð#Ð#Ð#à×(Ò(ØØÝ•W˜U J°Ñ3Ô3ÐA°zÑBÔBÝ�7 5¨'°2Ñ6Ô6Ð<¸"Ñ=Ô=åÝ˜E :¨rÑ2Ô2ÐHÐ6Hñô ð #9Ø0Ø*ðð ð &*ð )ñ 
ô 
ð 	
r(   r   )ÚMAX_ITERATIONS_SUMMARY_REQUESTÚuser)rT  r¢   )r¤   rK  N)Ú	tool_namer]  r^  Ú	timestampr  r  Úlast_aggregator_slotrÒ   r¨  rS   rO  ÚsystemrÊ   c                óf   — g | ].}t          |t          ¦  «        ¯|                     d ¦  «        ¯,|‘Œ/S )r8  )r7   r8   rü   )r@   Úks     r&   ú
<listcomp>z)handle_max_iterations.<locals>.<listcomp>u	  s<   € Ð$dÐ$dÐ$d¨1½:ÀaÍÑ;MÔ;MÐ$dÐRS×R^ÒR^Ð_bÑRcÔRcÐ$d QÐ$dÐ$dÐ$dr(   rñ  r†   rð  r¤   TÚmedium)ÚenabledÚeffort)Únous_portal_tagsÚtagsr
  rG   )rÒ   r<   ÚtemperatureÚreasoning_effortrˆ   r‹   )r‹   r   rÒ   rÜ  rØ  rU   Ú
openrouterzopenrouter/pareto-coderd   g      ð?zpareto-router)r_  Úmin_coding_scoreÚpluginsrŠ   r  rÓ  )rÒ   r<   rG   r×  rØ  rÙ  rÚ  rÜ  )r  )Ústrip_tool_prefixÚiteration_limit_summaryrB  c                ó2   •—  ‰j         j        j        di | ¤ŽS ©Nr?   ©r#  r$  r%  ©r(  Úsummary_clients    €r&   r'   z'handle_max_iterations.<locals>.<lambda>þ	  ó!   ø€ Ð$J NÔ$7Ô$CÔ$JÐ$UÐ$UÈWÐ$UÐ$U€ r(   z<think>z<think>.*?</think>\s*rM  ÚsuccessrS  z>I reached the iteration limit and couldn't generate a summary.)rÒ   r<   rG   rÙ  r×  rØ  rÚ  rÜ  Úiteration_limit_summary_retryc                ó2   •—  ‰j         j        j        di | ¤ŽS rA  rB  rC  s    €r&   r'   z'handle_max_iterations.<locals>.<lambda><
  rE  r(   z"Failed to get summary response: %sz"I reached the maximum iterations (z!) but couldn't summarize. Error: r  )Úoutcome)r  r2   )HÚ_safe_printÚmax_iterationsr'  r(  Úagent.context_compressorr+  r¿   Ú_should_sanitize_tool_callsr  Ú_copy_reasoning_content_for_apir!  r   rÒ   rU   rY   rL   Ú#_sanitize_tool_calls_for_strict_apirŽ  Úephemeral_system_promptrj   Úprefill_messagesÚ	enumerateÚinsertÚ_sanitize_api_messagesÚ#_drop_thinking_only_and_merge_usersr7   rK   r$  rò  ró  r�   rÜ  rR   rk   r+  Ú*_resolve_lmstudio_summary_reasoning_effortrØ  Úagent.portal_tagsr7  r  Ú_build_api_kwargsr  r  Únormalize_responser¢   r×  rŽ   r)  r‚   rŒ   r‰   r�   r#  r  r^   rš   r›   r  r  r  r”   r  Ú_ensure_primary_openai_clientrÿ   r   rg  rm   rn   r8   rZ   r   Úcomplete_logical_call)7rZ   r<   r  Úsummary_call_outcomer*  r+  Úsummary_requestÚ_needs_sanitizerÍ  r|  Úapi_msgÚinternal_fieldÚschema_foreignÚ_sanitize_modelÚ_moa_clientÚ	_agg_slotÚeffective_systemÚ
sys_offsetÚidxÚpfmÚinternal_keyÚsummary_extra_bodyrò  Ú
_OMIT_TEMPÚ_raw_summary_tempÚ_omit_summary_temperatureÚ_summary_temperaturer<  Ú_is_lmstudio_summaryÚ_lm_reasoning_effortÚ_portal_tagsÚcodex_kwargsÚsummary_responseÚ_ct_sumÚ_cnr_sumÚfinal_responseÚsummary_kwargsr   Úprofile_extra_bodyr‰   rþ  Ú_psÚ_tsumÚ_ant_kwÚ_summary_resultÚretry_responseÚ	_ct_retryÚ
_cnr_retryÚ_tretryÚ_ant_kw2Ú_retry_resultr�  r   r)  rD  s7   `                                                    @@r&   Úhandle_max_iterationsrƒ  	  sq  øøø€ à	×ÒØ]¨uÔ/CÐ]Ð]Ð]ñô ð ð Aµ$´*±,´,Ð@Ð@ÐØ#Ðð
ð 
ð 
ð 
ð 
ð 
ð 
ð, HÐGÐGÐGÐGÐGà4€OØ‡O‚O˜V°Ð@Ð@ÑAÔAÐAðj
ð  ×;Ò;Ñ=Ô=ˆØˆØð &	)ð &	)ˆCØ—h’h‘j”jˆGØ×1Ò1°#°wÑ?Ô?Ð?Ø"@ð 2ð 2�Ø—’˜N¨DÑ1Ô1Ð1Ð1ð #mð 2ð 2�Ø—’˜N¨DÑ1Ô1Ð1Ð1õ # 7Ñ+Ô+Ð+Øð Zð #(¤+�Ø”> UÒ*Ð*Ý")¨%°¸4Ñ"@Ô"@�KØ"Ð.Ý$+¨KÐ9OÐQUÑ$VÔ$V˜	Ø$ð A¨¯ª°wÑ)?Ô)?ð AØ.7¸Ô.@˜OØ×9Ò9¸'ÈÐ9ÑYÔYÐYØ×Ò Ñ(Ô(Ð(Ð(à Ô6Ð<¸"ÐØÔ(ð 	cØ 0°6Ñ 9¸EÔ<YÑ Y×`Ò`ÑbÔbÐØð 	\Ø%-Ð:JÐKÐKÐLÈ|Ñ[ˆLØÔ!ð 	BØ.Ð5˜˜°AˆJÝ% eÔ&<Ñ=Ô=ð Bð B‘��SØ×#Ò# J°Ñ$4°c·h²h±j´jÑAÔAÐAÐAð ×3Ò3°LÑAÔAˆð ×@Ò@ÀÑNÔNˆð
 $ð 	4ð 	4ˆGÝ˜'¥4Ñ(Ô(ð 4Ø$dÐ$d°Ð$dÑ$dÔ$dð 4ð 4�LØ—K’K ¨dÑ3Ô3Ð3Ð3øàÐð	ØkÐkÐkÐkÐkÐkÐkÐkÐkøÝð 	ð 	ð 	Ø+/Ð(ØˆJˆJˆJð	øøøð
 ,Ð7ð )Ð(¨¬°e´nÑEÔEÐEàð 	ð
 %6¸Ð$CÐ!Ø'@ÐW˜t˜tÐFWÐØ! UÔ%:Ð:ˆð Œ^Ð!˜r×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2°jÒ@ð 7Ø×4Ò4Ñ6Ô6ð 	ð $ð.ˆE×<Ò<Ñ>Ô>Ð>Ø)-ð 	ð $ð 	¨×(LÒ(LÑ(NÔ(Nð 	ØÔ%Ð1Ø27Ô2HÐ" ;Ñ/Ð/ð  $Ø&ð3ð 3Ð" ;Ñ/ð ð 	8ØJÐJÐJÐJÐJÐJØ)5¨©¬Ð˜vÑ&àŒ>Ð.Ò.Ð.Ø ×2Ò2°<Ñ@Ô@ˆLØ×Ò˜W dÑ+Ô+Ð+Ø$×6Ò6°|ÑDÔDÐØ×*Ò*Ñ,Ô,ˆGØ×1Ò1Ð2BÑCÔCˆHØ&Ô.Ð4°"×;Ò;Ñ=Ô=ˆN‰Nð œØ(ðð ˆNð $Ð/Ø0D�˜}Ñ-ØÔÐ+Ø×%Ò% e×&=Ò&=¸eÔ>NÑ&OÔ&OÑPÔPÐPØ#Ð/Ø5I�Ð1Ñ2õ $CÀ5Ñ#IÔ#IÐ Ø!#ÐðØ:Ð:Ð:Ð:Ð:Ð:à#7Ð#7¸¼Ñ#GÔ#GÐ Ø#Ð/Ø)9×)JÒ)JÝ#*¨5°,ÀÑ#EÔ#EØ-AÐ-IÀTØ#œkØ!&¤Ø).Ô)?ð *Kñ *ô *Ð&øøõ ð ð ð Ø�ðøøøð "ð >Ø"×)Ò)Ð*<Ñ=Ô=Ð=Ø#ð F¨
Ð:LÐ(LÐ(LØ”Ð% 2×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6¸,ÒFÐFØ×+Ò+Ñ-Ô-ð Gð 2FÐ" :Ñ.ð ”Ð7Ò7Ð7à”^Ð) r×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:¸lÒJÐJØ×/Ò/Ñ1Ô1ð Kð Ô5ÐAØÔ5¸Ò;Ð;ðÝ Ô AÑBÔB�C�CøÝ!¥:Ð.ð ð ð Ø�C�C�Cðøøøà�? s¨cÐ'8Ð'8Ò'8Ð'8°SÒ'8Ð'8Ð'8Ð'8Ð'8à.ÀCÐHÐHð5Ð& yÑ1ð "ð BØ/A�˜|Ñ,àŒ~Ð!5Ò5Ð5Ø×,Ò,Ñ.Ô.�Ø×,Ò,Øœ+Ø)ØØ$Ô/Ø%*Ô%;Ø"Ô6Ø"'×"@Ò"@Ñ"BÔ"BÝ$ UÐ,AÀ4ÑHÔHð -ñ 	ô 	�õ AÀÈÑPÔP�Ø#8Ð#8ØØÔ4Ø !ð$ñ $ô $Ð ð
 #(×":Ò":Ð;KÐ_dÔ_xÐ":Ñ"yÔ"y�Ø"1Ô"9Ð"?¸R×!FÒ!FÑ!HÔ!H��à!&×!DÒ!DØ4ð "Eñ "ô "�ð $9Ð#8Ø"ØUÐUÐUÐUØ !ð$ñ $ô $Ð ð
 #(×"6Ò"6Ñ"8Ô"8×"KÒ"KÐL\Ñ"]Ô"]�Ø"1Ô"9Ð"?¸R×!FÒ!FÑ!HÔ!H�àð G	bØ˜NÐ*Ð*Ý!#¤Ð(@À"ÀnÕ\^Ô\eÐ!fÑ!fÔ!f×!lÒ!lÑ!nÔ!n�Øð bØ'0Ð$Ø—’¨ÀÐ PÐ PÑQÔQÐQÑQà!a�‘ð Œ~Ð!2Ò2Ð2Ø$×6Ò6°|ÑDÔD�Ø× Ò  ¨$Ñ/Ô/Ð/Ø!&×!8Ò!8¸Ñ!FÔ!F�Ø!×0Ò0Ñ2Ô2�	Ø&×9Ò9¸.ÑIÔI�
Ø",Ô"4Ð":¸×!AÒ!AÑ!CÔ!C�‘Ø”Ð#7Ò7Ð7Ø×.Ò.Ñ0Ô0�Ø"×/Ò/Øœ+Ø)ØØ"Ô6Ø$Ô/Ø%*Ô%;Ø"'×"@Ò"@Ñ"BÔ"BÝ$ UÐ,AÀ4ÑHÔHð 0ñ 	ô 	�õ BÀ%ÈÑRÔR�Ø!6Ð!6ØØÔ4Ø !ð"ñ "ô "�ð
 !(× :Ò :¸>Ð]bÔ]vÐ :Ñ wÔ w�Ø"/Ô"7Ð"=¸2×!DÒ!DÑ!FÔ!F��ð #œ[Ø ,ð"ð "�ð (Ð3Ø4H�N =Ñ1ØÔ#Ð/Ø"×)Ò)¨%×*AÒ*AÀ%ÔBRÑ*SÔ*SÑTÔTÐTØ'Ð3Ø9M�NÐ#5Ñ6Ø%ð FØ3E�N <Ñ0à!&×!DÒ!DØ:ð "Eñ "ô "�ð $9Ð#8Ø"ØUÐUÐUÐUØ !ð$ñ $ô $Ð ð
 !&× 4Ò 4Ñ 6Ô 6× IÒ IÐJZÑ [Ô [�Ø"/Ô"7Ð"=¸2×!DÒ!DÑ!FÔ!F�àð 	bØ Ð.Ð.Ý%'¤VÐ,DÀbÈ.Õ`bÔ`iÐ%jÑ%jÔ%j×%pÒ%pÑ%rÔ%r�NØ!ð fØ+4Ð(Ø—O’O¨[À^Ð$TÐ$TÑUÔUÐUÐUà%e�N�Nà!a�øøåð ~ð ~ð ~Ý�ŠÐ;¸QÑ?Ô?Ð?Ø}¸eÔ>RÐ}Ð}ÕuxÐyzÑu{Ôu{Ð}Ð}ˆˆˆˆˆˆøøøøð~øøøð 	$Ð#Ð#Ð#Ð#Ð#à×'Ò'Ø"Ø(ð 	(ñ 	
ô 	
ð 	
ð 	
øð 	$Ð#Ð#Ð#Ð#Ð#à×'Ò'Ø"Ø(ð 	(ñ 	
ô 	
ð 	
ð 	
øøøð
 Ðs¡   Á"Hg É'I0 É/g É0JÉ>g Ê JÊG g ÑAR Òg Ò
R"Òg Ò!R"Ò"Cg Õ/V Ög ÖVÖg ÖVÖP+g çh0 ç
hç5h
èh0 è
hèh0 è0iÚtask_idc                óÎ  — 	 t          |¦  «        r | j        rt          j        d|› d�¦  «         n!t	          ¦   «                              |¦  «         n:# t          $ r-}| j        rt                               d||¦  «         Y d}~nd}~ww xY w	 d}	 ddl	m
}  |¦   «         }n<# t          $ r/ t          t          j                             d¦  «        ¦  «        }Y nw xY w|r#| j        rt          j        d	|› d�¦  «         dS dS t	          ¦   «                              |¦  «         dS # t          $ r4}| j        r"t                               d
||¦  «         Y d}~dS Y d}~dS d}~ww xY w)aÿ  Clean up VM and browser resources for a given task.

    Skips ``cleanup_vm`` when the active terminal environment is marked
    persistent (``persistent_filesystem=True``) so that long-lived sandbox
    containers survive between turns. The idle reaper in
    ``terminal_tool._cleanup_inactive_envs`` still tears them down once
    ``terminal.lifetime_seconds`` is exceeded. Non-persistent backends are
    torn down per-turn as before to prevent resource leakage (the original
    intent of this hook for the Morph backend, see commit fbd3a2fd).

    Skips ``cleanup_browser`` in headed mode so the browser window stays
    visible between turns. The inactivity reaper in
    ``browser_tool._cleanup_inactive_browser_sessions`` still handles
    idle sessions.
    z0Skipping per-turn cleanup_vm for persistent env z; idle reaper will handle it.z$Failed to cleanup VM for task %s: %sNFr   )Ú_is_headed_modeÚAGENT_BROWSER_HEADEDz5Skipping per-turn cleanup_browser for headed session z)Failed to cleanup browser for task %s: %s)r   rh  ri  r‘   r/   Ú
cleanup_vmr�   rm   rn   Útools.browser_toolr†  rP   r˜   r¯  rL   Úcleanup_browser)rZ   r„  r�  Úheadedr†  s        r&   Úcleanup_task_resourcesrŒ  \
  s  € ð OÝ˜WÑ%Ô%ð 	&ØÔ$ð Ý”ð3Àwð 3ð 3ð 3ñô ð øõ
 ‰EŒE×Ò˜WÑ%Ô%Ð%øøÝð Oð Oð OØÔ ð 	OÝ�NŠNÐAÀ7ÈAÑNÔNÐNøøøøøøøøøðOøøøðTØˆð	BØ:Ð:Ð:Ð:Ð:Ð:Ø$�_Ñ&Ô&ˆFˆFøÝð 	Bð 	Bð 	BÝ�"œ*Ÿ.š.Ð)?Ñ@Ô@ÑAÔAˆFˆFˆFð	Bøøøàð 	+ØÔ$ð Ý”ð3ÈGð 3ð 3ð 3ñô ð ð ð ðð õ ‰EŒE×!Ò! 'Ñ*Ô*Ð*Ð*Ð*øÝð Tð Tð TØÔ ð 	TÝ�NŠNÐFÈÐQRÑSÔSÐSÐSÐSÐSÐSÐSÐSð	Tð 	Tð 	Tð 	Tð 	Tð 	TøøøøðTøøøsZ   ‚AA Á
B
Á#BÂB
ÂD& ÂB" Â!D& Â"6CÃD& ÃCÃ$D& Ä!D& Ä&
E$Ä0#EÅE$©Údropped_tool_namesc               óŽ   — t          | |d|¬¦  «        }t          d|t          ¬¦  «        }t          t          ||g||pd¬¦  «        S )a­  Build a partial-stream-stub response for mid-stream drop scenarios.

    Used when the SSE stream ends without a ``finish_reason`` after
    delivering content (text-only drops, tool-call-arg drops).  The stub
    is tagged ``PARTIAL_STREAM_STUB_ID`` with ``FINISH_REASON_LENGTH`` so
    the conversation loop enters its continuation/retry path instead of
    silently accepting truncated output as a complete turn (#32086).
    N©rT  r¢   r¥   r£   r   ©ÚindexÚmessagerK  ©r_  rÒ   r    ÚusageÚ_dropped_tool_names)r   r   r
   )rT  Úfull_contentÚfull_reasoningr$  Ú	usage_objrŽ  Úmock_messageÚmock_choices           r&   Ú_build_partial_stream_stubrœ  Œ
  sr   € õ #ØØØØ(ð	ñ ô €Lõ "ØØÝ*ðñ ô €Kõ
 Ý!ØØ�ØØ.Ð6°$ðñ ô ð r(   )r  c               óH  ‡ ‡‡‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7‡8‡9‡:‡;‡<‡=‡>‡?‡@‡A‡B‡C— ‰ j         rt          d¦  «        ‚t          ‰ ¦  «        r‰                      ‰¦  «        S ‰ j        dk    r0‰‰ _        	 ‰                      ‰¦  «        d‰ _        S # d‰ _        w xY w‰ j        dk    �rxdddœŠAddiŠ:ddiŠ9d	t          j        ¦   «         iŠ&‰                     d
d¦  «        }t          ‰ ‰¦  «        }t          ‰ ¦  «         ˆ:ˆfd„Š.ˆ&ˆ.ˆ ˆˆ9ˆAfd„}t          j        t          |¦  «        d¬¦  «        }|                     ¦   «          |                     ¦   «         �r€|                     d¬¦  «         ‰ j         rt          d¦  «        ‚t          j        ¦   «         ‰&d	         z
  }||k    �rt                                d|||‰                     dd¦  «        ¦  «         ‰                      dt'          |¦  «        › d‰                     dd¦  «        › d�¦  «         t)          ‰ ¦  «         	 ddlm}  ||¦  «         n2# t.          $ r%}	t                                d|	¦  «         Y d}	~	nd}	~	ww xY wt          j        ¦   «         ‰&d	<   t          ‰ ¦  «         t3          dt'          |¦  «        › dt'          |¦  «        › d�¦  «        ‰Ad<   n|                     ¦   «         �°€‰ j         rt          d ¦  «        ‚‰Ad         �‰Ad         ‚‰Ad!         �t5          ‰ ¦  «         ‰Ad!         S ddg d"œŠAt          ‰ ¦  «         dddd#œŠ>d$d%iŠ?t          j        ¦   «         Š@d$diŠ0d%d&œd|ˆ>ˆ?ˆ@fd)„Š2d*„ Š7ˆ7ˆ>ˆ?ˆ@fd+„Š3d}ˆ7fd/„Š,d}ˆ,ˆ ˆ>ˆ?ˆ@fd0„Š+ddiŠ:ddiŠ9ddiŠ=d	t          j        ¦   «         iŠ;dŠ8t          j        ¦   «         ŠBdt9          ¦   «         ddd1œŠCd2diŠ<d~ˆ<fd4„Š1dˆ<fd5„Š*d€ˆ=ˆBˆCfd7„Š4d}ˆBˆCfd8„Š)d�ˆBˆCfd;„Š5d�ˆBˆCfd<„Š6d‚ˆBˆCfd=„Š-ˆ:ˆfd>„Š/dƒˆ*ˆ-ˆ/ˆ1ˆ2ˆ3ˆ5ˆ6ˆ8ˆ ˆˆ9ˆ;ˆ=ˆ>ˆAfd?„Š(ˆ*ˆ/ˆ1ˆ ˆˆ9ˆ;ˆ>fd@„Š'ˆ'ˆ(ˆ)ˆ*ˆ+ˆ0ˆ2ˆ4ˆ ˆ9ˆ:ˆ=ˆ>ˆAfdA„}
t;          ‰ j        ‰ j        ¦  «        }|�|}ntA          dBdC¦  «        }|dCk    rò‰ j!        rëtE          ‰ j!        ¦  «        r×dD}	 ddEl#m$}  |¦   «         }tK          |tL          ¦  «        r|                     dF¦  «        nd}tK          |tL          ¦  «        r@|                     dG¦  «        }tK          |t&          tN          f¦  «        rtO          |¦  «        }n# t.          $ r Y nw xY wtA          dH|¦  «        Š8t                                dI‰ j!        ‰8¦  «         nutQ          ‰¦  «        }|dJk    rtS          |dK¦  «        Š8n|dLk    rtS          |dM¦  «        Š8n|Š8ddNl*m+}  |‰                     dO¦  «        ¦  «        }|�tS          ‰8|¦  «        Š8t          j        t          |
¦  «        d¬¦  «        }|                     ¦   «          t          j        ¦   «         }dP}|                     ¦   «         �r‰|                     d¬¦  «         t          j        ¦   «         }||z
  |k    r˜|}t'          |‰;d	         z
  ¦  «        }||k    r_‰8�'‰8tO          dQ¦  «        k    rdRt'          ‰8¦  «        › dS�}ndT}‰  ,                    dU‰                     dOdV¦  «        › dW|› dX|› dY�¦  «         n‰  -                    dZ|› d[�¦  «         t          j        ¦   «         ‰;d	         z
  }|‰8k    �r*tQ          ‰¦  «        }t                                d\|‰8‰                     dOd¦  «        |d]›¦  «         ‰                      d^t'          |¦  «        › d‰                     dOd¦  «        › d_|d]›d`�¦  «         	  ‰)da¦  «          ‰+da¦  «         n# t.          $ r Y nw xY wt)          ‰ ¦  «         ‰ j        dbk    rn	 t          j        ¦   «         ‰;d	<   ‰  ,                    dct'          |¦  «        › dd�¦  «         ‰  -                    det'          |¦  «        › df�¦  «         ‰ j         rVd‰0d$<   t                                dg¦  «         	  ‰)dh¦  «          ‰+dh¦  «         n# t.          $ r Y nw xY wt          di¦  «        ‚|                     ¦   «         �°‰‰ j         rt          dj¦  «        ‚‰Ad         ��3‰9d         �r"t]          ‰ dkdT¦  «        pdT /                    ¦   «         pd}ta          ‰A                     dl¦  «        pg ¦  «        }|r·dm                     |ddn…         ¦  «        }tc          |¦  «        dnk    r|dotc          |¦  «        dnz
  › dp�z  }dq|› dr�}|pdT|z   }	 ‰  2                    |¦  «         n# t.          $ r Y nw xY wt                                ds|tc          |pdT¦  «        ‰Ad         ¦  «         tf          }n8t                                dttc          |pdT¦  «        ‰Ad         ¦  «         tf          }ti          du|dd¬v¦  «        } d}!	 ddwl5m6}"m7}#  |"‰Ad         tq          t]          ‰ dxdT¦  «        pdT¦  «        tq          t]          ‰ dOdT¦  «        pdT¦  «        ¬y¦  «        }$|$j9        |#j:        k    }!n# t.          $ r d}!Y nw xY wti          tv          t]          ‰ dOd¦  «        ti          d| |¬z¦  «        gd|pd¬{¦  «        }%|!rd|%_<        t5          ‰ ¦  «         |%S ‰Ad         ‚‰Ad!         �t5          ‰ ¦  «         ‰Ad!         S )„uØ  Streaming variant of _interruptible_api_call for real-time token delivery.

    Handles all three api_modes:
    - chat_completions: stream=True on OpenAI-compatible endpoints
    - anthropic_messages: client.messages.stream() via Anthropic SDK
    - codex_responses: delegates to _run_codex_stream (already streaming)

    Fires stream_delta_callback and _stream_callback for each text token.
    Tool-call turns suppress the callback â€” only text-only final responses
    stream to the consumer.  Returns a SimpleNamespace that mimics the
    non-streaming response shape so the rest of the agent loop is unchanged.

    Falls back to _interruptible_api_call on provider errors indicating
    streaming is not supported.
    z+Agent interrupted before streaming API callr
  Nr  rx  r<  Fr›  rÄ  r  r  c                 óf   •— ‰ d         s%‰r%d‰ d<   	  ‰¦   «          d S # t           $ r Y d S w xY wd S d S ©Nr<  T©r�   ©Úfirst_delta_firedr  s   €€r&   Ú_fire_firstz5interruptible_streaming_api_call.<locals>._fire_firstì
  sq   ø€ Ø$ VÔ,ð °ð Ø,0Ð! &Ñ)ðØ"�NÑ$Ô$Ð$Ð$Ð$øÝ ð ð ð Ø�D�Dðøøøð	ð ð ð ó   ’
 ž
,«,c                 óª  •‡‡‡‡‡‡‡‡— d } 	 ddl m} ddlmŠmŠmŠmŠmŠmŠ g Šdd iŠd,ˆˆˆˆˆˆfd„}ˆˆˆfd„}ˆˆfd	„}ˆˆfd
„}ˆˆfd„}d-ˆˆfd„}d.ˆˆfd„}| 	                    t          ‰¦  «        |t          t          ‰dd¦  «        pd¦  «        t          t          ‰dd¦  «        pd¦  «        t          t          ‰dd¦  «        pd¦  «        ||‰j        d„ |d„ dt          ‰dd ¦  «        t          ‰dd¦  «        rdn't          t          ‰d d¦  «        pd¦  «        dk    rd!nd"d#œd$¬%¦  «        }  ‰d&| i‰                     ¦   «         r|nd |‰j        s‰j        r|nd ˆfd'„ˆfd(„¬)¦  «        }	| j        p|	‰d*<   n# t&          $ r}
|
‰d+<   Y d }
~
nd }
~
ww xY w| �|                      ¦   «          d S d S # | �|                      ¦   «          w w xY w)/Nr   r  )r  r  r  Ú is_streaming_access_denied_errorr  Ústream_converse_with_callbacksr4   Únext_api_kwargsúdict[str, Any]c                ó
  •— t          | ¦  «        }|                     dd¦  «        }|                     dd ¦  «          ‰|¦  «        }	  |j        di |¤Ž}n˜# t          $ r‹} ‰
|¦  «        rdd‰_        ‰                     d¦  «         t                               dt          |¦  «        j	        ¦  «          ‰ |j
        di |¤Ž¦  «        cY d }~S  ‰	|¦  «        r ‰|¦  «         ‚ d }~ww xY w|                     dg ¦  «        S )	Nr  r  r  Tuœ   
âš   AWS IAM denied bedrock:InvokeModelWithResponseStream â€” falling back to non-streaming InvokeModel.
   Grant that action to restore streaming output.
u`   bedrock: converse_stream denied by IAM (%s) â€” using non-streaming converse() for this session.Ústreamr?   )rK   r!  Úconverse_streamr�   Ú_disable_streamingrJ  rm   r°  r�  rŽ  r"  rL   )r¨  Úfinal_kwargsr(  r  r)  r*  r  rZ   r  r  r¦  r  s         €€€€€€r&   Ú_open_bedrock_streamzUinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._open_bedrock_stream  sx  ø€ Ý#'¨Ñ#8Ô#8�LØ)×-Ò-Ð.BÀKÑPÔP�FØ ×$Ò$Ð%;¸TÑBÔBÐBØ8Ð8¸Ñ@Ô@�FðØ'= vÔ'=Ð'MÐ'MÀÐ'MÐ'M˜˜øÝ$ð ð ð ð
 <Ð;¸LÑIÔIð Ø7;˜EÔ4Ø!×-Ò-ð!Vñô ð õ
 #ŸKšKð!Så $ \Ñ 2Ô 2Ô ;ñô ð ð
 $?Ð#>Ø / ¤Ð ?Ð ?°,Ð ?Ð ?ñ$ô $ð ð ð ð ð ð ð 5Ð4°\ÑBÔBð >Ø5Ð5°fÑ=Ô=Ð=Øøøøøð-øøøð. (×+Ò+¨H°bÑ9Ô9Ð9s%   Á	A Á
C,Á!A)C'Ã
C,ÃC'Ã'C,c                óP   •—  ‰¦   «          ‰                      | ¦  «         d‰d<   d S )NTr›  )Ú_fire_stream_delta)r¨   r£  rZ   Údeltas_were_sents    €€€r&   Ú_on_textzIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_text#  s3   ø€ Ø�K‘M”M�MØ×,Ò,¨TÑ2Ô2Ð2Ø.2Ð$ UÑ+Ð+Ð+r(   c                óF   •—  ‰¦   «          ‰                      | ¦  «         d S r!   )Ú_fire_tool_gen_started)r•   r£  rZ   s    €€r&   Ú_on_toolzIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_tool(  s(   ø€ Ø�K‘M”M�MØ×0Ò0°Ñ6Ô6Ð6Ð6Ð6r(   c                óF   •—  ‰¦   «          ‰                      | ¦  «         d S r!   )Ú_fire_reasoning_delta)r¨   r£  rZ   s    €€r&   Ú_on_reasoningzNinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_reasoning,  s(   ø€ Ø�K‘M”M�MØ×/Ò/°Ñ5Ô5Ð5Ð5Ð5r(   c                 ó8   •—  ‰dt          ‰ ¦  «        i¦  «        S ©Nr«  )rC   )Úintercepted_eventsr§  s   €€r&   Ú_finalize_bedrock_streamzYinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._finalize_bedrock_stream0  s)   ø€ Ø9Ð9Ø!¥4Ð(:Ñ#;Ô#;Ð<ñô ð r(   Ú_streamr   r1   rÈ   c                ó,   •— t          ‰¦  «        ‰d<   d S ©Nr4   )r   )r¾  rZ   Úwriter_tokens    €€r&   Ú_bedrock_stream_createdzXinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._bedrock_stream_created5  s   ø€ Ý,?ÀÑ,FÔ,F�L Ñ)Ð)Ð)r(   Ú_eventrP   c                ó<   •— ‰d         }|d u pt          ‰|¦  «        S rÀ  )r   )rÃ  ÚtokenrZ   rÁ  s     €€r&   Ú_accept_bedrock_eventzVinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>._accept_bedrock_event8  s'   ø€ Ø(¨Ô1�EØ  D˜=ÐRÕ,DÀUÈEÑ,RÔ,RÐRr(   r‹   rS   rU   rÀ  rÒ   c                ó   — | S r!   r?   )r�   s    r&   r'   zIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>.<lambda>E  s   € °€ r(   c                ó>   — t          t          | dd ¦  «        ¦  «        S ©Nr    )rP   rY   )rt  s    r&   r'   zIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>.<lambda>G  s!   € Å$Ý ¨)°TÑ:Ô:ñCô C€ r(   r  Ú_current_api_request_idÚis_subagentFÚ	delegatedrØ  ÚfallbackÚprimary©r  r"  r#  T)r‹   r•   r$  Ú	finalizerÚon_stream_createdÚon_chunkÚchunk_adapterÚaccept_chunkÚcompleted_response_predicater%  r&  r«  c                 ó   •— ‰ j         S r!   )r\  rÆ   s   €r&   r'   zIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>.<lambda>^  s
   ø€ ¨uÔ/I€ r(   c                 óR   •— ‰                       dt          j        ¦   «         ¦  «        S )NrÄ  )Ú__setitem__rY  )Ú_bedrock_last_events   €r&   r'   zIinterruptible_streaming_api_call.<locals>._bedrock_call.<locals>.<lambda>_  s   ø€ Ð%8×%DÒ%DÀSÍ$Ì)É+Ì+Ñ%VÔ%V€ r(   )Úon_text_deltaÚon_tool_startÚon_reasoning_deltaÚon_interrupt_checkÚon_eventrt  ry  ©r¨  r©  )r¾  r   r1   rÈ   ©rÃ  r   r1   rP   )rZ   r   r   r  r  r  r¦  r  r§  r«  rK   r8   rY   r¿   r2   Ú_has_stream_consumersrj  rk  rv  r�   Úclose)r«  r   r¯  r³  r¶  r¹  r½  rÂ  rÆ  Ústreamed_responser�  r  r¼  r  r  r¦  r  r§  rÁ  rÙ  r£  rZ   rÐ   r²  r‘  s              @@@@@@@@€€€€€€r&   Ú_bedrock_callz7interruptible_streaming_api_call.<locals>._bedrock_callô
  sœ  øøøøøøøøø€ ØˆFðp#Ø+Ð+Ð+Ð+Ð+Ð+ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð &(Ð"Ø '¨˜�ð:ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð@3ð 3ð 3ð 3ð 3ð 3ð 3ð
7ð 7ð 7ð 7ð 7ð 7ð6ð 6ð 6ð 6ð 6ð 6ðð ð ð ð ð ð
Gð Gð Gð Gð Gð Gð GðSð Sð Sð Sð Sð Sð Sð #×)Ò)Ý˜Ñ$Ô$Ø(Ý"¥7¨5°,ÀÑ#CÔ#CÐ#IÀrÑJÔJÝ�W U¨J¸Ñ;Ô;ÐH¸yÑIÔIÝ"¥7¨5°'¸2Ñ#>Ô#>Ð#DÀ"ÑEÔEØ6Ø&=Ø/Ô6Ø"5Ð"5Ø!6ð2ð 2ð %-Ý*1Ø!Ð#<¸dñ+ô +õ
  ' u¨m¸UÑCÔCð+˜K˜Kõ  #¥7¨5Ð2CÀQÑ#GÔ#GÐ#LÈ1ÑMÔMÐPQÒQÐQð ", à!*ðð ð .2ð7 *ñ ô �ð: %CÐ$BØ˜vÐ&Ø.3×.IÒ.IÑ.KÔ.KÐ"U ( (ÐQUØ"*Ø8=Ô8PÐ'yÐTYÔToÐ'y } }ÐuyØ'IÐ'IÐ'IÐ'IØVÐVÐVÐVð%ñ %ô %Ð!ð &,Ô%:Ð%OÐ>O��zÑ"Ð"øÝð $ð $ð $Ø"#��w‘�����øøøøð$øøøð Ð%Ø—L’L‘N”N�N�N�Nð &Ð%ø�6Ð%Ø—L’L‘N”N�N�Nð &øøøs0   �E5F ÆF9 Æ
FÆFÆF9 ÆFÆF9 Æ9GTrŸ  r   r_  z)Agent interrupted during Bedrock API calluk   Bedrock stream stale for %.0fs (threshold %.0fs) â€” no events received. region=%s model=%s. Aborting call.rì   rÓ   u"   âš ï¸� No events from Bedrock for z
s (model: z). Aborting...r   )r  z)bedrock: stale client eviction failed: %sz&Bedrock stream produced no events for zs (threshold uF   s) â€” aborting stalled stream so the retry/fallback path can recover.ry  z7Agent interrupted during Bedrock API call (post-worker)rt  )rt  ry  Úpartial_tool_names)r  Údiagrz  r4   rH  r  r  r8   c               ó|   •— ‰5  | ‰d<   |‰d<   t          j        ¦   «         ‰d<   d d d ¦  «         n# 1 swxY w Y   | S r|  r}  r  s     €€€r&   r‚  z=interruptible_streaming_api_call.<locals>._set_request_clientÏ  s    ø€ Ø ð 	Gð 	GØ.4Ð! (Ñ+Ø+/Ð Ñ(å1:Ô1DÑ1FÔ1FÐ! +Ñ.ð		Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð
 ˆrƒ  c                ó°   — t          | dd ¦  «        }t          |¦  «        r|S t          | dd ¦  «        }t          |dd ¦  «        }t          |¦  «        r|S d S )Nrâ  rt  )rY   r7  )r«  râ  rt  s      r&   Ú_stream_close_callablez@interruptible_streaming_api_call.<locals>._stream_close_callable×  s`   € Ý˜ ¨Ñ.Ô.ˆÝ�E‰?Œ?ð 	ØˆLÝ˜6 :¨tÑ4Ô4ˆÝ˜ '¨4Ñ0Ô0ˆÝ�E‰?Œ?ð 	ØˆLØˆtr(   c                ó–   •—  ‰| ¦  «        €| S ‰5  | ‰d<   d‰d<   t          j        ¦   «         ‰d<   d d d ¦  «         n# 1 swxY w Y   | S )Nr  r«  r4   rz  r}  )r«  ré  r€  r�  rE  s    €€€€r&   Ú_set_request_stream_handlezDinterruptible_streaming_api_call.<locals>._set_request_stream_handleá  s¸   ø€ ð "Ð! &Ñ)Ô)Ð1ØˆMØ ð 	Gð 	GØ.4Ð! (Ñ+Ø+3Ð Ñ(Ý1:Ô1DÑ1FÔ1FÐ! +Ñ.ð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gð ˆs   ‘!>¾AÁAr?  r1   rÈ   c                óÚ   •—  ‰| ¦  «        }|€d S 	  |¦   «          t                                d|¦  «         d S # t          $ r'}t                                d||¦  «         Y d }~d S d }~ww xY w)Nz%Streaming response handle closed (%s)z/Streaming response handle close failed (%s): %s)rm   r°  r�   r‘   )r«  r?  râ  r“   ré  s       €r&   Ú_close_request_stream_handlezFinterruptible_streaming_api_call.<locals>._close_request_stream_handleï  s¤   ø€ Ø&Ð& vÑ.Ô.ˆØˆ=ØˆFð	ØˆE‰GŒGˆGÝ�KŠKÐ?ÀÑHÔHÐHÐHÐHøÝð 	ð 	ð 	Ý�LŠLØAØØñô ð ð ð ð ð ð ð øøøøð	øøøs   ’%9 ¹
A*ÁA%Á%A*c                óh  •— ‰	5  ‰                      d¦  «        }‰                      dd¦  «        }‰                      d¦  «        }|dk    o|d uo|d uo|t          j        ¦   «         k    }|rW‰                      dd¦  «        dk    r‰                     || ¬¦  «         n‰                     || ¬¦  «         	 d d d ¦  «         d S d ‰d<   d ‰d<   d d d ¦  «         n# 1 swxY w Y   |€d S |dk    r ‰|| ¦  «         d S |dk    r‰                     || ¬¦  «         d S ‰                     || ¬¦  «         d S )Nr  r4   rH  rz  r«  r  rB  r…  )
r?  r'  Úrequest_kindrz  rˆ  rí  rZ   r€  r�  rE  s
        €€€€€r&   r‰  zDinterruptible_streaming_api_call.<locals>._close_request_client_onceý  s  ø€ ð
 !ð 	6ð 	6Ø2×6Ò6°xÑ@Ô@ˆNØ.×2Ò2°7¸HÑEÔEˆLØ-×1Ò1°+Ñ>Ô>ˆIð  Ò(ð 7Ø"¨$Ð.ð7à TÐ)ð7ð ¥Ô!4Ñ!6Ô!6Ò6ð	 ð ð 
ð '×*Ò*¨7°HÑ=Ô=ÐAUÒUÐUØ×9Ò9Ø&¨vð :ñ ô ð ð ð ×6Ò6°~ÈfÐ6ÑUÔUÐUØð1	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð2 /3Ð! (Ñ+Ø15Ð! +Ñ.ð5	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð6 Ð!ØˆFð ˜8Ò#Ð#Ø(Ð(¨¸Ñ@Ô@Ð@Ð@Ð@ØÐ1Ò1Ð1Ø×1Ò1°.ÈÐ1ÑPÔPÐPÐPÐPà×.Ò.¨~ÀfÐ.ÑMÔMÐMÐMÐMs   „B2CÃ
CÃCÃ C)Úcurrentr>  Údiscarded_chunksÚdiscarded_bytesr«  r   c                ó   •— | ‰d<   | S r»  r?   )r«  Úmanaged_stream_holders    €r&   Ú_set_managed_streamz=interruptible_streaming_api_call.<locals>._set_managed_stream@  s   ø€ Ø*0Ð˜hÑ'Øˆr(   c                 óð   •— ‰                      dd ¦  «        } | €d S t          | dd ¦  «        }t          |¦  «        r:	  |¦   «          d S # t          $ r  t                               dd¬¦  «         Y d S w xY wd S )Nr«  râ  z&Managed provider stream cleanup failedTr×   )r!  rY   r7  r�   rm   r‘   )r«  râ  rô  s     €r&   Ú_close_managed_streamz?interruptible_streaming_api_call.<locals>._close_managed_streamD  s£   ø€ Ø&×*Ò*¨8°TÑ:Ô:ˆØˆ>ØˆFÝ˜ ¨Ñ.Ô.ˆÝ�E‰?Œ?ð 	VðVØ�‘”���øÝð Vð Vð VÝ—’ÐEÐPT�ÑUÔUÐUÐUÐUÐUðVøøøð	Vð 	Vs   ½
A	 Á	&A3Á2A3r2   c                 ó�   •— ‰5  ‰dxx         dz  cc<   t          ‰d         ¦  «        } d d d ¦  «         n# 1 swxY w Y   d‰d<   | S )Nrð  rÊ   Fr›  )r2   )Ú
attempt_idÚprovider_tool_in_flightÚstream_attempt_lockÚstream_attempt_states    €€€r&   Ú_start_stream_attemptz?interruptible_streaming_api_call.<locals>._start_stream_attemptO  s    ø€ Ø ð 	>ð 	>Ø  Ð+Ð+Ô+¨qÑ0Ð+Ð+Ñ+ÝÐ1°)Ô<Ñ=Ô=ˆJð	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð */Ð Ñ&ØÐs   „&6¶:½:c                óþ   •— ‰5  t          ‰                     d¦  «        pd¦  «        }|r‰d                              |¦  «         d d d ¦  «         n# 1 swxY w Y   |rt                               d|| ¦  «         d S d S )Nrð  r   r>  z&Marked stream attempt %s cancelled: %s)r2   rL   rÜ  rm   r‘   )r?  rð  rû  rü  s     €€r&   Ú_cancel_current_stream_attemptzHinterruptible_streaming_api_call.<locals>._cancel_current_stream_attemptV  sÝ   ø€ Ø ð 	?ð 	?ÝÐ.×2Ò2°9Ñ=Ô=ÐBÀÑCÔCˆGØð ?Ø$ [Ô1×5Ò5°gÑ>Ô>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð ð 	Ý�LŠLØ8ØØñô ð ð ð ð	ð 	s   „AAÁAÁAÚstream_attempt_idrP   c                ó¢   •— ‰5  | t          ‰                     d¦  «        pd¦  «        k    o	| ‰d         v	 cd d d ¦  «         S # 1 swxY w Y   d S )Nrð  r   r>  )r2   rL   ©r   rû  rü  s    €€r&   Ú_stream_attempt_is_activezCinterruptible_streaming_api_call.<locals>._stream_attempt_is_activeb  s«   ø€ Ø ð 	ð 	à!¥SÐ)=×)AÒ)AÀ)Ñ)LÔ)LÐ)QÐPQÑ%RÔ%RÒRð OØ%Ð-AÀ+Ô-NÐNðð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   „3AÁAÁAc                óP   •— ‰5  | ‰d         v cd d d ¦  «         S # 1 swxY w Y   d S )Nr>  r?   r  s    €€r&   Ú_stream_attempt_was_cancelledzGinterruptible_streaming_api_call.<locals>._stream_attempt_was_cancelledi  s�   ø€ Ø ð 	Jð 	JØ$Ð(<¸[Ô(IÐIð	Jð 	Jð 	Jð 	Jñ 	Jô 	Jð 	Jð 	Jð 	Jð 	Jð 	Jð 	Jøøøð 	Jð 	Jð 	Jð 	Jð 	Jð 	Js   „
›¢c                ó€  •— 	 t          t          |¦  «        ¦  «        }n# t          $ r d}Y nw xY w‰5  ‰dxx         dz  cc<   ‰dxx         |z  cc<   ‰d         }‰d         }d d d ¦  «         n# 1 swxY w Y   |dk    rt                               d| ||¦  «         d S t                               d| ||¦  «         d S )Nr   rñ  rÊ   rò  z[Discarding chunk from superseded stream attempt %s (discarded_chunks=%s discarded_bytes=%s)zUDiscarded stale stream chunk from attempt %s (discarded_chunks=%s discarded_bytes=%s))r9   Úreprr�   rm   rn   r‘   )r   r�   Úchunk_bytesrñ  rò  rû  rü  s        €€r&   Ú_discard_stale_stream_chunkzEinterruptible_streaming_api_call.<locals>._discard_stale_stream_chunkm  si  ø€ ð	Ý�d 5™kœkÑ*Ô*ˆKˆKøÝð 	ð 	ð 	ØˆKˆKˆKð	øøøà ð 	Fð 	FØ Ð!3Ð4Ð4Ô4¸Ñ9Ð4Ð4Ñ4Ø Ð!2Ð3Ð3Ô3°{ÑBÐ3Ð3Ñ3Ø3Ð4FÔGÐØ2Ð3DÔEˆOð		Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	Fð
 ˜qÒ Ð Ý�NŠNð;à!Ø Øñô ð ð ð õ �LŠLð;à!Ø Øñô ð ð ð s   ƒ   /®/´1A1Á1A5Á8A5c                 óf   •— ‰ d         s%‰r%d‰ d<   	  ‰¦   «          d S # t           $ r Y d S w xY wd S d S rŸ  r   r¡  s   €€r&   Ú_fire_first_deltaz;interruptible_streaming_api_call.<locals>._fire_first_deltaˆ  sq   ø€ Ø  Ô(ð 	¨^ð 	Ø(,Ð˜fÑ%ðØ�Ñ Ô Ð Ð Ð øÝð ð ð Ø��ðøøøð		ð 	ð 	ð 	r¤  c                ó¢  •‡ ‡,‡-‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7‡8‡9— ddl Š/t          ‰Cj        ‰Cj        ¦  «        }|�|nt	          dd¦  «        Š,|�|Š0n“t	          dd¦  «        Š0‰0dk    r?‰Cj        r8t          ‰Cj        ¦  «        r$‰,Š0t                               d‰Cj        ‰0¦  «         n>‰0dk    r8‰B�6‰Bt          d¦  «        k    r#‰B‰0k    r‰BŠ0t                               d	‰0¦  «         |�t          ‰,d
¦  «        ndŠ-g Š3i Š8t          ¦   «         }i }i }dŠ4dŠ5dŠ7g Š6dŠ9‰C                     ¦   «         Š.‰.‰Hd<   ddiŠ1ddiŠ2d[ˆ,ˆ-ˆ/ˆ>ˆ0ˆCˆ2ˆFfd„}d\ˆ.ˆ1ˆCfd„}d]ˆ@ˆ1ˆCˆDˆFˆGˆ fd„}d^ˆ3ˆ4ˆ5ˆ6ˆ7ˆ8ˆ9fd„}ddlm}	  ‰=|	                     ‰D|t!          t#          ‰Cdd¦  «        pd¦  «        t!          t#          ‰Cdd¦  «        pd¦  «        t!          t#          ‰Cdd¦  «        pd¦  «        |||d „ d!t#          ‰Cd"d¦  «        t#          ‰Cd#d$¦  «        rd%n't%          t#          ‰Cd&d¦  «        pd¦  «        dk    rd'nd(d)œd*¬+¦  «        ¦  «        }
‰Cj        d,k    r ‰?|
¦  «         |
D �]U}t'          j        ¦   «         ‰Fd-<   ‰C                     d.¦  «         	 t%          ‰.                     d/d¦  «        ¦  «        d0z   ‰.d/<   ‰.                     d1¦  «        €‰Fd-         ‰.d1<   	 t%          ‰.                     d2d¦  «        ¦  «        t-          |¦  «        z   ‰.d2<   n# t.          $ r Y nw xY wn# t.          $ r Y nw xY w‰Cj        rJ	 |
                     ¦   «          n1# t.          $ r$ ‰2d         }|�‰C                     |d3¬4¦  «         Y nw xY w �n5 ‰@‰ ¦  «        s ‰;‰ |¦  «         �Œ;|j        s>t9          |d¦  «        r|j        r|j        Š5t9          |d5¦  «        r|j        r|j        Š9�Œ€|j        d         j        }t9          |d¦  «        r|j        r|j        Š5t#          |d6d¦  «        pt#          |d7d¦  «        }|rNt?          ‰6r‰6d8         nd|¦  «        }‰6                      |¦  «          ‰<¦   «          ‰C !                    |¦  «         |rš|j"        r“‰3                      |j"        ¦  «         ‰8s* ‰<¦   «          ‰C #                    |j"        ¦  «         d*‰Ed9<   nM‰Cj$        rF	 ‰C $                    |j"        ¦  «         ‰C %                    |j"        ¦  «         n# t.          $ r Y nw xY w|�rR|j&        �rJ|j&        D �]A}|j'        �|j'        nd}|j(        pd}||vr|||<   |r)||v r%|||         k    rtS          ‰8d8¬:¦  «        d0z   }|||<   |r|||<   ||         }|‰8vr:|j(        }tU          |t$          ¦  «        rt!          |¦  «        }|pdd;ddd<œdd=œ‰8|<   ‰8|         }|j(        �2|j(        }tU          |t$          ¦  «        rt!          |¦  «        }|r||d><   |j+        rM|j+        j,        r|j+        j,        |d;         d?<   |j+        j-        r |d;         d@xx         |j+        j-        z  cc<   t#          |dAd¦  «        }|€Ft9          |dB¦  «        r6tU          |j.        t^          ¦  «        r|j.        ni                      dA¦  «        }|�Qt9          |dC¦  «        r<	 | 0                    d$¬D¦  «        }n$# tb          $ r | 0                    ¦   «         }Y nw xY w||dA<   |d;         d?         }|rS||vrO| 2                    |¦  «          ‰<¦   «          ‰C 3                    |¦  «         ‰IdE                               |¦  «         �ŒC|j        d         j4        r|j        d         j4        Š4t9          |d5¦  «        r|j        r|j        Š9�ŒW ‰:¦   «           ‰A‰ ¦  «        r‰/ 5                    dF‰ › dG�¦  «        ‚|
j6        ��|
j6        }t           7                    dH‰Cj        pdI‰Cj        pdI¦  «         d*‰C_8        |j        }tU          |tr          tt          f¦  «        r
|r|d         nd}t#          |dJd¦  «        }|�Ÿt#          |d6d¦  «        pt#          |d7d¦  «        }tU          |t           ¦  «        r!|r ‰<¦   «          ‰C !                    |¦  «         t#          |dKd¦  «        }tU          |t           ¦  «        r!|r ‰<¦   «          ‰C #                    |¦  «         |S d ;                    ‰3¦  «        pd}d}d$} ‰8rúg }ty          ‰8¦  «        D ]è}‰8|         }!|!d;         d@         }"|!d;         d?         pdL}#|"rZ|" =                    ¦   «         rF	 t}          j?        |"¦  «         n4# t|          j@        $ r tƒ          |"|#¦  «        }$|$dMk    r|$}"nd*} Y nw xY w‰4€d*} |                      t…          |!d>         |!dN         |!                     dA¦  «        t…          |!d;         d?         |"¬<¦  «        ¬O¦  «        ¦  «         Œé‰4€‰3s‰6s‰8st‡          dP¦  «        ‚| o‰4du }%|%rbˆ8fdQ„ty          ‰8¦  «        D ¦   «         }&t           D                    dR|&¦  «         t‹          ‰7|d ;                    ‰6¦  «        pd‰5‰9|&pd¬S¦  «        S ‰4du o‰3o‰8 }'|'rBt           D                    dT¦  «         t‹          ‰7|d ;                    ‰6¦  «        pd‰5‰9¦  «        S ‰4pdU}(| rdV}(d ;                    ‰6¦  «        pd})t…          ‰7|||)¬W¦  «        }*t…          d|*|(¬X¦  «        }+t…          dYt!          t�          jG        ¦   «         ¦  «        z   ‰5|+g‰9¬Z¦  «        S )_z#Stream a chat completions response.r   NÚHERMES_API_TIMEOUTg      œ@ÚHERMES_STREAM_READ_TIMEOUTr”  uD   Local provider detected (%s) â€” stream read timeout raised to %.0fsr6  uV   Cloud reasoning stream â€” read timeout raised to %.0fs to match stale-stream detectorr•  ç      >@rS  ræ  r4   r¨  r©  c                óH  •— i | ¥d‰                      ‰‰‰‰¬¦  «        dœ¥}t          ‰j        ¦  «        sddi|d<    ‰‰                     d|¬¦  «        ¦  «        }|‰	d<   t	          j        ¦   «         ‰
d	<   ‰                     d
¦  «          |j        j        j        di |¤ŽS )NT)ÚconnectÚreadÚwriteÚpool)r«  r`  Úinclude_usageÚstream_optionsÚchat_completion_stream_requestrJ  r4   rÄ  z)waiting for provider response (streaming)r?   )	ÚTimeoutr   rÜ  rL  rY  rÜ   r#  r$  r%  )r¨  Ústream_kwargsr'  Ú_base_timeoutÚ	_conn_capÚ_httpxr‚  Ú_stream_read_timeoutrZ   Úattempt_request_clientÚlast_chunk_times      €€€€€€€€r&   Ú_open_streamzVinterruptible_streaming_api_call.<locals>._call_chat_completions.<locals>._open_streamÕ  sì   ø€ ð	Ø!ð	àØ!Ÿ>š>Ø%Ø-Ø'Ø"ð	 *ñ ô ð	ð 	ð 	ˆMõ -¨U¬^Ñ<Ô<ð JØ3BÀDÐ2I�Ð.Ñ/Ø0Ð0Ø×3Ò3Ø;Ø,ð 4ñ ô ñô ˆNð /=Ð" 7Ñ+Ý#'¤9¡;¤;ˆO˜CÑ Ø×!Ò!Ð"MÑNÔNÐNØ9�>Ô&Ô2Ô9ÐJÐJ¸MÐJÐJÐJr(   Ú
raw_streamr   r1   rÈ   c                óø   •— t          | dd ¦  «        }‰                     |¦  «         ‰                     |¦  «         ‰                     ‰|¦  «         ‰                     |¦  «         t          ‰¦  «        ‰d<   d S )Nrt  r4   )rY   Ú_capture_rate_limitsÚ_capture_creditsÚ_stream_diag_capture_responseÚ_check_openrouter_cache_statusr   )r!  rt  Ú_diagÚ_writer_tokenrZ   s     €€€r&   Ú_stream_createdzYinterruptible_streaming_api_call.<locals>._call_chat_completions.<locals>._stream_createdî  s~   ø€ Ý˜z¨:°tÑ<Ô<ˆHØ×&Ò& xÑ0Ô0Ð0Ø×"Ò" 8Ñ,Ô,Ð,Ø×/Ò/°°xÑ@Ô@Ð@Ø×0Ò0°Ñ:Ô:Ð:Ý%8¸Ñ%?Ô%?ˆM˜'Ñ"Ð"Ð"r(   Ú_chunkrP   c                óŒ  •— 	 t          | dd ¦  «        }|rt          |d         dd ¦  «        nd }t          |dd ¦  «        rd‰	d<   n# t          $ r Y nw xY w ‰‰
¦  «        sdS ‰d         }|�At          ‰|¦  «        s1t                               d	‰                     d
d¦  «        ¦  «         dS t          j        ¦   «         ‰d<   dS )Nr    r   r¡   r¥   Tr›  Fr4   zxStreaming attempt superseded by a newer stream; stopping consumption to preserve the single-writer invariant (model=%s).rÒ   rÓ   rÄ  )rY   r�   r   rm   rn   rL   rY  )r*  r    r¡   rÅ  r  r(  rZ   rÐ   r  rú  r   s       €€€€€€€r&   Ú_accept_stream_chunkz^interruptible_streaming_api_call.<locals>._call_chat_completions.<locals>._accept_stream_chunkö  sý   ø€ ðÝ! &¨)°TÑ:Ô:�Ø>EÐO� ¨¤
¨G°TÑ:Ô:Ð:È4�Ý˜5 ,°Ñ5Ô5ð :Ø59Ð+¨EÑ2øøÝð ð ð Ø�ðøøøà,Ð,Ð->Ñ?Ô?ð Ø�uØ! 'Ô*ˆEØÐ Õ)AÀ%ÈÑ)OÔ)OÐ Ý—’ð"ð —N’N 7¨IÑ6Ô6ñ	ô ð ð �uõ
 $(¤9¡;¤;ˆO˜CÑ Ø�4s   ƒAA Á
AÁAc                 ó´   •— ˆfd„t          ‰¦  «        D ¦   «         } ‰‰d                     ‰¦  «        pd d                     ‰¦  «        pd | pd dœ‰pddœg‰dœS )Nc                ó    •— g | ]
}‰|         ‘ŒS r?   r?   )r@   r’  Útool_calls_accs     €r&   r3  zsinterruptible_streaming_api_call.<locals>._call_chat_completions.<locals>._relay_final_response.<locals>.<listcomp>  s   ø€ ÐTÐTÐT°E˜.¨Ô/ÐTÐTÐTr(   rS   )rT  r¢   r£   r¥   Ústop)r“  rK  )rÒ   r    r•  )rp   ro   )r¥   Úcontent_partsrK  r$  Úreasoning_partsrT  r/  r™  s    €€€€€€€r&   Ú_relay_final_responsez_interruptible_streaming_api_call.<locals>._call_chat_completions.<locals>._relay_final_response  s“   ø€ ØTÐTÐTÐT½VÀNÑ=SÔ=SÐTÑTÔTˆJà#ð %)Ø')§w¢w¨}Ñ'=Ô'=Ð'EÀØ13·²¸Ñ1IÔ1IÐ1QÈTØ*4Ð*<¸ð	$ð $ð *7Ð)@¸&ðð ð
ð #ðð ð r(   r  r‹   rS   rU   rÒ   c                ó"   — t          | d¦  «        S rÉ  )ro  r:   s    r&   r'   zRinterruptible_streaming_api_call.<locals>._call_chat_completions.<locals>.<lambda>3  s   € ½7À5È)Ñ;TÔ;T€ r(   r-  rÊ  rË  FrÌ  rØ  rÍ  rÎ  rÏ  T)	r‹   r•   r$  rÐ  rÑ  rÔ  rÕ  r%  r&  r  rÄ  úreceiving stream responseÚchunksrÊ   Úfirst_chunk_atÚbytesÚinterrupt_stream_close_failedrB  r•  r£   r¤   r‘  r›  )r–   r¦   rc  )r_  r�  r¦   rd  r_  r•   r§   rd  rU  rY  rZ  rå  zstream attempt z was supersededz}Streaming request returned a final response object instead of an iterator; switching %s/%s to non-streaming for this session.rÓ   r“  r¢   ú?ra  r�  )r_  r�  rd  r¦   zlProvider returned an empty stream with no finish_reason (possible upstream error or malformed SSE response).c                ó<   •— g | ]}‰|         d          d         pd‘ŒS )r¦   r•   r:  r?   )r@   rg  r/  s     €r&   r3  zTinterruptible_streaming_api_call.<locals>._call_chat_completions.<locals>.<listcomp>  s=   ø€ ð ð ð àð   Ô$ ZÔ0°Ô8Ð?¸Cðð ð r(   z¬Stream ended with no finish_reason while a tool call's arguments were still incomplete (tools=%s); treating as a mid-tool-call stream drop, not an output-length truncation.r�  zkStream ended with no finish_reason after delivering text with no tool calls; treating as a mid-stream drop.r0  Úlengthr�  r‘  zstream-)r_  rÒ   r    r•  rß  ©r!  r   r1   rÈ   )r*  r   r1   rP   )r1   r©  )HÚhttpxr   rU   rÒ   r   rÜ  r   rm   r‘   r^   rÁ   ro  Ú_stream_diag_initrZ   r   r«  r8   rY   r2   rY  rÜ   rL   r°   r�   r\  râ  rC  r    ro  r•  r¡   r   r¿   r¸  r¢   r±  rk  Ú_record_streamed_assistant_textr¥   r’  r_  rÀ   r7   r¦   r•   r§   rU  rK   rY  rš   rÜ  rµ  rK  ÚRemoteProtocolErrorrv  r°  r­  rC   Útuplero   rp   rj   ÚjsonÚloadsÚJSONDecodeErrorr   r   r   rn   rœ  r'  r(  )Jr   Ú_provider_timeout_cfgÚtool_gen_notifiedÚ_last_id_at_idxÚ_active_slot_by_idxr   r)  r,  r3  r   r«  r�   r'  r¡   rv  Útc_deltaÚraw_idxÚdelta_idÚnew_slotrg  Ú_tc_idÚentryÚ_new_idr‹  r•   rv  r    Úfirst_choicer“  r¢   r—  Úmock_tool_callsÚhas_truncated_tool_argsr­   r§   r-  ÚrepairedÚ_tool_args_dropped_no_finishÚ_dropped_namesÚ_text_only_dropped_no_finishÚeffective_finish_reasonr˜  rš  r›  r  r  r'  r  r  r(  r  r1  rK  r$  r2  rT  r/  r™  r÷  r	  r  rõ  r‚  rë  r  r  Ú_stream_stale_timeoutrZ   rÐ   r²  r  rú  r€  r‘  sJ   `                                           @@@@@@@@@@@@@@€€€€€€€€€€€€€€€€r&   Ú_call_chat_completionsz@interruptible_streaming_api_call.<locals>._call_chat_completions�  sµ  øøøøøøøøøøøøøøøø€ àÐÐÐõ !=¸U¼^ÈUÌ[Ñ YÔ YÐð %Ð0ð "Ð!åÐ/°Ñ8Ô8ð 	ð !Ð,Ø#8Ð Ð å#,Ð-IÈ5Ñ#QÔ#QÐ ð
 $ uÒ,Ð,°´Ð,ÕDUÐV[ÔVdÑDeÔDeÐ,Ø'4Ð$Ý—’ØZØ”NÐ$8ñô ð ð ð
 %¨Ò-Ð-Ø)Ð5Ø)­U°5©\¬\Ò9Ð9Ø)Ð,@Ò@Ð@ð (=Ð$Ý—’ð2Ø3Gñô ð ð 1FÐ0Q•C˜ tÑ,Ô,Ð,ÐW[ˆ	Ø ˆØ!ˆÝ!$¡¤Ðð
 !#ˆØ$&ÐØˆØˆ
ØˆØ "ˆØˆ	Ø×'Ò'Ñ)Ô)ˆØ(-Ð˜fÑ%Ø  $˜ˆØ")¨4 Ðð	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð2	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð>	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð$ 	$Ð#Ð#Ð#Ð#Ð#à$Ð$Ø×ÒØØÝ�w u¨l¸BÑ?Ô?ÐEÀ2ÑFÔFÝ� ¨
°BÑ7Ô7ÐE¸:ÑFÔFÝ�w u¨g°rÑ:Ô:Ð@¸bÑAÔAØ/Ø"1Ø1Ø-TÐ-Tà 2Ý&-¨eÐ5NÐPTÑ&UÔ&Uõ # 5¨-¸Ñ?Ô?ð'˜˜õ �w uÐ.?ÀÑCÔCÐHÀqÑIÔIÈAÒMÐMð (˜Zà&ð
ð 
ð *.ð+ ñ ô ñ
ô 
ˆð2 Œ>˜UÒ"Ð"ð 'Ð& vÑ.Ô.Ð.Øð x	(ñ x	(ˆEÝ#'¤9¡;¤;ˆO˜CÑ Ø×!Ò!Ð"=Ñ>Ô>Ð>ð
Ý"% e§i¢i°¸!Ñ&<Ô&<Ñ"=Ô"=ÀÑ"A��h‘Ø—9’9Ð-Ñ.Ô.Ð6Ø.=¸cÔ.B�EÐ*Ñ+ðÝ%(¨¯ª°7¸AÑ)>Ô)>Ñ%?Ô%?ÕBWÐX]ÑB^ÔB^Ñ%^�E˜'‘N�NøÝ ð ð ð Ø�Dðøøøøøåð ð ð Ø�ðøøøð Ô)ð ðØ—L’L‘N”N�N�NøÝ ð 
ð 
ð 
ð
 &<¸GÔ%D�NØ%Ð1Ø×:Ò:Ø*Ø#Bð ;ñ ô ð øøð
øøøð ‘à,Ð,Ð->Ñ?Ô?ð Ø+Ð+Ð,=¸uÑEÔEÐEÙà”=ð Ý˜5 'Ñ*Ô*ð -¨u¬{ð -Ø!&¤�Jå˜5 'Ñ*Ô*ð ,¨u¬{ð ,Ø %¤�IÙà”M !Ô$Ô*ˆEÝ�u˜gÑ&Ô&ð )¨5¬;ð )Ø"œ[�
õ % UÐ,?ÀÑFÔFÐkÍ'ÐRWÐYdÐfjÑJkÔJkˆNØð <õ
 "AØ+:ÐB�O BÔ'Ð'ÀØ"ñ"ô "�ð  ×&Ò& ~Ñ6Ô6Ð6Ø!Ð!Ñ#Ô#Ð#Ø×+Ò+¨NÑ;Ô;Ð;ð ð ˜œð Ø×$Ò$ U¤]Ñ3Ô3Ð3Ø%ð Ø%Ð%Ñ'Ô'Ð'Ø×,Ò,¨U¬]Ñ;Ô;Ð;Ø.2Ð$ UÑ+Ð+ð Ô0ð ðØ×3Ò3°E´MÑBÔBÐBØ×=Ò=¸e¼mÑLÔLÐLÐLøÝ$ð ð ð Ø˜ðøøøð ñ JB˜Ô)ñ JBØ %Ô 0ð IBñ IB�HØ08´Ð0J˜hœn˜nÐPQ�GØ'œ{Ð0¨b�Hð Ð&9Ð9Ð9Ø7>Ð+¨GÑ4à ð@à# Ð6Ð6Ø$¨¸Ô(@Ò@Ð@å#& ~¸rÐ#BÑ#BÔ#BÀQÑ#F˜Ø7?Ð+¨GÑ4Øð <Ø3;˜¨Ñ0Ø-¨gÔ6�Cà .Ð0Ð0à!)¤˜Ý% f­cÑ2Ô2ð 1Ý%(¨¡[¤[˜Fà"( ,¨BØ$.Ø13À"Ð(EÐ(EØ-1ð	/ð /˜ sÑ+ð +¨3Ô/�EØ”{Ð.Ø"*¤+˜Ý% g­sÑ3Ô3ð 3Ý&)¨'¡l¤l˜GØ"ð 2Ø*1˜E $™KØÔ(ð ZØ#Ô,Ô1ð 	Oð 9AÔ8IÔ8N˜E *Ô-¨fÑ5Ø#Ô,Ô6ð ZØ! *Ô-¨kÐ:Ð:Ô:¸hÔ>OÔ>YÑYÐ:Ð:Ñ:Ý# H¨o¸tÑDÔD�EØ�}­°¸=Ñ)IÔ)I�}Ý9CÀHÔDXÕZ^Ñ9_Ô9_Ð!g Ô!5Ð!5Ðeg× lÒ lÐm|Ñ }Ô }˜ØÐ(Ý" 5¨,Ñ7Ô7ð ;ð;Ø(-×(8Ò(8À%Ð(8Ñ(HÔ(H  øÝ#,ð ;ð ;ð ;Ø(-×(8Ò(8Ñ(:Ô(:   ð;øøøà16˜˜oÑ.à  Ô,¨VÔ4�DØð B Ð+<Ð <Ð <Ø)×-Ò-¨cÑ2Ô2Ð2Ø)Ð)Ñ+Ô+Ð+Ø×4Ò4°TÑ:Ô:Ð:ð Ð3Ô4×;Ò;¸DÑAÔAÐAùàŒ}˜QÔÔ-ð ?Ø %¤¨aÔ 0Ô >�õ �u˜gÑ&Ô&ð (¨5¬;ð (Ø!œK�	ùàÐÑÔÐà(Ð(Ð):Ñ;Ô;ð 	Ø×,Ò,ØDÐ"3ÐDÐDÐDñô ð ð Ô Ñ,Ø#Ô2ˆNÝ�KŠKðRà”Ð+ )Ø”Ð(˜yñ	ô ð ð (,ˆEÔ$Ø$Ô,ˆGõ ˜g­­e }Ñ5Ô5ðØ:Að�˜”
�
àð õ
 ˜l¨I°tÑ<Ô<ˆGØÐ"å˜GÐ%8¸$Ñ?Ô?ð ;Ý˜w¨°TÑ:Ô:ð õ ˜n­cÑ2Ô2ð @°~ð @Ø%Ð%Ñ'Ô'Ð'Ø×/Ò/°Ñ?Ô?Ð?Ý! '¨9°dÑ;Ô;�Ý˜g¥sÑ+Ô+ð 6°ð 6Ø%Ð%Ñ'Ô'Ð'Ø×,Ò,¨WÑ5Ô5Ð5Ø!Ð!ð —w’w˜}Ñ-Ô-Ð5°ˆØˆØ"'ÐØð -	Ø ˆOÝ˜nÑ-Ô-ð +ð +�Ø# CÔ(�Ø˜zœN¨;Ô7�	Ø˜zœN¨6Ô2Ð9°c�	Øð 3 §¢Ñ!2Ô!2ð 3ð;Ýœ
 9Ñ-Ô-Ð-Ð-øÝÔ/ð ;ð ;ð ;õ $?¸yÈ)Ñ#TÔ#T˜Ø# tÒ+Ð+à(0˜I˜Ið 7;Ð3øøð;øøøð #Ð*ð /3Ð+Ø×&Ò&¥Ø˜$”xØ˜FœØ"$§&¢&¨Ñ"9Ô"9Ý,Ø 
œ^¨FÔ3Ø"+ðñ ô ð	(ñ (ô (ñ ô ð ð ð Ð!Ø!ð "à#ð "ð #ð "õ
 #ðGñô ð ð2 (?Ð'XÀ=ÐTXÐCXÐ$Ø'ð 	ðð ð ð å! .Ñ1Ô1ðñ ô ˆNõ �NŠNðNð ñ	ô ð õ .Ø�lØ—’˜Ñ(Ô(Ð0¨DØ˜IØ#1Ð#9°Tð	ñ ô ð ð ˜TÐ!ð #Øð#à"Ð"ð 	%ð
 (ð 		Ý�NŠNðEñô ð õ .Ø�lØ—’˜Ñ(Ô(Ð0¨DØ˜Iñô ð ð #0Ð"9°6ÐØ"ð 	/Ø&.Ð#àŸš Ñ1Ô1Ð9°TˆÝ&ØØ Ø&Ø,ð	
ñ 
ô 
ˆõ &ØØ Ø1ð
ñ 
ô 
ˆõ
 Ø�3�tœz™|œ|Ñ,Ô,Ñ,ØØ �MØð	
ñ 
ô 
ð 	
s   É:A	LË6K;Ë:LË;
LÌLÌLÌLÌ
LÌLÌ$L9Ì9+M'Í&M'Ó4S9Ó9
TÔTÚ9[Û[1Û0[1å e5å5*f"æ!f"c                óø	  •‡ ‡‡‡‡— d}d}t          j         ¦   «         ‰ d<   ‰                     ¦   «         Š‰‰!d<   ddiŠdddœŠd}ddlm} dd	lmŠ |                     ¦   «         }d=ˆˆˆ ˆfd„}d>ˆˆˆˆfd„}d?ˆˆˆfd„} ‰|                     ‰|t          t          ‰dd¦  «        pd¦  «        t          t          ‰dd¦  «        pd¦  «        t          t          ‰dd¦  «        pd¦  «        |j
        ||j        |dt          ‰dd¦  «        t          ‰dd¦  «        rdn't          t          ‰dd¦  «        pd¦  «        dk    rdnd d!œd"¬#¦  «        ¦  «        }		 |	D �]ã}
d"}t          j         ¦   «         ‰ d<   ‰                     d$¦  «         	 t          ‰                     d%d¦  «        ¦  «        d&z   ‰d%<   ‰                     d'¦  «        €‰ d         ‰d'<   t          ‰                     d(d¦  «        ¦  «        t          |
¦  «        z   ‰d(<   n# t           $ r Y nw xY w‰j        r �nt          |
d)d¦  «        }|d*k    r^t          |
d+d¦  «        }|rIt          |d)d¦  «        d,k    r4d"}t          |d-d¦  «        }|r ‰¦   «          ‰                     |¦  «         �Œ@|d.k    r�t          |
d/d¦  «        }|rŠt          |d)d¦  «        }|d0k    r;t          |d1d¦  «        }|r&|s$ ‰¦   «          ‰                     |¦  «         d"‰d2<   �Œ«|d3k    r2t          |d4d¦  «        }|r ‰¦   «          ‰                     |¦  «         �Œå‰j        sA‰d5         }|�7	 |                     ¦   «         }n!# t,          $ r |st/          d6¦  «        d‚‚ w xY w	  ‰¦   «          ‰d7         }|�|                     ddd¦  «         n€# ‰d7         }|�|                     ddd¦  «         w w xY w# 	  ‰¦   «          ‰d7         }|�|                     ddd¦  «         w w # ‰d7         }|�|                     ddd¦  «         w w xY wxY w‰j        rdS d@d8„}|�1t          |d9d¦  «        s t          |d:d¦  «        €t/          d;¦  «        ‚|�#|	j        s ||¦  «        rt/          d<¦  «        ‚|S |                     |¦  «        }t          |d9d¦  «        s t          |d:d¦  «        €t/          d;¦  «        ‚ ||¦  «        rt/          d<¦  «        ‚|S )AaV  Stream an Anthropic Messages API response.

        Fires delta callbacks for real-time token delivery, but returns
        the native Anthropic Message object from get_final_message() so
        the rest of the agent loop (validation, tool extraction, etc.)
        works unchanged.

        Uses ``request_client`` (a per-request Anthropic client registered with
        the stranger-thread abort machinery) rather than the shared
        ``_anthropic_client``, so the stale/interrupt watchdog can abort this
        stream's socket without closing the shared client mid-flight (#67142).
        FrÄ  ræ  r4   N)Úmanagerr«  r   r  )Úsanitize_anthropic_kwargsr¨  r©  c                ó°   •— t          | ¦  «        } ‰|t          ‰dd¦  «        ¬¦  «          ‰j        j        di |¤Ž}|‰d<   |                     ¦   «         S )Nrê  rS   )rê  r\  r?   )rK   rY   r<   r«  Ú	__enter__)r¨  r®  r\  Ú_stream_contextrZ   r'  r]  s      €€€€r&   Ú_open_anthropic_streamzYinterruptible_streaming_api_call.<locals>._call_anthropic.<locals>._open_anthropic_streamâ  su   ø€ Ý Ñ0Ô0ˆLØ%Ð%ØÝ" 5¨,¸Ñ;Ô;ðñ ô ð ð 5�nÔ-Ô4ÐDÐD°|ÐDÐDˆGØ)0ˆO˜IÑ&Ø×$Ò$Ñ&Ô&Ð&r(   r!  r   r1   rÈ   c                ó¤   •— | ‰d<   	 ‰                      ‰t          | dd ¦  «        ¦  «         n# t          $ r Y nw xY wt          ‰¦  «        ‰d<   d S )Nr«  rt  r4   )r%  rY   r�   r   )r!  r'  r`  r(  rZ   s    €€€€r&   Ú_anthropic_stream_createdz\interruptible_streaming_api_call.<locals>._call_anthropic.<locals>._anthropic_stream_createdì  s{   ø€ Ø(2ˆO˜HÑ%ðØ×3Ò3ØÝ˜J¨
°DÑ9Ô9ñô ð ð øõ ð ð ð Ø�ðøøøå%8¸Ñ%?Ô%?ˆM˜'Ñ"Ð"Ð"s   ˆ%. ®
;º;rÃ  rP   c                óž   •— ‰d         }|�t          ‰|¦  «        rdS t                               d‰                     dd¦  «        ¦  «         dS )Nr4   Tz‚Anthropic streaming attempt superseded by a newer stream; stopping consumption to preserve the single-writer invariant (model=%s).rÒ   rÓ   F)r   rm   rn   rL   )rÃ  rÅ  r(  rZ   rÐ   s     €€€r&   Ú_accept_anthropic_eventzZinterruptible_streaming_api_call.<locals>._call_anthropic.<locals>._accept_anthropic_eventú  s[   ø€ Ø! 'Ô*ˆEØˆ}Õ 8¸ÀÑ FÔ Fˆ}Ø�tÝ�NŠNð(ð —’˜w¨	Ñ2Ô2ñ	ô ð ð �5r(   r‹   rS   rU   r¿  rÒ   r  rÊ  rË  rÌ  rØ  rÍ  rÎ  rÏ  T)	r‹   r•   r$  rÐ  rÑ  rÒ  rÔ  r%  r&  r5  r6  rÊ   r7  r8  r�  Úcontent_block_startÚcontent_blockÚtool_user•   Úcontent_block_deltar¡   Ú
text_deltar¨   r›  Úthinking_deltaÚthinkingr«  zeProvider returned an empty stream with no events (possible upstream error or malformed event stream).r\  c                óˆ   — t          | dd¦  «        �dS t          | dd¦  «        pg D ]}t          |dd¦  «        dk    r dS ŒdS )uµ  True when the stream died mid tool call (#80498 sibling).

            Mirror of the chat_completions zero-byte/truncated-args gate: a
            legitimate completion always carries a ``stop_reason``
            (``tool_use``/``end_turn``/...), so a message that contains a
            ``tool_use`` block but NO stop_reason means the SSE closed after
            ``content_block_start`` and before ``message_delta`` â€” the
            block's ``input`` is whatever partial state the SDK snapshot
            accumulated (typically ``{}`` when no ``input_json_delta`` ever
            arrived). Without this gate the empty-input call passed the
            empty-stream guards (content is non-empty) and executed the tool
            with no arguments and no retry. Raising EmptyStreamError blocks
            that execution on every path; when no assistant text streamed
            before the drop it additionally rides the bounded stream-retry
            the eventless case uses (probe-verified recovery), while a
            drop after streamed preamble text degrades to the
            partial-stream-stub/continuation path instead â€” still never an
            empty-args execution.
            Ústop_reasonNFr¢   r�  rh  T)rY   )r“  Úblocks     r&   Ú_tool_use_dropped_mid_streamz_interruptible_streaming_api_call.<locals>._call_anthropic.<locals>._tool_use_dropped_mid_stream]  sc   € õ( �w ¨tÑ4Ô4Ð@Ø�uÝ  ¨)°TÑ:Ô:Ð@¸bð  ð  �Ý˜5 &¨$Ñ/Ô/°:Ò=Ð=Ø˜4˜4ð >à�5r(   r¢   rn  zjProvider returned an empty stream with no stop_reason (possible upstream error or malformed event stream).zStream ended with no stop_reason while a tool_use block was still incomplete; treating as a mid-tool-call stream drop (#80498).rß  r=  rà  ©r1   rP   )rY  r?  rZ   r   r%  r]  ÚAnthropicStreamAccumulatorr«  r8   rY   ÚfinalizeÚobserver2   rÜ   rL   r°   r�   r\  rµ  r±  r¸  Úget_final_messageÚAssertionErrorr   Ú__exit__Úoutput_modifiedrt  )"r'  Úhas_tool_useÚsaw_stream_eventÚbase_final_messager   Úaccumulatorra  rc  re  r«  ÚeventÚ
event_typero  r-  r¡   Ú
delta_typer¨   Úthinking_textr!  r\  rp  Úfinal_messager'  r`  r(  r]  r÷  r  rõ  rZ   rÐ   r²  r  r€  s"   `                     @@@@€€€€€€€€r&   Ú_call_anthropicz9interruptible_streaming_api_call.<locals>._call_anthropic¼  s  øøøøøø€ ð ˆð !Ðå#œy™{œ{ˆ˜ÑØ×'Ò'Ñ)Ô)ˆØ(-Ð˜fÑ%Ø  $˜ˆØ&*°dÐ;Ð;ˆØ!Ðà#Ð#Ð#Ð#Ð#Ð#ØEÐEÐEÐEÐEÐEà×:Ò:Ñ<Ô<ˆð	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð %Ð$Ø×ÒØØ&Ý�w u¨l¸BÑ?Ô?ÐEÀ2ÑFÔFÝ� ¨
°BÑ7Ô7ÐF¸;ÑGÔGÝ�w u¨g°rÑ:Ô:Ð@¸bÑAÔAØ%Ô.Ø";Ø$Ô,Ø4à 4Ý&-¨eÐ5NÐPTÑ&UÔ&Uõ # 5¨-¸Ñ?Ô?ð'˜˜õ �w uÐ.?ÀÑCÔCÐHÀqÑIÔIÈAÒMÐMð (˜Zà&ð
ð 
ð *.ð+ ñ ô ñ
ô 
ˆð29	7Øð %Kñ %K�Ø#'Ð Ý'+¤y¡{¤{� Ñ$Ø×%Ò%Ð&AÑBÔBÐBðÝ&)¨%¯)ª)°H¸aÑ*@Ô*@Ñ&AÔ&AÀAÑ&E�E˜(‘OØ—y’yÐ!1Ñ2Ô2Ð:Ø2AÀ#Ô2F˜Ð.Ñ/Ý%(¨¯ª°7¸AÑ)>Ô)>Ñ%?Ô%?ÕBWÐX]ÑB^ÔB^Ñ%^�E˜'‘N�NøÝ ð ð ð Ø�DðøøøàÔ-ð Ø‘Eå$ U¨F°DÑ9Ô9�
ØÐ!6Ò6Ð6Ý# E¨?¸DÑAÔA�EØð D¥¨°¸Ñ!=Ô!=ÀÒ!KÐ!KØ'+˜Ý$+¨E°6¸4Ñ$@Ô$@˜	Ø$ð DØ-Ð-Ñ/Ô/Ð/Ø!×8Ò8¸ÑCÔCÐCùØÐ#8Ò8Ð8Ý# E¨7°DÑ9Ô9�EØð KÝ%,¨U°F¸DÑ%AÔ%A˜
Ø%¨Ò5Ð5Ý#*¨5°&¸"Ñ#=Ô#=˜DØ#ð ?¨Lð ?Ø 1Ð 1Ñ 3Ô 3Ð 3Ø %× 8Ò 8¸Ñ >Ô >Ð >Ø:>Ð 0°Ñ 7ùØ'Ð+;Ò;Ð;Ý,3°E¸:ÀrÑ,JÔ,J˜MØ,ð KØ 1Ð 1Ñ 3Ô 3Ð 3Ø %× ;Ò ;¸MÑ JÔ JÐ JùØÔ-ð Ø,¨XÔ6�
ØÐ)ðØ-7×-IÒ-IÑ-KÔ-KÐ*Ð*øÝ)ð ð ð Ø/ð (Ý"2ð!Wñ#ô #ð $(ð(ð ðøøøð7Ø%Ð%Ñ'Ô'Ð'à)¨)Ô4�ØÐ&Ø×$Ò$ T¨4°Ñ6Ô6Ð6øøð *¨)Ô4�ØÐ&Ø×$Ò$ T¨4°Ñ6Ô6Ð6Ð6ð 'øøøøð	7Ø%Ð%Ñ'Ô'Ð'à)¨)Ô4�ØÐ&Ø×$Ò$ T¨4°Ñ6Ô6Ð6Ð6ð 'øð *¨)Ô4�ØÐ&Ø×$Ò$ T¨4°Ñ6Ô6Ð6Ð6ð 'øøøøøøð Ô%ð 	Ø�4ð	ð 	ð 	ð 	ð8 Ð*ÝÐ.°	¸4Ñ@Ô@ð +åÐ*¨M¸4Ñ@Ô@ÐHå"ðGñô ð ð Ð)°&Ô2HÐ)Ø+Ð+Ð,>Ñ?Ô?ð Ý&ð:ñô ð ð
 &Ð%Ø#×,Ò,Ð-?Ñ@Ô@ˆå˜ y°$Ñ7Ô7ð	å˜ }°dÑ;Ô;ÐCå"ðGñô ð ð (Ð'¨Ñ6Ô6ð 	Ý"ð6ñô ð ð
 Ðsn   Å2O ÆA?HÈO È
HÈO ÈHÈD8O ÍM' Í&O Í'NÎO Î	
N5 Î5$OÏP2Ï
PÏ(#P2Ð$P/Ð/P2c                 ód  •‡‡— dd l } t          dd¦  «        }	 t          |dz   ¦  «        D �]} ‰ ¦   «         }‰!j        r ‰d¦  «         t	          d¦  «        ‚	 ‰!j        dk    r0 ‰‰!                     d¬	¦  «        d¬
¦  «        } ‰|¦  «        ‰&d<   n ‰|¦  «        ‰&d<     ‰¦   «           ‰‰&d         �dnd¦  «         d S # t          $ �r\} ‰¦   «          ‰d         rSt           	                    dt          |¦  «        j        ¦  «         Y d }~  ‰¦   «           ‰‰&d         �dnd¦  «         d S t          || j        | j        | j        f¦  «        }t          || j        | j        t$          f¦  «        }‰!                     |¦  «        }t          |t(          ¦  «        }	‰"d         �ršt+          ‰&                     d¦  «        ¦  «        p‰$d         }
d}|sg|seddlm} t          ||¦  «        rOt3          |dd ¦  «        s>t5          |¦  «                             ¦   «         Šd}t9          ˆfd„|D ¦   «         ¦  «        }|p|p|p|}|
o|o||k     }|sFt                               d|¦  «         |‰&d<   Y d }~  ‰¦   «           ‰‰&d         �dnd¦  «         d S 	 ‰!                     d¦  «         n# t          $ r Y nw xY w	 ‰!                     ¦   «          n# t          $ r Y nw xY wg ‰&d<   d‰"d<   d‰#d<   ‰!                      ||dz   |dz   d‰%                     d¦  «        ¬¦  «          ‰d¦  «          ‰d¦  «         Y d }~�Œd}|sg|seddlm} t          ||¦  «        rOt3          |dd ¦  «        s>t5          |¦  «                             ¦   «         Šd}t9          ˆfd„|D ¦   «         ¦  «        }|s|s|s|s|	rÀ||k     rO‰!                      ||dz   |dz   d‰%                     d¦  «        ¬¦  «          ‰d ¦  «          ‰d ¦  «         Y d }~�Œå‰! !                    d!||dz   |dz   d‰%                     d¦  «        ¬"¦  «         |r
d#|dz   › d$�}n|	r
d%|dz   › d$�}n	d&|dz   › d$�}‰! "                    |¦  «         n�t5          |¦  «                             ¦   «         }d'|v od(|v }d}|sd)|v rdd*l#m$}  ||¦  «        }|s|r d‰!_%        ‰! &                    |rd+nd,¦  «         t           '                    d-|¦  «         |‰&d<   Y d }~  ‰¦   «           ‰‰&d         �dnd¦  «         d S d }~ww xY wn<# t          $ r/}|‰&d<   Y d }~ ‰¦   «           ‰‰&d         �dnd¦  «         d S d }~ww xY w	  ‰¦   «           ‰‰&d         �dnd¦  «         d S #  ‰¦   «           ‰‰&d         �dnd¦  «         w xY w).Nr   ÚHERMES_STREAM_RETRIESr±  rÊ   Úinterrupt_before_stream_retryz%Agent interrupted before stream retryr  Úanthropic_stream_requestrB  r  rt  Ústream_request_completeÚstream_error_cleanupr4   uP   Streaming worker caught %s after request cancellation â€” exiting without retry.r›  rå  F)ÚAPIErrorÚstatus_code)
zconnection lostzconnection resetzconnection closedzconnection terminatedznetwork errorznetwork connectionÚ
terminatedzpeer closedzbroken pipezupstream connect errorc              3  ó    •K  — | ]}|‰v V — Œ	d S r!   r?   )r@   ÚphraseÚ_err_lower_previews     €r&   rB   zBinterruptible_streaming_api_call.<locals>._call.<locals>.<genexpr>õ  s=   øè è € ð ?"ð ?"à(.ð %+Ð.@Ð$@ð?"ð ?"ð ?"ð ?"ð ?"ð ?"r(   z9Streaming failed after partial delivery, not retrying: %sry  u9   

âš  Connection dropped mid tool-call; reconnectingâ€¦

r<  Træ  )ry  ÚattemptÚmax_attemptsÚmid_tool_callræ  Ústream_mid_tool_retry_cleanupc              3  ó    •K  — | ]}|‰v V — Œ	d S r!   r?   )r@   r�  Ú_err_lower_sses     €r&   rB   zBinterruptible_streaming_api_call.<locals>._call.<locals>.<genexpr>W  s<   øè è € ð 3ð 3à$*ð !'¨.Ð 8ð3ð 3ð 3ð 3ð 3ð 3r(   Ústream_retry_cleanupÚ	exhausted)r  ry  r�  r�  r‘  ræ  u5   â�Œ Provider returned malformed streaming data after uM    attempts. The provider may be experiencing issues â€” try again in a moment.u5   â�Œ Provider returned an empty response stream after u(   â�Œ Connection to provider failed after r«  znot supportedÚinvokemodelwithresponsestream)r¦  uŠ   
âš   AWS IAM denied bedrock:InvokeModelWithResponseStream. Switching to non-streaming.
   Grant that action to restore streaming output.
uš   
âš   Streaming is not supported for this model/provider. Switching to non-streaming.
   To avoid this delay, set display.streaming: false in config.yaml
z$Streaming failed before delivery: %s)(r>  r   Úranger\  rm  r  rŒ  r�   rm   r‘   r�  rŽ  r7   ÚReadTimeoutÚConnectTimeoutÚPoolTimeoutÚConnectErrorrA  ÚConnectionErrorÚ_is_provider_stream_parse_errorr   rP   rL   rH  r‰  rY   r8   rk   r&  rn   r±  Ú_reset_stream_delivery_trackingÚ_emit_stream_dropÚ_log_stream_retryrÙ   r   r¦  r­  rJ  Ú	exception)'r  Ú_max_stream_retriesÚ_stream_attemptr   r'  r�  Ú_is_timeoutÚ_is_conn_errÚ_is_stream_parse_errÚ_is_empty_streamÚ_partial_tool_in_flightÚ_is_sse_conn_err_previewÚ	_APIErrorÚ_SSE_PREVIEW_PHRASESÚ_is_transientÚ_can_silent_retryÚ_is_sse_conn_errÚ_SSE_CONN_PHRASESÚ_exhausted_msgÚ
_err_lowerÚ_is_stream_unsupportedÚ_is_bedrock_stream_deniedr¦  rŽ  r”  r‚  rZ  rÿ  r÷  r‰  r�  r‚  rý  rZ   r²  r¢  rú  r€  r‘  s'                          @@€€€€€€€€€€€€€€r&   r’  z/interruptible_streaming_api_call.<locals>._callš  sé	  øøø€ ØÐÐÐå%Ð&=¸qÑAÔAÐðE	Ý#(Ð)<¸qÑ)@Ñ#AÔ#Að tñ t�Ø$9Ð$9Ñ$;Ô$;Ð!ð Ô-ð TØ2Ð2Ð3RÑSÔSÐSÝ*Ð+RÑSÔSÐSðiØ”~Ð)=Ò=Ð=ð *=Ð)<Ø!×BÒBØ'Að Cñ ô ð "6ð	*ñ *ô *˜ð .=¨_¸^Ñ-LÔ-L˜˜zÑ*Ð*à-CÐ-CÐDUÑ-VÔ-V˜˜zÑ*ØðF	 "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð øõM	 !ð Zñ Zð ZØ)Ð)Ñ+Ô+Ð+ð *¨'Ô2ð ÝŸšðFå  ™GœGÔ,ñô ð ð
 ˜˜˜˜ðd "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð õk #-Ø˜FÔ.°Ô0EÀvÔGYÐZñ#ô #�Kõ $.Ø˜FÔ/°Ô1KÍ_Ð]ñ$ô $�Lð ,1×+PÒ+PÐQRÑ+SÔ+SÐ(Ý'1°!Õ5EÑ'FÔ'FÐ$ð (¨Ô.ñ \!Ý26Ø"ŸJšJÐ';Ñ<Ô<ñ3ô 3ð 3<à4°UÔ;ð 0ð 49Ð0Ø*ð "°<ð "ØDÐDÐDÐDÐDÐDÝ)¨!¨YÑ7Ô7ð "ÅÈÈ=ÐZ^Ñ@_Ô@_ð "Ý58¸±V´V·\²\±^´^Ð 2ð8"Ð 4õ <?ð ?"ð ?"ð ?"ð ?"à2Fð?"ñ ?"ô ?"ñ <"ô <"Ð 8ð
 (ð 4Ø+ð4à7ð4ð  4ð	 &ð 4ð FØ -ðFà /Ð2EÒ Eð *ð
  1ð #õ #ŸNšNØ [Ð]^ñô ð ð /0˜F 7™OØ"˜F˜F˜F˜FðZ "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð ðS!Ø!×4Ò4ð!6ñô ð ð øõ  )ð !ð !ð !Ø ˜Dð!øøøð!Ø!×AÒAÑCÔCÐCÐCøÝ(ð !ð !ð !Ø ˜Dð!øøøð
 8:˜Ð3Ñ4Ø27Ð(¨Ñ/Ø49Ð)¨&Ñ1Ø×/Ò/Ø"#Ø$3°aÑ$7Ø)<¸qÑ)@Ø*.Ø!6×!:Ò!:¸6Ñ!BÔ!Bð 0ñ ô ð ð 7Ð6Ð7VÑWÔWÐWØ2Ð2Ð3RÑSÔSÐSð !˜˜˜™ð (-Ð$Ø&ð ¨|ð Ø@Ð@Ð@Ð@Ð@Ð@Ý% a¨Ñ3Ô3ð ½GÀAÀ}ÐVZÑ<[Ô<[ð Ý-0°©V¬V¯\ª\©^¬^˜Nð1Ð-õ 03ð 3ð 3ð 3ð 3à.?ð3ñ 3ô 3ñ 0ô 0Ð,ð $ðpà'ðpð ,ðpð 0ð	pð
 ,ðpð +Ð-@Ò@Ð@Ø!×3Ò3Ø&'Ø(7¸!Ñ(;Ø-@À1Ñ-DØ.3Ø%:×%>Ò%>¸vÑ%FÔ%Fð 4ñ ô ð ð ;Ð:Ð;QÑRÔRÐRØ6Ð6Ð7MÑNÔNÐNð %˜H˜H˜H™Hð ×/Ò/Ø!,Ø"#Ø$7¸!Ñ$;Ø)<¸qÑ)@Ø*/Ø!6×!:Ò!:¸6Ñ!BÔ!Bð 0ñ ô ð ð 0ð ð!9Ø#6¸Ñ#:ð!9ð !9ð !9ð +˜Nð .ð ð!9Ø)<¸qÑ)@ð!9ð !9ð !9ð +˜Nð!9Ø#6¸Ñ#:ð!9ð !9ð !9ð +ð ×,Ò,¨^Ñ<Ô<Ð<Ð<å%(¨¡V¤V§\¢\¡^¤^˜
à$¨
Ð2ð >Ø /°:Ð =ð /ð 5:Ð1à 6ðà ?À:Ð MÐ Mðð ð ð ð ð ð !AÐ @ÀÑ CÔ Cð 6ð 2ð Ð5Nð Ø7;˜EÔ4Ø!×-Ò-ð $=ð!3ð !Vð !Vð!3ñ	ô 	ð 	õ ×(Ò(ØBØñô ð ð '(�F˜7‘OØ�F�F�F�Fð "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð øøøøðM	Zøøøð5tøõj	  ð 	ð 	ð 	ð  ˆF�7‰OØˆFˆFˆFà!Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð øøøøð	øøøðk	tðx	 "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð ð øð	 "Ð!Ñ#Ô#Ð#ð 'Ð&à˜*Ô%Ð1ð *Ð)à+ñô ð ð øøøsÑ   ™A T0 ÁA	CÂ#T0 ÃT,Ã?T'ÄT0 Ä5E T'É5T0 ÊJ2Ê1T'Ê2
J?Ê<T'Ê>J?Ê?T'ËKËT'Ë
K%Ë"T'Ë$K%Ë%AT'Í T0 ÍCT'Ð
T0 ÐC1T'ÔT0 Ô'T,Ô,T0 Ô/V Ô0
U)Ô:U$Ô?V Õ$U)Õ)V Ö!V/ræ   rç   rb   )Úload_config_readonlyrZ   Úlocal_stream_stale_timeoutÚ!HERMES_LOCAL_STREAM_STALE_TIMEOUTuB   Local provider detected (%s) â€” stale stream timeout set to %.0fsr`   rè   ra   ré   rê   rÒ   r  r6  r»   r¼   rS   r£  r¤  r¥  zRs with no output yet (provider may be slow or overloaded, or the model is thinkingr¦  zwaiting for stream response (zs, no chunks yet)uq   Stream stale for %.0fs (threshold %.0fs) â€” no chunks received. model=%s context=~%s tokens. Killing connection.rÕ   rÖ   z, context: ~z tokens). Reconnecting...Ústale_stream_killr  u    âš  no output from provider for rª  zstale stream detected after zs, reconnectingzLForce-closing streaming httpx client due to interrupt (not a network error).Ústream_interrupt_abortz+Agent interrupted during streaming API callz9Agent interrupted during streaming API call (post-worker)Ú _current_streamed_assistant_textrå  ri   é   z, +z moreu$   

âš  Stream stalled mid tool-call (zH); the action was not executed. Ask me to retry if you want to continue.z[Partial stream dropped tool call(s) %s after %s chars of text; surfaced warning to user: %sz¡Partial stream delivered before error; returning length-truncated stub with %s chars of recovered content so the loop can continue from where the stream died: %srS  r�  )Úclassify_api_errorr   rU   )rU   rÒ   r‘  r”  r­  r®  )r«  r   r1   r   rf  ©r1   r2   )r   r2   r1   rP   )r   r2   r1   rÈ   )r   r2   )=r\  rm  r3  Ú_interruptible_api_callr  r  rY  rL   rõ   rä   rg  rj  r+   rk  r²  ro   rm   rn   rÙ   r2   rË   r   r  r�   r‘   rM  rÍ   rh  ro  r	   rU   rÒ   r   rÜ  r   r÷  rµ  r7   rK   r^   rO   rÀ   rí   rë   r³  rÜ   rY   rj   rC   r9   r±  r   r   Úagent.error_classifierr¼  r   r8   r?  Úcontent_policy_blockedr
   Ú_content_filter_terminated)DrZ   rÐ   r  rß  Ú_bedrock_stale_timeouträ  rÄ  Ú_stale_elapsedr  Ú
_inval_excr’  rï   Ú_stream_stale_timeout_baseÚ_local_defaultrµ  Ú_cfgÚ
_agent_cfgÚ_vrñ   rë   rô   Ú_last_heartbeatÚ_HEARTBEAT_INTERVALÚ_hb_nowÚ_waiting_secsrÇ  Ú_est_ctxÚ_partial_textÚ_partial_namesÚ	_name_strÚ_warnÚ_stub_finish_reasonÚ	_stub_msgrÁ  r¼  r   Ú_clsÚ_stubrÙ  r‚  rZ  rÿ  r÷  r‰  rí  r	  r£  r  r�  rõ  r‚  rë  rý  r  r  ré  rY  r²  r¢  r  rô  rú  r€  r�  rE  r‘  rû  rü  sD   ```                                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r&   Ú interruptible_streaming_api_callr×  ¬
  sù  øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøø€ ð  Ô!ð NÝÐLÑMÔMÐMõ " %Ñ(Ô(ð 9Ø×,Ò,¨ZÑ8Ô8Ð8à„~Ð*Ò*Ð*ð
 '5ˆÔ#ð	/Ø×0Ò0°Ñ<Ô<à*.ˆEÔ'Ð'ø¨$ˆEÔ'Ð.Ð.Ð.Ð.ð „~Ð+Ò+Ñ+Ø"¨TÐ2Ð2ˆØ# U˜OÐØ! 5˜>Ðð  #¥D¤I¡K¤KÐ0Ðð %Ÿ.š.Ð)=¸{ÑKÔKˆå!=¸eÀZÑ!PÔ!PÐõ
 	˜EÑ"Ô"Ð"ð	ð 	ð 	ð 	ð 	ð 	ðr	#ð r	#ð r	#ð r	#ð r	#ð r	#ð r	#ð r	#ð r	#ð r	#õh ÔÝ)¨-Ñ8Ô8Àð
ñ 
ô 
ˆð 	
�Š‰	Œ	ˆ	Ø�jŠj‰lŒlñ 5	Ø�FŠF˜3ˆFÑÔÐØÔ)ð TÝ&Ð'RÑSÔSÐSõ
 "œY™[œ[Ð+>¸sÔ+CÑCˆNØÐ 6Ò6Ñ6Ý—’ðCà"Ð$:Ø# Z§^¢^°I¸yÑ%IÔ%Iñ	ô ð ð ×$Ò$ðT½¸^Ñ9LÔ9Lð Tð TØ)Ÿ~š~¨i¸ÑCÔCðTð Tð Tñô ð õ # 5Ñ)Ô)Ð)ðØOÐOÐOÐOÐOÐOØ-Ð-¨oÑ>Ô>Ð>Ð>øÝ ð ð ð Ý—L’LØCÀZñô ð ð ð ð ð ð øøøøðøøøõ ,0¬9©;¬;Ð# CÑ(õ $ EÑ*Ô*Ð*õ
 #/ðF½SÀÑ=PÔ=Pð Fð FÝ"%Ð&<Ñ"=Ô"=ðFð Fð Fñ#ô #��w‘ð
 ðk �jŠj‰lŒlñ 5	ð| Ô%ð 	^Ý"Ð#\Ñ]Ô]Ð]Ø�'Œ?Ð&Ø˜”/Ð!ð �*ÔÐ)Ý Ñ&Ô&Ð&Ø�jÔ!Ð!à¨ÀRÐHÐH€Fõ
 ˜ÑÔÐà'+°TÈÐMÐMÐð # HÐ-ÐÝ#œ.Ñ*Ô*Ðð " 5Ð)Ðà3;ð ð ð ð ð ð ð ð ð ð ðð ð ðð ð ð ð ð ð ð ðð ð ð ð ð ð)Nð )Nð )Nð )Nð )Nð )Nð )Nð )Nð )Nð )NðV   ˜ÐØ˜u�~ÐØ$ e˜nÐð �DœI™KœKÐ(€Oð !ÐÝ#œ.Ñ*Ô*ÐàÝ‘U”UØØð	ð Ðð & tÐ,Ððð ð ð ð ð ð	Vð 	Vð 	Vð 	Vð 	Vð 	Vðð ð ð ð ð ð ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ðð ð ð ð ð ð ðJð Jð Jð Jð Jð Jð Jðð ð ð ð ð ð ð6ð ð ð ð ð ðj
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ð j
ðX\ð \ð \ð \ð \ð \ð \ð \ð \ð \ð \ð \ð|Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð Jð JõZ
 ,¨E¬N¸E¼KÑHÔH€JØÐØ%/Ð"Ð"å%.Ð/LÈeÑ%TÔ%TÐ"ð " UÒ*Ð*¨u¬~Ð*ÕBSÐTYÔTbÑBcÔBcÐ*ð ˆð
	Ø>Ð>Ð>Ð>Ð>Ð>à'Ð'Ñ)Ô)ˆDÝ.8¸½tÑ.DÔ.DÐN˜Ÿš 'Ñ*Ô*Ð*È$ˆJÝ˜*¥dÑ+Ô+ð /Ø—^’^Ð$@ÑAÔA�Ý˜b¥3­ ,Ñ/Ô/ð /Ý%*¨2¡Y¤Y�NøøÝð 	ð 	ð 	ØˆDð	øøøå )Ð*MÈ~Ñ ^Ô ^ÐÝ�ŠØPØŒNÐ1ñ	
ô 	
ð 	
ð 	
õ 6°jÑAÔAˆØ˜Ò Ð Ý$'Ð(BÀEÑ$JÔ$JÐ!Ð!Ø˜6Ò!Ð!Ý$'Ð(BÀEÑ$JÔ$JÐ!Ð!à$>Ð!ð 	OÐNÐNÐNÐNÐNØ<Ð<¸Z¿^º^ÈGÑ=TÔ=TÑUÔUÐØÐ'Ý$'Ð(=Ð?OÑ$PÔ$PÐ!åÔÕ 6°uÑ =Ô =ÀdÐKÑKÔK€AØ‡G‚G�I„I€IÝ”i‘k”k€OØÐØ
�*Š*‰,Œ,ñ sRØ	�Š�sˆÑÔÐõ ”)‘+”+ˆØ�_Ñ$Ð(;Ò;Ð;Ø%ˆOÝ ¨/¸#Ô*>Ñ >Ñ?Ô?ˆMØÐ 3Ò3Ð3ð *Ð5Ø-µ°u±´Ò=Ð=à TµsÐ;PÑ7QÔ7QÐ TÐ TÐ T�I�Ià "�IØ×'Ò'ðP j§n¢n°W¸nÑ&MÔ&Mð Pð PØ$ðPð PàCLðPð Pð Pñô ð ð ð ×%Ò%ØT°MÐTÐTÐTñô ð õ œ™œ °sÔ';Ñ;ˆØÐ1Ò1Ñ1Ý6°zÑBÔBˆHÝ�NŠNðCàÐ 5Ø—’˜w¨	Ñ2Ô2°x°O°Oñ	ô ð ð × Ò ð#½¸NÑ8KÔ8Kð #ð #Ø%Ÿ>š>¨'°9Ñ=Ô=ð#ð #à%Ð3ð#ð #ð #ñô ð ðØ.Ð.Ð/BÑCÔCÐCØ*Ð*Ð+>Ñ?Ô?Ð?Ð?øÝð ð ð Ø�ðøøøõ ˜uÑ%Ô%Ð%ð Œ~Ð!5Ò5Ð5ð ð õ $(¤9¡;¤;ˆO˜CÑ Ø×#Ò#ð#µ3°~Ñ3FÔ3Fð #ð #ð #ñô ð ð ×!Ò!ØS­s°>Ñ/BÔ/BÐSÐSÐSñô ð ð Ô%ð 	Rð
 +/Ð˜wÑ'Ý�LŠLð)ñô ð ðØ.Ð.Ð/GÑHÔHÐHð +Ð*Ð+CÑDÔDÐDÐDøÝð ð ð Ø�ðøøøå"Ð#PÑQÔQÐQðg �*Š*‰,Œ,ñ sRðr Ô!ð \ÝÐZÑ[Ô[Ð[Øˆg„Ñ"Ø˜EÔ"ñ a	õ ˜ÐAÀ2ÑFÔFÐLÈ"ßŠe‰gŒgðàð õ " &§*¢*Ð-AÑ"BÔ"BÐ"HÀbÑIÔIˆNØð ;Ø ŸIšI n°R°a°RÔ&8Ñ9Ô9�	Ý�~Ñ&Ô&¨Ò*Ð*ØÐ!E¥s¨>Ñ':Ô':¸QÑ'>Ð!EÐ!EÐ!EÑE�Ið@Ø!ð@ð @ð @ð ð
 "/Ð!4°"¸Ñ =�ðØ×,Ò,¨UÑ3Ô3Ð3Ð3øÝ ð ð ð Ø�Dðøøøå—’ð<à"¥C¨Ð(;¸Ñ$<Ô$<¸fÀW¼oñô ð õ
 ';Ð#Ð#å—’ð&õ ˜Ð+¨Ñ,Ô,Ø˜7”Oñô ð õ ';Ð#õ (Ø ¨-ÀDØ"&ðñ ô ˆIð */Ð&ð3ØUÐUÐUÐUÐUÐUÐUÐUØ)Ð)Ø˜7”OÝ ¥¨°
¸BÑ!?Ô!?Ð!EÀ2ÑFÔFÝ�g e¨W°bÑ9Ô9Ð?¸RÑ@Ô@ðñ ô �ð ”K >Ô#HÒHð +Ð*øõ ð 3ð 3ð 3Ø-2Ð*Ð*Ð*ð3øøøå#Ý)Ý˜e W¨iÑ8Ô8Ý(Ø YÐ>Qðñ ô ð ð Ø$2Ð$:°dðñ ô ˆEð *ð 8Ø37�Ô0õ   Ñ&Ô&Ð&ØˆLØ�WŒoÐð ˆjÔÐ%Ý˜EÑ"Ô"Ð"Ø�*ÔÐs€   Á/B Â	BÈ$H6 È6
I%É I É I%Ò BT Ô
TÔTÞ^3 Þ3
_ Þ?_ á(a? á?
bâbå?f æ
f"æ!f"è-A(j êj%ê$j%)rÌ  rJ  rŒ  r  rƒ  rŒ  r×  )r0   r   r1   r2   rq  )r]   r2   r1   r^   )rf   r   r1   rg   )r1   rs   )rƒ   rK   r1   rK   )r•   r8   r–   r^   r1   r^   )r�   r   r1   r2   )r±   r^   r²   rP   r³   r^   r´   rµ   r¶   r^   r·   rP   r¸   r^   r¹   r^   r1   r8   r½  rf  )rÐ   rK   r¹   r^   r±   r^   rÎ   rP   rÏ   rg   r1   rÈ   )r¹   r^   r1   rÈ   )rÐ   rK   r1   r^   )rö   r÷   r1   rø   )rÐ   rK   r!   )rÍ  rC   rÎ  rÏ  r1   rK   )rK  r8   r1   rK   )rÒ   r8   rU   r8   r1   rÈ   )r™  rK   r1   rš  )r™  rK   r1   rg   )r?  r¬  r1   rP   )r<   rC   r  r2   r1   r8   )r„  r8   r1   rÈ   )\Ú__doc__Ú
__future__r   r)   rC  ri  r½   r˜   rÿ   rg  rY  r'  Útypesr   Útypingr   r   r   Úhermes_cli.timeoutsr   r	   rø  r
   r   r¿  r   Úagent.errorsr   Úagent.turn_contextr   Úagent.gemini_native_adapterr   rõ  r   Úagent.message_contentr   Úagent.message_sanitizationr   r   Úagent.reasoning_summariesr   Úagent.stream_single_writerr   r   Útools.terminal_toolr   Úutilsr   r   r   r   Ú	getLoggerrŽ  rm   rl   rÚ  r+   r/   rO   r\   re   rr   r‚   r”   rœ   r°   rÃ   rÇ   rË   rÍ   rÚ   rÝ   rä   rõ   rî   r+  r3  rS  r9  rv  rÌ  rJ  rŒ  r˜  rž  r«  r  rƒ  rŒ  rœ  r×  Ú__all__r?   r(   r&   ú<module>rè     s,  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø )Ð )Ð )Ð )Ð )Ð )Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø AÐ AÐ AÐ AÐ AÐ AØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð FÐ EÐ EÐ EÐ EÐ EØ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ Nà	ˆÔ	˜8Ñ	$Ô	$€Ø#EÐ#EÐ#EÐ  ð "%Ð ð)ð )ð )ðð ð ð2$ð 2$ð 2$ð 2$ðj	ð 	ð 	ð 	ðð ð ð ð&ð ð ð ð"ð ð ð ð&ð ð ð ð2ð ð ð ð,ð ,ð ,ð ,ð^9ð 9ð 9ð 9ðHð ð ð ðð ð ð ðð ð ð ð Øð!Eð !Eð !Eð !Eð !Eð !EðHCð Cð Cð Cð
ð 
ð 
ð 
ð#ð #ð #ð #ðL>ð >ð >ð >ðB<@ð <@ð <@ð <@ð~):ð ):ð ):ð ):ðb *.Ð &ðð ð ð ð2Vð Vð Vð VðrXð Xð Xð XðxUð Uð Uð Uð Uðrzð zð zð zð|%ð %ð %ð %ð:ð ð ð ðð ð ð ð*A4ð A4ð A4ð A4ð A4ðJPð Pð Pð Pðh
-Tð -Tð -Tð -Tðd ðð ð ð ð ð@ QUð ]ð ]ð ]ð ]ð ]ð ]ðF;ð ð €€€r(   