+
    iHàjÔ¦  ã                   ó,  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
HtHtHtHtHtHtHtHt ^ RIHtHtHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ R	I H!t! ^ R
I"H#t#H$t$H%t% Rt&RRRRRRRRRR]]3t'RRt(0 RSmt)R R lt*R R lt+RRRR/R R llt,Rt-R R  lt.R! R" lt/R# R$ lt0R% R& lt1R' R( lt2R) R* lt3R+ R, lt4R- R. lt5R/ R0 lt6RTt7]8! 0 RUm4      t9RVR1 R2 llt:R3 R4 lt;R5 R6 lt<R7 R8 lt=R9 R: lt>R; R< lt?R= R> lt@RWR? R@ lltARWRA RB lltBRC RD ltC]Pˆ                  ! RE4      tE]PŒ                  ]PŽ                  ,           ]P�                  ,           tIRXtJRF RG ltKRH RI ltL]8! 4       R3RJRK/RL RM llltM ! RN RO]!4      tN^ RPIOHPtP ]P! RQ]N4       R# )Yz÷OpenAI Chat Completions transport (default api_mode for OpenAI-compatible providers).

Messages/tools are already OpenAI-shaped, so convert_* are near-identity; the
provider-specific work lives in build_kwargs (max_tokens, reasoning, extra_body).
N©ÚAny)Úurlparse)	ÚGEMINI4_THINKING_LEVELSÚKIMI_K3_EFFORTSÚKIMI_K3_OVERRIDESÚOPENAI_COMPAT_WIRE_EFFORTSÚclamp_effortÚclamp_reasoning_configÚkimi_supported_effortsÚrequested_effortÚtokenhub_effort)ÚDATA_USEÚMESSAGE_UIDÚdata_use_requirement)Úcoalesce_tool_call_idÚnormalize_finish_reason)Úis_moonshot_modelÚsanitize_moonshot_tools)ÚDEVELOPER_ROLE_MODELS)ÚProviderTransport)ÚNormalizedResponseÚToolCallÚUsageÚhermes_tool_searchÚcodex_reasoning_itemsÚcodex_message_itemsÚ	tool_nameÚeffect_dispositionÚ	timestampÚplatform_message_idÚ
message_idÚapi_contentÚanthropic_content_blocksÚbedrock_content_blocksc                óä   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        \         \        \        \        3,          ,          \        \        \        3,          3,          /# ©é   ÚtoolsÚreturn)ÚlistÚdictÚstrr   Útuple)Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/agent/transports/chat_completions.pyÚ__annotate__r0   2   sP   € ÷ 
ñ 
¬d´4¼¼S¸µ>Õ.Bð 
ÄuÌTÔRVÔWZÔ\_ÐW_ÕR`ÕMaÔcgÔhkÔmpÐhpÕcqÐMqÕGrñ 
ó    c                ó*   € ^ RI Hp V! V RR R R7      # )zÂAlias the client ``tool_search`` declaration for xAI; returns ``(tools, {alias: "tool_search"})``.

If a real tool already holds ``hermes_tool_search``, the bridge takes a ``_2``/``_3`` suffix.
)Ú_alias_reserved_toolsc                 óV   € V P                  R 4      ;'       g    / P                  R4      # ©ÚfunctionÚname)Úget)Úts   &r/   Ú<lambda>Ú4_rename_tool_search_bridge_for_xai.<locals>.<lambda>:   s!   € °A·E±E¸*Ó4E×4KÐ4KÈ×3PÑ3PÐQWÔ3Xr1   c                 ó,   € / V CR / V R ,          CRV/C/C# r5   © )r9   Úaliass   &&r/   r:   r;   ;   s"   € Ð S 1Ð S jÐ2R°Q°zµ]Ð2RÀFÈEÑ2RÒ Sr1   )Úname_ofÚrename)Útool_search)Úagent.transports.codexr3   )r(   r3   s   & r/   Ú"_rename_tool_search_bridge_for_xairC   2   s    € õ
 =á ØÐÑ)XÙSôð r1   c                óh   € V ^8„  d   QhR\         \        \        \        3,          ,          R\        /# ©r'   Úmessagesr)   ©r*   r+   r,   r   )r.   s   "r/   r0   r0   ?   s'   € ÷ "ñ "¬$¬t´C¼°H­~Õ*>ð "Ä3ñ "r1   c                ór  € V '       d'   \        V ^ ,          \        4      '       d
   V ^ ,          M/ pVP                  R4      R9  d   R# VP                  R4      p\        V\        4      '       d   V#  \        P
                  ! VRRRR7      #   \        \        3 d    \        T;'       g    R4      u # i ; i)	zfStable leading system/developer prefix used for cache routing (later messages are conversation state).ÚroleÚ ÚcontentTF)Ú	sort_keysÚensure_asciiÚ
separators>   ÚsystemÚ	developer)Ú,Ú:)Ú
isinstancer+   r8   r,   ÚjsonÚdumpsÚ	TypeErrorÚ
ValueError)rF   ÚfirstrK   s   &  r/   Ú_static_prompt_instructionsrY   ?   s”   € ç#¬
°8¸Aµ;Ä×(EÒ(EˆH�QŽKÈ2€EØ‡y�y�ÓÐ 7Ô7ÙØ�i‰i˜	Ó"€GÜ�'œ3×ÒØˆð"Ü�zŠz˜'¨TÀÐR\Ô]Ð]øÜ”zÐ"ô "Ü�7—=�=˜bÓ!Ò!ð"ús   Á3B ÂB6Â,B6Â5B6Ú
session_idÚcache_scope_idc                ó   € V ^8„  d   QhR\         \        \        3,          R\        \         \        \        3,          ,          R\        \         \        \        3,          ,          R,          R\        R\        R,          R\        R,          RR/# )	r'   Ú
api_kwargsrF   r(   NÚsupports_prompt_cache_keyrZ   r[   r)   ©r+   r,   r   r*   Úbool)r.   s   "r/   r0   r0   M   sy   € ÷ '3ñ '3Ü”Sœ#�X•ð'3Ü-1´$´s¼C°xµ.Õ-Að'3ä””Sœ#�X•Õ $Õ&ð'3äCGð'3ô �d•
ð'3ô 47¸µ:ð'3ð 
ñ	'3r1   c               óR  € ^ RI HpHpHp W P	                  R4      3 U	u. uF&  p	\        V	\        4      '       g   K  RV	9   g   K$  V	NK(  	  p
p	V
'       d   V
 F  p	V! V	4       K  	  R# V'       g   R# T! \        V4      Y'! T;'       g    T4      4      pV'       d   W°R&   R# R# u up	i )ug  Add a content-addressed ``prompt_cache_key`` only for a capable endpoint.

``cache_scope_id`` (compression-lineage root) beats ``session_id`` so the key
survives compression rotation. A caller-supplied key is authoritative but is
bounded to OpenAI's 64-char cap in place. Shares the Responses transport's hash
so equivalent prefixes hit one bucket across modes.

``cache_scope_id``, when provided, is the rotation-stable logical scope (compression-lineage root â€”
agent/prompt_cache_scope.py) and takes precedence over the physical ``session_id`` so the key survives
context-compression session rotation (#79017).
)Ú_bound_prompt_cache_key_fieldÚ_cache_scope_from_session_idÚ_content_cache_keyÚ
extra_bodyÚprompt_cache_keyN)rB   rb   rc   rd   r8   rS   r+   rY   )r]   rF   r(   r^   rZ   r[   rb   rc   rd   ÚcÚ
containersÚ	cache_keys   &$$$$$      r/   Ú_add_prompt_cache_keyrj   M   s¥   € ÷0ñ ð )¯.©.¸Ó*FÑGÓ{ÑG˜Ì:ÐVWÔY]×K^”!ÐcuÐyzÑcz—!�!ÑG€JÐ{ßÛˆAÙ)¨!Ö,ñ áß$ÙÙ"Ü# HÓ-¨uÐ6RÐSa×SoÐSoÐeoÓ6pó€I÷ Ø)2Ð%Ó&ñ ùò |s   ŸB$¼B$ÁB$z(Connect timeout, please try again later.c                ó0   € V ^8„  d   QhR\         R\        /# )r'   Úusager)   ©r   r`   )r.   s   "r/   r0   r0   z   s   € ÷ ñ ¬3ð ´4ñ r1   c                óþ   € R Fv  p\        V \        4      '       d   V P                  V4      M\        WR4      p\        V\        \
        34      '       g   KT  \        V\        4      '       d   Kl  V^ 8”  g   Ku   R# 	  R# )zAReturn whether a response usage object proves text was generated.NTF)Úcompletion_tokensÚoutput_tokens)rS   r+   r8   ÚgetattrÚintÚfloatr`   )rl   ÚfieldÚvalues   &  r/   Ú_has_positive_completion_tokensrv   z   s\   € ã7ˆÜ$.¨u´d×$;Ò$;�—	‘	˜%Ô ÄÈÐW[ÓA\ˆÜ�eœc¤5˜\×*Ô*´:¸eÄT×3JÔ3JÈuÐWXÎyÚñ 8ñ r1   c                ó0   € V ^8„  d   QhR\         R\        /# )r'   Útextr)   ©r,   r`   )r.   s   "r/   r0   r0   ƒ   s   € ÷ Iñ I¬ð I´ñ Ir1   c                ón   € \        V 4      ;'       d$    \        P                  V P                  4       4      # )z\True while streamed text is still a prefix of the shim sentinel (hold it back until judged).)r`   Ú_ROUTER_TIMEOUT_SHIMÚ
