§
    ‰eîiI‰  ã                  óœ  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
mZ  ej        e¦  «        Z G d„ dej        ¦  «        Ze G d„ d	¦  «        ¦   «         Zg d
¢Zg d¢Zg d¢Zg d¢Zg d¢Zg d¢Zg d¢Zg d¢Zg d¢ZdgZ eh d£¦  «        Zg d¢Zg d¢Zddddddœd7d$„Z dd%œd8d,„Z!d9d-„Z"dd%œd:d.„Z#d;d/„Z$d<d1„Z%d=d3„Z&d>d4„Z'd?d5„Z(d@d6„Z)dS )Aa«  API error classification for smart failover and recovery.

Provides a structured taxonomy of API errors and a priority-ordered
classification pipeline that determines the correct recovery action
(retry, rotate credential, fallback to another provider, compress
context, or abort).

Replaces scattered inline string-matching with a centralized classifier
that the main retry loop in run_agent.py consults for every API failure.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚDictÚOptionalc                  óN   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )ÚFailoverReasonu8   Why an API call failed â€” determines recovery strategy.ÚauthÚauth_permanentÚbillingÚ
rate_limitÚ
overloadedÚserver_errorÚtimeoutÚcontext_overflowÚpayload_too_largeÚmodel_not_foundÚprovider_policy_blockedÚformat_errorÚthinking_signatureÚlong_context_tierÚunknownN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   © ó    ú8/home/div/.hermes/hermes-agent/agent/error_classifier.pyr
   r
      sv   € € € € € ØBÐBð €DØ%€Nð €GØ€Jð €JØ!€Lð €Gð *ÐØ+Ðð (€OØ7Ðð "€Lð .ÐØ+Ðð €G€G€Gr   r
   c                  óÈ   — e Zd ZU dZded<   dZded<   dZded<   dZded	<   d
Zded<    e	e
¬¦  «        Zded<   dZded<   dZded<   dZded<   dZded<   edd„¦   «         ZdS )ÚClassifiedErrorz>Structured classification of an API error with recovery hints.r
   ÚreasonNúOptional[int]Ústatus_codezOptional[str]ÚproviderÚmodelÚ ÚstrÚmessage)Údefault_factoryzDict[str, Any]Úerror_contextTÚboolÚ	retryableFÚshould_compressÚshould_rotate_credentialÚshould_fallbackÚreturnc                ó@   — | j         t          j        t          j        fv S ©N)r#   r
   r   r   )Úselfs    r    Úis_authzClassifiedError.is_authQ   s   € àŒ{�~Ô2µNÔ4QÐRÐRÐRr   )r2   r-   )r   r   r   r   Ú__annotations__r%   r&   r'   r*   r   Údictr,   r.   r/   r0   r1   Úpropertyr6   r   r   r    r"   r"   ?   sõ   € € € € € € àHÐHàÐÐÑØ!%€KÐ%Ð%Ð%Ñ%Ø"€HÐ"Ð"Ð"Ñ"Ø€EÐÐÐÑØ€GÐÐÐÑØ$) E¸$Ð$?Ñ$?Ô$?€MÐ?Ð?Ð?Ñ?ð €IÐÐÐÑØ!€OÐ!Ð!Ð!Ñ!Ø%*ÐÐ*Ð*Ð*Ñ*Ø!€OÐ!Ð!Ð!Ñ!àðSð Sð Sñ „XðSð Sð Sr   r"   )
