Ë
    áß²jZ¶  ã                   ó„  — U d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZ  ej,                  e«      Z ej2                  d«      Zdee   d	efd
„Zded	ee   fd„Zded	dfd„Zdeeef   ded	dfd„Z dZ!dZ"dZ#dZ$ e%ddh«      Z&dZ'g e"¢e#¢e$¢­D � ci c]	  } e'› | › �| “Œ c} Z(de(e!<   deeef   d	e)fd„Z*deeef   d	e)fd„Z+d„ d„ fde,eeef      d e-ed!f   d"eegef   d#eeegef   d	e-e,eeef      eeef   f   f
d$„Z.d	e)fd%„Z/deeef   d&e)d	e)fd'„Z0d	e)fd(„Z1	 dVdedeeef   d&e)d*e)d	e-eeeef   f   f
d+„Z2 e3«       Z4e3e   e5d,<   d-edeeef   d	e-ee)f   fd.„Z6d/Z7 ej2                  d0d1jq                  d2„ e7D «       «      › d3�«      Z9d-ed4ed	ee   fd5„Z:d4ed	e)fd6„Z;d-ed4ed	e)fd7„Z<d)d8œd-ed4ed*e)d	e-ed!f   fd9„Z=deeef   d-ed4ed	dfd:„Z>dWd;ed<ee,eeef         d=ed	ee   fd>„Z?dXd?ed-ee   d4ed	ee-   fd@„Z@deeef   d	e)fdA„ZAdBee,eeef         d	e)fdC„ZBdeeef   d	e)fdD„ZCdBe,eeef      d	e,eeef      fdE„ZDdFed	e)fdG„ZEdHed	eeF   fdI„ZGd-edeeef   dJedKe)dLe)d&e)dMe)d	eeef   fdN„ZH G dO„ dPe«      ZIddQlJmKZK  eKdReI«       ddSlmLZL ddTlmMZM ddUlmNZN yc c} w )YuÄ   OpenAI Responses API (Codex) transport.

Owns format conversion/normalization on top of agent/codex_responses_adapter.py â€”
NOT client lifecycle, streaming, or the _run_codex_stream() call path.
é    N)ÚAnyÚCallableÚOptional)ÚCODEX_ASTRA_EFFORTSÚCODEX_LEGACY_EFFORTSÚXAI_GROK46_EFFORTSÚXAI_LEGACY_EFFORTSÚclamp_effortÚis_astra_modelÚcodex_supported_efforts)ÚProviderTransport)ÚNormalizedResponseÚToolCallz^(cron_.+)_\d{8}_\d{6}$Ú
session_idÚreturnc                 ót   — t        | xs d«      }t        j                  |«      }|r|j                  d«      S |S )zBNormalize a physical session_id into a stable logical cache scope.Ú é   )ÚstrÚ_CRON_SESSION_ID_REÚmatchÚgroup)r   Úsidr   s      ú;/home/ubuntu/.hermes/hermes-agent/agent/transports/codex.pyÚ_cache_scope_from_session_idr      s6   € ä
ˆjÒ˜BÓ
€CÜ×%Ñ% cÓ*€EÙ"ˆ5�;‰;�q‹>Ð+¨Ð+ó    Úvaluec                 óÖ   — | €dnt        | «      j                  «       }|syt        |«      dk  r|S dt        j                  |j                  dd¬«      «      j                  «       dd z   S )	zOReturn a provider-safe (<=64 char) cache key without changing session identity.Nr   é@   Úpck_úutf-8Úreplace©Úerrorsé   )r   ÚstripÚlenÚhashlibÚsha256ÚencodeÚ	hexdigest)r   Úkeys     r   Ú_bounded_prompt_cache_keyr-   &   sc   € à�‰"¤3 u£:×#3Ñ#3Ó#5€CÙØÜ�c“(˜b’.ˆ3Ðu f¬w¯~©~¸c¿j¹jÈÐYb¸jÓ>cÓ/d×/nÑ/nÓ/pÐqtÐrtÐ/uÑ&uÐur   Ú	containerc                 ó€   — t        | t        «      r.d| v r)t        | d   «      }|r|| d<   y| j                  dd«       yyy)zCBound (or drop, when empty) an in-place ``prompt_cache_key`` entry.Úprompt_cache_keyN)Ú
isinstanceÚdictr-   Úpop)r.   Úboundeds     r   Ú_bound_prompt_cache_key_fieldr5   .   sJ   € ä�)œTÔ"Ð'9¸YÑ'FÜ+¨IÐ6HÑ,IÓJˆÙØ,3ˆIÐ(Ò)à�M‰MÐ,¨dÕ3ð (GÐ"r   ÚkwargsÚheadersc                 óú   — | j                  d«      }t        |t        «      r<|j                  «       D ��ci c]   \  }}|sŒ	|€Œt	        |«      t	        |«      “Œ" c}}ni }|j                  |«       || d<   yc c}}w )zeMerge ``headers`` into a str-coerced copy of ``kwargs['extra_headers']`` (SDK kwarg -> HTTP headers).Úextra_headersN)Úgetr1   r2   Úitemsr   Úupdate)r6   r7   ÚexistingÚkÚvÚmergeds         r   Ú_merge_extra_headersrA   8   sg   € à�z‰z˜/Ó*€HÜU_Ð`hÔjnÔUo¨¯©Ó)9×Q¡  AºQÀ1Á=Œc�!‹f”c˜!“f‰nÔQÐuw€FØ
‡M�M�'ÔØ$€Fˆ?Òùó Rs   µ
A7Á A7ÁA7Úhermes_web_search)Ú
web_searchÚsearch_files)rC   rD   Ú	fetch_urlÚpeople_searchÚfinance_search)Útool_searchúapi.openai.comzchatgpt.comÚhermes_rC   Úparamsc                 óö   — 	 ddl m}  || j                  d«      «      �y	 	 ddlm}  |t        | j                  d«      xs d«      «      j                  «       dk(  S # t        $ r Y ŒGw xY w# t        $ r Y y	w xY w)
zRTrue for opencode-zen/go providers, ``opencode-*`` families, or opencode.ai hosts.r   )Úopencode_provider_familyÚproviderT©Úbase_url_hostnameÚbase_urlr   zopencode.aiF)Úhermes_cli.modelsrM   r:   Ú	ExceptionÚutilsrP   r   Úlower)rK   rM   rP   s      r   Ú_is_opencode_responses_backendrV   c   s‚   € ðÝ>á# F§J¡J¨zÓ$:Ó;ÐGØð HðÝ+á ¤ V§Z¡Z°
Ó%;Ò%A¸rÓ!BÓC×IÑIÓKÈ}Ñ\Ð\øô ò Ùðûô ò Ùðús"   ‚A ¢:A, Á	A)Á(A)Á,	A8Á7A8c                 ó˜   — 	 ddl m}  |t        | j                  d«      xs d«      «      j	                  «       dk(  S # t
        $ r Y yw xY w)z>True for Perplexity's Responses-compatible Agent API endpoint.r   rO   rQ   r   zapi.perplexity.aiF)rT   rP   r   r:   rU   rS   )rK   rP   s     r   Ú _is_perplexity_responses_backendrX   t   sI   € ðÝ+á ¤ V§Z¡Z°