startswithÚlstrip)rx   s   &r/   Úrouter_timeout_shim_may_followr~   ƒ   s&   € ä�‹:×HÐHÔ.×9Ñ9¸$¿+¹+»-ÓHÐHr1   c                ó0   € V ^8„  d   QhR\         R\        /# ©r'   Úresponser)   rm   )r.   s   "r/   r0   r0   ˆ   s   € ÷ Qñ Q¤Sð Q¬Tñ Qr1   c                óp  € \        V RR4      p\        V\        4      '       d   \        V4      ^8w  d   R# \        V^ ,          RR4      p\        VRR4      p\        V\        4      '       d   VP                  4       \        8w  d   R# \        VRR4      '       d   R# \        \        V RR4      4      '       * # )uI  Recognize a router failure encoded as a successful ChatCompletion (#68396).

Some OpenAI-compatible routers answer an upstream connect timeout with HTTP 200 and the
sentinel as the sole assistant message. Only the exact sentinel, with no tool calls and no
positive ``completion_tokens``/``output_tokens`` proof of generation, is a shim â€” a model
that really produced those words keeps its usage evidence. Shared by every consumer of an
OpenAI-compatible response: ``validate_response``, the stream assembler, the
iteration-limit summary and the auxiliary ``_validate_llm_response``.
ÚchoicesNFÚmessagerK   Ú
tool_callsrl   )rq   rS   r*   Úlenr,   Ústripr{   rv   )r�   rƒ   r„   rK   s   &   r/   Úis_router_timeout_shimrˆ   ˆ   s”   € ô �h 	¨4Ó0€GÜ�gœt×$Ò$¬¨G«¸Ô(9ÙÜ�g˜a•j )¨TÓ2€GÜ�g˜y¨$Ó/€GÜ�gœs×#Ò# w§}¡}£Ô:NÔ'NÙÜˆw˜ d×+Ò+ÙÜ.¬w°xÀÈ$Ó/OÓPÔPÐPr1   c                óX   € V ^8„  d   QhR\         R\        R,          R\        R,          /# ©r'   ÚmodelÚreasoning_configNr)   ©r,   r+   )r.   s   "r/   r0   r0   ž   s/   € ÷ 	Pñ 	P¤sð 	P¼dÀT½kð 	PÌdÐUYÍkñ 	Pr1   c                ó"   € \        V\        4      # )u  Clamp Hermes' extended effort set (``ultra``) to the OpenAI-compat wire vocabulary.

Hermes' internal effort set extends the wire vocabulary with ``ultra`` (the /reasoning command documents
none..xhigh|max|ultra). OpenAI- compatible wires â€” OpenRouter chief among them â€” accept exactly
max|xhigh|high|medium|low|minimal|none and reject the extension with HTTP 400 (#89503). Clamp against
the declared wire vocabulary via the shared policy in ``agent.reasoning_effort``; provider profiles with
narrower sets clamp again downstream.
)r
   r   )r‹   rŒ   s   &&r/   Ú_reasoning_config_for_modelr�   ž   s   € ô "Ð"2Ô4NÓOÐOr1   c                óX   € V ^8„  d   QhR\         R\        R,          R\        R,          /# rŠ   r�   )r.   s   "r/   r0   r0   ª   s,   € ÷ 5ñ 5¬ð 5ÄÀtÅð 5ÔPTÐW[ÕP[ñ 5r1   c                ó²  € ^ RI Hp \        V\        4      '       g   R# T ;'       g    RP	                  4       P                  4       P                  R4      pVP                  R4      '       g   R# \        VP                  RR4      ;'       g    R4      P	                  4       P                  4       pVP                  R4      '       dT   VP                  R	4      R
J ;'       g    VR8H  pV'       d   RM\        V\        4      pRV'       * RV\        9   d   V/# R/# VP                  R	4      R
J g   VR8X  d8   RR
/pVP                  R4      '       d   ^ VR&   V# V! V4      '       d   RVR&   V# RR/pVP                  R4      '       d   V# VR9  d   RpV! V4      '       d7   RV9   d   V\        9   d   RMRVR&   V# VR9   d   RMV\        9   d   RMRVR&   V# )zLTranslate Hermes/OpenRouter-style reasoning config to Gemini thinkingConfig.)Úgemini_uses_thinking_levelNrJ   zgoogle/ÚgeminiÚeffortÚmediumzgemini-4ÚenabledFÚnoneÚlowÚincludeThoughtsÚthinkingLevelzgemini-2.5-ÚthinkingBudgetTÚhighÚpro>   r˜   Úmaxrœ   ÚultraÚxhighr•   Úminimal>   r˜   r¡   )Úagent.gemini_native_adapterr’   rS   r+   r‡   ÚlowerÚremoveprefixr|   r,   r8   r	   r   Ú_HIGH_EFFORTS)	r‹   rŒ   r’   Únormalized_modelr”   ÚdisabledÚlevelÚconfigÚthinking_configs	   &&       r/   Ú_build_gemini_thinking_configr«   ª   sà  € åFäÐ&¬×-Ò-ÙØŸ˜ ×*Ñ*Ó,×2Ñ2Ó4×AÑAÀ)ÓLÐð ×&Ñ& x×0Ò0ÙÜÐ!×%Ñ% h°Ó9×EÐE¸XÓF×LÑLÓN×TÑTÓV€FØ×"Ñ" :×.Ò.à#×'Ñ'¨	Ó2°eÐ;×OÐO¸vÈÑ?Oˆß!‘¤|°FÔ<SÓ'TˆØ! x¤<°È5ÔTkÔKkÀ%ÐzÐzÐqyÐzÐzØ×Ñ˜IÓ&¨%Ó/°6¸VÔ3Cð #4°UÐ!;ˆØ×&Ñ& }×5Ò5Ø'(ˆFÐ#Ñ$ð ˆñ (Ð(8×9Ò9Ø&+ˆF�?Ñ#ØˆØ'8¸$Ð&?€Oà×"Ñ" =×1Ò1ØÐØÐRÔRØˆñ "Ð"2×3Ò3ØÐ$Ô$Ø9?Ä=Ô9P©vÐV[ˆO˜OÑ,ð
 Ðð  Ð#5Ô5‘ÀVÌ}ÔE\¹6Ðbjð ˜OÑ,ð Ðr1   c                óL   € V ^8„  d   QhR\         R,          R\         R,          /# )r'   r©   Nr)   )r+   )r.   s   "r/   r0   r0   â   s"   € ÷ ñ ¬t°d­{ð ¼tÀd½{ñ r1   c                óä  € \        V \        4      '       d	   V '       g   R# / pV P                  R4      V P                  R4      V P                  R4      rCp\        V\        4      '       d   W!R&   \        V\        4      '       d8   VP                  4       '       d"   VP                  4       P                  4       VR&   \        V\        \        34      '       d   \        V4      VR&   T;'       g    R# )zEConvert Gemini thinking config keys to the OpenAI-compat field names.Nr™   rš   r›   Úinclude_thoughtsÚthinking_levelÚthinking_budget)	rS   r+   r8   r`   r,   r‡   r£   rr   rs   )r©   Ú