zinsufficient creditsÚinsufficient_quotazcredit balancezcredits have been exhaustedztop up your creditszpayment requiredzbilling hard limitzexceeded your current quotazaccount is deactivatedzplan does not include)z
rate limitr   ztoo many requestsÚ	throttledzrequests per minuteztokens per minutezrequests per dayztry again inzplease retry afterÚresource_exhaustedzrate increased too quicklyÚthrottlingexceptionztoo many concurrent requestsÚservicequotaexceededexception)zusage limitÚquotazlimit exceededúkey limit exceeded)z	try againÚretryz	resets atzreset inÚwaitzrequests remainingÚperiodicÚwindow)zrequest entity too largezpayload too largezerror code: 413)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   ä¸Šä¸‹æ–‡é•¿åº¦rG   zmax input tokenzinput tokenz*exceeds the maximum number of input tokens)zis not a valid modelzinvalid modelzmodel not foundr   zdoes not existzno such modelzunknown modelzunsupported model)z.no endpoints available matching your guardrailz0no endpoints available matching your data policyz,no endpoints found matching your data policy)	zinvalid api keyÚinvalid_api_keyÚauthenticationÚunauthorizedÚ	forbiddenzinvalid tokenztoken expiredztoken revokedzaccess deniedÚ	signature>   ÚSSLErrorÚ	ReadErrorÚPoolTimeoutÚReadTimeoutÚSSLEOFErrorÚConnectErrorÚTimeoutErrorÚConnectTimeoutÚAPITimeoutErrorÚBrokenPipeErrorÚConnectionErrorÚ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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:r(   i@ )r&   r'   Úapprox_tokensÚcontext_lengthÚnum_messagesÚerrorÚ	Exceptionr&   r)   r'   rf   Úintrg   rh   r2   c               óô  ‡ ‡‡‡‡‡— t          ‰ ¦  «        Št          ‰ ¦  «        j        }‰€|dk    rdŠt          ‰ ¦  «        Št	          ‰¦  «        }t          ‰ ¦  «                             ¦   «         }d}	d}
t          ‰t          ¦  «        �r­‰ 	                    di ¦  «        }t          |t          ¦  «        �rIt          | 	                    d¦  «        pd¦  «                             ¦   «         }	| 	                    di ¦  «        }t          |t          ¦  «        rè| 	                    d¦  «        pd}t          |t
          ¦  «        r¼| 
                    ¦   «         r¨	 d	dl}|                     |¦  «        }t          |t          ¦  «        ra| 	                    di ¦  «        }t          |t          ¦  «        r6t          | 	                    d¦  «        pd¦  «                             ¦   «         }
n# |j        t          f$ r Y nw xY w|	s6t          ‰ 	                    d¦  «        pd¦  «                             ¦   «         }	|g}|	r|	|vr|                     |	¦  «         |
r|
|vr|
|	vr|                     |
¦  «         d
                     |¦  «        Š‰pd 
                    ¦   «                              ¦   «         }‰pd 
                    ¦   «                              ¦   «         }d ˆˆ ˆˆˆfd„}‰dk    r d‰v rd‰v r |t"          j        dd¬¦  «        S ‰dk    r d‰v rd‰v r |t"          j        dd¬¦  «        S ‰�t)          ‰‰|‰||||||¬¦
  «
        }|�|S |rt+          |‰|¦  «        }|�|S t-          ‰||||¬¦  «        }|�|S t/          ˆfd„t0          D ¦   «         ¦  «        r |t"          j        d¬¦  «        S t/          ˆfd„t4          D ¦   «         ¦  «        }|rH‰sF||dz  k    p|dk    p|dk    }|r |t"          j        dd¬¦  «        S  |t"          j        d¬¦  «        S |t8          v s"t          ‰ t:          t<          t>          f¦  «        r |t"          j        d¬¦  «        S  |t"          j         d¬¦  «        S )!u¼  Classify an API error into a structured recovery recommendation.

    Priority-ordered pipeline:
      1. Special-case provider-specific patterns (thinking sigs, tier gates)
      2. HTTP status code + message-aware refinement
      3. Error code classification (from body)
      4. Message pattern matching (billing vs rate_limit vs context vs auth)
      5. SSL/TLS transient alert patterns â†’ retry as timeout
      6. Server disconnect + large session â†’ context overflow
      7. Transport error heuristics
      8. Fallback: unknown (retryable with backoff)

    Args:
        error: The exception from the API call.
        provider: Current provider name (e.g. "openrouter", "anthropic").
        model: Current model slug.
        approx_tokens: Approximate token count of the current context.
        context_length: Maximum context length for the current model.

    Returns:
        ClassifiedError with reason and recovery action hints.
    NÚRateLimitErroré­  r(   ri   r*   ÚmetadataÚrawr   Ú r#   r
   r2   r"   c                ór   •— | ‰‰‰t          ‰‰¦  «        dœ}|                     |¦  «         t          di |¤ŽS )N)r#   r%   r&   r'   r*   r   )Ú_extract_messageÚupdater"   )r#   Ú	overridesÚdefaultsÚbodyri   r'   r&   r%   s      €€€€€r    Ú_resultz#classify_api_error.<locals>._result�  sP   ø€ àØ&Ø ØÝ'¨¨tÑ4Ô4ð