Ó%;Ò%A¸rÓ!BÓC×IÑIÓKÐObÑbÐbøÜò Ùðús   ‚:= ½	A	ÁA	c                 ó$   — | j                  d«      S ©NÚname)r:   ©Úts    r   ú<lambda>r^   €   s   € ¨q¯u©u°V«}€ r   c                 ó   — i | ¥d|i¥S rZ   © )r]   Úaliass     r   r^   r^   �   s   € Ð;O¸aÐ;OÀÈÑ;O€ r   Úresponse_toolsÚreserved_names.Úname_ofÚrenamec                 óŠ  — g }i }| D �ch c]$  }t        |t        «      sŒ ||«      sŒ ||«      ’Œ& }}| D ]ƒ  }t        |t        «      r ||«      nd}||vr|j                  |«       Œ3t        › |› �x}	}
d}|
|v r|	› d|› �|dz   }}
|
|v rŒ|j	                  |
«       |||
<   |j                   |||
«      «       Œ… ||fS c c}w )a+  Alias provider-reserved function names on the wire; returns ``(tools, {alias: original_name})``.

    An alias already taken by a real tool gets a ``_2``/``_3`` suffix. ``name_of``/``rename``
    adapt the tool shape (Responses ``{name}`` by default; chat_completions passes ``function.name``).
    Né   Ú_r   )r1   r2   ÚappendÚ_RESERVED_TOOL_ALIAS_PREFIXÚadd)rb   rc   rd   re   Ú	rewrittenÚ	alias_mapÚtoolÚtakenr[   Úbasera   Úsuffixs               r   Ú_alias_reserved_toolsrr   ~   sò   € ð ')€IØ "€IØ'5Öb˜t¼ÀDÌ$Õ9OÑT[Ð\`ÕTa‰W�T�]Ðb€EÐbØò .ˆÜ *¨4´Ô 6‰w�tŒ}¸DˆØ�~Ñ%Ø×Ñ˜TÔ"ØÜ5Ð6°t°fÐ=Ð=ˆˆuØˆØ�u‰nØ#˜f A f XÐ.°¸±
�6ˆEð �uŠnà�	‰	�%ÔØˆ	�%ÑØ×Ñ™  eÓ,Õ-ð.ð �iÐÐùò cs   ‰C ŸC ¨
C c                  óÀ   — 	 ddl m}   | «       }|�t        |dd«      dk(  S ddlm}  |«       xs dj                  «       j                  «       dk(  S # t        $ r Y yw xY w)	u  True when xAI Responses should use Grok's native ``web_search`` built-in.

    Web-search registry first, then the legacy ``_get_search_backend`` probe; fails closed to native (True).

    Delegates to the web-search registry's provider resolution (which reads ``web.search_backend`` /
    ``web.backend`` from config) and checks whether the resolved provider is xAI. On any resolution failure,
    returns True (fail-closed to native â€” preserves the #48108 incomplete-hang fix rather than risk
    reintroducing it).
    r   ©Úget_active_search_providerNr[   Úxai©Ú_get_search_backendr   T©Úagent.web_search_registryru   ÚgetattrÚtools.web_toolsrx   r&   rU   rS   ©ru   rN   rx   s      r   Ú_xai_prefers_native_web_searchr~   š   sf   € ðÝHá-Ó/ˆØÐÜ˜8 V¨TÓ2°eÑ;Ð;å7á#Ó%Ò+¨×2Ñ2Ó4×:Ñ:Ó<ÀÑEÐEøÜò Ùðúó   ‚A ¡/A Á	AÁAÚis_xai_responsesc                 óÊ   — |s| j                  d«      du ry	 ddlm}  |t        | j                  d«      xs d«      «      j	                  «       t
        v S # t        $ r Y yw xY w)zaTrue when the Responses endpoint owns the ``tool_search`` namespace (xAI, OpenAI, ChatGPT Codex).Úis_codex_backendTr   rO   rQ   r   F)r:   rT   rP   r   rU   Ú_OPENAI_RESPONSES_HOSTSrS   )rK   r€   rP   s      r   Ú_reserves_tool_searchr„   ²   s`   € á˜6Ÿ:™:Ð&8Ó9¸TÑAØðÝ+á ¤ V§Z¡Z°
Ó%;Ò%A¸rÓ!BÓC×IÑIÓKÔOfÐfÐføÜò Ùðús   ˜=A Á	A"Á!A"c                  óÀ   — 	 ddl m}   | «       }|�t        |dd«      dk(  S ddlm}  |«       xs dj                  «       j                  «       dk(  S # t        $ r Y yw xY w)	aö  True when the active web-search backend selects OpenAI's server-side ``web_search``.

    Same contract as :func:`_xai_prefers_native_web_search` with one deliberate
    difference: it fails CLOSED (False). A resolution failure must leave the client-side
    Hermes tool in place rather than swap in a built-in the endpoint might reject.

    Only consulted for the Codex backend (``chatgpt.com/backend-api/codex``); a custom
    OpenAI-compatible endpoint does not implement the server-side tool.
    r   rt   Nr[   zopenai-nativerw   r   Fry   r}   s      r   Ú!_openai_prefers_native_web_searchr†   ¾   sf   € ðÝHá-Ó/ˆØÐÜ˜8 V¨TÓ2°oÑEÐEå7á#Ó%Ò+¨×2Ñ2Ó4×:Ñ:Ó<ÀÑOÐOøÜò Ùðúr   Fr‚   c                 óÔ  ‡	— i }dt         dt        fd„Š	|rl| rjt        ˆ	fd„| D «       «      rVt        «       r | D �cg c]  } ‰	|«      rŒ|‘Œ c}ddigz   } n,| D �cg c]  } ‰	|«      ri |¥dt        i¥n|‘Œ } }d|t        <   |r?| r=t        ˆ	fd„| D «       «      r)t        «       r| D �cg c]  } ‰	|«      rŒ|‘Œ c}ddigz   } | r/t        |«      r$t        | t        «      \  } }|j                  |«       | r/t        |«      r$t        | t        «      \  } }|j                  |«       | r0t        ||«      r$t        | t        «      \  } }|j                  |«       | |fS c c}w c c}w c c}w )	u¸  Apply provider-reserved tool-name aliasing; returns ``(tools, {alias: original})`` for THIS request.

    xAI: a client ``web_search`` collides with Grok's native search â€” native mode
    swaps it 1:1 for the built-in, client mode keeps Hermes dispatch under an alias.

    OpenAI Codex: the Responses endpoint carries the same collision, so the backend
    selection drives the same 1:1 swap (``web.search_backend: openai-native``).
    r]   r   c                 óN   — t        | t        «      xr | j                  d«      dk(  S )Nr[   rC   ©r1   r2   r:   r\   s    r   Úis_client_web_searchz/_alias_wire_tools.<locals>.is_client_web_searchã   s!   € Ü˜!œTÓ"ÒD q§u¡u¨V£}¸Ñ'DÐDr   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­w©Nr`   ©Ú.0r]   rŠ   s     €r   ú	<genexpr>z$_alias_wire_tools.<locals>.<genexpr>æ   ó   øè ø€ Ò2cÈqÑ3GÈ×3JÑ2cùó   ƒÚtyperC   r[   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wrŒ   r`   r�   s     €r   r�   z$_alias_wire_tools.<locals>.<genexpr>ò   r�   r‘   )r   ÚboolÚanyr~   Ú_XAI_CLIENT_WEB_SEARCH_ALIASr†   rV   rr   Ú_OPENCODE_RESERVED_TOOL_NAMESr<   rX   Ú_PERPLEXITY_RESERVED_TOOL_NAMESr„   Ú_XAI_RESERVED_TOOL_NAMES)
rb   rK   r€   r‚   Úwire_aliasesr]   Ú_oc_aliasesÚ_pplx_aliasesÚ_xai_aliasesrŠ   s
            @r   Ú_alias_wire_toolsrž   Ö   s–  ø€ ð $&€LðE¤ð E¬ó Eñ ™N¬sÓ2cÐTbÔ2cÔ/cÜ)Ô+Ø)7ÖW AÑ?SÐTUÕ?VšaÒWÐ\bÐdpÐ[qÐZrÑr‰Nð hvöØbcÑ?SÐTUÔ?VÐ;�1Ð;�fÔ:Ò;Ð\]Ñ]ðˆNð ð :FˆLÔ5Ñ6ñ
 ™N¬sÓ2cÐTbÔ2cÔ/cÜ,Ô.Ø)7ÖW AÑ?SÐTUÕ?VšaÒWÐ\bÐdpÐ[qÐZrÑrˆNñ Ô8¸Ô@Ü&;¸NÔLiÓ&jÑ#ˆ˜Ø×Ñ˜KÔ(ñ Ô:¸6ÔBÜ(=¸nÔNmÓ(nÑ%ˆ˜Ø×Ñ˜MÔ*ñ Ô/°Ð8HÔIÜ'<¸^ÔMeÓ'fÑ$ˆ˜Ø×Ñ˜LÔ)Ø˜<Ð'Ð'ùòQ Xùòùò Xs   ºEÁEÁE Â(E%Â6E%Ú_UNPROJECTABLE_DISABLE_WARNEDÚmodelc                 ó¼  — d\  }}|j                  d«      }|r<t        |t        «      r,|j                  d«      du rd}n|j                  d«      r|d   }|j                  dd«      rddlm}  || «      rt
        nt        }nd|j                  d	«      }|j                  d