translatedÚincluder¨   Úbudgets   &    r/   Ú"_snake_case_gemini_thinking_configr´   â   s¹   € ä�fœd×#Ò#¯6ÙØ!#€JØ#ŸZ™ZÐ(9Ó:¸F¿J¹JÀÓ<WÐY_×YcÑYcÐdtÓYu�F€GÜ�'œ4× Ò Ø)0Ð%Ñ&Ü�%œ×Ò %§+¡+§-¢-Ø',§{¡{£}×':Ñ':Ó'<ˆ
Ð#Ñ$Ü�&œ3¤˜,×'Ò'Ü(+¨F«ˆ
Ð$Ñ%Ø×Ð˜Ðr1   c                óV   € V ^8„  d   QhR\         R\        R,          R\        R\        /# )r'   r‹   rŒ   NÚ	requestedr)   )r,   r+   r   )r.   s   "r/   r0   r0   ñ   s4   € ÷ Kñ K¬Sð KÄDÈ4ÅKð KÔ\_ð KÔdgñ Kr1   c                óH   € \        W4      pV'       g   V# ^ RIHp V! W#4      # )zbRaise Gemini output caps that thinking tokens (billed against max_tokens) would otherwise exhaust.)Ú#_effective_gemini_max_output_tokens)r«   r¢   r¸   )r‹   rŒ   r¶   rª   r¸   s   &&&  r/   Ú!_raise_gemini_thinking_max_tokensr¹   ñ   s#   € ä3°EÓL€OßØÐÝOá.¨yÓJÐJr1   c                ó0   € V ^8„  d   QhR\         R\        /# ©r'   Úbase_urlr)   rm   )r.   s   "r/   r0   r0   û   s   € ÷ uñ u´ð u¼ñ ur1   c                 óä   € \        T ;'       g    R 4      P                  4       P                  R4      P                  4       p\	        V4      ;'       d    RV9   ;'       d    VP                  R4      # )rJ   Ú/ú!generativelanguage.googleapis.comz/openai)r,   r‡   Úrstripr£   r`   Úendswith)r¼   Ú
normalizeds   & r/   Ú!_is_gemini_openai_compat_base_urlrÃ   û   s]   € Ü�X—^�^ Ó$×*Ñ*Ó,×3Ñ3°CÓ8×>Ñ>Ó@€JÜ�
Ó×tÐtÐ CÀzÑ Q×tÐtÐV`×ViÑViÐjsÓVtÐtr1   c                ó0   € V ^8„  d   QhR\         R\        /# r»   rm   )r.   s   "r/   r0   r0      s   € ÷ ñ ¤cð ¬dñ r1   c                óÊ   €  \        \        T ;'       g    R4      P                  4       4      P                  ;'       g    RP	                  4       R8H  #   \
         d     R# i ; i)z»True only for the exact api.openai.com host (implies ``prompt_cache_key`` support).

Not a substring match: Azure / strict compat endpoints stay opt-in via ``supports_prompt_cache_key``.
rJ   zapi.openai.comF)r   r,   r‡   Úhostnamer£   Ú	Exception)r¼   s   &r/   Ú_is_openai_api_base_urlrÈ      sU   € ð
Üœ˜XŸ^˜^¨Ó,×2Ñ2Ó4Ó5×>Ñ>×DÐDÀ"×KÑKÓMÐQaÑaÐaøÜô Úðús   ‚A •)A ¿A ÁA"Á!A"c                óH   € V ^8„  d   QhR\         R\         R\         R\        /# )r'   r‹   r¼   Úproviderr)   rm   )r.   s   "r/   r0   r0     s*   € ÷ ñ ¬Sð ¼Cð ÔRUð Ôaeñ r1   c                ó‚  aa€ ^ RI Ho \        T ;'       g    R4      P                  4       pRV9   ;'       g‰    RV9   ;'       g|    T;'       g    RP	                  4       P                  4       \
        9   ;'       gE    \        ;QJ d$    VV3R l\         4       F  '       g   K   R# 	  R# ! VV3R l\         4       4      # )a  True for Gemini routes, which require tool-call ``extra_content`` (thought_signature) replay.

A Gemini host or provider counts even when the model id is an alias without "gemini" in it;
every other strict provider (Fireworks, Cerebras) rejects the key, so it is stripped there.
©Úbase_url_host_matchesrJ   r“   Úgemmac              3   ó6   <"  € T F  pS! SV4      x € K  	  R # 5i©Nr=   )Ú.0Úhostr¼   rÍ   s   & €€r/   Ú	<genexpr>Ú4_model_consumes_thought_signature.<locals>.<genexpr>  s   øé € ÐYÑAX¸Ñ$ X¨t×4Ð4ÓAXùs   ƒTF)ÚutilsrÍ   r,   r£   r‡   Ú_GEMINI_SIGNATURE_PROVIDERSÚanyÚ_GEMINI_SIGNATURE_HOSTS)r‹   r¼   rÊ   ÚmrÍ   s   &f& @r/   Ú!_model_consumes_thought_signaturerÚ     sª   ù€ õ ,äˆE�KˆK�RÓ×ÑÓ €Aà�A‰÷ 	Zð 	Z˜ A™÷ 	Zð 	ZØ�NˆN˜×!Ñ!Ó#×)Ñ)Ó+Ô/JÑJ÷	Zð 	Zç‹3ÕYÕAXÓY�3Œ3ðò ðð ÕYÕAXÓYÓYðr1   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r'   rÊ   r¼   r)   )r   Ú	frozenset)r.   s   "r/   r0   r0     s!   € ÷ 8ñ 8¤sð 8´cð 8¼iñ 8r1   c                ó   € ^ RI Hp V! W4      # )a  Reasoning keys an assistant message may carry on this route; the rest are stripped.

``message_sanitization.route_reasoning_carriers`` owns the table; keys the route rejected
this session were already removed upstream by ``reapply_reasoning_echo``. The table replays
``reasoning_details`` to OpenRouter-format gateways (OpenRouter, Kilo, Vercel AI Gateway,
Nous Portal) and to vendors documenting it (Novita, MiniMax /v1, TokenHub), never to strict
schemas (Groq, Mistral, Cerebras, opencode relays: ``property 'reasoning_details' is
unsupported`` / ``Extra inputs are not permitted`` / ``no such field``, #70233).
The Portal is back on the list: the "cumulative replayed-reasoning budget" blamed for #118182
does not exist in the Portal code and ~440 live replay requests (up to 32 KB of reasoning)
returned no 400; the observed failures were an upstream content filter surfaced as
"Provider returned error". Portal lanes that reject a carrier are handled by the
per-(provider, host, model) reactive strip. Stored history always keeps every carrier.
)Úroute_reasoning_carriers)Úagent.message_sanitizationrÞ   )rÊ   r¼   rÞ   s   && r/   Ú_wire_reasoning_carriersrà     s   € õ Dá# HÓ7Ð7r1   c                ó0   € V ^8„  d   QhR\         R\        /# )r'   Úextra_contentr)   rm   )r.   s   "r/   r0   r0   3  s   € ÷ Bñ B´Sð B¼Tñ Br1   c                ó.  € \        V \        4      '       g   R# V P                  R4      pV P                  R4      pVf(   \        V\        4      '       d   VP                  R4      p\        V\        4      ;'       d    \	        VP                  4       4      # )aF  Whether OpenRouter's Gemini sidecar contains a usable thought signature.

Gemini accepts the signature either directly or under its ``google``
namespace.  Replaying an empty or non-string value makes a multimodal
request fail with ``Corrupted thought signature``; omit that sidecar while
leaving the stored history untouched.
FÚthought_signatureÚgoogle)rS   r+   r8   r,   r`   r‡   )râ   Ú	candidaterå   s   &  r/   Ú!_has_replayable_thought_signaturerç   3  sw   € ô �m¤T×*Ò*ÙØ×!Ñ!Ð"5Ó6€IØ×Ñ˜xÓ(€FØÒœZ¨´×5Ò5Ø—J‘JÐ2Ó3ˆ	Ü�i¤Ó%×AÐA¬$¨y¯©Ó/@Ó*AÐAr1   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r'   Úobjr7   r)   )r   r,   )r.   s   "r/   r0   r0   D  s!   € ÷ ñ œcð ¬ð ´ñ r1   c                óÄ   € \        WR4      pVfP   \        V R4      '       d>   \        V P                  \        4      '       d   V P                  M/ P                  V4      pV# )z^``obj.<name>``, else the same key from pydantic ``model_extra`` (some SDKs park fields there).NÚmodel_extra)rq   ÚhasattrrS   rë   r+   r8   )ré   r7   ru   s   && r/   Ú_attr_or_model_extrarí   D  sK   € ä�C˜tÓ$€EØ‚}œ  m×4Ò4Ü$.¨s¯©Ä×$EÒ$E�—’È2×RÑRÐSWÓXˆØ€Lr1   c                ó0   € V ^8„  d   QhR\         R\         /# )r'   Úextrar)   r   )r.   s   "r/   r0   r0   L  s   € ÷ 
ñ 
œsð 
¤sñ 
r1   c                óª   € \        V R4      '       d!   RR// 3 F  p V P                  ! R/ VB u # 	  V #   \         d     K*  \         d      T # i ; i)ziPlain-dict form of a pydantic ``extra_content``; older pydantic lacks ``warnings=``, so retry without it.Ú
model_dumpÚwarningsFr=   )rì   rñ   rV   rÇ   )rï   Údump_kwargss   & r/   Ú_dump_extra_contentrô   L  sg   € äˆu�l×#Ò#Ø'¨Ð/°Ó4ˆKðØ×'Ò'Ñ6¨+Ñ6Ò6ñ 5ð €Løô	 ô ÚÜô ÙØ€Lðús   �5µAÁAÁAÁAc                ó>   € V ^8„  d   QhR\         R\        R,          /# )r'   Úrawr)   N)r   rs   )r.   s   "r/   r0   r0   Y  s"   € ÷ Hñ H”sð Hœu t�|ñ Hr1   c                óŒ   €  V R9  d   \        V 4      MRpTe   RTu;8:  d	   R8:  d   T#  R#   \        \        3 d     R# i ; i)zICoding-score floor for the Pareto router as a float in [0, 1], else None.Ng        g      ð?)NrJ   )rs   rV   rW   )rö   Úscores   & r/   Ú_pareto_scorerù   Y  sS   € ðØ!¨Ô3”�c”
¸ˆð Ò%¨#°Ö*=¸#Ô*=ˆ5ÐGÐ*=À4ÐGøô ”zÐ"ô Úðús   ‚. ®AÁAc                ó<   € V ^8„  d   QhR\         R\        R\         /# )r'   Ú	sanitizedÚmodel_lowerr)   )r*   r,   )r.   s   "r/   r0   r0   b  s!   € ÷ ñ ¤Dð ´sð ¼tñ r1   c                óN  a€ V '       dœ   \        V ^ ,          \        4      '       d   V ^ ,          P                  R4      R8X  db   \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   / V ^ ,          CRR/C.V R,          O# V # )zCGPT-5/Codex models take a ``developer`` role instead of ``system``.rI   rO   c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irÐ   r=   )rÑ   Úprü   s   & €r/   rÓ   Ú'_swap_developer_role.<locals>.<genexpr>f  s   øé € Ð@Ñ*? Q�[Ö Ó*?ùó   ƒTFrP   :é   NN)rS   r+   r8   r×   r   )rû   rü   s   &fr/   Ú_swap_developer_roler  b  sz   ø€ ÷ 	”j ¨1¥¬t×4Ò4¸À1½×9IÑ9IÈ&Ó9QÐU]Ô9]ß‹CÔ@Õ*?Ó@�C�CŠCÔ@Õ*?Ó@×@Ò@à5�9˜Q•<Ð5 ¨Ñ5ÐF¸	À"½ÐFÐFØÐr1   c                óX   € V ^8„  d   QhR\         R\        R\        R\         R\        RR/# )r'   r]   r‹   rŒ   ÚparamsÚprofile_maxr)   N)r+   r,   r   )r.   s   "r/   r0   r0   l  sA   € ÷ rñ r¤$ð r¬sð rÄcð rÔSWð rÔfið rÐuyñ rr1   c           
     óH  € VP                  R4      pVP                  R4      VP                  R4      3 F5  pVf   K	  V'       g   K  V P                  V! \        WV4      4      4        R# 	  V'       d.   V'       d$   V P                  V! \        WV4      4      4       R# R# R# )zIPreserve internal task/recovery budgets and provider protocol exceptions.Úmax_tokens_param_fnÚephemeral_max_output_tokensÚ