ð 
ˆð 	�Š˜	Ñ"Ô"Ð"ÝÐ*Ð* Ð*Ð*Ð*r   é�  rM   ÚthinkingTF©r.   r/   zextra usagezlong context©r&   r'   rf   rg   rh   Ú	result_fn)rf   rg   r}   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   ©Ú.0ÚpÚ	error_msgs     €r    ú	<genexpr>z%classify_api_error.<locals>.<genexpr>Ü  s'   øè è € Ð
;Ð
;˜aˆ1�	ˆ>Ð
;Ð
;Ð
;Ð
;Ð
;Ð
;r   ©r.   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z%classify_api_error.<locals>.<genexpr>å  s'   øè è € ÐLÐL¨1˜˜Y˜ÐLÐLÐLÐLÐLÐLr   g333333ã?iÀÔ éÈ   )r#   r
   r2   r"   )!Ú_extract_status_codeÚtyper   Ú_extract_error_bodyÚ_extract_error_coder)   ÚlowerÚ
isinstancer8   ÚgetÚstripÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorÚappendÚjoinr
   r   r   Ú_classify_by_statusÚ_classify_by_error_codeÚ_classify_by_messageÚanyÚ_SSL_TRANSIENT_PATTERNSr   Ú_SERVER_DISCONNECT_PATTERNSr   Ú_TRANSPORT_ERROR_TYPESrT   rX   ÚOSErrorr   )ri   r&   r'   rf   rg   rh   Ú