«      du }d}	|s't        |«      st        |j                  d«      | |«      }	|	�|	nt        | ||¬«      }|sy|sht        d„ |D «       «      }
|
sJ| t        vrBt        j                  | «       t        j                  d| dj                  d„ |D «       «      «       |
rddfS ddfS t!        ||«      |fS )uX  ``(effort, enabled)`` for the request, effort clamped (never escalated) to the endpoint's vocabulary.

    A profile-declared ``()`` (or a model that takes no ``reasoning`` field on its route) means "no
    reasoning parameters accepted" (400 on any reasoning field) and disables reasoning outright:
    ``(None, False)``. An explicit ``reasoning_effort: none`` on a route whose vocabulary has ``none``
    resolves to ``("none", False)`` so the disable goes on the wire instead of being omitted â€” omitting
    it re-enables the model's default effort (gpt-5.6 defaults to ``medium``, #75227).
    )ÚmediumTÚreasoning_configÚenabledFÚeffortr€   r   ©Úis_grok_46_familyrQ   r‚   TNrN   ©r‚   )NFc              3   óp   K  — | ].  }t        |«      j                  «       j                  «       d k(  –— Œ0 y­w)ÚnoneN)r   r&   rU   ©rŽ   Úlevels     r   r�   z%_resolve_reasoning.<locals>.<genexpr>?  s+   è ø€ ÒSÀ”s˜5“z×'Ñ'Ó)×/Ñ/Ó1°VÕ;ÑSùs   ‚46u¤   reasoning_effort: none cannot be sent for %s â€” its route accepts only %s, so the model's default effort stays on (an omitted reasoning field does not disable it).z, c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrŒ   )r   r«   s     r   r�   z%_resolve_reasoning.<locals>.<genexpr>F  s   è ø€ Ò C°¤ U§Ñ Cùs   ‚rª   )r:   r1   r2   Úagent.model_metadatar§   r   r	   Ú_is_openai_api_originÚ_profile_declared_effortsÚ_codex_efforts_for_router•   rŸ   rk   ÚloggerÚwarningÚjoinr
   )r    rK   Úreasoning_effortÚreasoning_enabledr£   r§   Ú	supportedrQ   r‚   ÚdeclaredÚhas_nones              r   Ú_resolve_reasoningrº     sr  € ð +9Ñ'ÐÐ'Ø—z‘zÐ"4Ó5ÐÙœJÐ'7¼Ô>Ø×Ñ 	Ó*¨eÑ3Ø %ÑØ×!Ñ! (Ô+Ø/°Ñ9Ðð ‡z�zÐ$ eÔ,Ý:ñ +<¸EÔ*BÕ&ÔHZ‰	à—:‘:˜jÓ)ˆØ!Ÿ:™:Ð&8Ó9¸TÐAÐð ˆÙ Ô$9¸(Ô$CÜ0°·±¸JÓ1GÈÐPXÓYˆHØ (Ð 4‘HÔ:RØ�8Ð.>ô;@ˆ	áØÙÜÑSÈÔSÓSˆÙ˜EÔ)FÑFä)×-Ñ-¨eÔ4Ü�N‰Nð\à�t—y‘yÑ C¸Ô CÓCôñ
 #�¨uÐ4Ð4¨¨uÐ4Ð4ÜÐ(¨)Ó4Ð6GÐGÐGr   )zgpt-5.5-prozgpt-5.5zgpt-5.4zgpt-5.2zgpt-5.1-codex-maxzgpt-5.1-codex-minizgpt-5.1-chat-latestzgpt-5.1-codexzgpt-5.1zgpt-5-codexzgpt-5zgpt-4.1z(?:^|[./:])(?:ú|c              #   óF   K  — | ]  }t        j                  |«      –— Œ y ­wrŒ   )ÚreÚescape)rŽ   r[   s     r   r�   r�   R  s   è ø€ ÒY°4œrŸy™y¨ŸÑYùs   ‚!z)(?:-\d{4}-\d{2}-\d{2})?$rQ   c                 ó˜  — ddl m}  |t        |xs d«      «      j                  «       }|dk(  ry|j	                  d«      }t        |«      dk(  xr$ |d   dk(  xr t        |d	   «      xr
 |d