max_tokensN)r8   Úupdater¹   )r]   r‹   rŒ   r  r  Úmax_tokens_fnræ   s   &&&&&  r/   Ú_apply_max_tokensr  l  s‡   € à—J‘JÐ4Ó5€MØ—j‘jÐ!>Ó?ÀÇÁÈLÓAYÓZˆ	ØÔ §]¡]Ø×Ñ™mÔ,MÈeÐgpÓ,qÓrÔsÚñ [÷ —}Ø×Ñ™-Ô(IÈ%ÐcnÓ(oÓpÖqñ %�{r1   c                ó‚   € V ^8„  d   QhR\         R\        R\        R\        R\        R\        \         \        3,          /# )r'   r‹   rû   r(   r  Úprofiler)   )r,   r*   r   r+   )r.   s   "r/   r0   r0   x  sD   € ÷ ñ œð ¬ð ´Sð Ä$ð ÔQTð Ô`dÔehÔjmÐemÕ`nñ r1   c                óR  € RV RV/pVeU   ^ RI Hp VP                  VJ d   M=VP                  e   VP                  VR&   MVP                  R4      e   VR,          VR&   VP                  R4      e   VR,          VR&   V'       d"   \	        V 4      '       d   \        V4      MTVR&   V# )zÑShared ``{model, messages[, temperature][, timeout][, tools]}`` scaffold for both build paths.

``temperature`` is profile-path only: ``fixed_temperature`` beats the caller's; ``OMIT_TEMPERATURE`` sends none.
r‹   rF   )ÚOMIT_TEMPERATUREÚtemperatureÚtimeoutr(   )Úproviders.baser  Úfixed_temperaturer8   r   r   )r‹   rû   r(   r  r  r]   r  s   &&&&&  r/   Ú_base_kwargsr  x  s¬   € ð
 #*¨5°*¸iÐ!H€JØÒÝ3à×$Ñ$Ð(8Ó8ØØ×&Ñ&Ò2Ø(/×(AÑ(AˆJ�}Ò%Ø�Z‰Z˜Ó&Ò2Ø(.¨}Õ(=ˆJ�}Ñ%Ø‡z�z�)ÓÒ(Ø & yÕ 1ˆ
�9Ñßä@QÐRW×@XÒ@XÔ5°eÔ<Ð^cˆ
�7ÑØÐr1   c                ó˜   € V ^8„  d   QhR\         \        \        3,          R\        R\         R\        R\         \        \        3,          /# )r'   r]   rû   r  r^   r)   r_   )r.   s   "r/   r0   r0   �  sQ   € ÷ ñ œt¤C¬ H�~ð ¼$ð Ìð Ôlpð ÔuyÔz}ô  @Cð  {Cõ  vDñ r1   c          
     ó€   € \        WV P                  R4      VVP                  R4      VP                  R4      R7       V # )zQTail shared by both build paths: content-addressed prompt_cache_key, then return.r(   rZ   r[   )rF   r(   r^   rZ   r[   )rj   r8   )r]   rû   r  r^   s   &&&$r/   Ú_finish_kwargsr  �  s;   € äØ¨j¯n©n¸WÓ.EÐazØ—:‘:˜lÓ+¸F¿J¹JÐGWÓ<Xõð Ðr1   z^[A-Za-z0-9]{9}$c                ór   € V ^8„  d   QhR\         R,          R\         R,          R\         R,          R\        /# )r'   rÊ   Nr‹   r¼   r)   ry   )r.   s   "r/   r0   r0   ¥  s>   € ÷ Kñ K¬s°T­zð KÄ#ÈÅ*ð KÔX[Ð^bÕXbð KÔgkñ Kr1   c                 ój  a€ ^ RI Hp T ;'       g    RP                  4       P                  4       R8X  g#   T! \	        T;'       g    R4      R4      '       d   R# T;'       g    RP                  4       o\
        ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R# ! V3R l\         4       4      # )é    rÌ   rJ   Úmistralz
mistral.aiTc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irÐ   r=   )rÑ   Úmarkerrü   s   & €r/   rÓ   Ú3_route_requires_mistral_tool_ids.<locals>.<genexpr>«  s   øé € ÐJÑ3I¨˜Ö$Ó3Iùr  F)rÕ   rÍ   r‡   r£   r,   r×   Ú_MISTRAL_MODEL_MARKERS)rÊ   r‹   r¼   rÍ   rü   s   &&& @r/   Ú _route_requires_mistral_tool_idsr"  ¥  s…   ø€ Ý+à�ˆ�B×ÑÓ×%Ñ%Ó'¨9Ô4Ñ8MÌcÐRZ×R`ÐR`Ð^`ÓNaÐco×8pÒ8pÙØ—;�;˜B×%Ñ%Ó'€Kß‹3ÔJÕ3IÓJ�3Œ3ÐJŠ3ÐJˆ3ÔJÕ3IÓJÓJÐJr1   c                ó0   € V ^8„  d   QhR\         R\         /# )r'   Úkeyr)   ©r,   )r.   s   "r/   r0   r0   ®  s   € ÷ 	ñ 	œ#ð 	¤#ñ 	r1   c                óx  € \         P                  V 4      '       d   V # \        P                  \        P
                  ! V P                  RR4      4      P                  4       R,          R4      p. p\        ^	4       F-  p\        V^>4      w  rVP                  \        V,          4       K/  	  RP                  V4      # )zR``key`` when already 9 alphanumeric characters, else a stable base62 digest of it.zutf-8Úsurrogatepass:Né   NÚbigrJ   )Ú_MISTRAL_TOOL_ID_REÚ	fullmatchrr   Ú