error_typeÚ
error_codeÚ_raw_msgÚ	_body_msgÚ_metadata_msgÚ_err_objÚ	_metadataÚ	_raw_jsonr�   Ú_innerÚ
_inner_errÚpartsÚprovider_lowerÚmodel_lowerrx   Ú
classifiedÚis_disconnectÚis_largerw   r‚   r%   s   ```                     @@@r    Úclassify_api_errorr­   9  sX  øøøøøø€ õ> ' uÑ-Ô-€KÝ�e‘”Ô%€Jð Ð˜zÐ-=Ò=Ð=ØˆÝ˜uÑ%Ô%€DÝ$ TÑ*Ô*€Jõ �5‰zŒz×ÒÑ!Ô!€HØ€IØ€MÝ�$�ÑÔñ ?Ø—8’8˜G RÑ(Ô(ˆÝ�h¥Ñ%Ô%ñ 	Ý˜HŸLšL¨Ñ3Ô3Ð9°rÑ:Ô:×@Ò@ÑBÔBˆIà Ÿš Z°Ñ4Ô4ˆIÝ˜)¥TÑ*Ô*ð Ø%ŸMšM¨%Ñ0Ô0Ð6°B�	Ý˜i­Ñ-Ô-ð 	°)·/²/Ñ2CÔ2Cð 	ðØ#˜˜˜Ø!%§¢¨IÑ!6Ô!6˜Ý% f­dÑ3Ô3ð ]Ø)/¯ª°G¸RÑ)@Ô)@˜JÝ)¨*µdÑ;Ô;ð ]Ý03°J·N²NÀ9Ñ4MÔ4MÐ4SÐQSÑ0TÔ0T×0ZÒ0ZÑ0\Ô0\ øøØ Ô0µ)Ð<ð ð ð Ø˜ðøøøàð 	?Ý˜DŸHšH YÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>ˆIàˆJ€EØð  �Y hÐ.Ð.Ø�Š�YÑÔÐØð $˜¨hÐ6Ð6¸=ÐPYÐ;YÐ;YØ�Š�]Ñ#Ô#Ð#Ø—’˜‘”€IØ�n "×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5€NØ�;˜B×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€Kð	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð$ 	�sÒÐØ˜9Ð$Ð$Ø˜)Ð#Ð#àˆwÝÔ-ØØ!ð
ñ 
ô 
ð 	
ð 	�sÒÐØ˜YÐ&Ð&Ø˜iÐ'Ð'àˆwÝÔ,ØØ ð
ñ 
ô 
ð 	
ð ÐÝ(Ø˜ J°Ø#¨;Ø'¸Ø%Øð
ñ 
ô 
ˆ
ð Ð!ØÐð ð Ý,¨Z¸ÀGÑLÔLˆ
ØÐ!ØÐõ &Ø�:Ø#Ø%Øð	ñ ô €Jð ÐØÐõ Ð
;Ð
;Ð
;Ð
;Õ#:Ð
;Ñ
;Ô
;Ñ;Ô;ð ?Øˆw•~Ô-¸Ð>Ñ>Ô>Ð>õ ÐLÐLÐLÐLÕ0KÐLÑLÔLÑLÔL€MØð ?˜[ð ?Ø  >°CÑ#7Ò7Ðg¸=È6Ò;QÐgÐUaÐdgÒUgˆØð 	Ø�7ÝÔ/ØØ $ðñ ô ð ð
 ˆw•~Ô-¸Ð>Ñ>Ô>Ð>ð Õ+Ð+Ð+­z¸%Å,ÕP_ÕahÐAiÑ/jÔ/jÐ+Øˆw•~Ô-¸Ð>Ñ>Ô>Ð>ð ˆ7•>Ô)°TÐ:Ñ:Ô:Ð:s   ÅBG+ Ç+G?Ç>G?)rh   r%   r‚   rž   rw   r8   úOptional[ClassifiedError]c               óÊ  ‡— | dk    r |	t           j        ddd¬¦  «        S | dk    r9d‰v sd‰v r |	t           j        ddd¬¦  «        S  |	t           j        dd¬¦  «        S | d	k    rt          ‰|	¦  «        S | d
k    r‡t	          ˆfd„t
          D ¦   «         ¦  «        r |	t           j        dd¬¦  «        S t	          ˆfd„t          D ¦   «         ¦  «        r |	t           j        dd¬¦  «        S  |	t           j	        d¬¦  «        S | dk    r |	t           j
        dd¬¦  «        S | dk    r |	t           j        ddd¬¦  «        S | dk    rt          ‰||||||||	¬¦	  «	        S | dv r |	t           j        d¬¦  «        S | dv r |	t           j        d¬¦  «        S d| cxk    rdk     rn n |	t           j        dd¬¦  «        S d| cxk    rdk     rn n |	t           j        d¬¦  «        S dS )zAClassify based on HTTP status code with message-aware refinement.i‘  FT©r.   r0   r1   i“  r@   zspending limit©r.   r1   i’  i”  c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z&_classify_by_status.<locals>.<genexpr>0  s'   øè è € ÐIÐI !ˆq�Iˆ~ÐIÐIÐIÐIÐIÐIr   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z&_classify_by_status.<locals>.<genexpr>6  s'   øè è € ÐAÐA !ˆq�Iˆ~ÐAÐAÐAÐAÐAÐAr   r„   i�  r{   rn   ry   r|   )éô  iö  )i÷  i  r´   éX  N)r
   r   r   Ú_classify_402r˜   Ú!_PROVIDER_POLICY_BLOCKED_PATTERNSr   Ú_MODEL_NOT_FOUND_PATTERNSr   r   r   r   Ú_classify_400r   r   r   )
r%   r‚   rž   rw   r&   r'   rf   rg   rh   r}   s
    `        r    r•   r•   ü  s  ø€ ð �cÒÐð ˆyÝÔØØ%)Ø ð	
ñ 
ô 
ð 	
ð �cÒÐà 9Ð,Ð,Ð0@ÀIÐ0MÐ0MØ�9ÝÔ&ØØ)-Ø $ð	ñ ô ð ð ˆyÝÔØØ ð
ñ 
ô 
ð 	
ð �cÒÐÝ˜Y¨	Ñ2Ô2Ð2à�cÒÐõ ÐIÐIÐIÐIÕ'HÐIÑIÔIÑIÔIð 	Ø�9ÝÔ6ØØ %ðñ ô ð õ
 ÐAÐAÐAÐAÕ'@ÐAÑAÔAÑAÔAð 	Ø�9ÝÔ.ØØ $ðñ ô ð ð ˆyÝÔ"Øð
ñ 
ô 
ð 	
ð
 �cÒÐØˆyÝÔ,ØØ ð