d ddgk(  }|syt        | xs d«      j                  «       j                  «       j                  dd«      }t        j                  |«      rdS dS )zAReturn ``24h`` for supported hosts/models (Bedrock Mantle, Meta).r   rO   r   zapi.meta.aiÚ24hú.é   zbedrock-mantler   rg   NÚapiÚawsrh   ú-)rT   rP   r   rU   Úsplitr'   r”   r&   r"   Ú_EXTENDED_PROMPT_CACHE_MODEL_REÚsearch)r    rQ   rP   ÚhostnameÚpartsÚis_bedrock_mantleÚ
normalizeds          r   Ú+_default_prompt_cache_retention_for_requestrÍ   W  sÏ   € å'á ¤ X¢^°Ó!4Ó5×;Ñ;Ó=€Hð �=Ò ØØ�N‰N˜3Ó€EÜ˜E›
 a™Ò{¨E°!©HÐ8HÑ,HÒ{ÌTÐRWÐXYÑRZË^Ò{Ð`eÐfgÐfhÐ`iÐnsÐuzÐm{Ñ`{ÐÙØÜ�U’[˜bÓ!×'Ñ'Ó)×/Ñ/Ó1×9Ñ9¸#¸sÓC€JÜ3×:Ñ:¸:ÔFˆ5ÐPÈDÐPr   c                 óZ   — ddl m}  |t        | xs d«      «      j                  «       dk(  S )z`Exact host, so a Responses-compatible proxy or a lookalike subdomain keeps the generic contract.r   rO   r   rI   )rT   rP   r   rU   )rQ   rP   s     r   r¯   r¯   l  s(   € å'áœS ¢¨RÓ0Ó1×7Ñ7Ó9Ð=MÑMÐMr   c                 ó2   — t        | «      xr t        |«      S )z'Astra on the canonical API origin only.)r   r¯   )r    rQ   s     r   Ú#_is_official_openai_responses_routerÐ   s  s   € ä˜%Ó ÒDÔ%:¸8Ó%DÐDr   r¨   c                óÂ   — |s't        |«      rddlm}  |t        | xs d«      «      ryt	        | «      r|st        | |«      st        S t        t        | xs d«      «      S )a›  Effort vocabulary for a Responses route; ``()`` when the model takes no ``reasoning`` field at all.

    Keeps Astra's new vocabulary off unrelated Responses-compatible endpoints, and sends nothing for the
    chat-era OpenAI families (gpt-4o, gpt-4.1, ...) on api.openai.com, which 400 on any ``reasoning``
    key (#76255). Only the exact OpenAI origin is judged: a relay serving those ids may translate.
    r   )Úopenai_model_rejects_reasoningr   r`   )r¯   r®   rÒ   r   r   rÐ   r   r   )r    rQ   r‚   rÒ   s       r   r±   r±   x  sU   € ñ Ô 5°hÔ ?ÝGá)¬#¨eªk°rÓ*:Ô;ØÜ�eÔÙÔ?ÀÀxÔPä#Ð#Ü"¤3 u¢{°Ó#3Ó4Ð4r   c                 óà  — t        ||«      sy| j                  d«      }t        |t        «      rQt	        |j                  d«      xs d«      j                  «       j                  «       }|rt        |t        «      nd|d<   dD ]  }| j                  |d«       Œ | j                  d«      }t        |t        «      r0|D �cg c]   }dt	        |«      j                  «       vsŒ|‘Œ" c}| d<   yyc c}w )	a¼  Astra's official-API contract, applied AFTER ``request_overrides`` so an override can't put a
    rejected field back on the wire: ``reasoning.effort`` is ``low..max`` only (``none``/``minimal``
    400), sampling and logprob knobs are rejected, and cache lifetime is fixed server-side
    (``prompt_cache_options.ttl`` accepts only its ``30m`` default, so nothing is sent for it and the
    pre-5.6 ``prompt_cache_retention`` knob is dropped).NÚ	reasoningr¥   r   Úlow)ÚtemperatureÚtop_pÚtop_logprobsÚlogprobsÚprompt_cache_retentionÚincludeÚlogprob)rÐ   r:   r1   r2   r   r&   rU   r
   r   r3   Úlist)r6   r    rQ   rÔ   Ú	requestedr,   rÛ   Úitems           r   Ú_sanitize_astra_request_kwargsrà   ‹  sÎ   € ô /¨u°hÔ?ØØ—
‘
˜;Ó'€IÜ�)œTÔ"Ü˜	Ÿ™ hÓ/Ò5°2Ó6×<Ñ<Ó>×DÑDÓFˆ	ÙNWœl¨9Ô6IÔJÐ]bˆ	�(ÑØ]ò ˆØ�
‰
�3˜Õðà�j‰j˜Ó#€GÜ�'œ4Ô Ø.5Ö\ d¸Ì#ÈdË)Ï/É/ÓJ[Ò9[šTÒ\ˆˆyÒð !ùÚ\s   Â> C+ÃC+ÚinstructionsÚtoolsÚscope_idc                 ó   — | s|syd}|r.t        d„ |D «       d„ ¬«      }t        j                  |ddd¬	«      }|› d
| xs d› d
|› �}dt        j                  |j                  dd¬«      «      j                  «       dd z   S )u®  ``pck_<sha256[:24]>`` of (scope_id, instructions, name-sorted tools), or None if nothing static.

    Routing hint only; ``scope_id`` keeps unrelated sessions off one bucket.

    ``scope_id`` (pass ``_cache_scope_from_session_id(session_id)``) keeps unrelated sessions â€” independent
    conversations, main vs. child/subagent, sibling children â€” from concentrating onto the same bucket
    merely because their static prefix matches (see #78941), while still letting recurring cron fires of one
    job share a stable key across their timestamped session_ids (the original #51395/#52295 fix this built
    on). Sorting tools by name keeps the hash insertion-order independent.
    Nr   c              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­wrŒ   )r1   r2   )rŽ   r]   s     r   r�   z%_content_cache_key.<locals>.<genexpr>®  s   è ø€ Ò5�1¤¨A¬tÕ!4ŒQÑ5ùs   ‚˜c                 ód   — t        | j                  d«      xs | j                  d«      xs d«      S )Nr[   r’   r   )r   r:   r\   s    r   r^   z$_content_cache_key.<locals>.<lambda>®  s+   € ÄSÈÏÉÈvËÒImÐZ[×Z_ÑZ_Ð`fÓZgÒImÐkmÓEn€ r   )r,   TF)ú,ú:)Ú	sort_keysÚensure_asciiÚ
separatorsú r    r!   r"   r#   r%   )ÚsortedÚjsonÚdumpsr(   r)   r*   r+   )rá   râ   rã   Ú
tools_partÚsorted_toolsÚcontents         r   Ú_content_cache_keyró   ž  s�   € ñ ¡ØØ€JÙÜÙ5˜Ô5Ñ;nô
ˆô —Z‘Z ¸È5Ð]gÔhˆ
à�
˜$˜|Ò1¨rÐ2°$°z°lÐC€GØ”G—N‘N 7§>¡>°'À) >Ó#LÓM×WÑWÓYÐZ]Ð[]Ð^Ñ^Ð^r   rN   c                 óœ  — 	 ddl m} t        | xs d«      j                  «       j	                  «       }d}|r9ddlm}  |t        |«      «      }|r ||k7  r ||«      }|�|j                  |«      }|€!|r ||«      nd}	|	�|	j                  |«      nd}|€dS t        |«      S # t        $ r }
t        j                  d|
«       Y d}
~
yd}
~
ww xY w)av  Provider-profile-declared reasoning-effort vocabulary, or None (fail-open).

    Resolves by endpoint host first, then by provider name: a ``custom:<name>`` entry pointed
    at a host with a registered profile must follow that host's vocabulary, not the generic
    custom declaration. Lazy import: provider plugins import this transport during registry
    discovery.
    r   )Úget_provider_profiler   N)Ú_infer_provider_from_urlz*profile-declared efforts lookup failed: %s)Ú	providersrõ   r   r&   rU   r®   rö   Úsupported_reasoning_effortsrS   r²   ÚdebugÚtuple)rN   r    rQ   rõ   r[   r¸   rö   ÚinferredÚinferred_profileÚprofileÚexcs              r   r°   r°   ¶  sÕ   € ðÝ2ä�8’>˜rÓ"×(Ñ(Ó*×0Ñ0Ó2ˆØˆÙÝEá/´°H³Ó>ˆHÙ˜H¨Ò,Ù#7¸Ó#AÐ Ø#Ð/Ø/×KÑKÈEÓR�HØÐÙ48Ñ*¨4Ô0¸dˆGØELÐEX�w×:Ñ:¸5ÔAÐ^bˆHð Ð#ˆ4Ð8¬¨x«Ð8øô ò Ü�‰ÐAÀ3ÔGÜûðús   ‚BB" Â"	CÂ+CÃCc                 óÔ   — ddl m} t        | j                  d«      xs d«      j	                  «       j                  «       dk(  ry |t        | j                  d«      xs d«      d«      S )	u\   True for Microsoft Foundry's Responses API (provider id, else host match â€” not substring).r   ©Úbase_url_host_matchesrN   r   úazure-foundryTrQ   úservices.ai.azure.com©rT   r  r   r:   r&   rU   )rK   r  s     r   Ú_is_azure_foundry_responsesr  Ô  sV   € å+ä
ˆ6�:‰:�jÓ!Ò' RÓ(×.Ñ.Ó0×6Ñ6Ó8¸OÒKØÙ ¤ V§Z¡Z°
Ó%;Ò%A¸rÓ!BÐD[Ó\Ð\r   Úmessagesc                 óŠ  ‡‡‡‡— ddl mŠmŠ ddt        dt        dt        fˆˆfd„Št	        «       Št        | xs d«      D ]�  }t        |t        «      r|j                  d	«      nd}|d
k(  rŒ,|dk(  r! ‰|j                  d«      «      }|s y‰|z  ŠŒR|dk7  r yt        ˆˆfd„|j                  d«      xs g D «       «      c S  y)a^  True when ``messages`` end on a tool-result run issued by the preceding assistant turn.

    Azure Foundry rejects only this post-tool shape when encrypted reasoning is
    replayed, so only the *trailing* messages are checked (a whole-history scan
    would make suppression sticky). Call ids resolve like ``_chat_messages_to_responses_input``.
    r   )Ú_canonical_call_id_from_fcÚ_split_responses_tool_idNÚrawÚexplicitr   c                 ór  •—  ‰| «      \  }}|r|hn	t        «       }t        |t        «      r/|j                  «       r|j	                  |j                  «       «       |s?t        | t        «      r/| j                  «       r|j	                  | j                  «       «        ‰|«      }|r|j	                  |«       |S rŒ   )Úsetr1   r   r&   rk   )r
  r  Úembedded_call_idÚitem_idÚidsÚ	canonicalr  r	  s         €€r   Ú	_pair_idsz'_is_post_tool_replay.<locals>._pair_idsæ  sŒ   ø€ Ù$<¸SÓ$AÑ!Ð˜'Ù$4ÐÑ ¼#»%ˆÜ�h¤Ô$¨¯©Ô)9Ø�G‰G�H—N‘NÓ$Ô%Ù”z #¤sÔ+°·	±	´Ø�G‰G�C—I‘I“KÔ Ù.¨wÓ7ˆ	ÙØ�G‰G�IÔØˆ
