+
    iHàj™` ã                  óÖ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
Ht ^ RIHtHtHtHtHtHt ]P&                  ! ]4      tRtRt ! R R]P0                  4      t]
 ! R	 R
4      4       tRÖt. R×O]ORN5tRØtRtRt] ! RRRRRRRRR]RRRRR04      t!RÙt"RÚt#RÛt$RÜt%RÝt&RÞt'Rßt(Ràt)Rát*] ! 0 Râm4      t+Rãt,Rt-Rät.Rt/RRR R!R"R#]/3t0Råt1Ræt2Rçt3R'Rè/t4R(]5R)&   Rét6Rêt7Rët8Rìt9Rít:Rît;Rït<Rðt=Rñt>Ròt?] ! 0 Róm4      t@RôtARõtBRötCR÷tD]E]F]3,          tGR* R+ ltHR,R-R.R-/tIR/R0R.R-/tJ]tK]H! ]KP˜                  3R/R0/]IB tM]H! ]KPœ                  3/ ]IB tO]H! ]KP                   3R/R0/]IB tQ]H! ]KP                   3/ ]JB tR]H! ]KP¦                  3/ ]JB tT]H! ]KPª                  3/ ]JB tV]H! ]KP®                  3/ ]JB tX]H! ]KP²                  3R/R0/]IB tZ]H! ]KP¶                  3/ ]JB t\]H! ]KPº                  3/ ]JB t^]H! ]KP¾                  3/ ]JB t`]H! ]KPÂ                  R-R17      tb]H! ]KPÆ                  R-R17      td]e! ]H]KPÌ                  ]KPÎ                  ]KPÐ                  ]KPÒ                  34      w  tjtktltm]H! ]KPÜ                  4      ]H! ]KPÞ                  4      utptq]H! ]KPä                  4      ]H! ]KPæ                  4      utttu]H! ]KPì                  R0R0R27      tw]H! ]KPð                  3/ ]JB ty]H! ]KP¶                  R0R0R37      tzR4t{Røt|]Pú                  ! R54      t~]Pú                  ! R64      tRùt€Rút�R7 R8 lt‚R9 R: ltƒR; R< lt„R= R> lt…R? R@ lt†])]t3](]q3]']p33t‡]=]k3]*]j3],]b33tˆ]]M3]9]^3].]T33t‰]ˆ]9]^3].]T3]"]O3]]…33,           tŠRût‹]*]j3]&]d3]1]y3]‹]\33]‡,           tŒ]#]j3]]…3]"]O3]=]k3],]b3]<]Q3]9]^3].]T3]>]l3]?]l33
t�/ ]EEP                  Rü]H! ]KPœ                  R-RA7      4      C]EEP                  ]!]M4      C]EEP                  Rý]T4      C]EEP                  Rþ]b4      C]EEP                  ]+]j4      CRB]u/Ct�RC]5RD&   RERFRGRHRIRHRJRHRKRHRLRH/t�RFRM]k/RHRN]jRO]lRP]k/RQRR]kRS]O//t‘RT]5RU&   R%R&0t’]’R$0,          t“]”;QJ d    . RV ]3 4       F  NK  	  5M! RV ]3 4       4      t•]
 ! RW RX4      4       t–RY RZ lt—R[ R\ lt˜Rÿt™] ! ]Pœ                  ]EP4                  ]PÌ                  ]PÂ                  ]PÆ                  ]EP6                  ]EP8                  04      t�];]”;QJ d    . R] ] 4       F  NK  	  5M! R] ] 4       4      ,           tžR^ R_ ltŸR` Ra lt Rb Rc lt¡Rd Re lt¢Rf Rg lt£Rh Ri lt¤Rj Rk lt¥]—]˜] ]¥]¡]¢]£]¤3t¦Rl]5Rm&   RnRoRpRoRq^ RrRsRt^ RuRoRvR/Rw Rx llt§Ry Rz lt¨] ! R{04      t©R| R} ltªR~ R lt«R€ R� lt¬R‚ Rƒ lt­R„ R… lt®ER R† R‡ llt¯Rˆ R‰ lt°RŠ R‹ lt±RŒ R� lt²RŽ R� lt³R� R‘ lt´R’]³R“R” R•R– R—]ªR˜]«R™Rš R›Rœ R�Rž RŸ]¬R ]­R¡]­R¢R£ R¤R¥ /tµR¦]5R§&   ERt¶ERt·R¨ R© lt¸Rª R« lt¹R¬ R­ ltºR® R¯ lt»R°t¼R±t½R² R³ lt¾R´ Rµ lt¿R¶ R· ltÀR¸ R¹ ltÁRº R» ltÂR¼ R½ ltÃR¾ R¿ ltÄRÀ RÁ ltÅRÂ RÃ ltÆRÄ RÅ ltÇRÆ RÇ ltÈRÈ RÉ ltÉRÊ RË ltÊRÌ RÍ ltËRÎ RÏ ltÌRÐ RÑ ltÍRÒ RÓ ltÎRÔ RÕ ltÏR# (  a   API error classification for smart failover and recovery.

A priority-ordered pipeline maps an API exception to a ``ClassifiedError``
whose recovery hints (retry, rotate credential, fallback, compress, abort) the
retry loop in run_agent.py consults instead of re-matching strings itself.
)ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚDictÚIteratorÚOptionalÚSequenceÚprovider_stream_non_json_dataÚprovider_stream_empty_framec                  ó’   € ] tR t^"tRtRtRtRtRtRt	Rt
RtR	tR
tRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRtRt Rt!Rt"R t#R!# )"ÚFailoverReasonu8   Why an API call failed â€” determines recovery strategy.ÚauthÚauth_permanentÚbillingÚ
rate_limitÚupstream_rate_limitÚupstream_blockedÚ
overloadedÚserver_errorÚtimeoutÚssl_cert_verificationÚcontext_overflowÚpayload_too_largeÚimage_too_largeÚimage_corruptÚmodel_not_foundÚprovider_policy_blockedÚdata_policy_deniedÚcontent_policy_blockedÚmodel_entitlementÚincomplete_responseÚformat_errorÚrole_alternationÚinvalid_encrypted_contentÚ#multimodal_tool_content_unsupportedÚreasoning_mandatoryÚthinking_signatureÚlong_context_tierÚ!oauth_long_context_beta_forbiddenÚllama_cpp_grammar_patternÚunknown© N)$Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Ú__static_attributes__r-   ó    Ú;/home/ubuntu/.hermes/hermes-agent/agent/error_classifier.pyr   r   "   s¯   † ÙBØ€DØ%€NØ€GØ€JØ/ÐØ)ÐØ€JØ!€LØ€GØ3ÐØ)ÐØ+ÐØ'€OØ#€MØ'€OØ7ÐØ-ÐØ5ÐØ+ÐØ/ÐØ!€LØ)ÐØ ;ÐØ*OÐ'Ø/Ðð .ÐØ+ÐØ(KÐ%Ø ;ÐØ„Gr4   r   c                  óÞ   € ] tR t^Ft$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   R
t	R]R&   ]
! ]R7      tR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   ]R R l4       t]R R l4       tRtR# )ÚClassifiedErrorz>Structured classification of an API error with recovery hints.r   ÚreasonNúOptional[int]Ústatus_codeúOptional[str]ÚproviderÚmodelÚ ÚstrÚmessage)Údefault_factoryzdict[str, Any]Úerror_contextTÚboolÚ	retryableFÚshould_compressÚshould_rotate_credentialÚshould_fallbackc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnrC   r-   )Úformats   "r5   Ú__annotate__ÚClassifiedError.__annotate__X   s   € ÷ Sñ S˜ñ Sr4   c                	ó\   € V P                   \        P                  \        P                  09   # ©N)r8   r   r   r   ©Úselfs   &r5   Úis_authÚClassifiedError.is_authW   s"   € à�{‰{œ~×2Ñ2´N×4QÑ4QÐRÑRÐRr4   c               ó   € V ^8„  d   QhRR/# rI   r-   )rL   s   "r5   rM   rN   \   s   € ÷ Bñ B Dñ Br4   c                óJ   € \        V P                  P                  R4      4      # )zDTrue when a ``billing`` verdict rests on an ambiguous body (#82154).Úbilling_unverified)rC   rB   ÚgetrQ   s   &r5   rW   Ú"ClassifiedError.billing_unverified[   s!   € ô �D×&Ñ&×*Ñ*Ð+?Ó@ÓAÐAr4   r-   )r.   r/   r0   r1   r2   Ú__annotations__r:   r<   r=   r@   r   ÚdictrB   rD   rE   rF   rG   ÚpropertyrS   rW   r3   r-   r4   r5   r7   r7   F   s—   ‡ áHàÓØ!%€K�Ó%Ø"€HˆmÓ"Ø€Eˆ=ÓØ€GˆSÓÙ$)¸$Ô$?€M�>Ó?ð €IˆtÓØ!€O�TÓ!Ø%*Ð˜dÓ*Ø!€O�TÓ!àôSó ðSð ôBó ôBr4   r7   Ú model_not_supported_on_free_tierÚinsufficient_quotaÚbalance_depletedzhard billing limitz$personal-team-blocked:spending-limitÚ"usage_window_and_credits_exhaustedÚbilling_not_activeÚpayment_requiredÚinsufficient_creditsÚno_usable_creditsÚmember_spend_cap_exceededÚterminal_quota_exhaustedÚcredit_balance_exhaustedÚ!organization_spend_limit_exceededÚ!organization_usage_limit_exceededÚproject_spend_limit_exceededÚ#insufficient_credits_for_paid_modelz>model is not supported when using codex with a chatgpt accountzno user query foundzmust have non-empty contentzmessages must have non-emptyÚinvalid_request_bodyz%text content blocks must be non-emptyzcontent field is requiredz*messages: at least one message is requiredÚinvalid_request_errorÚunknown_parameterÚunsupported_parameterÚprompt_cache_retentionzdict[str, tuple]Ú_SERVER_INJECTED_PARAM_SENDERSc               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r8   r   Úhintsr   rK   ÚVerdictr-   )rL   s   "r5   rM   rM   Ð  s!   € ÷ 'ñ 'ˆ~ð '¨ð '°ñ 'r4   c                ó   € R V /VC# )r8   r-   )r8   rs   s   &,r5   Ú_vrv   Ð  s   € Ø�fÐ& Ð&Ð&r4   rF   TrG   rD   F©rE   )rE   rG   ©rD   rG   zreasoning is mandatoryz¢(?<![\w\-/])(?:reasoning_effort|thinking_config|thinking_budget|enable_thinking|thinkingconfig|thinkingbudget|reasoning|thinking|think)(?![\w\-/])(?!\s+models?\b)z~['"]param['"]\s*:\s*['"](?:reasoning(?:[._]effort)?|thinking(?:_config|_budget)?|enable_thinking)['"]|invalid_reasoning_effortc               ó    € V ^8„  d   QhRRRR/# ©rJ   Ú	error_msgr?   rK   rC   r-   )rL   s   "r5   rM   rM   (  s   € ÷ Fñ F¨Cð F°Dñ Fr4   c                ód  a€ T ;'       g    RP                  4       p\        P                  V4      pVf   R# V\        ^ VP	                  4       ^0,
          4      VP                  4       ^`,            o\        ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R# ! V3R l\         4       4      # )uo  Provider 400 rejecting the *value* of a reasoning wire control against the endpoint's closed