ñ 
ô 
ð 	
ð �cÒÐàˆyÝÔ%ØØ%)Ø ð	
ñ 
ô 
ð 	
ð �cÒÐÝØ�z 4Ø UØ'Ø)Ø%Øð
ñ 
ô 
ð 	
ð �jÐ Ð Øˆy�Ô4ÀÐEÑEÔEÐEà�jÐ Ð Øˆy�Ô2¸dÐCÑCÔCÐCð ˆkÐÐÒÐ˜CÒÐÐÐÐØˆyÝÔ'ØØ ð
ñ 
ô 
ð 	
ð ˆkÐÐÒÐ˜CÒÐÐÐÐØˆy�Ô4ÀÐEÑEÔEÐEàˆ4r   c                óð   ‡ — t          ˆ fd„t          D ¦   «         ¦  «        }t          ˆ fd„t          D ¦   «         ¦  «        }|r|r |t          j        ddd¬¦  «        S  |t          j        ddd¬¦  «        S )u  Disambiguate 402: billing exhaustion vs transient usage limit.

    The key insight from OpenClaw: some 402s are transient rate limits
    disguised as payment errors.  "Usage limit, try again in 5 minutes"
    is NOT a billing problem â€” it's a periodic quota that resets.
    c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_402.<locals>.<genexpr>  ó'   øè è € ÐHÐH¨Q˜!˜y˜.ÐHÐHÐHÐHÐHÐHr   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_402.<locals>.<genexpr>€  s'   øè è € ÐVÐV°!˜q I˜~ÐVÐVÐVÐVÐVÐVr   Tr°   F)r˜   Ú_USAGE_LIMIT_PATTERNSÚ_USAGE_LIMIT_TRANSIENT_SIGNALSr
   r   r   )r‚   r}   Úhas_usage_limitÚhas_transient_signals   `   r    r¶   r¶   w  s®   ø€ õ ÐHÐHÐHÐHÕ2GÐHÑHÔHÑHÔH€OÝÐVÐVÐVÐVÕ7UÐVÑVÔVÑVÔVÐàð 
Ð/ð 
àˆyÝÔ%ØØ%)Ø ð	
ñ 
ô 
ð 	
ð ˆ9ÝÔØØ!%Øð	ñ ô ð r   c               ó   ‡ — t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j	        ddd¬	¦  «        S t          ˆ fd
„t          D ¦   «         ¦  «        r |t          j        ddd¬	¦  «        S d}	t          |t          ¦  «        r½|                     di ¦  «        }
t          |
t          ¦  «        rHt          |
                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }	|	sHt          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }	t%          |	¦  «        dk     p|	dv }||dz  k    p|dk    p|dk    }|r|r |t          j        dd¬¦  «        S  |t          j        dd¬¦  «        S )uH   Classify 400 Bad Request â€” context overflow, format error, or generic.c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_400.<locals>.<genexpr>£  ó'   øè è € Ð
>Ð
>˜aˆ1�	ˆ>Ð
>Ð
>Ð
>Ð
>Ð
>Ð
>r   Tr{   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_400.<locals>.<genexpr>«  ó'   øè è € Ð
EÐ
E˜aˆ1�	ˆ>Ð
EÐ
EÐ
EÐ
EÐ
EÐ
Er   Fr±   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_400.<locals>.<genexpr>±  ó'   øè è € Ð
=Ð
=˜aˆ1�	ˆ>Ð
=Ð
=Ð
=Ð
=Ð
=Ð
=r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_400.<locals>.<genexpr>º  ó'   øè è € Ð
8Ð
8˜aˆ1�	ˆ>Ð
8Ð
8Ð
8Ð
8Ð
8Ð
8r   r°   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z _classify_400.<locals>.<genexpr>Á  ó'   øè è € Ð
5Ð
5˜aˆ1�	ˆ>Ð
5Ð
5Ð
5Ð
5Ð
5Ð
5r   r(   ri   r*   é   )ri   r(   gš™™™™™Ù?i€8 éP   )r˜   Ú_CONTEXT_OVERFLOW_PATTERNSr
   r   r·   r   r¸   r   Ú_RATE_LIMIT_PATTERNSr   Ú_BILLING_PATTERNSr   rŒ   r8   r�   r)   rŽ   r‹   Úlenr   )r‚   rž   rw   r&   r'   rf   rg   rh   r}   Úerr_body_msgÚerr_objÚ
is_genericr¬   s   `            r    r¹   r¹   ”  sÛ  ø€ õ Ð
>Ð
>Ð
>Ð
>Õ#=Ð
>Ñ
>Ô
>Ñ>Ô>ð 
ØˆyÝÔ+ØØ ð
ñ 
ô 
ð 	
õ Ð
EÐ
EÐ
EÐ
EÕ#DÐ
EÑ
EÔ
EÑEÔEð 
ØˆyÝÔ2ØØ!ð
ñ 
ô 
ð 	
õ
 Ð