r   r`   ÚroleÚsystemrn   Útool_call_idFÚ	assistantc              3   ó’   •K  — | ]>  }t        |t        «      r,‰ ‰|j                  d «      |j                  d«      «      z  –— Œ@ y­w)ÚidÚcall_idNr‰   )rŽ   Úcallr  Útrailings     €€r   r�   z'_is_post_tool_replay.<locals>.<genexpr>   s@   øè ø€ ò 
àÜ˜$¤Ô%ð ‘y §¡¨$£°·±¸)Ó1DÓEÕEñ
ùs   ƒAAÚ
tool_callsrŒ   )
Úagent.codex_responses_adapterr  r	  r   r  Úreversedr1   r2   r:   r•   )r  Úmsgr  r  r  r  r	  r  s       @@@@r   Ú_is_post_tool_replayr   Ý  sË   û€ ÷ cñ
”sð 
¤cð 
´Sö 
ô ‹u€HÜ˜š BÓ'ò 
ˆÜ",¨S´$Ô"7ˆs�w‰w�vŒ¸TˆØ�8ÒØØ�6Š>Ù˜CŸG™G NÓ3Ó4ˆCÙÙØ˜‰OˆHØà�;ÒÙÜô 
àŸ™ Ó-Ò3°ô
ó 
ò 	
ð
ð$ r   c                 óî   — ddl m} t        | j                  d«      xs d«      j	                  «       j                  «       dk(  ryt        | j                  d«      xs d«      } ||d«      xs	  ||d	«      S )
zºTrue for any Azure-hosted Responses endpoint: the ``azure-foundry`` provider, a resource-level
    ``*.openai.azure.com`` host, or the project-scoped ``*.services.ai.azure.com`` gateway.r   r   rN   r   r  TrQ   zopenai.azure.comr  r  )rK   r  rQ   s      r   Ú_is_azure_responsesr"    sl   € õ ,ä
ˆ6�:‰:�jÓ!Ò' RÓ(×.Ñ.Ó0×6Ñ6Ó8¸OÒKØÜ�6—:‘:˜jÓ)Ò/¨RÓ0€HÙ  Ð+=Ó>ÒzÑBWÐX`ÐbyÓBzÐzr   c                 óê  — g }d}t        | «      D ]Ë  }t        |t        «      r%|j                  d«      dk(  r|j                  d«      nd}t        |t        «      rqt        d„ |D «       «      r_|r[|D �cg c]*  }t        |t        «      sŒ|j                  d«      dk(  sŒ)|‘Œ, }}t        |d	¬
«      }|r||d<   n|j                  d«       d	}|j                  |«       ŒÍ |j                  «        |S c c}w )a¯  Copy of ``messages`` keeping ``codex_reasoning_items`` only on the newest assistant row that has any.
    Foundry rejects a request that replays encrypted reasoning from more than one prior response (HTTP 400
    "Conflicting authenticated continuation identities", #105369). ``compaction`` checkpoints stay everywhere.
    A trimmed row is marked ``codex_reasoning_trimmed`` so the converter still drops its ``msg_*`` id (#97427).Fr  r  Úcodex_reasoning_itemsNc              3   óh   K  — | ]*  }t        |t        «      xr |j                  d «      dk7  –— Œ, y­w)r’   Ú
compactionNr‰   )rŽ   Úis     r   r�   z)_newest_reasoning_only.<locals>.<genexpr>  s.   è ø€ Ò*pÐef¬:°a¼Ó+>Ò+`À1Ç5Á5ÈÃ=ÐT`ÑC`Ó+`Ñ*pùs   ‚02r’   r&  T)Úcodex_reasoning_trimmed)	r  r1   r2   r:   rÝ   r•   r3   ri   Úreverse)r  ÚoutÚnewest_keptr  r;   r'  Úcheckpointss          r   Ú_newest_reasoning_onlyr-    sã   € ð
 !#€CØ€KÜ˜Ó!ò ˆÜ4>¸sÄDÔ4IÈcÏgÉgÐV\ËoÐalÒNl�—‘Ð/Ô0ÐrvˆÜ�eœTÔ"¤sÑ*pÐjoÔ*pÔ'pÙØ*/Öi Q´:¸aÄÕ3FÈ1Ï5É5ÐQWË=Ð\hÓKhšqÐi�ÐiÜ˜3¸Ô=�ÙØ3>�CÐ/Ò0à—G‘GÐ3Ô4ØˆKØ�
‰
�3�ðð ‡K�K„MØ€Jùò js   Á2C0ÂC0ÂC0Úcontext_managementc                 ó<   — t        | t        «      xr t        | «      S )zæTrue only when the caller's eligibility gate produced a non-empty payload.

    Every native-compaction wire effect hangs off this predicate, so a persisted
    checkpoint cannot keep reshaping requests after the gate closes.
    )r1   rÝ   r”   )r.  s    r   Ú_native_compaction_activer0  *  s   € ô Ð(¬$Ó/ÒL´DÐ9KÓ4LÐLr   Útimeoutc                 ó¤   — t        | t        t        f«      r:t        | t        «      s*dt        | «      cxk  rt        d«      k  rt        | «      S  yy)zNFinite positive number -> float; anything else (None, bool, str, inf) -> None.r   ÚinfN)r1   ÚintÚfloatr”   )r1  s    r   Ú_coerce_timeoutr6  3  sG   € ä�'œC¤˜<Ô(´¸GÄTÔ1JÈqÔSXÐY`ÓSaÔOpÔdiÐjoÓdpÒOpÜ�W‹~Ðð Pqár   r¥   r¤   Úreplay_encrypted_reasoningÚis_github_responsesc                óÞ   — |rdgng }i }|r|rddl m}	 ||d<    |	| «      rd|i|d<   |S |r,|r|j                  d«      �|d   |d<   |S |dd	œ|d<   ||d<   |S |s|sg |d<   |d