from_bytesÚhashlibÚsha256ÚencodeÚdigestÚrangeÚdivmodÚappendÚ_MISTRAL_ID_ALPHABETÚjoin)r$  ÚnumberÚcharsÚ_Úrems   &    r/   Ú_mistral_tool_idr:  ®  s�   € ä×$Ñ$ S×)Ò)Øˆ
Ü�^‰^œGŸNšN¨3¯:©:°g¸Ó+OÓP×WÑWÓYÐZ\Õ]Ð_dÓe€FØ€EÜ�1ŽXˆÜ˜V RÓ(‰ˆØ�‰Ô)¨#Õ.Ö/ñ ð �7‰7�5‹>Ðr1   Úmistral_tool_idsFc                ó|   € V ^8„  d   QhR\         R\        R\        R\        R,          R\        R\        R,          /# )r'   ÚmsgÚstrip_extra_contentÚstrip_reasoningÚnative_reasoning_details_typeNr;  r)   )r   r`   rÜ   r,   r+   )r.   s   "r/   r0   r0   º  sV   € ÷ GXñ GXÜ	ðGXÜ#'ðGXÜ:CðGXä#&¨¥:ðGXäKOðGXô 
ˆD…[ñGXr1   c               óh  € \        V \        4      '       g   R# V  Uu. uF@  qU\        9   g2   \        V\        4      '       g   K%  VP	                  R4      '       g   K>  VNKB  	  ppV P                  R4      R8X  d!   Yb Uu. uF  qUV 9   g   K  VNK  	  up,          pRpRV9  dÕ   \        V P                  R4      \        4      '       d°   V R,          pV U	u. uFn  p	\        V	\        4      '       dT   \        V	P                  R4      \        4      '       d/   V	R,          P                  R4      '       d   V	R,          V8w  d   Kl  V	NKp  	  p
p	\        V
4      \        V4      8w  d   VP                  R4       T
pV P                  R4      R8X  d   R	V 9   d   VP                  R	4       V P                  4        UUu/ uF  w  r[WV9  g   K  W[bK  	  pppR
pV'       dY   V P                  R4      R8X  dC   \        RV P                  R4      /4      pV'       d   \        V4      ;qðR,          8w  d   WüR&   RpV'       d   W|R&   V P                  R4      pRpV P                  R4      R8X  dO   RV 9   dH   Ve   \        V\        4      '       d.   V'       g&   VP                  RR4       VP                  R4       EMF\        V\        4      '       Ed0   \        V4       EF  w  pp\        V\        4      '       g   K  \         Uu. uF  qUV9   g   K  VNK  	  ppRV9   d2   V'       g   \!        VR,          4      '       g   VP                  R4       V'       d   \        V4      MRpV'       d   \        V4      MRpV'       g   Vf   K¬  VVP                  R4      8w  g   KÄ  Vf   \        V4      pVP                  4        UUu/ uF  w  r[VV9  g   K  W[bK  	  uppVV&   Vf   EK
  VVV,          R&   EK  	  Ve   VVR&   V'       g   V'       g   Ve   V# R# u upi u upi u up	i u uppi u upi u uppi )aS  Sanitized copy of ``msg``, or None when nothing needs stripping.

Drops persistence sidecars, ``_``-prefixed scaffolding markers, tool-call ``call_id`` /
``response_item_id`` (and ``extra_content`` unless Gemini), an assistant
``tool_calls: []`` / ``null`` (strict providers reject both), ``name``
on tool results (schema-valid only on user/assistant messages; strict
providers reject it with ``contains item with unknown key name``), and the reasoning
keys in ``strip_reasoning`` (carriers the route does not read, ``_wire_reasoning_carriers``).
On a route that reads ``reasoning_details``, private ``<provider>.native_assistant`` carriers still go only to the
profile that declared that exact type: another provider's signed replay is meaningless (or
rejected) elsewhere, and stored history keeps it for a return to the original provider.
``mistral_tool_ids`` maps the call ``id`` and the result ``tool_call_id`` through
``_mistral_tool_id`` from the pairing key the result writers use (``coalesce_tool_call_id``:
``call_id`` first, call half of a composite ``call|item`` id), so each pair stays matched.
Nr8  rI   Ú	assistantÚreasoning_detailsÚtypez.native_assistantÚtoolr7   FÚidÚtool_call_idTr…   râ   rJ   )rS   r+   Ú_STRIP_MSG_KEYSr,   r|   r8   r*   rÁ   r†   r3  Úitemsr   r:  ÚpopÚ	enumerateÚ_STRIP_TC_KEYSrç   )r=  r>  r?  r@  r;  ÚkÚ
strip_keysÚkept_detailsÚdetailsÚdÚkeptÚvÚout_msgÚremappedÚ
result_keyÚmappedr…   Úcopied_tool_callsÚtc_idxÚtcÚkeysr$  s   &&&&$                 r/   Ú_sanitize_messager\  º  s€  € ô& �cœ4× Ò ÙÙ Óg™S˜¬Ô$8¼ZÈÌ3×=O”!ÐTU×T`ÑT`Ðad×Te—!�!™S€JÐgØ
‡w�wˆvƒ˜+Ô%Ø /Ó>¡/˜Q¸#±X—q�q¡/Ñ>Õ>ˆ
Ø€LØ *Ô,´¸C¿G¹GÐDWÓ<XÔZ^×1_Ò1_ØÐ)Õ*ˆÙ"ó i™7�aÜ�qœ$×Ò¤J¨q¯u©u°V«}¼c×$BÒ$BØ�&•	×"Ñ"Ð#6×7Ò7¸A¸f½IÐIfÑ<f÷ �™7ˆð iô ˆt‹9œ˜G›Ô$Ø×ÑÐ1Ô2ØˆLð ‡w�wˆvƒ˜&Ô  V¨s¤]Ø×Ñ˜&Ô!Ø #§	¡	¤ÔC¡™˜¨qÑ/BŒtˆqŠt¡€GÑCØ€Hß˜CŸG™G F›O¨vÔ5Ü*¨D°#·'±'¸.Ó2IÐ+JÓKˆ
ßÔ%5°jÓ%AÐA˜6È.ÕFYÔYØ&,�NÑ#ØˆHßØ'3Ð#Ñ$Ø—‘˜Ó&€JØÐØ
‡w�wˆvƒ˜+Ô%¨,¸#Ô*=À:ÒCUÔZdÐeoÔqu×ZvÒZv÷  @JØ�‰�L $Ô'Ø×Ñ˜,Ö'Ü	�J¤×	%Ó	%Ü# J×/‰JˆF�BÜ˜b¤$×'Ò'ÙÝ-Ó9™~˜!°b±—A�A™~ˆDÐ9Ø "Ô$ß#Ô+LÈRÐP_ÕM`×+aÒ+aà—‘˜OÔ,ß/?Ô'¨Ô+ÀRˆCß.1Ô% cÔ*°tˆFß˜Ô*¨v¸¿¹À»Ö/EØ$Ò,Ü(,¨ZÓ(8Ð%Ø>@¿h¹h¼jÔ,Z¹j±d°aÈAÐUYÉM¬T¨QªT¹jÒ,ZÐ! &Ñ)ØÕ%Ø6<Ð% fÕ-¨dÔ3ñ 0ð  Ò(Ø$5ˆG�LÑ!ß §HÐ0AÒ0Mˆ7ÐWÐSWÐWùòe hùâ>ùòiùó Dùò$ :ùó -[sT   �"PÁPÁPÁ?PÂPÃAPÄ4PÅPÆ9
P#ÇP#Ë?P)ÌP)Î>P.ÏP.c                   óØ   a € ] tR tRt o RtRt]V 3R lR l4       tV 3R lR ltV 3R lR	 lt	RV 3R
 lR llt
R tV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R ltRtV tR# )ÚChatCompletionsTransporti  z*Transport for api_mode='chat_completions'.Nc                ó    <€ V ^8„  d   QhRS[ /# )r'   r)   r%  )r.   Ú__classdict__s   "€r/   r0   Ú%ChatCompletionsTransport.__annotate__  s   ø€ ÷ "ñ "™#ñ "r1   c                ó   € R # )Úchat_completionsr=   )Úselfs   &r/   Úapi_modeÚ!ChatCompletionsTransport.api_mode  s   € á!r1   c                ór   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[S[S[3,          ,          /# rE   rG   )r.   r`  s   "€r/   r0   ra    s>   ø€ ÷ Cñ C©©d±3¹°8­nÕ)=ð CÉDÑQUÑVYÑ[^ÐV^ÕQ_ÕL`ñ Cr1   c                óæ  € VP                  R4      p\        VRR4      ;'       g    VP                  R4      p\        VP                  R4      VP                  R4      V4      '       * p\        VRR4      ;'       g    Rp\        WBP                  R4      4      pV'       d   V'       d   VR0,          p\	        0 Rm4      V,
          p\        WBP                  R4      VP                  R4      4      p	V U
u. uF  p
V
\        W¥W†V	R	7      3NK  	  pp
\        ;QJ d    R
 V 4       F  '       d   K   RM	  RM! R
 V 4       4      '       d   V# V U
Uu. uF  w  r¬Vf   T
MTNK  	  upp
# u up
i u upp
i )z•Strip internal fields that strict chat-completions providers reject (HTTP 400/422).