=Ð
=Ð
=Ð
=Õ#<Ð
=Ñ
=Ô
=Ñ=Ô=ð 
ØˆyÝÔ*ØØ ð
ñ 
ô 
ð 	
õ Ð
8Ð
8Ð
8Ð
8Õ#7Ð
8Ñ
8Ô
8Ñ8Ô8ð 
ØˆyÝÔ%ØØ%)Ø ð	
ñ 
ô 
ð 	
õ Ð
5Ð
5Ð
5Ð
5Õ#4Ð
5Ñ
5Ô
5Ñ5Ô5ð 
ØˆyÝÔ"ØØ%)Ø ð	
ñ 
ô 
ð 	
ð €LÝ�$�ÑÔð JØ—(’(˜7 BÑ'Ô'ˆÝ�g�tÑ$Ô$ð 	MÝ˜wŸ{š{¨9Ñ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔD×JÒJÑLÔLˆLàð 	JÝ˜tŸxšx¨	Ñ2Ô2Ð8°bÑ9Ô9×?Ò?ÑAÔA×GÒGÑIÔIˆLÝ�\Ñ"Ô" RÒ'ÐH¨<¸=Ð+H€JØ˜~°Ñ3Ò3Ða°}ÀuÒ7LÐaÐP\Ð_aÒPa€Hàð 
�hð 
ØˆyÝÔ+ØØ ð
ñ 
ô 
ð 	
ð ˆ9ÝÔ#ØØðñ ô ð r   c                ó  — |                       ¦   «         }|dv r |t          j        dd¬¦  «        S |dv r |t          j        ddd¬¦  «        S |dv r |t          j        dd¬¦  «        S |d	v r |t          j        dd¬
¦  «        S dS )z:Classify by structured error codes from the response body.)r<   r;   Úrate_limit_exceededT)r.   r0   )r:   Úbilling_not_activeÚpayment_requiredFr°   )r   Úmodel_not_availableÚinvalid_modelr±   )Úcontext_length_exceededÚmax_tokens_exceededr{   N)r‹   r
   r   r   r   r   )rž   r‚   r}   Ú
code_lowers       r    r–   r–   ç  sé   € ð ×!Ò!Ñ#Ô#€JàÐOÐOÐOØˆyÝÔ%ØØ%)ð
ñ 
ô 
ð 	
ð ÐUÐUÐUØˆyÝÔ"ØØ%)Ø ð	
ñ 
ô 
ð 	
ð ÐPÐPÐPØˆyÝÔ*ØØ ð
ñ 
ô 
ð 	
ð ÐGÐGÐGØˆyÝÔ+ØØ ð
ñ 
ô 
ð 	
ð ˆ4r   r�   c               ó
  ‡ — t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        }|rTt          ˆ fd„t
          D ¦   «         ¦  «        }|r |t          j        ddd¬¦  «        S  |t          j        ddd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        ddd¬¦  «        S t          ˆ fd	„t          D ¦   «         ¦  «        r |t          j        ddd¬¦  «        S t          ˆ fd