k(  rdd
i|d<   |S )uŠ  ``reasoning`` / ``include`` request fields for the endpoint family.

    xAI 400s on ``reasoning.effort`` outside its allowlist; GitHub Models takes a
    verbatim ``github_reasoning_extra`` and never ``include``. A disabled ask resolved to
    ``effort="none"`` is sent as ``{"effort": "none"}`` â€” the wire has no other way to switch
    a reasoning model's default effort off (#75227).
    zreasoning.encrypted_contentr   )Úgrok_supports_reasoning_effortrÛ   r¥   rÔ   Úgithub_reasoning_extraÚauto)r¥   Úsummaryrª   )r®   r:  r:   )
r    rK   r¥   r¤   r7  r€   r8  rÛ   Úfieldsr:  s
             r   Ú_reasoning_fieldsr?  :  sÈ   € ñ 2LÐ,Ñ-ÐQS€GØ€FÙÑ#ÝGà#ˆˆyÑÙ)¨%Ô0Ø#+¨VÐ"4ˆF�;Ñð €Mñ 
ÙØ�z‰zÐ2Ó3Ð?Ø&,Ð-EÑ&F��{Ñ#ð €Mð .4ÀÑ"GˆF�;ÑØ 'ˆF�9Ñð
 €Mñ	 !Ñ)9ØˆˆyÑØ�VÒØ#+¨VÐ"4ˆF�;ÑØ€Mr   c                   ón  — e Zd ZU dZdddddœZdZee   ed<   dZ	ee   ed<   dZ
eeeef      ed<   ed	efd
„«       Zdeeef   d	efd„Zdeeeef      d	efd„Zdeeeeef         d	efd„Z	 ddedeeeef      deeeeef         d	eeef   fd„Zded	efd„Zded	efd„Zddddœdedededed	ef
d„Zy)ÚResponsesApiTransportz)Transport for api_mode='codex_responses'.ÚstopÚlength)Ú	completedÚ
incompleteÚfailedÚ	cancelledNÚ_last_issuer_kindÚ_last_issuer_modelÚ_last_wire_aliasesr   c                  ó   — y)NÚcodex_responsesr`   )Úselfs    r   Úapi_modezResponsesApiTransport.api_modeg  s   € à r   rK   c                 óÌ   — ddl m}  ||j                  d«      du |j                  d«      du |j                  d«      du |j                  d«      ¬«      | _        | j                  S )	z_Classify the current Responses endpoint from transport params (stashed for normalize_response).r   )Ú_classify_responses_issuerr€   Tr8  r‚   rQ   )r€   r8  r‚   rQ   )r  rP  r:   rH  )rM  rK   rP  s      r   Ú_resolve_issuer_kindz*ResponsesApiTransport._resolve_issuer_kindk  sb   € åLá!;Ø#ŸZ™ZÐ(:Ó;¸tÐCØ &§
¡
Ð+@Ó AÀTÐ IØ#ŸZ™ZÐ(:Ó;¸tÐCØ—Z‘Z 
Ó+ô	"
ˆÔð ×%Ñ%Ð%r   r  c                 ó@  — ddl m}m}  ||j                  d«      «      | _         |||j                  d«      du |j                  d«      du t        |j                  dd«      «      | j                  |«      | j                  t        |j                  d«      «      ¬	«      S )
z:Convert OpenAI chat messages to Responses API input items.r   )Ú!_chat_messages_to_responses_inputÚ_wire_model_identityr    r€   Tr8  r7  r.  )r€   r8  r7  Úcurrent_issuer_kindÚcurrent_issuer_modelÚnative_compaction_eligible)r  rS  rT  r:   rI  r”   rQ  r0  )rM  r  r6   rS  rT  s        r   Úconvert_messagesz&ResponsesApiTransport.convert_messagesw  sŒ   € çiá"6°v·z±zÀ'Ó7JÓ"KˆÔÙ0Ø v§z¡zÐ2DÓ'EÈÐ'MØ &§
¡
Ð+@Ó AÀTÐ IÜ'+¨F¯J©JÐ7SÐUYÓ,ZÓ'[Ø $× 9Ñ 9¸&Ó AØ!%×!8Ñ!8Ü'@ÀÇÁÐL`ÓAaÓ'bô
ð 	
r   râ   c                 ó   — ddl m}  ||«      S )zBConvert OpenAI tool schemas to Responses API function definitions.r   )Ú_responses_tools)r  rZ  )rM  râ   rZ  s      r   Úconvert_toolsz#ResponsesApiTransport.convert_tools…  s   € åBá Ó&Ð&r   r    c                 ón  — ddl m} |j                  dd«      }|}|sM|rK|d   j                  d«      dk(  r4t        |d   j                  d«      xs d«      j	                  «       }|dd	 }|xs |}|j                  d
«      du }|j                  d«      du }	|j                  d«      du }
t        |j                  dd«      «      xr t        |«      xr t        |«       }|rt        |«      rt        |«      }|j                  d«      }t        |«      }t        ||«      \  }}t        | j                  |«      ||
|	«      \  }| _        ddlm} |j                  d«      xs i } ||j                  d|«      «      }||| j#                  ||
|||j                  d«      |	||¬«      ddœ}|r||d<   d|d<   d|d<   |r||d<   |j                  d«      }t%        |j                  d«      xs |«      }t'        |||«      xs |}|s	|
s|r||d<   t)        ||j                  d«      «      }|r|j+                  d|«       |j-                  t/        ||||||
|¬«      «       |j                  d «      }|r	|
sd!|i|d"<   |r|j-                  |«       ||d<   t1        |||j                  d«      «       t3        |«       |
r4dd#lm}  ||«      r|j                  d$«      d%k(  s|j7                  d$d	«       t9        |j                  d&|j                  d&«      «      «      }|�||d&<   n|j7                  d&d	«       |	rc|rt        |«      nd	|j                  d«      xs t;        |«      d'œ}|j=                  «       D ��ci c]  \  }}|sŒ	||“Œ }}}|r&t?        |fi |¤Ž n|j                  d(«      �|d(   |d)<   |
rf|rdt?        |fi d*|i¤Ž |j                  d+«      }tA        |tB        «      rtC        |«      ni |d+<   |d+   j+                  d|j                  d|«      «       t3        |j                  d+«      «       |S c c}}w ),uC  Build Responses API kwargs (calls convert_messages/convert_tools internally).

        params: instructions, reasoning_config ({effort, enabled}), session_id (transcript id;
        Codex header; cache-scope fallback), cache_scope_id (rotation-stable scope for the
        cache key / xAI conv header), max_tokens, timeout, request_overrides, provider, base_url,
        is_github_responses, is_codex_backend, is_xai_responses, github_reasoning_extra,
        context_management, replay_encrypted_reasoning.

        params: instructions: str â€” system prompt (extracted from messages[0] if not given)
        reasoning_config: dict | None â€” {effort, enabled} session_id: str | None â€” transcript/session id;
        drives the Codex ``session_id`` header, and is the cache-scope fallback when no ``cache_scope_id``
        is given cache_scope_id: str | None â€” rotation-stable logical scope id (compression-lineage root;
        see agent/prompt_cache_scope.py). Preferred over session_id when deriving the prompt_cache_key
        content hash and the xAI x-grok-conv-id header; the Codex x-client-request-id header mirrors the
        resulting body key. Keeps the cache warm across context-compression session rotation (#79017)
        max_tokens: int | None â€” max_output_tokens timeout: float | None â€” per-request timeout forwarded to
        the SDK request_overrides: dict | None â€” extra kwargs merged in provider: str | None â€” provider name
        for backend-specific logic base_url: str | None â€” endpoint URL base_url_hostname: str | None â€”
        hostname for backend detection is_github_responses: bool â€” Copilot/GitHub models backend
        is_codex_backend: bool â€” chatgpt.com/backend-api/codex is_xai_responses: bool â€” xAI/Grok backend
        github_reasoning_extra: dict | None â€” Copilot reasoning params
        r   )ÚDEFAULT_AGENT_IDENTITYrá   r   r  r  rò   r   Nr8  Tr‚   r€   r7  r.  )Ú"strip_codex_context_variant_suffixÚrequest_overridesr    rQ   )r€   r8  r7  rQ   r‚   r.  r    F)r    rá   ÚinputÚstorerâ   r<  Útool_choiceÚparallel_tool_callsr   Úcache_scope_idr0   rÚ   )r¥   r¤   r7  r€   r8  Útext_verbosityÚ	verbosityÚtextr¦   Úservice_tierÚpriorityr1  )r   zx-client-request-idÚ