level set ("'reasoning_effort' must be one of: 'minimal', 'low', â€¦", Alibaba token-plan /
DashScope routes, code ``invalid_parameter_error``). The reasoning-field token must be present
next to the wording â€” a 400 enum complaint about some other field is not this class. The field is
understood and has to stay on the wire; only the disabled level ("none") is invalid, so the
recovery is the floor step-up in the auxiliary ladder and the disable-drop in the main loop, not
the strip rung and not an abort to the fallback chain.r>   Fc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   ©Ú.0ÚmÚnears   & €r5   Ú	<genexpr>Ú/is_reasoning_level_rejection.<locals>.<genexpr>5  s   øé € ÐEÑ"D˜Q�DŽyÓ"Dùó   ƒT)ÚlowerÚ_REASONING_FIELD_TOKENÚsearchÚmaxÚstartÚendÚanyÚ"_REASONING_LEVEL_REJECTION_MARKERS©r{   ÚmsgÚtokenr�   s   &  @r5   Úis_reasoning_level_rejectionr�   (  s…   ø€ ð �?ˆ?˜×
!Ñ
!Ó
#€CÜ"×)Ñ)¨#Ó.€EØ‚}ÙØŒs�1�e—k‘k“m bÕ(Ó)¨%¯)©)«+¸Õ*:Ð;€Dß‹3ÔEÕ"DÓE�3Œ3ÐEŠ3ÐEˆ3ÔEÕ"DÓEÓEÐEr4   c               ó    € V ^8„  d   QhRRRR/# rz   r-   )rL   s   "r5   rM   rM   8  s   € ÷ dñ d¨sð d°tñ dr4   c                óŠ  a€ T ;'       g    RP                  4       p\        P                  V4      pVf   R# V\        ^ VP	                  4       ^0,
          4      VP                  4       ^`,            o\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      ;'       g    \        V4      # )u3  Provider 400 saying the model's reasoning cannot be switched OFF ("Reasoning is mandatory for
this endpoint and cannot be disabled", the Nous Portal on gpt-6-astra) â€” or refusing the OFF
*level* because the endpoint's closed set starts at ``minimal``
(``is_reasoning_level_rejection``). The opposite of ``is_reasoning_field_rejection``: the field is
understood, the *disable* is refused, so the right reaction is to step the effort up to the
lowest level rather than drop the field (a dropped field also works, but tells the caller nothing
about the next call).r>   Fc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r~   s   & €r5   r‚   Ú2is_reasoning_required_rejection.<locals>.<genexpr>E  s   øé € Ð>Ñ"=˜Q�DŽyÓ"=ùr„   T)	r…   r†   r‡   rˆ   r‰   rŠ   r‹   Ú_REASONING_REQUIRED_MARKERSr�   r�   s   &  @r5   Úis_reasoning_required_rejectionr–   8  sŒ   ø€ ð �?ˆ?˜×
!Ñ
!Ó
#€CÜ"×)Ñ)¨#Ó.€EØ‚}ÙØŒs�1�e—k‘k“m bÕ(Ó)¨%¯)©)«+¸Õ*:Ð;€Dß‹3Ô>Õ"=Ó>�3�3Š3Ô>Õ"=Ó>Ó>×cÐcÔB^Ð_bÓBcÐcr4   c               ó    € V ^8„  d   QhRRRR/# rz   r-   )rL   s   "r5   rM   rM   H  s   € ÷ Uñ U¨Cð U°Dñ Ur4   c                ó¸  a€ T ;'       g    RP                  4       o\        P                  S4      '       d   R# \        P                  S4      pVf   R# S\	        ^ VP                  4       ^ ,
          4      VP                  4       ^ ,            pRV9   ;'       gC    \        ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R# ! V3R l\         4       4      # )uc  Provider 400 rejecting a reasoning wire control by name (``reasoning_effort``, ``reasoning``,
``thinking``/``think``): the field token plus either a generic unsupported marker ("Unrecognized
request argument supplied: reasoning_effort", #112781) or a standalone "unsupported" next to the
field in either word order ("unsupported reasoning_effort"; "reasoning_effort 'none' unsupported;
use minimal|low|medium|high|xhigh", #114460). The route default is the right answer for such a
model, so both the main loop and the auxiliary ladder retry once without the disable. A body
whose structured ``param``/code names the reasoning field (``'param': 'reasoning.effort'``,
``invalid_reasoning_effort``, #100536) is a rejection whatever the message says â€” even none.

Known trade-off: a 400 about a thinking *state* ("Function calling is not supported when
thinking is enabled") also matches â€” the marker sits right next to the token, so no proximity
rule separates it from the forward wordings. Cost is one dropped-disable retry before the
spent path takes the fallback chain; the auxiliary ladder already treated it this way.r>   TFÚunsupportedc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   )r   r€   rŽ   s   & €r5   r‚   Ú/is_reasoning_field_rejection.<locals>.<genexpr>]  s   øé € Ð'TÑ:S°Q¨S®Ó:Sùr„   )	r…   Ú_REASONING_PARAM_REJECTIONr‡   r†   rˆ   r‰   rŠ   r‹   ÚUNSUPPORTED_PARAM_MARKERS)r{   r�   r�   rŽ   s   &  @r5   Úis_reasoning_field_rejectionrž   H  s¦   ø€ ð �?ˆ?˜×
!Ñ
!Ó
#€CÜ!×(Ñ(¨×-Ò-ÙÜ"×)Ñ)¨#Ó.€EØ‚}ÙØŒs�1�e—k‘k“m bÕ(Ó)¨%¯)©)«+¸Õ*:Ð;€DØ˜DÑ ×TÐT§C£CÔ'TÕ:SÓ'T§C¤CÐT¢CÐT CÔ'TÕ:SÓ'TÓ$TÐTr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   r{   r?   rK   rt   r-   )rL   s   "r5   rM   rM   `  s   € ÷ 0ñ 0˜cð 0 gñ 0r4   c                ó¼   a € / p\         ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      '       d   RRRR/p/ \        CRV/C# )zEBilling verdict carrying the #82154 ambiguity marker when applicable.c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   ©r   Úpr{   s   & €r5   r‚   Ú!_billing_hints.<locals>.<genexpr>c  s   øé € Ð
@Ñ#?˜a�	Ž>Ó#?ùr„   TFrW   Úpossible_content_filterrB   )r‹   Ú_UNVERIFIED_BILLING_PATTERNSÚ
_V_BILLING)r{   Úctxs   f r5   Ú_billing_hintsr©   `  sL   ø€ à€Cß
ƒsÔ
@Õ#?Ó
@‡s‡s‚sÔ
@Õ#?Ó
@×@Ò@Ø# TÐ+DÀdÐKˆØ/ŒjÐ/˜/¨3Ñ/Ð/r4   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r{   r?   Úrulesz#Sequence[tuple[Sequence[str], Any]]rK   úOptional[Verdict]r-   )rL   s   "r5   rM   rM   h  s#   € ÷ ñ ˜Cð Ð(Kð ÐPañ r4   c                óÜ   a € V Fd  w  r#\         ;QJ d    V 3R lV 4       F  '       g   K   RM	  RM! V 3R lV 4       4      '       g   KG  \        V4      '       d   V! S 4      u # Tu # 	  R# )z@Verdict of the first rule whose pattern list hits ``error_msg``.c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r¢   s   & €r5   r‚   Ú_first_match.<locals>.<genexpr>k  s   øé € Ð0¡x !�IŽ~£xùr„   TFN)r‹   Úcallable)r{   r«   ÚpatternsÚverdicts   f&  r5   Ú_first_matchr³   h  sP   ø€ ã"Ñˆß‹3Ô0¡xÓ0�3�3Š3Ô0¡xÓ0×0Ô0Ü)1°'×):Ò):‘7˜9Ó%ÒGÀÒGñ #ñ r4   )rF   r%   zdict[str, Verdict]Ú_ERROR_CODE_VERDICTSúopenai-codexÚopenaiÚgoogleÚgeminizgoogle-geminizgoogle-ai-studioÚvertexzgoogle-vertexr   ÚunavailableÚdeadline_exceededÚinternalÚ	anthropicÚ	api_errorÚrate_limit_errorzdict[str, dict[str, Verdict]]Ú_PROVIDER_CODE_VERDICTSc              #  ó6   "  € T F  qR 8w  g   K  Vx € K  	  R# 5i)rm   Nr-   ©r   r£   s   & r5   r‚   r‚   ¾  s   é € Ð iÑ,H qÐQhÑLh§¢Ó,Hùs   ‚�
c                  óª   € ] tR tRt$ RtR]R&   R]R&   R]R&   R	]R
&   R	]R&   R	]R&   R]R&   R]R&   R]R&   RtR	]R&   RtR]R&   R R ltR R lt	Rt
R# )Ú_CtxiÃ  z<Everything the classifier stages need about one failed call.Ú	ExceptionÚerrorr9   r:   r[   Úbodyr?   rŽ   r<   r=   ÚintÚapprox_tokensÚcontext_lengthÚnum_messagesr>   Úbase_urlFrC   Ú	anonymousc               ó   € V ^8„  d   QhRR/# )rJ   rK   ÚNoner-   )rL   s   "r5   rM   Ú_Ctx.__annotate__Ó  s   € ÷ =ñ =˜tñ =r4   c                	óÜ  € \        V P                  4      P                  V n        \	        V P
                  4      V n        V P                  P                  4       V n        \        V P                  \        / 4      V n        V P                  ;'       g    R P                  4       P                  4       V n        V P                  ;'       g    R P                  4       P                  4       V n        R# ©r>   N)ÚtyperÆ   r.   Ú
error_typeÚ_extract_error_coderÇ   Ú
error_coder…   ÚcodeÚ_from_cause_chainÚ_headers_ofÚheadersr<   ÚstripÚprovider_slugr=   Ú
model_slugrQ   s   &r5   Ú__post_init__Ú_Ctx.__post_init__Ó  s›   € Ü˜tŸz™zÓ*×3Ñ3ˆŒÜ-¨d¯i©iÓ8ˆŒØ—O‘O×)Ñ)Ó+ˆŒ	Ü(¨¯©´[À"ÓEˆŒØ"Ÿm™m×1Ð1¨r×8Ñ8Ó:×@Ñ@ÓBˆÔØŸ:™:×+Ð+¨×2Ñ2Ó4×:Ñ:Ó<ˆŽr4   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rJ   ÚfracÚfloatÚtokensrÈ   ÚmessagesrK   rC   r-   )rL   s   "r5   rM   rÐ   Û  s(   € ÷ 
ñ 
 %ð 
°ð 
Àð 
Èñ 
r4   c                óÌ   € V P                   V P                  V,          8„  ;'       g>    V P                  R8*  ;'       d'    V P                   V8„  ;'       g    V P                  V8„  # )z;Absolute thresholds only proxy for smaller context windows.i è )rÉ   rÊ   rË   )rR   rá   rã   rä   s   &&&&r5   Úlarge_sessionÚ_Ctx.large_sessionÛ  s_   € à×!Ñ! D×$7Ñ$7¸$Õ$>Ñ>÷ 
ð 
Ø×Ñ 6Ñ)×kÐk¨t×/AÑ/AÀFÑ/J×/jÐ/jÈd×N_ÑN_ÐbjÑNjð	
r4   )r×   rÖ   rÔ   rÚ   rÝ   rÜ   N)r.   r/   r0   r1   r2   rZ   rÌ   rÍ   rÞ   ræ   r3   r-   r4   r5   rÄ   rÄ   Ã  sZ   ‡ áFàÓØÓØ
ƒJØ	ƒHØƒMØƒJØÓØÓØÓØ€HˆcÓØ€IˆtÓõ=÷
ñ 
r4   rÄ   c               ó    € V ^8„  d   QhRRRR/# ©rJ   ÚcrÄ   rK   r¬   r-   )rL   s   "r5   rM   rM   â  s   € ÷ ñ �tð Ð 1ñ r4   c                óö  €  ^ RI Hp V! V P                  V P                  V P                  V P
                  V P                  V P                  V P                  V P                  V P                  V P                  V P                  R7      pTe>   \        P!                  RTR,          P"                  T P                  T P                  4       T#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)zÏFirst valid plugin classification (runs before the built-in pipeline so a
provider plugin can add or correct verdicts). invoke_hook isolates callback
failures; this guard only covers import/dispatch failure.)Úget_plugin_error_classification)r<   r=   r:   rÔ   rÖ   Úerror_messageÚ
error_bodyrÆ   rÉ   rÊ   rË   z+Plugin error classification unavailable: %sNz@API error classified by plugin hook: %s (provider=%s, status=%s)r8   )Úhermes_cli.pluginsrì   r<   r=   r:   rÔ   rÖ   rŽ   rÇ   rÆ   rÉ   rÊ   rË   rÅ   ÚloggerÚdebugÚinfoÚvalue)rê   rì   r²   Úexcs   &   r5   Ú_plugin_verdictrõ   â  s¿   € ð	ÝFÙ1Ø—Z‘Z q§w¡w¸A¿M¹MÐVW×VbÑVbØ—|‘|°1·5±5ÀQÇVÁVÐST×SZÑSZØŸ/™/¸!×:JÑ:JÐYZ×YgÑYgô
ˆð ÒÜ�‰ÐVØ˜HÕ%×+Ñ+¨Q¯Z©Z¸¿¹ô	Hà€Nøô ô Ü�‰ÐBÀCÔHÝûðús   ‚BC ÃC8ÃC3Ã3C8c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   ö  s   € ÷ (ñ (˜ð (Ð!2ñ (r4   c           	     ól  € V P                   '       g   R#  ^ RIHp \        V! V P                   4      RR4      p\	        V4      '       g   R# V! V P
                  V P                  V P                  V P                  V P                  V P                  R7      p\        T\        4      '       g   R# TP!                  R4      p\        T\"        4      '       d)    \%        TP'                  4       P)                  4       4      p\        T\$        4      '       g   R# \,         Uu/ uF  qfT9   g   K  T\/        Y6,          4      bK  	  ppTP!                  R4      '       d   RT9  d   T\0        9  d   R	TR&   \3        T3/ TB p\        TP!                  R
4      \        4      '       d   TR
,          TR
&   \        P5                  RTP6                  T P8                  T P                  4       T#   \         d-   p\        P                  RT P                   T4        Rp?R# Rp?ii ; i  \*         d     R# i ; iu upi )a€  The current provider's own ``ProviderProfile.classify_api_error`` verdict, or None.

A ``kind: model-provider`` plugin never enters the PluginManager hook lifecycle, so without this a
vendor-specific body (a 403 ``quota_exhausted`` that is billing, not auth) could only be corrected by
shipping a second plugin component. Scoped to the provider that produced the error; no name table.N)Úget_provider_profileÚclassify_api_error)r:   rÖ   r@   rÇ   r=   z7Provider profile error classification failed for %s: %sr8   rG   rD   FrB   zEAPI error classified by provider profile: %s (provider=%s, status=%s))rÜ   Ú	providersrø   Úgetattrr°   rÆ   r:   rÖ   rŽ   rÇ   r=   rÅ   rð   rñ   Ú
isinstancer[   rX   r?   r   rÛ   r…   Ú
ValueErrorÚ_HINT_FLAGSrC   ÚRETRYABLE_CLIENT_REASONSrv   rò   ró   r<   )	rê   rø   ÚhookÚresultrô   r8   Úkrs   r²   s	   &        r5   Ú_profile_verdictr  ö  s¿  € ð �?�?ˆ?Ùð	Ý2ÜÑ+¨A¯O©OÓ<Ð>RÐTXÓYˆÜ˜�~Š~ÙÙ�a—g‘g¨1¯=©=ÀQÇ\Á\Ð[\×[`Ñ[`ØŸ6™6¨¯©ô2ˆô
 �fœd×#Ò#ÙØ�Z‰Z˜Ó!€FÜ�&œ#×Òð	Ü# F§L¡L£N×$8Ñ$8Ó$:Ó;ˆFô �fœn×-Ò-ÙÝ)4ÓD© A¸V¹ÔˆQ”�V•Y“Ò©€EÐDð
 ‡y�yÐ"×#Ò#¨¸5Ô(@ÀVÔSkÔEkØ"ˆˆkÑÜ�Ñ!˜5Ñ!€GÜ�&—*‘*˜_Ó-¬t×4Ò4Ø#)¨/Õ#:ˆ�Ñ Ü
‡K�KÐWØ—‘˜aŸj™j¨!¯-©-ô9à€Nøô3 ô Ü�‰ÐNÐPQ×P_ÑP_ÐadÔeÝûðûô ô 	Úð	üò Es<   –4G% ÁA
G% Ã'H ÄH1Ä*H1Ç%HÇ0!HÈHÈH.È-H.c              #  ó>   "  € T F  q\         9  g   K  Vx € K  	  R # 5irP   )Ú_FREE_TIER_REFUSAL_PATTERNSrÂ   s   & r5   r‚   r‚   /  s   é € ð GJÙ ˆ!Ô-HÑ$H‡A‚AÓ ùs   ‚“
c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   3  s   € ÷ 0Yñ 0Y˜$ð 0YÐ#4ñ 0Yr4   c                óÄ  a € ^ RI HpHpHpHp S P
                  pS P                  '       gR   S P                  R8X  d?   VR8X  d8   V! VS P                  4      R8X  d    \        \        P                  RRRR/R7      # R	# VR
8X  dB   V! S P                  4      '       d*   RRR^ R. RR/p\        \        P                  RRRV/R7      # VR8X  dÝ   ^ RIHp V! S P                   4      ;'       g>    V! S P"                  \%        S P                  S P                   S P"                  4      R7      pRV/pVR,          V9   d   \        \        P&                  RRVR7      # VR,          ^ 8”  d'   \(        P(                  ! 4       VR,          ,           VR&   \        \        P*                  RVR7      # \,        ;QJ d#    V 3R l\.         4       F  '       g   K   RM	  RM! V 3R l\.         4       4      '       * p	T! TS P                  V	'       d   S P                  MR	4      p
V
f   R	# RV
/pVR8X  d   \        \        P                  RRVR7      # \        \        P                  RRVR7      # )u€  The Nous inference gateway's welcome-tier (free tier) refusals, read from the structured body.

A 429 carrying a fairshare ``reason`` is either a tier gate (``model_not_free`` /
``feature_not_free``: the model or feature is never served on the free tier, so retrying is
pointless â€” abort this route and fall back) or capacity (``at_capacity`` / ``admission_closed``
/ ``rate_limited``: honour ``retry_after``, never rotate the free tier's only credential). A
400/403 whose message names the wrong host or a dark tier is deterministic for the request.
The parsed refusal rides ``error_context`` so the terminal copy can say what happened.
)ÚWELCOME_TIER_GATE_REASONSÚparse_welcome_refusalÚroute_is_welcome_hostÚwelcome_route_refusalÚnousé�  Únamed_on_welcome_hostFTÚwelcome_route)rD   rG   rB   Né’  r8   ÚrefusedÚretry_afterÚ
alternatesÚupgrade_urlr>   Úwelcome_refusalé­  )Úwelcome_refusal_from_headers)Ú	body_waitÚreset_at©rG   rB   c              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   ©rŽ   ©r   r£   rê   s   & €r5   r‚   Ú%_nous_welcome_tier.<locals>.<genexpr>\  s   øé € ÐHÑ,G q˜QŸU™Už
Ó,Gùó   ƒé“  )Úhermes_cli.anon_authr  r	  r
  r  r:   rÍ   r<   rŽ   rv   Ú_Rr#   rÌ   r   Úagent.nous_rate_guardr  rÇ   rÚ   Ú_rate_limit_reset_secondsr   Útimer   r‹   Ú_WELCOME_403_NAMED_PATTERNS)rê   r  r	  r
  r  ÚstatusÚrefusalr  r¨   Ú	plain_403Úkinds   f          r5   Ú_nous_welcome_tierr+  3  s  ø€ ÷hó hà�]‰]€FØ�;�;ˆ;ð �:‰:˜Ô F¨c¤MÑ6KÈFÐTU×TYÑTYÓ6ZÐ^uÔ6uÜ”b—o‘o°ÈØ%4Ð6MÐ$NôPð PáØ�„}Ñ.¨q¯z©z×:Ò:ð ˜Y¨°q¸,ÈÈMÐ[]Ð^ˆÜ”"×#Ñ#¨uÀdØ!2°GÐ <ô>ð 	>à�„}õ 	GÙ'¨¯©Ó/÷ Vð VÑ3OØ�I‰IÔ!:¸1¿5¹5À!Ç&Á&È!Ï)É)Ó!Tô4Vˆà  'Ð*ˆØ�8ÕÐ 9Ô9Ü”b×(Ñ(°EÈ4Ð_bÔcÐcØ�=Õ! AÔ%Ü"Ÿiši›k¨G°MÕ,BÕBˆC�
‰OÜ”"—-‘-°ÀSÔIÐI÷ “CÔHÕ,GÓH—C—C’CÔHÕ,GÓHÓHÔH€IÙ  ¨¯©¿i°·
²
ÈTÓR€DØ‚|ÙØ˜DÐ
!€CØ�„}Ü”"×#Ñ#¨uÀdÐZ]Ô^Ð^ÜŒb�o‰o¨ÀÐTWÔXÐXr4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   f  s   € ÷ 6ñ 6˜tð 6Ð(9ñ 6r4   c                ór  a€ V P                   V P                  uopV P                  R8X  d   \        \        P
                  RRR7      # \        V 4      pVe   V# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   \        # \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   \        # \        V 4      '       d   \        \        P                  3/ \        B # VR8X  d   V P                  R	8X  g   R	S9   d   \        # VR8X  di   R
S9   db   \        ;QJ d#    V3R l\          4       F  '       g   K   RM	  RM! V3R l\          4       4      '       d   \        \        P"                  4      # VR8X  d*   RS9   d#   RS9   d   \        \        P$                  RR7      # VR8X  d(   RS9   d!   RS9   d   \        \        P&                  4      # RS9   ;'       gG    RS9   ;'       g:    RS9   ;'       d    RS9   ;'       g     RS9   ;'       d    RS9   ;'       d    RS9   pVR8X  d-   V'       d%   \(        S9  d   \        \        P*                  4      # RS9   g   RS9   d   RS9   d   \,        # R# )zLHighest-priority provider-specific shapes that a status code would misroute.r   Frx   Nc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   ©r   r£   rŽ   s   & €r5   r‚   Ú*_provider_special_cases.<locals>.<genexpr>q  s   øé € Ð
>Ñ=˜�Ž8Ó=ùr„   Tc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   r0  t  ó   øé € Ð
<Ñ;˜�Ž8Ó;ùr„   r  Úthinking_signature_invalidÚthinkingc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   r0  „  s   øé € Ð2^ÑE]À¸¶8ÓE]ùr„   r  zextra usagezlong contextrw   zlong context betaznot yet availablezerror parsing grammarzjson-schema-to-grammarzunable to generate parserÚtemplatezinvalid json schemazregex lookaroundúnot supportedz'do not have an active grok subscriptionzout of available resourcesÚgrok)rŽ   r:   r×   rv   r"  r   r+  r‹   Ú _CONTENT_POLICY_BLOCKED_PATTERNSÚ_V_CONTENT_BLOCKEDÚ_ACCOUNT_POLICY_BLOCK_PATTERNSÚ_V_POLICY_BLOCKEDÚ!_is_codex_masked_replay_rejectionr%   Ú_ABORT_FALLBACKÚ_V_INVALID_ENCRYPTEDÚ_THINKING_MUTATION_WORDSr(   r)   r*   Ú_NO_USER_QUERY_SIGNALr+   Ú_V_AUTH_FALLBACK)rê   r'  ÚwelcomeÚgrammar_hitrŽ   s   &   @r5   Ú_provider_special_casesrE  f  s9  ø€ à—%‘%˜Ÿ™€K€Cˆà‡v�vÐ%Ô%Ü”"×'Ñ'°5È%ÔPÐPÜ  Ó#€GØÒØˆ÷ ƒsÔ
>Õ=Ó
>‡s‡s‚sÔ
>Õ=Ó
>×>Ò>Ü!Ð!ç
ƒsÔ
<Õ;Ó
<‡s‡s‚sÔ
<Õ;Ó
<×<Ò<Ü Ð ô )¨×+Ò+Ü”"×.Ñ.ÑB´/ÑBÐBð �„}˜!Ÿ&™&Ð$@Ô@ÐD`ÐdgÔDgÜ#Ð#ð �„}˜ sÔ*¯s«sÔ2^ÕE]Ó2^¯s¯sªsÔ2^ÕE]Ó2^×/^Ò/^Ü”"×'Ñ'Ó(Ð(à�„}˜¨#Ô-°.ÀCÔ2GÜ”"×&Ñ&¸Ô=Ð=à�„}Ð,°Ô3Ð8KÈsÔ8RÜ”"×6Ñ6Ó7Ð7ð *¨SÑ0÷ að aÐ4LÐPSÑ4S÷ að aØ# sÑ*×@Ð@¨z¸SÑ/@÷að aà
 3Ñ
&×
_Ð
_Ð+=ÀÑ+D×
_Ð
_ÈÐ\_ÑI_ð ð �„}ŸÔ)>ÀcÔ)IÜ”"×.Ñ.Ó/Ð/ð 1°CÔ7Ð<XÐ\_Ô<_ÐdjÐnqÔdqÜÐÙr4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   Ÿ  s   € ÷ lñ l˜$ð lÐ#4ñ lr4   c                ój  a € S P                   R 8X  dd   \        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      '       d   \        \        P
                  RR7      # ^ RIHp \        S P                  V4      '       d   \        \        P                  RR7      # R# )Úmoac              3  óR   <"  € T F  q\        SP                  4      9   x € K  	  R # 5irP   )r?   rÆ   )r   Úsrê   s   & €r5   r‚   Ú%_moa_special_cases.<locals>.<genexpr>¢  s   øé € Ð'[ÑCZ¸a¬S°·±«\Ö(9ÓCZùs   ƒ$'TF)rD   )ÚMoAPresetNotFoundErrorN)rÜ   r‹   Ú_MOA_ADAPTER_SHAPE_BUGSrv   r"  r#   Úagent.errorsrL  rü   rÆ   r   )rê   rL  s   f r5   Ú_moa_special_casesrO  Ÿ  sq   ø€ ð 	‡�˜%Ô§C£CÔ'[ÕCZÓ'[§C§C¢CÔ'[ÕCZÓ'[×$[Ò$[Ü”"—/‘/¨UÔ3Ð3å3Ü6@ÀÇÁÐJ`×6aÒ6aŒ2Œb× Ñ ¨EÔ2ÐkÐgkÐkr4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   ©  s   € ÷ 