„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        ddd¬¦  «        S t          ˆ fd„t          D ¦   «         ¦  «        r |t          j        dd¬¦  «        S t          ˆ fd„t           D ¦   «         ¦  «        r |t          j        dd¬¦  «        S dS )zJClassify based on error message patterns when no status code is available.c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>  s'   øè è € Ð
?Ð
?˜aˆ1�	ˆ>Ð
?Ð
?Ð
?Ð
?Ð
?Ð
?r   Tr{   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>%  r¼   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>'  s'   øè è € Ð"ZÐ"Z°a 1¨	 >Ð"ZÐ"ZÐ"ZÐ"ZÐ"ZÐ"Zr   r°   Fc              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>7  rÌ   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>@  rÊ   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>I  rÄ   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>U  s'   øè è € Ð
2Ð
2˜aˆ1�	ˆ>Ð
2Ð
2Ð
2Ð
2Ð
2Ð
2r   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>_  rÆ   r   r±   c              3  ó    •K  — | ]}|‰v V — Œ	d S r4   r   r   s     €r    rƒ   z'_classify_by_message.<locals>.<genexpr>g  rÈ   r   N)r˜   Ú_PAYLOAD_TOO_LARGE_PATTERNSr
   r   r¾   r¿   r   r   rÑ   rÐ   rÏ   r   Ú_AUTH_PATTERNSr   r·   r   r¸   r   )r‚   r�   rf   rg   r}   rÀ   rÁ   s   `      r    r—   r—     sØ  ø€ õ Ð
?Ð
?Ð
?Ð
?Õ#>Ð
?Ñ
?Ô
?Ñ?Ô?ð 
ØˆyÝÔ,ØØ ð
ñ 
ô 
ð 	
õ ÐHÐHÐHÐHÕ2GÐHÑHÔHÑHÔH€OØð 
Ý"Ð"ZÐ"ZÐ"ZÐ"ZÕ;YÐ"ZÑ"ZÔ"ZÑZÔZÐØð 	Ø�9ÝÔ)ØØ)-Ø $ð	ñ ô ð ð ˆyÝÔ"ØØ%)Ø ð	
ñ 
ô 
ð 	
õ Ð
5Ð
5Ð
5Ð
5Õ#4Ð
5Ñ
5Ô
5Ñ5Ô5ð 
ØˆyÝÔ"ØØ%)Ø ð	
ñ 
ô 
ð 	
õ Ð
8Ð
8Ð
8Ð
8Õ#7Ð
8Ñ
8Ô
8Ñ8Ô8ð 
ØˆyÝÔ%ØØ%)Ø ð	
ñ 
ô 
ð 	
õ Ð
>Ð
>Ð
>Ð
>Õ#=Ð
>Ñ
>Ô
>Ñ>Ô>ð 
ØˆyÝÔ+ØØ ð
ñ 
ô 
ð 	
õ Ð
2Ð
2Ð
2Ð
2¥>Ð
2Ñ
2Ô
2Ñ2Ô2ð 
ØˆyÝÔØØ%)Ø ð	
ñ 
ô 
ð 	
õ Ð
EÐ
EÐ
EÐ
EÕ#DÐ
EÑ
EÔ
EÑEÔEð 
ØˆyÝÔ2ØØ!ð
ñ 
ô 
ð 	
õ Ð
=Ð
=Ð
=Ð
=Õ#<Ð
=Ñ
=Ô
=Ñ=Ô=ð 
ØˆyÝÔ*ØØ ð
ñ 
ô 
ð 	
ð ˆ4r   r$   c                óN  — | }t          d¦  «        D ]’}t          |dd¦  «        }t          |t          ¦  «        r|c S t          |dd¦  «        }t          |t          ¦  «        rd|cxk    rdk     rn n|c S t          |dd¦  «        pt          |dd¦  «        }|�||u r n|}Œ“dS )	z?Walk the error and its cause chain to find an HTTP status code.é   r%   NÚstatuséd   rµ   Ú	__cause__Ú__context__)ÚrangeÚgetattrrŒ   rk   )ri   ÚcurrentÚ_ÚcodeÚcauses        r    r‡   r‡   s  sØ   € à€GÝ�1‰XŒXð ð ˆÝ�w ¨tÑ4Ô4ˆÝ�d�CÑ Ô ð 	ØˆKˆKˆKå�w ¨$Ñ/Ô/ˆÝ�d�CÑ Ô ð 	 S¨DÐ%6Ð%6Ò%6Ð%6°3Ò%6Ð%6Ð%6Ð%6Ð%6ØˆKˆKˆKå˜ ¨dÑ3Ô3Ð\µw¸wÈÐW[Ñ7\Ô7\ˆØˆ=˜E WÐ,Ð,ØˆEØˆˆØˆ4r   c                óö   — t          | dd¦  «        }t          |t          ¦  «        r|S t          | dd¦  «        }|�=	 |                     ¦   «         }t          |t          ¦  «        r|S n# t          $ r Y nw xY wi S )z8Extract the structured error body from an SDK exception.rw   NÚresponse)rò   rŒ   r8   r�   rj   )ri   rw   rø   Ú	json_bodys       r    r‰   r‰   †  s•   € å�5˜& $Ñ'Ô'€DÝ�$�ÑÔð Øˆå�u˜j¨$Ñ/Ô/€HØÐð	Ø Ÿš™œˆIÝ˜)¥TÑ*Ô*ð !Ø Ð ð!øåð 	ð 	ð 	ØˆDð	øøøà€Is   ½*A) Á)
A6Á5A6c                ó  — | sdS |                       di ¦  «        }t          |t          ¦  «        ri|                      d¦  «        p|                      d¦  «        pd}t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S |                       d¦  «        p|                       d¦  «        pd}t          |t          t
          f¦  «        r!t          |¦  «                             ¦   «         S dS )z4Extract an error code string from the response body.r(   ri   rõ   rˆ   rž   )r�   rŒ   r8   r)   rŽ   rk   )rw   Ú	error_objrõ   s      r    rŠ   rŠ   —  sâ   € àð ØˆrØ—’˜ "Ñ%Ô%€IÝ�)�TÑ"Ô"ð  Ø�}Š}˜VÑ$Ô$ÐC¨	¯ª°fÑ(=Ô(=ÐCÀˆÝ�d�CÑ Ô ð 	  T§Z¢Z¡\¤\ð 	 Ø—:’:‘<”<Ðà�8Š8�FÑÔÐ;˜tŸxšx¨Ñ5Ô5Ð;¸€DÝ�$��c˜
Ñ#Ô#ð !Ý�4‰yŒy�ŠÑ Ô Ð Øˆ2r   c                óö  — |rá|                      di ¦  «        }t          |t          ¦  «        r[|                      dd¦  «        }t          |t          ¦  «        r0|                     ¦   «         r|                     ¦   «         dd…         S |                      dd¦  «        }t          |t          ¦  «        r0|                     ¦   «         r|                     ¦   «         dd…         S t          | ¦  «        dd…         S )z+Extract the most informative error message.ri   r*   r(   Nr´   )r�   rŒ   r8   r)   rŽ   )ri   rw   rû   Úmsgs       r    rs   rs   §  sÜ   € ð ð %Ø—H’H˜W bÑ)Ô)ˆ	Ý�i¥Ñ&Ô&ð 	)Ø—-’- 	¨2Ñ.Ô.ˆCÝ˜#�sÑ#Ô#ð )¨¯	ª	©¬ð )Ø—y’y‘{”{ 4 C 4Ô(Ð(Ø�hŠh�y "Ñ%Ô%ˆÝ�c�3ÑÔð 	% C§I¢I¡K¤Kð 	%Ø—9’9‘;”;˜t ˜tÔ$Ð$åˆu‰:Œ:�d�s�dÔÐr   )ri   rj   r&   r)   r'   r)   rf   rk   rg   rk   rh   rk   r2   r"   )r%   rk   r‚   r)   rž   r)   rw   r8   r&   r)   r'   r)   rf   rk   rg   rk   rh   rk   r2   r®   )r‚   r)   r2   r"   )r‚   r)   rž   r)   rw   r8   r&   r)   r'   r)   rf   rk   rg   rk   rh   rk   r2   r"   )rž   r)   r‚   r)   r2   r®   )
r‚   r)   r�   r)   rf   rk   rg   rk   r2   r®   )ri   rj   r2   r$   )ri   rj   r2   r8   )rw   r8   r2   r)   )ri   rj   rw   r8   r2   r)   )*r   Ú
__future__r   ÚenumÚloggingÚdataclassesr   r   Útypingr   r   r   Ú	getLoggerr   ÚloggerÚEnumr
   r"   rÑ   rÐ   r¾   r¿   ré   rÏ   r¸   r·   rê   Ú_THINKING_SIG_PATTERNSÚ	frozensetr›   rš   r™   r­   r•   r¶   r¹   r–   r—   r‡   r‰   rŠ   rs   r   r   r    ú<module>r     s  ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à	ˆÔ	˜8Ñ	$Ô	$€ð
"ð "ð "ð "ð "�T”Yñ "ô "ð "ðN ðSð Sð Sð Sð Sñ Sô Sñ „ðSð4ð ð Ð ðð ð Ð ð&ð ð Ð ð	"ð 	"ð 	"Ð ðð ð Ð ð!ð !ð !Ð ðH	ð 	ð 	Ð ð8%ð %ð %Ð !ð
ð 
ð 
€ð ðÐ ð
 #˜ð $ð $ð $ñ ô Ð ð4ð ð Ð ð4ð ð Ð ð0 ØØØ Øð~;ð ~;ð ~;ð ~;ð ~;ð ~;ðZ ðxð xð xð xð xð xðvð ð ð ðL ðNð Nð Nð Nð Nð Nðf#ð #ð #ð #ðP_ð _ð _ð _ðHð ð ð ð&ð ð ð ð"ð ð ð ð ð ð ð ð ð r   