max_tokensÚmax_output_tokenszx-grok-conv-idÚ
extra_body)"Úagent.prompt_builderr]  r:   r   r&   r”   r  r   r"  r-  r0  rº   rž   r[  rJ  r®   r^  rX  r   ró   rÍ   Ú
setdefaultr<   r?  rà   r5   r§   r3   r6  r-   r;   rA   r1   r2   ) rM  r    r  râ   rK   r]  rá   Úpayload_messagesr8  r‚   r€   r7  r.  Únative_compaction_activerµ   r¶   rb   Ú_strip_ctx_variantr_  Ú
wire_modelr6   r   Ú_cache_scopeÚ	cache_keyÚcache_retentionre  r§   r1  r7   r>   r?   Úexisting_extra_bodys                                    r   Úbuild_kwargsz"ResponsesApiTransport.build_kwargs‹  s{  € õ2 	@à—z‘z .°"Ó5ˆØ#ÐÙ¡¨X°a©[¯_©_¸VÓ-DÈÒ-PÜ˜x¨™{Ÿ™¨yÓ9Ò?¸RÓ@×FÑFÓHˆLØ'¨¨˜|ÐØ#Ò=Ð'=ˆà$Ÿj™jÐ)>Ó?À4ÐGÐØ!Ÿ:™:Ð&8Ó9¸TÐAÐØ!Ÿ:™:Ð&8Ó9¸TÐAÐä%)¨&¯*©*Ð5QÐSWÓ*XÓ%Yò &
Ü'¨Ó/ÒZÔ4HÐIYÓ4Zð_
Ð"ñ
 &Ô*=¸fÔ*EÜ5Ð6FÓGÐà#ŸZ™ZÐ(<Ó=ÐÜ#<Ð=OÓ#PÐ ä.@ÀÈÓ.OÑ+ÐÐ+Ü2CØ×Ñ˜uÓ% vÐ/?ÐAQó3
Ñ/ˆ˜Ô/õ
 	bØ"ŸJ™JÐ':Ó;ÒA¸rÐá'Ð(9×(=Ñ(=¸gÀuÓ(MÓNˆ