ñ 
�dð 
Ð0ñ 
r4   c                óV  € V P                   \        8X  d   RV P                  9   d   \        # \        P                  V P                   4      pVfZ   \        P                  V P                  V P                  4      p\        P                  V/ 4      P                  V P                   4      pV# )z.Structured error codes from the response body.zrequest validation failed:)	r×   Ú#PROVIDER_STREAM_NON_JSON_ERROR_CODErŽ   Ú_V_FORMAT_ERRORr´   rX   Ú_PROVIDER_CODE_FAMILIESrÜ   rÀ   )rê   r²   Úfamilys   &  r5   Ú_by_error_coderV  ©  s   € ð 	‡v�vÔ4Ô4Ð9UÐYZ×Y^ÑY^Ô9^ÜÐÜ"×&Ñ& q§v¡vÓ.€GØ‚Ü(×,Ñ,¨Q¯_©_¸a¿o¹oÓNˆÜ)×-Ñ-¨f°bÓ9×=Ñ=¸a¿f¹fÓEˆØ€Nr4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   ¶  s   € ÷ cñ c�4ð cÐ-ñ cr4   c                ó@  a € \        S P                  \        4      pVe   V# \        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      pV'       d   \        S P                  \        4      # \        S P                  \        4      # )zmMessage patterns when no status code settled it; status-less usage
limits get the same disambiguation as 402.c              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   Ú_by_message.<locals>.<genexpr>¼  s   øé € Ð@Ñ*? Q˜1Ÿ5™5–jÓ*?ùr  TF)r³   rŽ   Ú_MESSAGE_HEAD_RULESr‹   Ú_USAGE_LIMIT_PATTERNSÚ_classify_402r[   Ú_MESSAGE_TAIL_RULES)rê   ÚheadÚusage_limits   f  r5   Ú_by_messagera  ¶  sg   ø€ ô ˜Ÿ™Ô2Ó3€DØÒØˆß“#Ô@Õ*?Ó@—#—#’#Ô@Õ*?Ó@Ó@€Kß)4Œ=˜Ÿ™¤Ó%Ðb¼,ÀqÇuÁuÔNaÓ:bÐbr4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   À  s   € ÷ -ñ -�Tð -Ð/ñ -r4   c                óÄ  a€ V P                   o\        S\        \        3\        \
        334      pVe   V# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       dX   V P                  '       gF   ^ RI	H
p V! V P                  4      e   \
        # V P                  RR^È4      '       d   \        # \
        # V P                  R8X  d-   R	S9   d&   R
S9   d   \        \         P"                  3/ \$        B # V P                  \&        9   ;'       g&    \)        V P*                  \,        \.        \0        34      pV'       d   \
        # R# )zNSSL, disconnect, circuit-breaker and transport-type heuristics, in that order.Nc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   Ú _by_transport.<locals>.<genexpr>É  s   øé € Ð
9Ñ8˜�Ž8Ó8ùr„   TF)Ú!get_reasoning_stale_timeout_floorg333333ã?iÀÔ ÚRuntimeErrorzconsecutive stale attemptszaborting this call)rŽ   r³   Ú_SSL_CERT_VERIFY_PATTERNSÚ_V_SSL_CERTÚ_SSL_TRANSIENT_PATTERNSÚ
_V_TIMEOUTr‹   Ú_SERVER_DISCONNECT_PATTERNSr:   Úagent.reasoning_timeoutsrf  r=   ræ   Ú_V_CONTEXT_OVERFLOWrÔ   rv   r"  r   r>  Ú_TRANSPORT_ERROR_TYPESrü   rÆ   ÚTimeoutErrorÚConnectionErrorÚOSError)rê   Ússlrf  Ú	transportrŽ   s   &   @r5   Ú_by_transportru  À  s  ø€ à
�%‰%€Cô �sÔ7¼ÐEÔH_ÔakÐGlÐmÓ
n€CØ
‚Øˆ
ç
ƒsÔ
9Õ8Ó
9‡s‡s‚sÔ
9Õ8Ó
9×9Ò9À!Ç-Ç-À-õ 	OÙ,¨Q¯W©WÓ5ÒAÜÐØ&'§o¡o°c¸6À3×&GÒ&GÔ"ÐWÌZÐWð 	‡|�|�~Ô%Ð*FÈ#Ô*MÐRfÐjmÔRmÜ”"—*‘*Ñ0¤Ñ0Ð0Ø—‘Ô 6Ñ6×wÐw¼*ÀQÇWÁWÌ|Ô]lÔnuÐNvÓ:w€Iß"Œ:Ð,¨Ð,r4   c               ó    € V ^8„  d   QhRRRR/# ré   r-   )rL   s   "r5   rM   rM   â  s   € ÷ Rñ R�$ð RÐ,ñ Rr4   c                óÊ   € V P                   pVf   R# RTu;8:  d   R8  d
   M M\        MRTu;8:  d   R8  d
   M M\        MRpV\        9   d   \        V,          ! V 4      # T# )uN   HTTP status code with message-aware refinement (unlisted 4xx/5xx â†’ generic).Nr  éô  éX  )r:   rS  Ú_V_SERVER_ERRORÚ_STATUS_HANDLERS)rê   r'  Údefaults   &  r5   Ú