Returns the input list unchanged when nothing needs sanitizing.
Úprovider_profiler7   NrÊ   r‹   r¼   r@  rC  )r;  c              3   ó.   "  € T F  w  rVR J x € K  	  R # 5irÐ   r=   )rÑ   r8  Úss   &  r/   rÓ   Ú<ChatCompletionsTransport.convert_messages.<locals>.<genexpr>!  s   é € Ð5¡_™T˜Qˆq�D�y£_ùs   ‚FT>   Ú	reasoningÚreasoning_contentrC  )r8   rq   rÚ   rà   rÜ   r"  r\  Úall)rd  rF   Úkwargsr  rÊ   r>  Únative_typeÚcarriersr?  Úmistral_idsrÙ   Úsanitized_pairsrk  s   &&,          r/   Úconvert_messagesÚ)ChatCompletionsTransport.convert_messages  sW  € ð
 —*‘*Ð/Ó0ˆÜ˜7 F¨DÓ1×KÐK°V·Z±ZÀ
Ó5KˆÜ"CÀFÇJÁJÈwÓDWÐY_×YcÑYcÐdnÓYoÐqyÓ"zÔzÐÜ˜gÐ'FÈÓM×UÐUÐQUˆÜ+¨H·j±jÀÓ6LÓMˆßŸ8àÐ#6Ð"7Õ7ˆHÜ#Ò$[Ó\Ð_gÕgˆÜ6°xÇÁÈGÓATÐV\×V`ÑV`ÐakÓVlÓmˆñ %-ó.á$,˜qð Ô0°ÈØBMô Oó Pá$,ð 	ð .÷ ‹3Ñ5¡_Ó5�3�3Š3Ñ5¡_Ó5×5Ò5ØˆOÙ2AÔB±/©$¨!�Q’Y‘ AÒ%±/ÒBÐBùò.ùó
 Cs   Ã5E(ÅE-c                ór   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[S[S[3,          ,          /# r&   rG   )r.   r`  s   "€r/   r0   ra  %  s5   ø€ ÷ ñ ¡4©©S±#¨X­Õ#7ð ¹DÁÁcÉ3ÀhÅÕ<Pñ r1   c                ó   € V# )u0   Tools are already in OpenAI format â€” identity.r=   )rd  r(   s   &&r/   Úconvert_toolsÚ&ChatCompletionsTransport.convert_tools%  s   € àˆr1   c          
      ó¢   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RS[S[S[ S[3,          ,          R,          RS[S[ S[3,          /# )r'   r‹   rF   r(   Nr)   )r,   r*   r+   r   )r.   r`  s   "€r/   r0   ra  )  s\   ø€ ÷ S
ñ S
ÙðS
Ù$(©©c±3¨h­Õ$8ðS
ÙAEÁdÉ3ÑPSÈ8ÅnÕAUÐX\ÕA\ðS
á	‰c‘3ˆh�ñS
r1   c           
     óŠ  € VP                  R4      p\        V4      VR&   V P                  W!VP                  R4      VVP                  R4      R7      pV'       d   V P                  WQWcV4      # \	        YdP                  RT;'       g    RP                  4       4      4      p\        WW44      pVP                  RR	4      pVP                  R
R	4      p	\        WP                  R4      4      p
\        WqW¤4       \        V
\        4      ;'       d    V
P                  R4      R	J p\        V
4      pV'       dI   V'       gA   \        V4      pV\        J pVf   V'       d   RMRM\        YÍV'       d   \        MR4      VR&   VP                  RR	4      '       d   V'       g   \!        V4      VR&   / pVP                  RR	4      pVP                  R4      pV'       d$   VP                  R4      '       d   VR,          VR&   V'       d0   VR8X  d)   \#        VP                  R4      4      pVe   RRRV/.VR&   V'       d   RV'       d   RMR/VR&   V	'       dœ   VP                  RR	4      '       d!   VP                  R4      e   VR,          VR &   McV
'       d3   \        V
\        4      '       d   V
P                  R!R4      ;'       g    RMRpT;'       g    VR"8H  pRV'       * R!V'       d   R"MT/VR &   \%        VP                  R4      ;'       g    R4      P'                  4       P                  4       R#8X  dp   \)        W4      p\+        V4      '       dG   \-        V4      pV'       d3   VP                  R$/ 4      p/ VP                  R%/ 4      CR&V/CVR%&   VVR$&   MV'       d   VVR&&   VP                  R'4      '       d   VP/                  VR',          4       V'       d   W÷R$&   VP                  R(4      '       d   VP/                  VR(,          4       \1        YvT\3        VP                  R)4      4      ;'       g    \5        V4      R*7      # )+zÌBuild chat.completions.create() kwargs.

With ``provider_profile`` every quirk comes from the profile; the legacy flag
path below (is_kimi, is_openrouter, ...) is only reached for unregistered providers.
ri  Údata_user¼   Úprovider_name)r‹   r¼   ri  rÊ   rü   rJ   Úis_kimiFÚsupports_reasoningrŒ   r–   Nrœ   r•   Úreasoning_effortÚis_tokenhubÚis_openrouterÚprovider_preferencesrÊ   zopenrouter/pareto-codeÚopenrouter_min_coding_scorerF  zpareto-routerÚmin_coding_scoreÚpluginsrD  r§   ÚthinkingÚis_github_modelsÚgithub_reasoning_extrarm  r”   r—   r“   re   rå   rª   Úextra_body_additionsÚrequest_overridesr^   ©r^   )r8   r   ru  Ú_build_kwargs_from_profiler  r£   r  r�   r  rS   r+   r   r   r   r	   r   r   rù   r,   r‡   r«   rÃ   r´   r  r  r`   rÈ   )rd  r‹   rF   r(   r  Ú_profilerû   r]   r  r€  rŒ   Úthinking_offÚ_eÚ
_supportedÚis_k3re   rƒ  r¼   Ú_pareto_score_fÚ_effortÚoffÚraw_thinking_configrª   Úopenai_compat_extras   &&&&,                   r/   Úbuild_kwargsÚ%ChatCompletionsTransport.build_kwargs)  só  € ð —:‘:Ð0Ó1ˆä1°(Ó;ˆˆzÑØ×)Ñ)Ø¨F¯J©J°zÓ,BÐU]Ø—Z‘Z Ó0ð *ó 
ˆ	÷ Ø×2Ñ2°8ÀIÐV\Ó]Ð]ä(¨·J±J¸}ÈuÏ{È{ÐXZ×NaÑNaÓNcÓ4dÓeˆ	Ü! %°EÓBˆ
à—*‘*˜Y¨Ó.ˆØ#ŸZ™ZÐ(<¸eÓDÐÜ6°u¿j¹jÐI[Ó>\Ó]ÐÜ˜*Ð-=ÔFô "Ð"2´DÓ9×fÐfÐ>N×>RÑ>RÐS\Ó>]ÐafÐ>fˆÜÐ.Ó/ˆßŸ<ä/°Ó6ˆJØ¤/Ð1ˆEà35²:Ÿ5‘¡hÜ! "ÇuÕ2CÐRVÓWð Ð)Ñ*ð �:‰:�m U×+Ò+·LÜ-<¸RÓ-@ˆJÐ)Ñ*à%'ˆ
ØŸ
™
 ?°EÓ:ˆØ—:‘:˜jÓ)ˆß˜VŸZ™ZÐ(>×?Ò?Ø%+Ð,BÕ%CˆJ�zÑ"ç˜UÐ&>Ô>Ü+¨F¯J©JÐ7TÓ,UÓVˆOØÒ*Ø*.°ÐASÐUdÐ)eÐ(f�
˜9Ñ%ßØ&,¿L©jÈiÐ%XˆJ�zÑ"çØ�z‰zÐ,¨e×4Ò4Ø—:‘:Ð6Ó7ÒCØ.4Ð5MÕ.N�J˜{Ñ+øçTdÔisð  uEô  GK÷  jLò  jLÐ+×/Ñ/°¸(ÓC×OÐOÀxøð  RZ�à"×7Ð7 g°Ñ&7�Ø+4¸#´g¸x×SVÉÐ\cÐ*d�
˜;Ñ'äˆv�z‰z˜/Ó*×0Ð0¨bÓ1×7Ñ7Ó9×?Ñ?ÓAÀXÔMÜ"?ÀÓ"XÐÜ0°×:Ò:Ü"DÐEXÓ"Y�ß"Ø*4¯.©.¸ÀrÓ*JÐ'ð 5BÐ7J×7NÑ7NÈxÐY[Ó7\ð  5BÐ^oð  rAñ  5BÐ'¨Ñ1Ø/B�J˜|Ñ,øß$Ø0C�
Ð,Ñ-à�:‰:Ð,×-Ò-Ø×Ñ˜fÐ%;Õ<Ô=ßØ'1�|Ñ$Ø�:‰:Ð)×*Ò*Ø×Ñ˜fÐ%8Õ9Ô:ÜØ 6Ü&*¨6¯:©:Ð6QÓ+RÓ&S×&xÐ&xÔWnÐowÓWxô
ð 	
r1   c                ó†  € \        VP                  V4      T;'       g    RP                  4       4      p\        W#WEVR7      p\	        W%P                  R4      4      p\        WbWuVP                  V4      R7       VP                  R4      pVP                  ! RRVRVP                  RR4      RVP                  R4      R	VR
VP                  R
4      RVP                  R4      RVP                  R4      RVP                  R4      /Ve   RV/M/ B w  ršVP                  V
4       / pVP                  VP                  R4      VP                  R4      VVP                  R
4      VVP                  R4      VP                  R4      R7      pWÉVP                  R4      3 F  pV'       g   K  VP                  V4       K   	  VP                  R4      ;'       g    / P                  4        F9  w  rïVR8X  d*   \        V\        4      '       d   VP                  V4       K5  WöV&   K;  	  V'       d_    ^ RIHp V! VP                  R
4      4      pV'       d-   VP                  4        UUu/ uF  w  rïVR9   g   K  WïbK  	  pppV'       d   W¶R&   \#        WcV\%        \'        VRR4      4      R7      #   \          d    Rp Lqi ; iu uppi )uV   Build API kwargs from a ProviderProfile â€” every quirk comes from the profile object.rJ   )r  rŒ   )r  Úlmstudio_reasoning_optionsr€  FÚqwen_session_metadatar‹   r¼   Úollama_num_ctxrZ   r[   r„  r…  r}  )rZ   r„  r‹   r¼   rŒ   r…  r}  r‹  rŒ  re   )Úis_native_gemini_base_urlr^   r�  r=   )rª   ÚthinkingConfigÚmax_output_tokens)r  Úprepare_messagesr£   r  r�   r8   r  Úget_max_tokensÚbuild_api_kwargs_extrasr  Úbuild_extra_bodyrI  rS   r+   r¢   rŸ  rÇ   r  r`   rq   )rd  r  r‹   rû   r(   r  r]   rŒ   Ú_lm_optionsÚextra_body_from_profileÚtop_level_from_profilere   Úprofile_bodyÚpartrM  rS  rŸ  Ú_native_geminis   &&&&&&            r/   rŽ  Ú3ChatCompletionsTransport._build_kwargs_from_profile~  sÊ  € ä(¨×)AÑ)AÀ)Ó)LÈuÏ{È{ÐXZ×NaÑNaÓNcÓdˆ	Ü! %°EÈ7ÔSˆ
ä6°u¿j¹jÐI[Ó>\Ó]Ðä˜*Ð-=ÐSZ×SiÑSiÐjoÓSpÕqð —j‘jÐ!=Ó>ˆØ:A×:YÒ:Yñ ;
Ø-ð;
ØBHÇ*Á*ÐMaÐchÓBið;
à"(§*¡*Ð-DÓ"Eð;
àMRð;
ð —Z‘Z 
Ó+ð;
ð =C¿J¹JÐGWÓ<Xð;
ð —z‘z ,Ó/ð	;
ð AGÇ
Á
ÐK[Ó@\ð	;
ð
 ?JÒ>UÐ,¨kÑ:Ð[]ñ;
Ñ7Ðð 	×ÑÐ0Ô1à%'ˆ
Ø×/Ñ/Ø—z‘z ,Ó/ÀfÇjÁjÐQgÓFhÐpuØ—Z‘Z 
Ó+Ð>NØ(.¯
©
Ð3PÓ(QÐ\b×\fÑ\fÐgqÓ\rð 0ó 
ˆð
 "¸F¿J¹JÐG]Ó<^Ó_ˆDß‰tØ×!Ñ! $Ö'ñ `ð —Z‘ZÐ 3Ó4×:Ð:¸×AÑAÖC‰DˆAØ�LÔ ¤Z°´4×%8Ò%8Ø×!Ñ! !Ö$à !˜1“ñ	 D÷ ð'ÝQÙ!:¸6¿:¹:ÀjÓ;QÓ!R�÷ Ø/9×/?Ñ/?Ô/Aô  FÑ/A¡t qÀQð  KEñ  FEœd˜ašdÑ/A�
ñ  FßØ+5˜<Ñ(ÜØ 6ÄTÌ'ÐRYÐ[vÐx}ÓJ~ÓEô
ð 	
øô ô 'Ø!&’ð'üó Fs   È+J* É#J=É3J=Ê*J:Ê9J:c                ó&   <€ V ^8„  d   QhRS[ RS[/# r€   )r   r   )r.   r`  s   "€r/   r0   ra  ³  s   ø€ ÷ 0
ñ 0
©3ð 0
Ñ=Oñ 0
r1   c           
     ó(  a € VP                   ^ ,          p\        VRR4      p\        VRR4      p\        \        V\        4      '       d   \        V4      MT4      ;'       g    RpRp\        VRR4      '       d+   V 3R lVP                   4        Uu. uF
  qˆf   K  VNK  	  pp\        VR4      '       d3   VP                  '       d!   \        P                  ! VP                  4      MRp	\        VR4      p
/ pV
e   W«R&   \        VR	R4      '       d   VP                  VR	&   R F!  p\        WL4      ;pf   K  \        V4      W¼&   K#  	  \        VRR4      p\        VR4      p\        V\
        4      '       dZ   VP                  4       '       dD   WûR&   \        V\
        4      '       d   VP                  4       '       g   V'       g   TpVR9   d   Rp\        YçT\        VRR4      ;'       g    VP!                  R
4      T	T;'       g    RR7      # u upi )zÐNormalize an OpenAI ChatCompletion.

Gemini ``extra_content`` rides on ToolCall.provider_data; ``reasoning_content`` and
``reasoning_details`` stay distinct in provider_data because downstream reads them so.
r„   NÚfinish_reasonÚstopr…   c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5irÐ   )Ú_normalize_tool_call)rÑ   rZ  rd  s   & €r/   rÓ   Ú>ChatCompletionsTransport.normalize_response.<locals>.<genexpr>Â  s!   øé € Ð'_ÑP^È"¨×(AÑ(AÀ"×(EÐ(EÓP^ùs   ƒ!rl   rn  rC  Úreasoning_textrK   ÚrefusalÚcontent_filterrm  )rK   r…   r¯  rm  rl   Úprovider_data)râ   Úreasoning_opaquer´  )Nr°  )rƒ   rq   Ú_normalize_finish_reasonrS   rr   r,   r…   rì   rl   r   Úfrom_openairí   rC  rô   r‡   r   r8   )rd  r�   rp  Úchoicer=  Ú_frr¯  r…   rZ  rl   rn  r·  r$  ru   rK   rµ  s   f&,             r/   Únormalize_responseÚ+ChatCompletionsTransport.normalize_response³  sÙ  ø€ ð ×!Ñ! !Õ$ˆÜ�f˜i¨Ó.ˆÜ�f˜o¨tÓ4ˆô 1¼ZÈÌS×=QÒ=Q´°S´ÐWZÓ[×eÐeÐ_eˆàˆ
Ü�3˜ d×+Ò+Ü'_ÐPS×P^ÒP^Ô'_ÓrÑ'_ Ÿ"˜"Ñ'_ˆJÐrä5<¸XÀw×5OÒ5OÐT\×Tb×TbÐTb”×!Ò! (§.¡.Ô1Ðhlˆô 1°Ð6IÓJÐØ(*ˆØÒ(Ø1BÐ-Ñ.Ü�3Ð+¨T×2Ò2Ø14×1FÑ1FˆMÐ-Ñ.ãJˆCÜ-¨cÓ7Ð7�ÔDÜ%8¸Ó%?�Ó"ñ Kô ˜#˜y¨$Ó/ˆÜ& s¨IÓ6ˆÜ�gœs×#Ò#¨¯©¯ªØ'.˜)Ñ$ä˜w¬×,Ò,°·±·²Ï*Ø!�Ø  NÔ2Ø$4�Mä!ØÀ-ä˜c ;°Ó5×\Ð\¸×9JÑ9JÐK[Ó9\ÐdiØ'×/Ð/¨4ô	
ð 	
ùò9 ss   ÂHÂHc                ó4   <€ V ^8„  d   QhRS[ RS[R,          /# )r'   rZ  r)   N)r   r   )r.   r`  s   "€r/   r0   ra  å  s   ø€ ÷ ñ ¡sð ©x¸$­ñ r1   c                óè  € \        VRR4      p\        VRR4      pVe   Vf   R# V P                  pVf   V\        8X  d   RMTpMVP                  W34      p\        VRR4      p\	        VR4      p\	        VR4      pRVf   RM
\        V4      3RV33 UU	u/ uF  w  r‰V	f   K  W‰bK  	  p
pp	\        \        VRR4      Y5f   R	MTT
;'       g    RR
7      p\        VRR4      RJ d   RVn        V# u up	pi )zZOne SDK tool call -> ToolCall; None when it lacks a function/name (matches Relay's codec).r6   Nr7   rA   Ú	argumentsrâ   rä   rF  z{})rF  r7   rÁ  r·  Úargs_repairedFT)rq   Ú_last_wire_aliasesÚ_XAI_TOOL_SEARCH_ALIASr8   rí   rô   r   rÂ  )rd  rZ  Útc_functionr7   Ú	alias_maprÁ  rï   Úfn_sigrM  rS  r·  Úcalls   &&          r/   r²  Ú-ChatCompletionsTransport._normalize_tool_callå  s  € ä˜b *¨dÓ3ˆÜ�{ F¨DÓ1ˆØÒ $¢,Ùà×+Ñ+ˆ	ØÒØ$(Ô,BÔ$B‘=È‰Dà—=‘= Ó,ˆDÜ˜K¨°dÓ;ˆ	Ü$ R¨Ó9ˆÜ% kÐ3FÓGˆØ,;ÀUÂ]¹TÔXkÐlqÓXrÐ+sØ-@À&Ð,Iñ+Kô ]ñ +K¡$ !ØNOô ˜šñ +Kˆñ ]äÜ�r˜4 Ó&¨TÒEV¹TÐ\eØ'×/Ð/¨4ô
ˆô �; °Ó7¸4Ó?Ø!%ˆDÔØˆùó]s   ÂC.Â"C.c                ó&   <€ V ^8„  d   QhRS[ RS[/# r€   rm   )r.   r`  s   "€r/   r0   ra  þ  s   ø€ ÷ 4ñ 4©#ð 4±$ñ 4r1   c                óT   € Ve   \        VRR4      '       g   R# \        V4      '       * # )zGCheck that response has valid choices and is not a router failure shim.Nrƒ   F)rq   rˆ   )rd  r�   s   &&r/   Úvalidate_responseÚ*ChatCompletionsTransport.validate_responseþ  s'   € àÒ¤7¨8°YÀ×#EÒ#EÙÜ)¨(Ó3Ô3Ð3r1   c                óJ   <€ V ^8„  d   QhRS[ RS[S[S[3,          R,          /# )r'   r�   r)   N)r   r+   r,   rr   )r.   r`  s   "€r/   r0   ra    s,   ø€ ÷ 	dñ 	d©Cð 	d±D¹¹c¸µNÀTÕ4Iñ 	dr1   c                ó8  € \        VRR4      pVf   R# \        VRR4      pV'       d   \        VR^ 4      ;'       g    ^ M^ pV'       d   \        VR^ 4      ;'       g    ^ M^ pT;'       g    \        VR^ 4      ;'       g    ^ pV'       g	   V'       d   RVRV/# R# )zkCache stats from prompt_tokens_details (OpenRouter/OpenAI) or DeepSeek's top-level prompt_cache_hit_tokens.rl   NÚprompt_tokens_detailsÚcached_tokensÚcache_write_tokensÚprompt_cache_hit_tokensÚcreation_tokens)rq   )rd  r�   rl   rP  ÚcachedÚwrittens   &&    r/   Úextract_cache_statsÚ,ChatCompletionsTransport.extract_cache_stats  s™   € ä˜ '¨4Ó0ˆØŠ=ÙÜ˜%Ð!8¸$Ó?ˆß>E”˜ /°1Ó5×:Ð:¸øÈ1ˆßDK”'˜'Ð#7¸Ó;×@Ð@¸qøÐQRˆØ×LÐLœ7 5Ð*CÀQÓG×LÐLÈ1ˆßHN×RY� Ð):¸GÐDÐcÐ_cÐcr1   c                óJ   <€ V ^8„  d   Qh/ S[ S[S[3,          R,          ;R&   # )r'   NrÃ  )r+   r,   )r.   r`  s   "€r/   r0   ra    s   ø‡ ‚ ñ
 ™S¡#˜X�¨Õ-Ñ4ò r1   r=   rÐ   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÃ  Úpropertyre  ru  ry  r™  rŽ  r½  r²  rÌ  r×  Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__)r`  s   @r/   r^  r^    s~   ø‡ € Ù4ð 15Ðà÷"ó ð"÷Cð C÷,ð ÷S
ò S
òj3
÷j0
ð 0
÷dð ÷24ð 4÷	dð 	d÷A ƒ r1   r^  )Úregister_transportrc  )Úcall_idÚresponse_item_id>   rž   rœ   rŸ   r    )r¿   zaiplatform.googleapis.com>   r“   ÚvertexÚcopilot)NNrÐ   )r  Ú	magistralÚmixtralÚdevstralÚ	codestralÚ	ministralÚpixtralÚvoxtral)QrÞ  r-  rT   ÚreÚstringÚtypingr   Úurllib.parser   Úagent.reasoning_effortr   r   r   r   r	   r
   r   r   r   Úagent.message_metadatar   r   r   rß   r   r   r¹  Úagent.moonshot_schemar   r   Úagent.prompt_builderr   Úagent.transports.baser   Úagent.transports.typesr   r   r   rÄ  rH  rL  r¥   rC   rY   rj   r{   rv   r~   rˆ   r�   r«   r´   r¹   rÃ   rÈ   rØ   rÜ   rÖ   rÚ   rà   rç   rí   rô   rù   r  r  r  r  Úcompiler*  ÚdigitsÚascii_uppercaseÚascii_lowercaser4  r!  r"  r:  r\  r^  Úagent.transportsrã  r=   r1   r/   Ú<module>rþ     sÀ  ðñó Û Û 	Û Ý Ý !÷÷ õ ÷ OÑ Nß qß LÝ 6Ý 3ß FÑ Fð .Ð ð
 Ð2°KÐAUÐWbð ˜<¨Ð8RÐTlØ�ð€ð 1€Ú1€õ
õ"ð'3ð "ð'3ð AE÷'3ðT BÐ õõIõ
Qõ,	Põ5õpõKõuõ
ð ]Ð Ù'Ò(GÓHÐ ÷õ 8õ(Bõ"õ
õHõ÷r÷õ.ð —j’jÐ!4Ó5Ð Ø—}‘} v×'=Ñ'=Õ=À×@VÑ@VÕVÐ ðÐ õ
Kõ	ñ GPÃkØ04ñGXàRW÷GXð GXôTIdÐ0ô IdõX 0á Ð%Ð'?Ö @r1   