ð  Ø(Ø×*Ñ*Ø Ð3CÐYlØ+EÐPV×PZÑPZÐ[eÓPfØ!1ÐFXÐ`jð +ó ð
 ñ

ˆñ Ø,ˆF�7‰OØ$*ˆF�=Ñ!Ø,0ˆFÐ(Ñ)Ù#Ø+=ˆFÐ'Ñ(à—Z‘Z Ó-ˆ
ô 4°F·J±JÐ?OÓ4PÒ4^ÐT^Ó_ˆÜ& |°^À\ÓRÒbÐVbˆ	á"Ñ+;Á	Ø)2ˆFÐ%Ñ&äEÀeÈVÏZÉZÐXbÓMcÓdˆÙØ×ÑÐ6¸ÔHà�‰Ô'Ø�6Ð"2Ð<MØ'AØ-ÐCVô
ô 	ð  Ÿ™Ð$4Ó5ˆÙÑ"2Ø)¨>Ð:ˆF�6‰NÙØ�M‰MÐ+Ô,Ø(ˆF�7‰Oä& v¨u°f·j±jÀÓ6LÔMä% fÔ-ñ
 Ý>á% eÔ,°·±¸NÓ1KÈzÒ1YØ—
‘
˜>¨4Ô0ô " &§*¡*¨Y¸¿
¹
À9Ó8MÓ"NÓOˆØÐØ 'ˆF�9Òà�J‰J�y $Ô'áñ 2<œc *œoÀØ'-§z¡zÐ2DÓ'EÒ'pÔIbÐcoÓIpñˆGð )0¯©«×=¡  1º1�q˜!‘tÐ=ˆGÑ=ÙÜ$ VÑ7¨wÓ7Ø�Z‰Z˜Ó%Ð1Ø*0°Ñ*>ˆFÐ&Ñ'á¡
ä  ÑLÐ,<¸lÐ+KÒLð #)§*¡*¨\Ó":ÐÜ@JÐK^Ô`dÔ@e¤4Ð(;Ô#<ÐkmˆF�<Ñ Ø�<Ñ ×+Ñ+Ð,>ÀÇ
Á
ÐK]Ð_hÓ@iÔjä% f§j¡j°Ó&>Ô?Øˆùó/ >s   Í2
P1Í=P1Úresponsec                 óŠ  — ddl m}  |||j                  d«      xs | j                  |j                  d«      xs | j                  ¬«      \  }}d}|�r|j
                  rûg }| j                  }|j
                  D ]Þ  }dD �	ci c]  }	t        ||	d«      sŒ|	t        ||	«      “Œ }
}	t        |d«      }|r|j                  j                  nt        |d	d
«      }|€t        j                  ||«      }n	||v r||   }|j                  t        t        |d«      r|j                  n|xs d||r|j                  j                  nt        |dd«      |
xs d¬«      «       Œà dD �	ci c]  }	|rt        ||	d«      r|	t        ||	d«      “Œ! }
}	t!        |r|j"                  nd||xs d|rt        |dd«      ndd|
xs d¬«      S c c}	w c c}	w )z=Normalize Codex Responses API response to NormalizedResponse.r   )Ú_normalize_codex_responseÚissuer_kindÚissuer_model)r{  r|  N)r  Úresponse_item_idÚfunctionr[   r   r  Ú	argumentsz{})r  r[   r  Úprovider_data)r$  Úcodex_message_itemsÚreasoning_detailsrB  rÔ   )rò   r  Úfinish_reasonrÔ   Úusager€  )r  rz  r:   rH  rI  r  rJ  r{   Úhasattrr~  r[   Ú_LEGACY_ALIAS_FALLBACKri   r   r  r  r   rò   )rM  rx  r6   rz  r  rƒ  r  rm   Útcr,   r€  Úhas_fnr[   s                r   Únormalize_responsez(ResponsesApiTransport.normalize_response(  sÕ  € åKá6Ø &§*¡*¨]Ó";Ò"U¸t×?UÑ?UØŸ™ NÓ3ÒN°t×7NÑ7Nô
Ñˆˆ]ð
 ˆ
Ú�3—>’>ØˆJØ×/Ñ/ˆIØ—n‘nò �à5Tö!Ø.1ÔX_Ð`bÐdgÐimÕXn�Cœ  SÓ)Ñ)ð!�ð !ô !  ZÓ0�Ù+1�r—{‘{×'Ò'´w¸rÀ6È2Ó7N�àÐ$Ü1×5Ñ5°d¸DÓA‘DØ˜YÑ&Ø$ T™?�DØ×!Ñ!¤(Ü '¨¨DÔ 1�r—u’u¸ºÀÈDÙ7=˜bŸk™k×3Ò3Ä7È2È{Ð\`ÓCaØ"/Ò"7°4ô#õ ðð& ]ö
àÙ”w˜s C¨Ô.ð ”˜˜c 4Ó(Ñ(ð
ˆð 
ô
 "Ù#&�C—K’K¨D¸ZÐWdÒWnÐhnÙ9<”g˜c ;°Ô5À$ØØ'Ò/¨4ô	
ð 	
ùò+!ùò 
s   ÂF;ÂF;Å$G c                 ó”  — |€yt        |dd«      }t        |t        «      r|ryt        t        |dd«      xs d«      j	                  «       j                  «       }t        |dd«      }t        |t        «      r|j                  d«      nt        |dd«      }|d	k(  xr. t        |xs d«      j	                  «       j                  «       d
k(  S )u	  True if response.output is a non-empty list, or a terminal content_filter refusal.

        An incomplete/content_filter response with no output must reach normalization,
        not a retry. Does NOT check output_text fallback â€” the caller handles that.
        NFÚoutputTÚstatusr   Úincomplete_detailsÚreasonrE  Úcontent_filter)r{   r1   rÝ   r   r&   rU   r2   r:   )rM  rx  r‹  rŒ  ÚdetailsÚ
raw_reasons         r   Úvalidate_responsez'ResponsesApiTransport.validate_responseR  sº   € ð ÐØÜ˜ 8¨TÓ2ˆÜ�fœdÔ#©ØÜ”W˜X x°Ó4Ò:¸Ó;×AÑAÓC×IÑIÓKˆÜ˜(Ð$8¸$Ó?ˆÜ.8¸Ä$Ô.G�W—[‘[ Ô*ÌWÐU\Ð^fÐhjÓMkˆ
Ø˜Ñ%Òc¬#¨jÒ.>¸BÓ*?×*EÑ*EÓ*G×*MÑ*MÓ*OÐScÑ*cÐcr   F©Úallow_streamr8  Úsanitize_harmony_tokensÚ
api_kwargsr”  r8  r•  c                ót   — ddl m}  |||||¬«      }t        |«       t        |j                  d«      «       |S )z­Validate and sanitize Codex API kwargs before the call.

        ``sanitize_harmony_tokens`` is for the ChatGPT Codex backend only (rejects literal Harmony tokens).
        r   )Ú_preflight_codex_api_kwargsr“  rl  )r  r˜  r5   r:   )rM  r–  r”  r8  r•  r˜  rÌ   s          r   Úpreflight_kwargsz&ResponsesApiTransport.preflight_kwargsb  s>   € õ 	Ná0Ø \ÐGZØ$;ô
ˆ
ô 	& jÔ1Ü% j§n¡n°\Ó&BÔCØÐr   rŒ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_STOP_REASON_MAPrH  r   r   Ú__annotations__rI  rJ  r2   ÚpropertyrN  r   rQ  rÝ   rX  r[  rw  r   r‰  r”   r’  r™  r`   r   r   rA  rA  [  s‰  … Ù3ð &,¸8ÈvÐdjÑkÐð (,Ð�x ‘}Ó+Ø(,Ð˜ ™Ó,à37Ð˜  c¨3 h¡Ñ0Ó7àð!˜#ò !ó ð!ð
&¨4°°S°©>ð 
&¸có 
&ð
¨¨d°3¸°8©nÑ)=ð 
ÈCó 
ð' 8¨D°°c¸3°h±Ñ,@Ñ#Að 'Àcó 'ð cgñ[Øð[Ø$(¨¨c°3¨h©Ñ$8ð[ØAIÈ$ÈtÐTWÐY\ÐT\É~ÑJ^ÑA_ð[à	ˆc�3ˆh‰ó[ðz(
¨3ð (
Ð=Oó (
ðTd¨#ð d°$ó dð" 8=ÐZ_Ø(-òØðØ04ðØSWðà!%ðð 
ôr   rA  )Úregister_transportrL  )ÚDict)ÚList)ÚTuple)F)r   rŒ   )Or�  r(   rî   Úloggingr½   Útypingr   r   r   Úagent.reasoning_effortr   r   r   r	   r
   r   r   Úagent.transports.baser   Úagent.transports.typesr   r   Ú	getLoggerrš  r²   Úcompiler   r   r   r-   r5   r2   rA   r–   r—   r˜   r™   Ú	frozensetrƒ   rj   r†  r”   rV   rX   rÝ   rú   rr   r~   r„   r†   rž   r  rŸ   rŸ  rº   Ú_EXTENDED_PROMPT_CACHE_MODELSr´   rÇ   rÍ   r¯   rÐ   r±   rà   ró   r°   r  r   r"  r-  r0  r5  r6  r?  rA  Úagent.transportsr¡  r¢  r£  r¤  )r[   s   0r   ú<module>r¯     sx  ðòó Û Û Û 	ß *Ñ *÷÷ ñ õ 4ß ?à	ˆ×	Ñ	˜8Ó	$€ð
 !�b—j‘jÐ!;Ó<Ð ð,¨X°c©]ð ,¸só ,ðv Sð v¨X°c©]ó vð4¨Sð 4°Tó 4ð%  c¨3 h¡ð %¸Cð %ÀDó %ð  3Ð ð !?Ð ð#Ð ð ,Ð Ù#Ð%5°}Ð$EÓFÐ Ø'Ð ð nÐ/ÐmÐ2QÐmÐTlÑmöàð #Ð# D 6Ð*¨DÑ0òÐ ð 8DÐ Ð3Ñ 4ð¨4°°S°©>ð ¸dó ð"¨T°#°s°(©^ð Àó ñ &=Ù*Oñ Ø˜˜c 3˜h™Ñ(ð Ø:?ÀÀSÀ¹/ð à�t�f˜c�kÑ"ð ð �d˜C�[ $Ð&Ñ'ð ð ˆ4��S˜#�X‘Ñ  c¨3 h¡Ð/Ñ0ó	 ð8¨ó ð0	 $ s¨C x¡.ð 	ÀDð 	ÈTó 	ð¨4ó ð2 chñ:(Øð:(Ø!% c¨3 h¡ð:(ØCGð:(Ø[_ð:(à
ˆ3��S˜#�X‘ÐÑó:(ñ| +.«%Ð ˜s 3™xÓ /ð2H˜cð 2H¨4°°S°©>ð 2H¸eÀCÈÀIÑ>Nó 2Hðj!Ð ð
 #- "§*¡*Ø�c—h‘hÑYÐ;XÔYÓYÐZð [ ð  ó#Ð ðQ°sð QÀcð QÈhÐWZÉmó Qð*N Cð N¨Dó NðE¨sð E¸cð EÀdó Eð
 UZò 5 Cð 5°3ð 5ÈTð 5Ð^cÐdgÐilÐdlÑ^mó 5ð&]¨4°°S°©>ð ]À#ð ]ÐQTð ]ÐY]ó ]ñ&_ Sð _°¸$¸tÀCÈÀH¹~Ñ:NÑ1Oð _Ð[^ð _ÐhpÐqtÑhuó _ñ09¨ð 9°H¸S±Mð 9ÈSð 9Ð\dÐejÑ\kó 9ð<]¨¨S°#¨X©ð ]¸4ó ]ð( 8¨D°°c¸3°h±Ñ,@Ñ#Að (Àdó (ðV{  S¨# X¡ð {°4ó {ð T¨$¨s°C¨x©.Ñ%9ð ¸dÀ4ÈÈSÈÁ>Ñ>Ró ð.M°#ð M¸$ó Mð˜Sð  X¨e¡_ó ðØðØ˜S #˜X™ðØ36ðØAEðØcgðàðà15ðð 
ˆ#ˆsˆ(�^óôBWÐ-ô Wõv 0á Ð$Ð&;Ô <õ Ý Þ ùòKs   Â.J=