_by_statusr}  â  sU   € à�]‰]€FØ‚~ÙØ!$¨Ö!4°×!4�oÈSÐTZÖM`Ð]`×M`½/Ðfj€GØ*0Ô4DÔ*DÔ˜FÖ# AÓ&ÐQÈ'ÐQr4   z-Sequence[Callable[[_Ctx], Optional[Verdict]]]Ú_STAGESr<   r>   r=   rÉ   rÊ   i@ rË   rÌ   Úapi_keyc               ó<   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRR/	# )rJ   rÆ   rÅ   r<   r?   r=   rÉ   rÈ   rÊ   rË   rÌ   r  r   rK   r7   r-   )rL   s   "r5   rM   rM   ô  sZ   € ÷ !2ñ !2Øð!2Ø#&ð!2Ø47ð!2àð!2à,/ð!2àHKð!2ð ð!2ð ð	!2ð
 ñ!2r4   c               ó  a€ ^ RI Hp \        V 4      p	V	f   \        V 4      P                  R8X  d   Rp	\        V 4      p
\        Y	T
\        W
4      YY4T\        T;'       g    R4      V! W4      R7      o\        R V3R l\         4        4       \        4      p\        W
4      pVR,          \        P                  \        P                  39   d   \!        S4      pV'       d	   V R	V R
2pRV	RVRVRV/p\#        R/ / VCVCB # )a‡  Classify an API error into a structured recovery recommendation (see ``_STAGES``).

``base_url`` (optional) is the route the call went to; the Nous welcome tier keys its
dark-tier 403 on it because that refusal carries no distinguishing message.
``api_key`` identifies an anonymous request; a host or fairshare reason alone does not.
The credential is never included in the returned context.)Úis_anonymous_requestÚRateLimitErrorr  r>   )rÍ   c              3  ó0   "  € T F  qf   K  Vx € K  	  R # 5irP   r-   )r   Úvs   & r5   r‚   Ú%classify_api_error.<locals>.<genexpr>  s   é € ÐPÑ>˜!—A’AÓ>ùs   ‚Œ
c              3  ó2   <"  € T F  q! S4      x € K  	  R # 5irP   r-   )r   Ústagerê   s   & €r5   r‚   r†    s   øé € Ð>±g¨U  a§ ³gùs   ƒr8   z (endpoint: Ú)r:   r<   r=   r@   r-   )r!  r‚  Ú_extract_status_coderÓ   r.   Ú_extract_error_bodyrÄ   Ú_build_error_msgr?   Únextr~  Ú
_V_UNKNOWNÚ_extract_messager"  r   r   Ú_off_route_hostr7   )rÆ   r<   r=   rÉ   rÊ   rË   rÌ   r  r‚  r:   rÇ   r²   r@   ÚhostÚbaserê   s   &$$$$$$$       @r5   rù   rù   ô  sþ   ø€ õ :Ü& uÓ-€KàÒœt E›{×3Ñ3Ð7GÔGØˆÜ˜uÓ%€DÜØ˜DÔ"2°5Ó"?ÀØ |´S¸¿¸ÀRÓ5HÙ& xÓ9ô	€Aô
 ÑPÔ>µgÔ>ÓPÔR\Ó]€GÜ˜uÓ+€GØˆxÕœRŸW™W¤b×&7Ñ&7Ð8Ô8ô ˜qÓ!ˆßØ ˜	 ¨d¨V°1Ð5ˆGØ˜;¨
°H¸gÀuÈiÐY`Ða€DÜÑ1Ð0 Ð0¨Ð0Ñ1Ð1r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rê   rÄ   rK   r?   r-   )rL   s   "r5   rM   rM     s   € ÷ ñ �tð  ñ r4   c                ó˜   € ^ RI Hp ^ RIHp V! V P                  4      pV'       d"   V! V P
                  V P                  4      RJ d   R# V# )zeThe contacted host when ``base_url`` is set and is not the provider's own endpoint; ``""`` otherwise.)Úprovider_owns_route)Úbase_url_hostnameTr>   )Úhermes_cli.route_identityr•  Úutilsr–  rÌ   rÜ   )rê   r•  r–  r‘  s   &   r5   r�  r�    s8   € å=Ý'Ù˜QŸZ™ZÓ(€DßÑ& q§¡¸¿
¹
ÓCÀtÓKÙØ€Kr4   Úupstream_unavailablec               ó    € V ^8„  d   QhRRRR/# ©rJ   rê   rÄ   rK   rt   r-   )rL   s   "r5   rM   rM   *  s   € ÷ ñ �4ð ˜Gñ r4   c                ó  a € S P                   \        9   d   \        # S P                  R 8H  ;'       d    S P                   \        8H  pT;'       gQ    \
        ;QJ d*    V 3R lR\        ,            4       F  '       g   K   RM	  RM! V 3R lR\        ,            4       4      pV'       d   \        # \
        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      '       d   \        # \        # )z	xai-oauthc              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   Ú_status_403.<locals>.<genexpr>/  s   øé € ÐpÑ3o¨a A§E¡EžzÓ3oùr  TFc              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   rž  5  s   øé € Ð
:Ñ9˜!�—‘Ž:Ó9ùr  )úkey limit exceededzspending limit)r×   Ú_403_TRANSIENT_CODESÚ_V_OVERLOADEDrÜ   Ú_XAI_SPENDING_LIMIT_ERROR_CODEr‹   Ú_BILLING_PATTERNSr§   Ú_UPSTREAM_BLOCKED_PATTERNSÚ_V_UPSTREAM_BLOCKEDrB  )rê   Ú	xai_spendr   s   f  r5   Ú_status_403r¨  *  s¦   ø€ Ø‡v�vÔ%Ô%ÜÐà—‘ ;Ñ.×[Ð[°1·6±6Ô=[Ñ3[€IØ×pÐpŸ3›3ÔpÐ3[Ô^oÖ3oÓpŸ3Ÿ3š3ÔpÐ3[Ô^oÖ3oÓpÓp€GßÜÐ÷ ƒsÔ
:Õ9Ó
:‡s‡s‚sÔ
:Õ9Ó
:×:Ò:Ü"Ð"ÜÐr4   c               ó    € V ^8„  d   QhRRRR/# r›  r-   )rL   s   "r5   rM   rM   :  s   € ÷ oñ o�4ð o˜Gñ or4   c                óÜ   € V P                   \        9   d   \        # \        V P                  \
        4      pVe   V# \        V P                  V P                  4      '       d   \        # \        # rP   )r×   Ú_BILLING_ERROR_CODESr§   r³   rŽ   Ú
_404_RULESÚ_model_id_missing_known_prefixrÝ   rÜ   Ú_V_MODEL_NOT_FOUNDrŽ  )rê   r²   s   & r5   Ú_status_404r¯  :  sV   € ð 	‡v�vÔ%Ô%ÜÐÜ˜1Ÿ5™5¤*Ó-€GØÒØˆô "@ÀÇÁÈaÏoÉo×!^Ò!^ÔÐnÔdnÐnr4   c               ó    € V ^8„  d   QhRRRR/# r›  r-   )rL   s   "r5   rM   rM   H  s   € ÷ ñ �4ð ˜Gñ r4   c                óš  a € S P                   \        9   d   \        # \        ;QJ d#    V 3R  l\         4       F  '       g   K   RM	  RM! V 3R  l\         4       4      '       d   \
        # \        S P                  S P                  4      '       d@   \        S P                  4      pV'       d   RV/M/ p\        \        P                  RVR7      # S P                   R8H  ;'       gg    \        ;QJ d5    V 3R lR
\        ,           \        ,            4       F  '       g   K   RM*	  RM&! V 3R lR
\        ,           \        ,            4       4      p\        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      pV'       d@   V'       g8   \!        S P"                  S P                  S P$                  4      '       g   \        # \'        S P"                  S P                  S P$                  4      pV'       d?   \        \        P(                  3/ \*        BRR	\,        P,                  ! 4       V,           //B # \.        # )c              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   Ú_status_429.<locals>.<genexpr>P  s   øé € Ð
4Ñ3˜!�—‘Ž:Ó3ùr  TFÚupstream_providerr  Úusage_limit_reachedc              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   r³  [  s   øé € ð 8Ù`�qˆQ�U‰UŽ
Ó`ùr  c              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   r³  ^  s   øé € ÐGÑ2F¨Q 1§5¡5žjÓ2Fùr  rB   r  )rµ  )r×   r«  r§   r‹   Ú_OVERLOADED_PATTERNSr¢  Ú_is_openrouter_upstream_errorrÇ   rÜ   Ú_extract_upstream_provider_namerv   r"  r   r\  r¤  Ú_RATE_LIMIT_PATTERNSÚ!_has_usage_limit_transient_signalrŽ   rÚ   r$  r   Ú_ROTATE_FALLBACKr%  Ú_V_RATE_LIMIT)rê   Úupstreamr¨   Ú
quota_wallÚexplicit_rate_limitÚresets   f     r5   Ú_status_429rÃ  H  s�  ø€ ð 	‡v�vÔ%Ô%ÜÐ÷ ƒsÔ
4Õ3Ó
4‡s‡s‚sÔ
4Õ3Ó
4×4Ò4ÜÐä$ Q§V¡V¨Q¯_©_×=Ò=Ü2°1·6±6Ó:ˆß19Ð" HÑ-¸rˆÜ”"×(Ñ(¸$ÈcÔRÐRð
 —‘Ð0Ñ0÷ ð ·C³Cô 8Ø4Ô7LÕLÔO`Ö`ó8·C·C²Cô 8Ø4Ô7LÕLÔO`Ö`ó8ó 5€J÷ ›#ÔGÕ2FÓGŸ#Ÿ#š#ÔGÕ2FÓGÓGÐß×-Ô6WÐXY×X]ÑX]Ð_`×_eÑ_eÐgh×gpÑgp×6qÒ6qÜÐä% a§e¡e¨Q¯V©V°Q·Y±YÓ?€EßÜ”"—-‘-ÑeÔ#3ÑeÀJÔPT×PYÒPYÓP[Ð^cÕPcÐCdÒeÐeÜÐr4   c               ó    € V ^8„  d   QhRRRR/# r›  r-   )rL   s   "r5   rM   rM   h  s   € ÷ Jñ J�4ð J˜Gñ Jr4   c                óv  a € \         ;QJ d#    V 3R  l\         4       F  '       g   K   RM	  RM! V 3R  l\         4       4      ;'       g    S P                  \        9   pV'       d-   \	        S P
                  S P                  4      '       g   \        # \        S P
                  \        4      ;'       g    \        # )c              3  ó@   <"  € T F  qSP                   9   x € K  	  R # 5irP   r  r  s   & €r5   r‚   Ú_status_5xx.<locals>.<genexpr>k  s   øé € ÐFÑ)E A˜!Ÿ%™%–ZÓ)Eùr  TF)r‹   Ú_REQUEST_VALIDATION_PATTERNSr×   Ú_5XX_VALIDATION_CODESÚ#_is_server_injected_param_rejectionrŽ   rÜ   rS  r³   Ú_OVERFLOW_AS_5XX_RULESrz  )rê   Ú
validations   f r5   Ú_status_5xxrÍ  h  sq   ø€ ÷ “ÔFÕ)EÓF——’ÔFÕ)EÓFÓF×iÐiÈ!Ï&É&ÔTiÑJi€JßÔ=¸a¿e¹eÀQÇ_Á_×UÒUÜÐÜ˜Ÿ™Ô5Ó6×IÐI¼/ÐIr4   c               ó    € V ^8„  d   QhRRRR/# ©rJ   rê   rÄ   rK   rC   r-   )rL   s   "r5   rM   rM   q  s   € ÷ Vñ V�dð V˜tñ Vr4   c                óà   € V P                   ;'       g    RP                  4       P                  4       R8X  d   R# ^ RIHp \        V P                  4      ;'       d    V! V P                  R4      # )z[The usage-window 402 code is Nous's: any other upstream sending it keeps main's text rules.r>   r  T)Úbase_url_host_matchesznousresearch.com)r<   rÛ   r…   r˜  rÑ  rC   rÌ   )rê   rÑ  s   & r5   Ú_is_nous_routerÒ  q  sR   € à	�
‰
×Ð�b×ÑÓ!×'Ñ'Ó)¨VÔ3ÙÝ+Ü�—
‘
Ó×UÐUÑ 5°a·j±jÐBTÓ UÐUr4   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rJ   r{   r?   Ú	result_fnzCallable[..., Any]r×   rÇ   r   rK   r-   )rL   s   "r5   rM   rM   y  s9   € ÷ Eñ E˜Sð EÐ-?ð EÀsð EÐWZð EÐfiñ Er4   c                óÌ  a € V\         8X  d2   RR/p\        V4      ;p'       d   WTR&   V! R	/ / \        CRR/CBRV/B # \        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      ;'       dC    \        ;QJ d#    V 3R l\
         4       F  '       g   K   RM	  RM! V 3R l\
         4       4      pT! R	/ V'       d	   \        B # \        B # )
at  Disambiguate 402: "usage limit, try again in 5 minutes" is a periodic quota, not billing.
The Nous usage-window code is decisive (its prose names the reset time, which must not
demote it to a transient rate limit); every other 402 keeps the text rules. A usage-window 402's
optional ``display_message`` (server-set wording) rides in ``error_context`` for the refusal line.Úusage_windowTÚdisplay_messagerG   FrB   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r¢   s   & €r5   r‚   Ú _classify_402.<locals>.<genexpr>…  s   øé € ÐBÑ,A q˜–NÓ,Aùr„   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r¢   s   & €r5   r‚   rÙ  …  s   øé € ð KÙ >˜1ˆYŽÓ >ùr„   r-   )Ú_NOUS_USAGE_WINDOW_402_CODEÚ_usage_window_display_messager§   r‹   r\  Ú_USAGE_LIMIT_TRANSIENT_SIGNALSr¾  )r{   rÔ  r×   rÇ   ÚcontextÚdisplayÚ	transients   f&&&   r5   r]  r]  y  sÇ   ø€ ð
 Ô*Ô*à#1°4Ð"8ˆÜ3°DÓ9Ð9ˆ7Ö9Ø)0Ð%Ñ&áÑ[ÐCœjÐCÐ*;¸UÑCÑ[ÐSZÒ[Ð[ß“ÔBÕ,AÓB——’ÔBÕ,AÓBÓB÷ ð ÇsÃsô KÝ >óKÇsÇsÂsô KÝ >óKó H€Iñ ÑD¯œÑDÐD¼
ÑDÐDr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r   rK   r?   r-   )rL   s   "r5   rM   rM   ‹  s   € ÷ 	ñ 	¨ð 	°ñ 	r4   c                óH  € \        V \        4      '       g   R# W P                  R4      3 Fs  p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       g   KD  VP	                  4       '       g   K\  VP	                  4       R,          u # 	  R# )zxThe server's optional wording for a usage-window 402 (top level or under ``error``), trimmed and
capped; "" when absent.r>   rÆ   r×  NºNiô  N)rü   r[   rX   r?   rÛ   )rÇ   Úholderró   s   &  r5   rÜ  rÜ  ‹  st   € ô �dœD×!Ò!ÙØŸ™ 'Ó*Ó+ˆÜ1;¸FÄD×1IÒ1I�—
‘
Ð,Ô-ÈtˆÜ�eœS×!Ô! e§k¡k§m¤mØ—;‘;“= Õ&Ò&ñ ,ñ r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   Úcontentr   rK   rC   r-   )rL   s   "r5   rM   rM   —  s   € ÷ 
ñ 
 Sð 
¨Tñ 
r4   c                ó€  € ^ RI Hp \        V \        4      '       d   T MR F™  p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   VP                  R4      MTp\        V\        4      '       g   Km  VP                  R4      '       g   K†  \        V4      V8”  g   K˜   R# 	  R# )	zÆTrue when a rejected ``content`` list carries a ``data:image/`` part the shrink pass would rewrite
(over ``conversation_compression._IMAGE_SHRINK_TARGET_BYTES``; below it a shrink retry is a no-op).)Ú_IMAGE_SHRINK_TARGET_BYTESÚ	image_urlNÚurlzdata:image/TFr-   )	Úagent.conversation_compressionrè  rü   Úlistr[   rX   r?   Ú
startswithÚlen)ræ  rè  ÚpartÚimagerê  s   &    r5   Ú_has_large_inline_imagerñ  —  sŠ   € õ Jä% g¬t×4Ò4‘¸"Ò<ˆÜ)3°D¼$×)?Ò)?�—‘˜Ô%ÀTˆÜ",¨U´D×"9Ò"9ˆe�i‰i˜Ô¸uˆÜ�cœ3×Ô C§N¡N°=×$AÔ$AÄcÈ#ÃhÐQkÖFkÚñ	 =ñ
 r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r   rK   rC   r-   )rL   s   "r5   rM   rM   ¤  s   € ÷ ñ ¨sð °tñ r4   c                óÄ  € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   TMR EF  p\        V\        4      '       d   VP                  R4      MRpVP                  R4      R8w  g'   \        V\        4      '       d   \	        V4      ^8  d   Kk  V Uu. uF  p\        V4      P                  4       NK  	  ppVR,          RR.8X  g   K¥  VRR R	R
.8X  g   K³  \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   Kï  \        VP                  R4      4      '       g   EK   R# 	  R# u upi )u¶  400 rejecting a *message* ``content`` field whose rejected value carries a large inline image.

Nebius Token Factory caps a single image at 10 MiB and reports the violation through the field that
failed to coerce â€” pydantic ``{"type": "string_type", "loc": ["body","messages",N,"content","str"],
"msg": "Input should be a valid string", "input": [...]}`` â€” naming no size vocabulary, so the
keyword multimodal *tool*-content rule (#104731) claimed it and spent its retry stripping tool images
that were never there (#112473). The same list-shaped content with a small image succeeds, so the
image bytes are the trigger. Tool-scoped locs (``messages.N.tool.content.str``) stay with #104731.
ÚdetailNÚlocrÓ   Ústring_type:NrJ   NrÇ   rä   ræ  r?   c              3  óB   "  € T F  qP                  R 4      x € K  	  R# 5i)ÚtoolN)rí  ©r   Úxs   & r5   r‚   Ú7_oversized_message_content_rejection.<locals>.<genexpr>´  s   é € ð ^
Ù*/ Q�L‰L˜× Ð «%ùs   ‚TFÚinputr-   éþÿÿÿ)	rü   r[   rX   rì  rî  r?   r…   r‹   rñ  )rÇ   Údetailsrô  rõ  rú  Úpartss   &     r5   Ú$_oversized_message_content_rejectionr   ¤  s  € ô %/¨t´T×$:Ò$:ˆd�h‰h�xÔ À€GÜ'¨´×6Ò6‘'¸BÓ>ˆÜ#-¨f´d×#;Ò#;ˆf�j‰j˜ÔÀˆØ�:‰:�fÓ Ô.´jÀÄd×6KÒ6KÌsÐSVËxÐZ[Ì|ÙÙ),Ó-© A”�Q“—‘–©ˆÐ-Ø��9˜ Ð,Ö,°°r°s°À	È5Ð?QÖ1Q×Z]ÓZ]ñ ^
Ù*/ó^
×Z]×Z]ÒZ]ñ ^
Ù*/ó^
÷ [
ô [
ä% f§j¡j°Ó&9×:Õ:Úñ ?ñ ùò .s   Â3"Ec               ó    € V ^8„  d   QhRRRR/# r›  r-   )rL   s   "r5   rM   rM   »  s   € ÷ Iñ I�Tð I˜gñ Ir4   c                ó  a€ V P                   V P                  uop\        V P                  4      '       d   \        # \        S\        4      pVe   V# \        S9   d   \        # VR8X  g9   RS9   g2   RS9   d   RS9   g$   RS9   g   RS9   g   RS9   d   RS9   g   RS9   d   \        # \        S9   g#   \        S4      '       g   \        S4      '       d   \        # \        SV P                  4      '       d   \         # \"        ;QJ d#    V3R	 l\$         4       F  '       g   K   R
M	  RM! V3R	 l\$         4       4      '       d   \&        # \"        ;QJ d#    V3R l\(         4       F  '       g   K   R
M	  RM! V3R l\(         4       4      '       d   \*        # \"        ;QJ d#    V3R l\,         4       F  '       g   K   R
M	  RM! V3R l\,         4       4      '       g   V\.        9   d   \0        # \"        ;QJ d#    V3R l\2         4       F  '       g   K   R
M	  RM! V3R l\2         4       4      '       g   VR8X  d3   \4        P7                  RV P8                  V P:                  S4       \0        # V\<        9   d   \>        # \        S\@        4      pVe   V# \C        R R \E        V P                  4       4        4       R4      p\G        V4      ^8  ;'       g    VR9   pV'       d    V PI                  RR^P4      '       d   \J        # \0        # )uV   400 Bad Request â€” image/tool shapes, request-shape rejections, overflow, or generic.r%   zencrypted content for itemzcould not be verifiedz0could not decrypt the provided encrypted_contentz2encrypted content could not be decrypted or parsedÚencrypted_contentzwas not issued to this callerz1conflicting authenticated continuation identitiesc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   Ú _classify_400.<locals>.<genexpr>æ  s   øé € Ð
;Ñ:˜�Ž8Ó:ùr„   TFc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   r  è  s   øé € Ð
8Ñ7˜�Ž8Ó7ùr„   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   r  ë  s   øé € Ð
6Ñ5˜�Ž8Ó5ùr„   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   r/  s   & €r5   r‚   r  ï  r2  r„   rl   u%  Malformed message array 400 (invalid request body) classified as format_error, NOT context overflow â€” failing fast + falling back instead of entering the compression loop. This usually means an empty-content assistant stub is in the transcript; num_messages=%s approx_tokens=%s. error=%.200sc              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irP   r-   ©r   r€   s   & r5   r‚   r     s   é € ÐnÑ h˜1Ólm—Q’QÓ hùs   ‚	�
c              3  ó„   "  € T F6  p\        T;'       g    R 4      P                  4       P                  4       x € K8  	  R# 5irÒ   ©r?   rÛ   r…   rù  s   & r5   r‚   r     s1   é € Ð hÑGgÀ!¤ Q§W W¨"£×!3Ñ!3Ó!5×!;Ñ!;×!=Ð!=ÓGgùs
   ‚A •+A r>   gš™™™™™Ù?i€8 >   r>   rÆ   )&rŽ   r×   r   rÇ   Ú_V_IMAGE_TOO_LARGEr³   Ú_IMAGE_TOOL_RULESÚ&CODEX_ACCOUNT_MODEL_ENTITLEMENT_MARKERÚ_V_MODEL_ENTITLEMENTr?  Ú_REASONING_MANDATORY_PATTERNrž   r�   Ú_V_REASONING_MANDATORYrÊ  rÜ   rz  r‹   Ú_MALFORMED_TOOL_ARGS_PATTERNSÚ_V_MALFORMED_TOOL_ARGSÚ_ROLE_ALTERNATION_PATTERNSÚ_V_ROLE_ALTERNATIONÚ_400_VALIDATION_PATTERNSÚ_400_VALIDATION_CODESrS  Ú_INVALID_MESSAGE_BODY_PATTERNSrð   ÚwarningrË   rÉ   Ú_MEMORY_CEILING_ERROR_CODESr¢  Ú_400_TAIL_RULESr�  Ú_body_message_candidatesrî  ræ   rn  )rê   r×   r²   Úbody_msgÚ
is_genericrŽ   s   &    @r5   Ú_classify_400r   »  sO  ø€ à—‘�q—v‘v€I€Cˆô ,¨A¯F©F×3Ò3Ü!Ð!Ü˜3Ô 1Ó2€GØÒØˆô .°Ô4Ü#Ð#ð Ð*Ô*Ð.IÈSÔ.PØ$¨Ô+Ð0GÈ3Ô0NØ	;¸sÔ	Bà<ÀÔCð 	˜sÔ"Ð'FÈ#Ô'Mð 	<¸sÔBä#Ð#ô 	%¨Ô+Ô/KÈC×/PÒ/PÜ+¨C×0Ò0Ü%Ð%ô +¨3°·±×@Ò@ÜÐß
ƒsÔ
;Õ:Ó
;‡s‡s‚sÔ
;Õ:Ó
;×;Ò;Ü%Ð%ß
ƒsÔ
8Õ7Ó
8‡s‡s‚sÔ
8Õ7Ó
8×8Ò8Ü"Ð"ç
ƒsÔ
6Õ5Ó
6‡s‡s‚sÔ
6Õ5Ó
6×6Ò6¸$ÔBWÔ:WÜÐ÷ ƒsÔ
<Õ;Ó
<‡s‡s‚sÔ
<Õ;Ó
<×<Ò<ÀÐH^Ô@^Ü�‰ðð ŸN™N¨A¯O©O¸Sô		
ô Ðð Ô*Ô*ÜÐÜ˜3¤Ó0€GØÒØˆô ÑnÑ hÔG_Ð`a×`fÑ`fÔGgÔ hÓnÐprÓs€HÜ�X“ Ñ#×@Ð@ x°=Ñ'@€Jß�a—o‘o c¨5°"×5Ò5Ü"Ð"ÜÐr4   c               ó    € V ^8„  d   QhRRRR/# r›  r-   )rL   s   "r5   rM   rM     s   € ÷ Eñ E ð E¨ñ Er4   c                ó”   € \        V P                  4      '       d   \        # \        V P                  \
        4      ;'       g    \        # )zT422: pydantic relays report the same content-field shapes as 400 (#104731, #112473).)r   rÇ   r  r³   rŽ   r  rS  ©rê   s   &r5   Ú_classify_image_tool_422r$    s1   € ä+¨A¯F©F×3Ò3Ü!Ð!Ü˜Ÿ™Ô0Ó1×DÐD´_ÐDr4   r  i‘  c                ó   € \         # rP   )Ú_V_AUTH_ROTATEr#  s   &r5   Ú<lambda>r'    s   € ¥~r4   r  c                ó¦   € \        V P                  \        \        V 4      '       d   V P                  V P
                  4      # R V P
                  4      # )r>   )r]  rŽ   r[   rÒ  r×   rÇ   r#  s   &r5   r'  r'    s6   € ”= §¡¬¼Àq×8IÒ8I¨a¯f©fÐST×SYÑSYÔZÈrÐST×SYÑSYÔZr4   r   i”  i˜  c                ó   € \         # rP   )rk  r#  s   &r5   r'  r'    s   € µzr4   i�  c                ó   € \         # rP   )Ú_V_PAYLOAD_TOO_LARGEr#  s   &r5   r'  r'    s   € ÕRfr4   i¦  c                ó   € \        V 4      # rP   )r$  r#  s   &r5   r'  r'    s
   € Ô+¨AÔ.r4   r  rx  iö  i÷  c                óR   € \        V P                  \        4      ;'       g    \        # rP   ©r³   rŽ   rË  r¢  r#  s   &r5   r'  r'    ó   € ”< §¡Ô'=Ó>×OÐOÄ-ÐOr4   i  c                óR   € \        V P                  \        4      ;'       g    \        # rP   r.  r#  s   &r5   r'  r'    r/  r4   z$dict[int, Callable[[_Ctx], Verdict]]r{  c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r{   r?   rÇ   r[   rK   rC   r-   )rL   s   "r5   rM   rM   #  s"   € ÷ 	ñ 	°ð 	¸Dð 	ÐW[ñ 	r4   c                ó@  a a€ \         ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      '       d   R# V\        V4      3 Uu. uF  p\        V\        4      '       g   K  VNK  	  pp\         ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# S'       dU   \        SR4      '       dC   \         ;QJ d#    V3R l\         4       F  '       g   K   R# 	  R# ! V3R l\         4       4      # R# u upi )z\Whether a usage-limit response identifies a reset window (message, body fields, or headers).c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   )r   Úpatternr{   s   & €r5   r‚   Ú4_has_usage_limit_transient_signal.<locals>.<genexpr>%  s   øé € Ð
NÑ/M G�iÖÓ/Mùr„   TFc              3  ób   "  € T F%  p\          F  q!P                  V4      R9  x € K  	  K'  	  R # 5i©N©Nr>   )Ú_RESET_FIELDSrX   )r   ÚpayloadÚfs   &  r5   r‚   r5  (  s$   é € Ð
[¹8°Ï]È�;‰;�q‹> Ö+É]Ñ+»8ùs   ‚-/rX   c              3  óL   <"  € T F  pSP                  V4      R9  x € K  	  R # 5ir7  ©rX   )r   ÚhÚresponse_headerss   & €r5   r‚   r5  +  s"   øé € ÐUÁnÀÐ#×'Ñ'¨Ó*°*Ö<Ãnùs   ƒ!$)r‹   rÝ  Ú
_error_objrü   r[   ÚhasattrÚ_RESET_HEADERS)r{   rÇ   r?  r£   Úpayloadss   f&f  r5   r¼  r¼  #  sº   ù€ ç
ƒsÔ
NÕ/MÓ
N‡s‡s‚sÔ
NÕ/MÓ
N×NÒNÙØ ¤*¨TÓ"2Ñ3ÓKÑ3�a´zÀ!ÄT×7J—�Ñ3€HÐKß
ƒsÑ
[¹8Ó
[‡s‡s‚sÑ
[¹8Ó
[×[Ò[ÙßœGÐ$4°e×<Ò<ß‹sÔUÅnÓU�sŒsÐUŠsÐUˆsÔUÅnÓUÓUÐUÙùò Ls   ÁDÁ9Dc               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r{   r?   rÇ   r[   rK   zOptional[float]r-   )rL   s   "r5   rM   rM   /  s!   € ÷ /ñ /¨ð /°Dð /Èñ /r4   c                ó²  € ^ RI HpHp R V\        V4      3 4        F¢  p\         F•  pVP                  V4      pVR9   d   K  VP                  R4      '       dP   \        V\        \        34      '       d4   \        R\        V4      \        P                  ! 4       ,
          4      u u # V! V4      ;pf   K‘  Vu u # 	  K¤  	  V! V4      ;pe   V# V! V 4      # )z·Seconds until a 429's window reopens, from the body's reset fields, ``Retry-After`` or the
message grammar (``retry after Ns`` / ``resets in 4hr``); None when the response names none.)Úparse_retry_after_secondsÚreset_delay_from_messagec              3  óV   "  € T F  p\        V\        4      '       g   K  Vx € K!  	  R # 5irP   )rü   r[   rÂ   s   & r5   r‚   Ú,_rate_limit_reset_seconds.<locals>.<genexpr>3  s   é € ÐOÑ7˜!¼:ÀaÌ×;N—A’AÓ7ùs   ‚)Ÿ
)Ú_atg        r8  )Úagent.retry_utilsrF  rG  r@  r9  rX   Úendswithrü   rÈ   râ   rˆ   r%  )	r{   rÇ   r?  rF  rG  r:  Únameró   Úsecondss	   &&&      r5   r$  r$  /  s¸   € ÷ VÙO ¤j°Ó&6Ñ7ÖOˆß!ˆDØ—K‘K Ó%ˆEØ˜
Ô"ÙØ�}‰}˜U×#Ò#¬
°5¼3Ä¸,×(GÒ(GÜ˜3¤ e£¬t¯yªy«{Õ :Ó;Ô;Ù4°UÓ;Ð;�ÔHØ”ó "ñ Pñ -Ð-=Ó>Ð>ˆÒKØˆÙ# IÓ.Ð.r4   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r=   r?   r<   rK   rC   r-   )rL   s   "r5   rM   rM   A  s!   € ÷ ñ ¨#ð ¸ð Àñ r4   c                óÞ   € T ;'       g    RP                  4       pV'       d   RV9   d   R#  ^ RIHp \        T! T;'       g    RP                  4       V4      4      #   \         d     R# i ; i)zÛTrue when a bare model id is only known to the provider as ``vendor/id``.

Never guesses: an id absent from the curated catalogue returns False so real
endpoint problems keep their retryable ``unknown`` classification.
r>   Ú/F)Úsuggest_prefixed_model_id)rÛ   Úhermes_cli.model_normalizerR  rC   rÅ   )r=   r<   rM  rR  s   &&  r5   r­  r­  A  s`   € ð �KˆK�R×ÑÓ €Dß�3˜$”;ÙðÝHÜÑ-¨x¯~¨~¸2×.DÑ.DÓ.FÈÓMÓNÐNøÜô Úðús   ­A ÁA ÁA,Á+A,c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   r{   r?   r<   rK   rC   r-   )rL   s   "r5   rM   rM   Q  s!   € ÷ 
ñ 
°3ð 
À#ð 
È$ñ 
r4   c                óÌ  a a€ T;'       g    RP                  4       P                  4       o\        P                  4        F¡  w  r#S '       g   K  VS 9   g   K  \        ;QJ d#    V 3R l\
         4       F  '       g   K   RM	  RM! V 3R l\
         4       4      '       g   Kb  \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       * u # 	  R# )zåTrue when a 400 blames a one-route-only parameter this route never sends.

Conservative: known parameters only, and only when ``provider`` is not a
sender, so a genuine bad parameter (``max_tokens`` on GPT-5) stays format_error.
r>   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   )r   Úwr{   s   & €r5   r‚   Ú6_is_server_injected_param_rejection.<locals>.<genexpr>Y  s   øé € Ð3cÑLbÀq¸¶NÓLbùr„   TFc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5irP   r-   )r   ÚsenderrÜ   s   & €r5   r‚   rX  Z  s   øé € ÐIÁ°v ]Ö2Ãùr„   )rÛ   r…   rq   Úitemsr‹   Ú_PARAM_REJECTION_WORDS)r{   r<   ÚparamÚsendersrÜ   s   f&  @r5   rÊ  rÊ  Q  s�   ù€ ð —^�^ ×*Ñ*Ó,×2Ñ2Ó4€MÜ8×>Ñ>Ö@‰ˆß‰9˜ )Ö+·³Ô3cÕLbÓ3c··²Ô3cÕLbÓ3c×0cÔ0cß“sÔIÁÓI—s—s’sÔIÁÓIÓIÔIÒIñ Añ r4   zrequest blocked.zunsupported content typec               ó    € V ^8„  d   QhRRRR/# rÏ  r-   )rL   s   "r5   rM   rM   b  s   € ÷ ñ ¨ð °$ñ r4   c                óh  € V P                   R8w  g   V P                  R	9  d   R# \        V P                  \        4      '       d   V P                  M/ p\        VP                  R4      ;'       g    R4      P                  4       P                  4       \        8X  g/   V'       g)   \        V P                  9   d   RV P                  9   d   R# \        R \        V4       4       R4      pV P                  R8H  ;'       d    V\        8H  ;'       g%    V P                  P                  4       R\         28H  # )
u¡  HTTP 400 / status-less ``{code: invalid_prompt, message: "Request blocked."}`` from
``openai-codex`` â€” as an SDK error body, a Responses ``error`` SSE frame, or the
``response.failed`` text ``"invalid_prompt: Request blocked."`` â€” or the bare
``{"detail": "Unsupported content type"}`` envelope the same backend returns for a rejected
encrypted-reasoning replay (#51512). Both are exact envelopes, provider-gated.rµ   Frô  r>   Tc              3  ó‚   "  € T F5  q'       g   K  \        V4      P                  4       P                  4       x € K7  	  R # 5irP   r  r
  s   & r5   r‚   Ú4_is_codex_masked_replay_rejection.<locals>.<genexpr>p  s.   é € ÐYÑ5S°ÓWXÔ+”S˜“V—\‘\“^×)Ñ)×+Ð+Ó5Sùs   ‚	?�/?Úinvalid_promptzinvalid_prompt: )Nr  )rÜ   r:   rü   rÇ   r[   r?   rX   rÛ   r…   Ú!_CODEX_UNSUPPORTED_CONTENT_DETAILrŽ   r�  r  r×   Ú_CODEX_MASKED_REPLAY_MESSAGE)rê   rÇ   r  s   &  r5   r=  r=  b  sé   € ð 	‡�˜.Ô(¨A¯M©MÀÔ,LÙÜ §¡¬×-Ò-ˆ1�6Š6°2€DÜ
ˆ4�8‰8�HÓ×#Ð# Ó$×*Ñ*Ó,×2Ñ2Ó4Ô8YÔYßÔ6¸!¿%¹%Ô?ÀHÐPQ×PUÑPUÔDUáäÑYÔ5MÈdÔ5SÓYÐ[]Ó^€HØ�F‰FÐ&Ñ&×SÐS¨8Ô7SÑ+S÷ ð Ø	�‰�‰‹Ð+Ô,HÐ+IÐJÑJðr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r   rK   r[   r-   )rL   s   "r5   rM   rM   v  s   € ÷ 0ñ 0�Sð 0˜Tñ 0r4   c                óˆ   € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d   V# / # )z1``body["error"]`` when it is a dict, else ``{}``.rÆ   N)rü   r[   rX   )rÇ   Úerrs   & r5   r@  r@  v  s5   € ä)¨$´×5Ò5ˆ$�(‰(�7Ô
¸4€CÜ˜S¤$×'Ò'ˆ3Ð/¨RÐ/r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   Útextr   rK   úOptional[dict]r-   )rL   s   "r5   rM   rM   |  s   € ÷ 6ñ 6�Sð 6˜^ñ 6r4   c                ó  € \        V \        4      '       d   V P                  4       '       g   R#  \        P                  ! V 4      p\        T\        4      '       d   T# R#   \        P
                  \        3 d     R# i ; i)zVParse a JSON object string; None for non-strings, blanks, invalid JSON or non-objects.N)rü   r?   rÛ   ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorr[   )rj  Úinners   & r5   Ú
_json_dictrr  |  sg   € ä�tœS×!Ò! d§j¡j§l¢lÙðÜ—
’
˜4Ó ˆô ˜u¤d×+Ò+ˆ5Ð5°Ð5øô × Ñ ¤)Ð,ô Úðús   °A  Á A?Á>A?c               ó    € V ^8„  d   QhRRRR/# )rJ   Úerr_objr[   rK   r?   r-   )rL   s   "r5   rM   rM   ‡  s   € ÷ Pñ P¨ð P°#ñ Pr4   c                ó  € V P                  R/ 4      p\        V\        4      '       d   \        VP                  R4      4      MRpV'       d<   \	        \        V4      P                  R4      ;'       g    R4      P                  4       # R# )zOLowercased inner message from OpenRouter's ``error.metadata.raw`` JSON wrapper.ÚmetadataÚrawNr@   r>   )rX   rü   r[   rr  r?   r@  r…   )rt  rv  rq  s   &  r5   Ú_openrouter_wrapped_messagerx  ‡  sf   € à�{‰{˜: rÓ*€HÜ/9¸(ÄD×/IÒ/IŒJ�x—|‘| EÓ*Ô+Èt€EßBGŒ3Œz˜%Ó ×$Ñ$ YÓ/×5Ð5°2Ó6×<Ñ<Ó>ÐOÈRÐOr4   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   rÆ   rÅ   rÇ   r   rK   r?   r-   )rL   s   "r5   rM   rM   Ž  s!   € ÷ ñ ˜Ið ¨Sð °Sñ r4   c                ó.  € \        V 4      P                  4       pR;r4\        V\        4      '       d�   \	        V4      p\        VP                  R4      ;'       g    R4      P                  4       ;'       g3    \        VP                  R4      ;'       g    R4      P                  4       pV'       d   \        V4      MRpV.pV'       d   W29  d   VP                  V4       V'       d   WB9  d   WC9  d   VP                  V4       RP                  V4      # )z“Lowercased str(error) + body message + OpenRouter-wrapped upstream message
(OpenAI SDK's APIStatusError.__str__ omits the body, so it is appended).r>   r@   Ú )	r?   r…   rü   r[   r@  rX   rx  ÚappendÚjoin)rÆ   rÇ   Úraw_msgr  Úmetadata_msgrt  rÿ  s   &&     r5   rŒ  rŒ  Ž  sÒ   € ô �%‹j×ÑÓ €GØ Ð €HÜ�$œ×ÒÜ˜TÓ"ˆÜ�w—{‘{ 9Ó-×3Ð3°Ó4×:Ñ:Ó<×fÐfÄÀDÇHÁHÈYÓDW×D]ÐD]Ð[]Ó@^×@dÑ@dÓ@fˆß?FÔ2°7Ô;ÈBˆØˆI€Eß�HÔ+Ø�‰�XÔß˜Ô3¸Ô8TØ�‰�\Ô"Ø�8‰8�E‹?Ðr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r[   rK   zIterator[Any]r-   )rL   s   "r5   rM   rM   Ÿ  s   € ÷ mñ m 4ð m¨Mñ mr4   c              #  ó²  "  € \        V 4      P                  R4      x € V P                  R4      x € V P                  R4      x € V P                  R4      p\        V\        4      '       d   VP                  R4      MRx € V P                  R4      p\        V\        4      '       d   VP                  R4      M\        V\        4      '       d   TMRx € R# 5i)z\Body message fields in priority order (OpenAI, flat, litellm/Bedrock proxy, FastAPI shapes).r@   ÚerrorMessageÚ	errorArgsr8   Nrô  )r@  rX   rü   r[   r?   )rÇ   Úargsrô  s   &  r5   r  r  Ÿ  s¢   é € ä
�TÓ
×
Ñ
˜yÓ
)Ò)Ø
�(‰(�9Ó
ÒØ
�(‰(�>Ó
"Ò"Ø�8‰8�KÓ €DÜ *¨4´× 6Ò 6ˆ$�(‰(�8Ô
¸DÒ@ð
 �X‰X�hÓ€FÜ#-¨f´d×#;Ò#;ˆ&�*‰*�YÔ
Ì:ÐV\Ô^a×KbÒKbÁÐhlÔlùs   ‚CCc               ó(   € V ^8„  d   QhRRRRRRRR/# )rJ   rÆ   rÅ   ÚpickzCallable[[Any], Any]r|  r   rK   r-   )rL   s   "r5   rM   rM   ®  s*   € ÷ ñ ˜Yð Ð.Bð ÈSð ÐUXñ r4   c                ó®   € T p\        ^4       FC  pV! V4      pVe   Vu # \        VRR4      ;'       g    \        VRR4      pVe   WcJ d    V# TpKE  	  V# )z]First non-None ``pick(exc)`` over the error and its __cause__/__context__ chain (max 5 deep).NÚ	__cause__Ú__context__)Úrangerû   )rÆ   r†  r|  ÚcurrentÚ_ÚfoundÚcauses   &&&    r5   rØ   rØ   ®  si   € à€GÜ�1ŽXˆÙ�W“ˆØÒØŠLÜ˜ ¨dÓ3×\Ð\´w¸wÈÐW[Ó7\ˆØŠ=˜EÓ,Øà€Nð Šñ ð €Nr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rô   r   rK   r9   r-   )rL   s   "r5   rM   rM   ¼  s   € ÷ Iñ I�Cð I˜Mñ Ir4   c                óº   € \        V R R4      p\        V\        4      '       d   V# \        V RR4      p\        V\        4      '       d   ^dTu;8:  d	   R8  d   V#  R# )r:   Nr'  ry  )rû   rü   rÈ   )rô   r×   s   & r5   Ú
_status_ofr‘  ¼  sV   € Ü�3˜ tÓ,€DÜ�$œ×ÒØˆÜ�3˜ $Ó'€DÜ˜d¤C×(Ò(¨S°DÖ->¸3Ô->ˆ4ÐHÐ->ÀDÐHr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rô   r   rK   rk  r-   )rL   s   "r5   rM   rM   Ä  s   € ÷ 	>ñ 	>�#ð 	>˜.ñ 	>r4   c                óì   € \        V R R4      p\        V\        4      '       d   V# \        V RR4      p Ve   VP                  4       MRp\        T\        4      '       d   T# R#   \         d     R# i ; i)rÇ   NÚresponse)rû   rü   r[   rm  rÅ   )rô   rÇ   r”  Ú	json_bodys   &   r5   Ú_body_ofr–  Ä  st   € Ü�3˜ Ó%€DÜ�$œ×ÒØˆÜ�s˜J¨Ó-€HðØ'/Ò';�H—M‘M”OÀˆ	ô # 9¬d×3Ò3ˆ9Ð=¸Ð=øô ô Úðús   ´A$ Á$A3Á2A3c               ó    € V ^8„  d   QhRRRR/# )rJ   rô   r   rK   r-   )rL   s   "r5   rM   rM   Ð  s   € ÷ Dñ D�Sð D˜Sñ Dr4   c                ón   € \        \        V R R4      RR4      pV'       d   \        VR4      '       d   V# R# )r”  NrÚ   rX   )rû   rA  )rô   rÚ   s   & r5   rÙ   rÙ   Ð  s2   € Ü”g˜c :¨tÓ4°iÀÓF€Gß¤'¨'°5×"9Ò"9ˆ7ÐC¸tÐCr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r   rK   r9   r-   )rL   s   "r5   rM   rM   Õ  s   € ÷ ñ  ð ¨ñ r4   c                óæ   € \        V \        4      '       g   R# \        V 4      pR Uu. uF  q!P                  V4      NK  	  upV P                  R4      .,           p\	        R V 4       R4      # u upi )uä  Numeric HTTP error status (400-599) from ``error.code``/``code`` in a structured body.
An aggregator/relay can deliver the upstream failure only this way â€” as an
error object inside an HTTP-200 SSE stream â€” leaving the SDK to raise a
status-less ``APIError`` whose ``body`` carries the status (#121270). String
codes stay symbolic (``_code_from_payload``'s ``"400" is not a code``), unlike the
string-parsing text-SSE sibling ``chat_completion_helpers._status_code_from_payload``.Nr×   c              3  ó°   "  € T FL  p\        V\        4      '       g   K  \        V\        4      '       d   K3  R Tu;8:  d
   R8  g   KD  M KH  Vx € KN  	  R# 5i)r  ry  N)rü   rÈ   rC   )r   rê   s   & r5   r‚   Ú)_status_code_from_body.<locals>.<genexpr>á  s:   é € Ðd‘Jˆq¤*¨Q´×"4Œ¼ZÈÌ4×=PŒÐUXÐ\]ÖUcÐ`cÑUcŒÑUc�“Jùs   ‚AŸA·AÁAÁ
A)r:   r'  Úhttp_statusr×   )rü   r[   r@  rX   r�  )rÇ   Ú	error_objr  Ú
candidatess   &   r5   Ú_status_code_from_bodyr   Õ  sn   € ô �dœD×!Ò!ÙÜ˜4Ó €IÙ,\Ó]Ñ,\ q—-‘- Ö"Ñ,\Ñ]Ðae×aiÑaiÐjpÓaqÐ`rÕr€JÜÙd‘JÓdØóð ùò ^s   ¨A.c               ó    € V ^8„  d   QhRRRR/# )rJ   rÆ   rÅ   rK   r9   r-   )rL   s   "r5   rM   rM   æ  s   € ÷ ñ  	ð ¨mñ r4   c                ód   € \        V \        R4      pVf   \        \        V \        / 4      4      pV# )z‘HTTP status code from the error or its cause chain; a body-carried numeric
``code`` counts when the exception itself carries no status (#121270).N)rØ   r‘  r   r–  )rÆ   r'  s   & r5   rŠ  rŠ  æ  s0   € ô ˜u¤j°$Ó7€FØ‚~Ü'Ô(9¸%ÄÈ2Ó(NÓOˆØ€Mr4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÆ   rÅ   rK   r[   r-   )rL   s   "r5   rM   rM   ï  s   € ÷ 2ñ 2˜yð 2¨Tñ 2r4   c                ó$   € \        V \        / 4      # )z?Structured error body from an SDK exception or its cause chain.)rØ   r–  )rÆ   s   &r5   r‹  r‹  ï  s   € ä˜U¤H¨bÓ1Ð1r4   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rJ   r:  r   Útop_keyszSequence[str]Úpeek_messagerC   rK   r?   r-   )rL   s   "r5   rM   rM   ô  s)   € ÷ 2ñ 2 ð 2¨}ð 2ÈDð 2ÐUXñ 2r4   c                óš  a € \        S \        4      '       g   R# S P                  R/ 4      p\        V\        4      '       Ed+   VP                  R4      ;'       g    VP                  R4      ;'       g    Rp\        V\        4      '       g   VP                  R4      ;'       g    Tp\        V\        4      '       d<   VP	                  4       '       d&   VP	                  4       R8w  d   VP	                  4       # VP                  R4      pV'       d\   \        V\        4      '       dF   VP	                  4       P                  R4      '       d!   \        \        V4      RR	4      pV'       d   V# \        V 3R
 lV 4       R4      p\        V\        \        34      '       d   \        V4      P	                  4       MRpV'       d
   VR8w  d   V# R# )aa  Code/type from ``payload.error`` or a top-level key; ``"400"`` is not a code.
``peek_message`` also parses a JSON ``error.message`` for a nested code
(Responses API surfaces ``invalid_encrypted_content`` this way). Gemini
puts the HTTP status in ``error.code`` and the symbolic code
(``UNAVAILABLE``) in ``error.status``, so a numeric code defers to it.r>   rÆ   r×   rÓ   r'  Ú400r@   Ú{Fc              3  óx   <"  € T F/  pSP                  V4      '       g   K  SP                  V4      x € K1  	  R # 5irP   r=  )r   r  r:  s   & €r5   r‚   Ú%_code_from_payload.<locals>.<genexpr>  s'   øé € ÐD© A°W·[±[À·^”�—‘˜Q—�«ùs   ƒ:¡:)r×   rÖ   )
rü   r[   rX   r?   rÛ   rí  Ú_code_from_payloadrr  r�  rÈ   )r:  r¦  r§  rž  r×   r@   Únested_coderj  s   f&&     r5   r­  r­  ô  sE  ø€ ô �gœt×$Ò$ÙØ—‘˜G RÓ(€IÜ�)œT×"Ó"Ø�}‰}˜VÓ$×CÐC¨	¯©°fÓ(=×CÐCÀˆÜ˜$¤×$Ò$Ø—=‘= Ó*×2Ð2¨dˆDÜ�dœC× Ò  T§Z¡Z§\¢\°d·j±j³lÀeÔ6KØ—:‘:“<ÐØ—-‘- 	Ó*ˆßœJ w´×4Ò4¸¿¹»×9SÑ9SÐTW×9XÒ9XÜ,¬Z¸Ó-@ÐBXÐZ_Ó`ˆKßØ"Ð"ÜÔD©ÓDÀbÓI€DÜ *¨4´#´s°× <Ò <Œ3ˆt‹9�?‰?ÔÀ"€Dß˜D EœMˆ4Ð1¨rÐ1r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r[   rK   r?   r-   )rL   s   "r5   rM   rM     s   € ÷ _ñ _˜dð _ sñ _r4   c                ó0   € V '       d   \        V RR4      # R# )z4Extract an error code string from the response body.Tr>   )r×   rÖ   Ú	errorCode)r­  )rÇ   s   &r5   rÕ   rÕ     s   € çRVÔ˜dÐ$GÈÓNÐ^Ð\^Ð^r4   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   rÆ   rÅ   rÇ   r[   rK   r?   r-   )rL   s   "r5   rM   rM     s!   € ÷ 6ñ 6˜Ið 6¨Tð 6°cñ 6r4   c                ó°   € \        R \        T;'       g    / 4       4       R4      pV'       d   VP                  4       R,          # \        V 4      R,          # )zCExtract the most informative error message (structured body first).c              3  ó†   "  € T F7  p\        V\        4      '       g   K  VP                  4       '       g   K3  Vx € K9  	  R # 5irP   )rü   r?   rÛ   r
  s   & r5   r‚   Ú#_extract_message.<locals>.<genexpr>  s,   é € ÐdÑ?�aÄ:ÈaÔQT×CU”ÐZ[×ZaÑZa×Zc—’Ó?ùs   ‚AŸA·
ANrã  )r�  r  rÛ   r?   )rÆ   rÇ   rŽ   s   && r5   r�  r�    sB   € ä
ÑdÔ3°D·J°J¸BÔ?ÓdÐfjÓ
k€CßˆC�I‰I‹K°Õ5Ð5¤C¨£J°Õ5Ð5r4   c               ó$   € V ^8„  d   QhRRRRRR/# )rJ   rÇ   r   r<   r?   rK   rC   r-   )rL   s   "r5   rM   rM     s&   € ÷ 
]ñ 
]¨ð 
]°sð 
]¸tñ 
]r4   c                óz  € \        V 4      p\        VP                  R4      ;'       g    R4      P                  4       P	                  4       R8w  d   R# T;'       g    RP                  4       P	                  4       R8X  d   R# VP                  R4      p\        V\        4      ;'       d    RV9   ;'       g    R	V9   # )
z†OpenRouter's "Provider returned error" wrapper: the key is healthy, the
upstream failed, so credential rotation is the wrong recovery.r@   r>   zprovider returned errorFÚ
openrouterTrv  rw  Úprovider_name)r@  r?   rX   rÛ   r…   rü   r[   )rÇ   r<   rh  rv  s   &&  r5   r¹  r¹    s›   € ô �TÓ
€CÜ
ˆ3�7‰7�9Ó×#Ð# Ó$×*Ñ*Ó,×2Ñ2Ó4Ð8QÔQÙØ�ˆ�B×ÑÓ×%Ñ%Ó'¨<Ô7Ùà�w‰w�zÓ"€HÜ�h¤Ó%×\Ð\¨5°HÑ+<×+[Ð+[ÀÐS[Ñ@[Ð\r4   c               ó    € V ^8„  d   QhRRRR/# )rJ   rÇ   r   rK   r;   r-   )rL   s   "r5   rM   rM   %  s   € ÷ Lñ L¨#ð L°-ñ Lr4   c                ó  € \        V 4      P                  R4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d'   VP                  4       '       d   VP                  4       # R# )zCPull the upstream provider name out of OpenRouter's error metadata.rv  r¹  N)r@  rX   rü   r[   r?   rÛ   )rÇ   rv  rM  s   &  r5   rº  rº  %  sZ   € ä˜$Ó×#Ñ# JÓ/€HÜ,6°xÄ×,FÒ,Fˆ8�<‰<˜Ô(ÈD€DÜ% d¬C×0Ò0°T·Z±Z·\²\ˆ4�:‰:‹<ÐKÀtÐKr4   )r]   znot available on the free tier)zinsufficient creditsr^   zinsufficient balancezcredit balancezcredits exhaustedzcredits have been exhaustedzrequires available creditszaccount balance is too lowzno usable creditsztop up your creditszpayment requiredzbilling hard limitzexceeded your current quotazaccount is deactivatedzplan does not includeúout of extra usagezout of fundszrun out of fundsr_   zbudget limit exceeded)r¼  )z
rate limitr   ztoo many requestsÚ	throttledzrequests per minuteztokens per minutezrequests per dayztry again inzplease retry afterzresource exhaustedÚresource_exhaustedzresource-exhaustedÚresourceexhaustedzrate increased too quicklyÚthrottlingexceptionztoo many concurrent requestsÚservicequotaexceededexceptionÚ
throttling)r   ztemporarily overloadedz!service is temporarily overloadedz%service may be temporarily overloadedzserver is overloadedzserver overloadedzserver overloadÚserver_overloadzservice overloadedzservice is overloadedzupstream overloadedzcurrently overloadedzQupstream model provider is temporarily unavailable. please try again in a moment.zat capacityzover capacity)zusage limitÚquotazlimit exceededr   )z	try againÚretryz	resets atzreset inz	resets inzreset afterzavailable inÚwaitzrequests remainingÚperiodicÚwindowz
per minutez
per second)zrequest entity too largezpayload too largezerror code: 413Úrequest_too_largez request exceeds the maximum size)zimage exceedszimage too larger   zimage size exceedszimage dimensions exceedz"dimensions exceed max allowed sizezmax allowed size: 8000zmedia exceedszmedia too largezpatches after processingzmake sure your payload is belowz(streamreadconstraints.getmaxstringlength)zinvalid png imagezinvalid jpeg imagez1base64 string of provided image cannot be decodedzIdownloaded response does not contain a valid jpg, png, webp, or ico image)
ztext is not setz%tool message content must be a stringztool content must be a stringztool message must be a stringzexpected string, got listzexpected string, got arrayz tool_call.content must be stringztool.content.strzinput should be a valid stringÚ'chatcompletionrequesttoolmessagecontent)zmemory guardzmemory limit exceededÚmemory_guard_tierzdynamic ceilingzmemory ceilingzavailable memoryzout of memoryzinsufficient memoryzprefill would requirezpredicted peak wouldzprefill safety capÚ	metal_cap>   Úprefill_memory_abortedÚprefill_memory_exceededÚomlx_prefill_memory_exceeded)zcontext lengthzcontext sizezmaximum contextztoken limitztoo many tokenszreduce the lengthzexceeds the limitzcontext windowzprompt is too longzprompt exceeds max lengthÚ
max_tokenszmaximum number of tokenszexceeds the max_model_lenÚmax_model_lenzprompt lengthúinput is too longzmaximum model lengthzcontext length exceededztruncating inputzslot contextÚ
n_ctx_slotu   è¶…è¿‡æœ€å¤§é•¿åº¦u   ä¸Šä¸‹æ–‡é•¿åº¦z.tokens in request more than max tokens allowedrÒ  zmax input tokenzinput tokenz*exceeds the maximum number of input tokenszmaximum allowed input length)
zis not a valid modelzinvalid modelzmodel not foundr   zdoes not existzno such modelzunknown modelzunsupported modelz(no endpoints found that support tool usezis no longer free)	zroles must alternatezrole must alternatezmust alternate betweenzconsecutive user messagesz'consecutive messages with the same rolez%consecutive messages of the same rolezsame role in a rowzmultiple user messages in a rowz$adjacent messages with the same role)	zinvalid tool call argumentszinvalid tool_call argumentszinvalid tool_calls argumentszinvalid function call argumentszinvalid function_call argumentsztool call arguments are invalidztool_call arguments are invalidz#function call arguments are invalidz#function_call arguments are invalid)úunknown parameterúunsupported parameterúunrecognized request argumentrm   rn   ro   )ÚmetaÚmuseÚmslz	model-apiÚbedrockÚmantle)r7  r™   r,   Úunrecognized)Ú	signaturezcannot be modifiedzmust remain as they were)z.'types.SimpleNamespace' object is not iterablez7'types.SimpleNamespace' object has no attribute 'index')z.no endpoints available matching your guardrailz0no endpoints available matching your data policyz,no endpoints found matching your data policy)z'blocked for a previous policy violation)z'flagged for possible cybersecurity riskztrusted access for cyberzviolates our usage policiesz violates openai's usage policieszyour request was flagged byz prompt was flagged by our safetyz+responses cannot be generated due to safetyÚcontent_filterÚresponsibleaipolicyviolationÚnew_sensitivezcontent exists riskz&data may contain inappropriate contentÚdata_inspection_failed)zinvalid api keyÚinvalid_api_keyÚgateway_auth_failedÚauthenticationÚunauthorizedÚ	forbiddenzinvalid tokenztoken expiredztoken revokedzaccess deniedz&failed to extract accountid from token)zreturned an empty responsezempty response despite retriesz#provider returned an empty responsezmodel returning empty responseszempty response stream)z	timed outzturn timed outzrequest timed outzdeadline exceededzoperation timed outzupstream timed out)zconnection refusedÚeconnrefusedzno route to hostznetwork is unreachableznetwork unreachablezname or service not knownz$temporary failure in name resolutionznodename nor servname providedzgetaddrinfo failedzgetaddrinfo enotfoundÚ	eai_againzfetch failedzfailed to fetchzupstream connect error>   ÚSSLErrorÚ	ReadErrorÚPoolTimeoutÚReadTimeoutÚSSLEOFErrorÚConnectErrorrp  ÚConnectTimeoutÚAPITimeoutErrorÚBrokenPipeErrorrq  ÚSSLSyscallErrorÚSSLWantReadErrorÚSSLWantWriteErrorÚAPIConnectionErrorÚSSLZeroReturnErrorÚRemoteProtocolErrorÚConnectionResetErrorÚConnectionAbortedErrorÚServerDisconnectedError)zserver disconnectedzpeer closed connectionzconnection reset by peerzconnection was closedznetwork connection lostzunexpected eofzincomplete chunked read)zcertificate verify failedÚcertificate_verify_failedz&unable to get local issuer certificatezself-signed certificatezself signed certificatezcertificate has expiredz+hostname mismatch, certificate is not validz&unable to verify the first certificate)zbad record macz	ssl alertz	tls alertzssl handshake failureztlsv1 alertzsslv3 alertÚbad_record_macÚ	ssl_alertÚ	tls_alertÚtls_alert_internal_errorz[ssl:)
zyour request was blockedzrequest blockedzsorry, you have been blockedz)enable javascript and cookies to continuezcdn-cgi/challenge-platformzcf-browser-verificationzchallenge-error-textÚ__cf_chlzcf-error-detailsz attention required! | cloudflare)rÕ  ro   r7  zdoes not supportzdoesn't supportzis deprecated for this modelrÔ  rÖ  zunrecognized parameterzinvalid parameterzextra inputs are not permittedzinvalid option: expected one of)Ú	mandatoryzcannot be disabledzcan't be disabledzmust be enabledzis requiredzalways enabledzcannot be turned off)zmust be one ofzinvalid value for)zerror renderingzrendering promptzjinja templatezjinja render)r¾  r½  Úrate_limit_exceeded)r   Úmodel_not_availableÚinvalid_model)Úcontext_length_exceededÚmax_tokens_exceeded)rD   rE   rF   rG   rÒ   )Úresets_in_secondsÚ	resets_atr  r  )zretry-afterzRetry-Afterzx-ratelimit-resetzX-RateLimit-Reset)ÐÚ__conditional_annotations__r2   Ú
__future__r   Úenumrm  ÚloggingÚrer%  Údataclassesr   r   Útypingr   r   r   r   r	   r
   Ú	getLoggerr.   rð   rR  Ú&PROVIDER_STREAM_EMPTY_FRAME_ERROR_CODEÚEnumr   r7   r  r¤  r¦   r£  rÛ  Ú	frozensetr«  r»  r¸  r\  rÝ  Ú_PAYLOAD_TOO_LARGE_PATTERNSÚ_IMAGE_TOO_LARGE_PATTERNSÚ_IMAGE_CORRUPT_PATTERNSÚ!_MULTIMODAL_TOOL_CONTENT_PATTERNSÚ_MEMORY_CEILING_PATTERNSr  Ú_CONTEXT_OVERFLOW_PATTERNSr  Ú_MODEL_NOT_FOUND_PATTERNSrA  r  r  r  rÈ  rq   rZ   r\  r@  rM  Ú!_PROVIDER_POLICY_BLOCKED_PATTERNSr;  r9  Ú_AUTH_PATTERNSÚ!_EMPTY_PROVIDER_RESPONSE_PATTERNSÚ_TIMEOUT_MESSAGE_PATTERNSÚ_CONNECTION_MESSAGE_PATTERNSro  rl  rh  rj  r¥  r[   r?   rt   rv   r½  r>  r"  r   r§   r   r¾  r   r&  rB  r   r®  r   r¦  r    r:  r!   r  r#   rS  r   r<  r   ri  r   rn  r   r+  Úmapr   r   r   r,   r¢  rz  rk  rŽ  r   r   r  Ú_V_IMAGE_CORRUPTr&   r%   Ú_V_MULTIMODALr?  r'   r  r$   r  r  r  r�   Úcompiler†   rœ   r•   rŒ   r�   r–   rž   r©   r³   r  rË  r¬  r  Ú_STREAM_RENDER_ERROR_PATTERNSr[  r^  Úfromkeysr´   rT  rÀ   r  rÉ  Útupler  rÄ   rõ   r  rþ   r   r)   r(   rÿ   r&  r+  rE  rO  rV  ra  ru  r}  r~  rù   r�  r¡  r¨  r¯  rÃ  rÍ  rÒ  r]  rÜ  rñ  r   r   r$  r{  r9  rB  r¼  r$  r­  rÊ  re  rd  r=  r@  rr  rx  rŒ  r  rØ   r‘  r–  rÙ   r   rŠ  r‹  r­  rÕ   r�  r¹  rº  )r	  s   @r5   Ú<module>r'     sÌ	  øðôõ #ã Û Û Û 	Û ß (ß D× Dà	×	Ò	˜8Ó	$€ð 'FÐ #ð *GÐ &ô
!�T—Y‘Yô !ðH ÷Bð Bó ðBð@ eÐ òð !ðð ñÐ ð(  7Ð ð "HÐ ð CÐ ñ !ØÐ.Ð0BÐDZØÐ+Ð-OØÐ!;Ð=[ð Ð CØ'Ð)Gà)ð"ó Ð ðÐ ðÐ ð YÐ ð"Ð ðÐ ð*Ð ðÐ ð%Ð !ð(Ð ñ (ò )ó Ð ðÐ ð$ *jÐ &ðÐ ð .Ð ð "Ð#AÐCYØ+Ð-HØ0Ð2Gð"Ð ðÐ ð!Ð ð Ð ð ÐWð4Ð Ð 0ó ð UÐ ð [Ð ðÐ ð%Ð !ð "NÐ ð$Ð  ð€ð%Ð !ðÐ ð Ð ñ #ò $ó Ð ðÐ ðÐ ðÐ ðÐ ð ˆs�Cˆx�.€õ'ð /°Ð6GÈÐNÐ Ø Ð'8¸$Ð?€Ø€á�—
‘
Ñ@ eÐ@Ð/?Ñ@€
Ù�2—=‘=Ñ5Ð$4Ñ5€Ù�B—G‘GÑA uÐAÐ0@ÑA€Ù�b—g‘gÑ1 Ñ1Ð Ù˜×*Ñ*Ñ>¨oÑ>Ð Ù˜×,Ñ,Ñ@°Ñ@Ð Ù˜×1Ñ1ÑE°_ÑEÐ á˜"×.Ñ.ÑT¸%ÐTÐCSÑTÐ Ù�R—_‘_Ñ8¨Ñ8€á�r×1Ñ1ÑE°_ÑEÐ Ù�×)Ñ)Ñ=¨_Ñ=€Ù˜×,Ñ,¸dÔCÐ Ù˜"×.Ñ.ÀÔEÐ Ù9<¸RÀ"Ç-Á-ÐQS×Q`ÑQ`Ðbd×blÑblÐnp×nxÑnxÐAyÓ9zÑ 6€ˆ 
¨JÙ')¨"×*<Ñ*<Ó'=¹rÀ"×BRÑBRÓ?SÐ $Ð Ð$Ù&(¨×)OÑ)OÓ&PÑRTÐUW×UqÑUqÓRrÐ #€Ð#Ù˜B×2Ñ2ÀEÐ[`ÔaÐ ñ ˜×,Ñ,Ñ@°Ñ@Ð ñ ˜BŸO™O°uÈeÔTÐ à7Ð ðÐ ð ŸšðLóÐ ð  ŸZšZð%óÐ ðÐ ð &MÐ "õFõ dõ Uõ00õð '¨Ð6Ð9PÐRbÐ8cØÐ 2Ð3ðÐ ð '¨Ð8Ð;SÐUbÐ:cØÐ!4Ð5ðÐ ð ˜
Ð#Ð&GÐIZÐ%[ØÐ 2Ð3ð€
ð )Ø&Ð(9Ð:Ð=VÐXjÐ<kØ˜=Ð)Ð,=¸~Ð+Nð,õ €ð !jÐ ð 1°-Ð@Ø3Ð5IÐJØ2Ð4GÐHØ5°ÐGðIð L]õ]Ð ð ˜=Ð)Ð,=¸~Ð+NØ˜=Ð)Ð,MÈÐ+_ØÐ!4Ð5¸ÈÐ7WØ&Ð(9Ð:Ð=VÐXjÐ<kØ 
Ð+Ð.JÈJÐ-WðÐ ð,Ø
‡m‚mÐNÙ�r—}‘}¸tÔDóFð,ð ‡m‚mÐ(¨*Ó5ð,ð ‡m‚mÐOÐQcÓdð	,ð
 ‡m‚mÐFÐH[Ó\ð,ð ‡m‚mÐ/°Ó?ð,ð  Ð!5ñ,Ð Ð(ó ð *¨8°X¸xÈÐZbØ-¨x¸À8È_Ð^fðhÐ ð ˆ~˜Ð/Øˆ}˜mÐ-@À*ÈjÐZiÐjØ�+˜Ð0BÀMÐRð:Ð Ð6ó ð -Ð.EÐFÐ Ø-Ð1HÐ0IÕIÐ ß ˜5Ñ iÑ,HÓ iŸ5™5Ñ iÑ,HÓ iÓiÐ ð
 ÷
ð 
ó ð
õ<õ((ðV ^€ñ %Ø×Ñ˜~×AÒAÀ>×C\ÑC\Ø×#Ñ# ^×%EÑ%EÀ~×GgÒGgØ×%Ò%ð&ó Ð ð ?ÇÀñ GJÙ óGJÇÁñ GJÙ óGJó BJõ JÐ õ0Yõf6õrlõ
õcõ-õDRð Ð%Ð'>À
ÐL^Ø�K ð:€Ð	6ó ð!2Ø)+ð!2Ø:<ð!2àð!2à28ð!2àNOð!2ð ð!2ð ÷	!2õHñ !Ð"8Ð!9Ó:Ð õõ oõõ@JõV÷Eð Eõ$	õ
õõ.IõXEð ˆ˜Ñ5ØÑ	ZØˆ�c˜;¨Ñ-AÀ3ÑHfØÑ	.Øˆ�c˜;¨¨[ØÑ	OØÑ	Oð:Ð Ð6ó ñ N€ÙY€õ	õ/õ$õ 
ð  2Ð Ø$>Ð !õõ(0õ6õPõõ"mõõIõ	>õDõ
õ"õ2õ
2õ2_õ
6õ
]÷Lr4   