Ë
    ³Œj  ã                  óè   — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	  ej                  e«      Z eh d£«      ZdZdd„Z G d„ d	ej"                  «      Z G d
„ dej&                  «      Zdd„Zy)at  Custom httpx transports with retry logic for the sandbox client.

Provides RetryTransport (sync) and AsyncRetryTransport (async) that wrap
the default httpx transports with automatic retry on transient errors.
This mirrors the main LangSmith client's _LangSmithHttpAdapter + urllib3.Retry
architecture at the transport level, making retries transparent to all call sites.
é    )ÚannotationsN)ÚSandboxConnectionError>   éö  é÷  éø  g      $@c                óR   — t        d| z  t        j                  «       z   t        «      S )z@Compute exponential backoff with jitter, capped at _MAX_BACKOFF.é   )ÚminÚrandomÚ_MAX_BACKOFF)Úattempts    úf/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/sandbox/_transport.pyÚ_compute_backoffr      s   € äˆq�'‰zœFŸM™M›OÑ+¬\Ó:Ð:ó    c                  ó:   — e Zd ZdZdddœ	 	 	 	 	 dd„Zd	d„Zd
d„Zy)ÚRetryTransportam  Sync httpx transport that retries on transient errors.

    Retries on:
    - 502/503/504 with exponential backoff
    - 429 with Retry-After header support
    - Connection errors/timeouts with exponential backoff

    After exhausting retries, the last response is returned (for status errors)
    or SandboxConnectionError is raised (for connection errors).
    é   N©Úmax_retriesÚ	transportc               óL   — |xs t        j                  «       | _        || _        y ©N)ÚhttpxÚHTTPTransportÚ
_transportÚ_max_retries©Úselfr   r   s      r   Ú__init__zRetryTransport.__init__,   s!   € ð $Ò<¤u×':Ñ':Ó'<ˆŒØ'ˆÕr   c                ór  — d }t        | j                  dz   «      D �]W  }|| j                  k(  }	 | j                  j                  |«      }|}|�s"|j                  t
        v rw|j                  «        t        |«      }t        j                  d|j                  |j                  |j                  |dz   | j                  |«       t        j                  |«       Œ½|j                  dk(  rŠt        |«      }|d|z  z  t        j                  «       z   }|j                  «        t        j                  d|j                  |j                  ||dz   | j                  «       t        j                  |«       �ŒV|c S  |€J ‚|S # t         j"                  t         j$                  t         j&                  f$ rˆ}|sbt        |«      }t        j                  d|j                  |j                  |dz   | j                  ||«       t        j                  |«       Y d }~�Œ÷t)        d| j                  dz   › d|› �«      |‚d }~ww xY w©	Né   z9Retrying %s %s (status %d, attempt %d/%d, sleeping %.1fs)i­  r	   z;Rate limited on %s %s, retrying after %.1fs (attempt %d/%d)zGConnection error on %s %s, retrying (attempt %d/%d, sleeping %.1fs): %sz"Failed to connect to server after z attempts: )Úranger   r   Úhandle_requestÚstatus_codeÚRETRYABLE_STATUS_CODESÚcloser   ÚloggerÚdebugÚmethodÚurlÚtimeÚsleepÚ_parse_retry_afterr   r   ÚConnectErrorÚConnectTimeoutÚPoolTimeoutr   ©	r   ÚrequestÚlast_responser   Úis_last_attemptÚresponseÚ
sleep_timeÚretry_afterÚexcs	            r   r$   zRetryTransport.handle_request5   s  € Ø/3ˆä˜T×.Ñ.°Ñ2×3ˆGØ%¨×):Ñ):Ñ:ˆOð8ØŸ?™?×9Ñ9¸'ÓB�Ø (�â&Ø×+Ñ+Ô/EÑEØ Ÿ™Ô(Ü%5°gÓ%>˜
ÜŸ™ØWØ#ŸN™NØ#ŸK™KØ$×0Ñ0Ø# a™KØ ×-Ñ-Ø&ôô Ÿ
™
 :Ô.Ø à×+Ñ+¨sÒ2Ü&8¸Ó&B˜Ø%0°1°g±:Ñ%=ÄÇÁÃÑ%O˜
Ø Ÿ™Ô(ÜŸ™ð.à#ŸN™NØ#ŸK™KØ&Ø# a™KØ ×-Ñ-ôô Ÿ
™
 :Ô.Ù à’ðO 4ðz Ð(Ð(Ð(ØÐøô+ ×&Ñ&¬×(<Ñ(<¼e×>OÑ>OÐPò Ù&Ü!1°'Ó!:�JÜ—L‘Lð>àŸ™ØŸ™Ø !™Ø×)Ñ)Ø"Øô	ô —J‘J˜zÔ*ÝÜ,Ø8Ø×(Ñ(¨1Ñ,Ð-¨[¸¸ð?óð ðûðús,   ¯B(E<ÃBE<Å1E<Å<2H6Æ.AH1ÈH1È1H6c                ó8   — | j                   j                  «        y r   )r   r'   ©r   s    r   r'   zRetryTransport.closex   s   € Ø�‰×ÑÕr   )r   Úintr   zhttpx.BaseTransport | NoneÚreturnÚNone©r3   zhttpx.Requestr=   úhttpx.Response©r=   r>   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   r'   © r   r   r   r       s>   „ ñ	ð Ø04ñ	(ð ð(ð .ð	(ð
 
ó(óAôF r   r   c                  ó:   — e Zd ZdZdddœ	 	 	 	 	 dd„Zd	d„Zd
d„Zy)ÚAsyncRetryTransportz…Async httpx transport that retries on transient errors.

    Async equivalent of RetryTransport. See RetryTransport for details.
    r   Nr   c               óL   — |xs t        j                  «       | _        || _        y r   )r   ÚAsyncHTTPTransportr   r   r   s      r   r   zAsyncRetryTransport.__init__‚   s!   € ð $ÒA¤u×'?Ñ'?Ó'AˆŒØ'ˆÕr   c              ƒ  óô  K  — d }t        | j                  dz   «      D �]  }|| j                  k(  }	 | j                  j                  |«      ƒ d {  –—† }|}|�sB|j                  t
        v r‡|j                  «       ƒ d {  –—†  t        |«      }t        j                  d|j                  |j                  |j                  |dz   | j                  |«       t        j                  |«      ƒ d {  –—†  ŒÕ|j                  dk(  ršt        |«      }|d|z  z  t        j                  «       z   }|j                  «       ƒ d {  –—†  t        j                  d|j                  |j                  ||dz   | j                  «       t        j                  |«      ƒ d {  –—†  �Œ~|c S  |€J ‚|S 7 �ŒW7 �Œ+7 Œ¿7 Œq7 Œ# t         j"                  t         j$                  t         j&                  f$ r‘}|skt        |«      }t        j                  d|j                  |j                  |dz   | j                  ||«       t        j                  |«      ƒ d {  –—†7   Y d }~�Œ4t)        d| j                  dz   › d|› �«      |‚d }~ww xY w­wr!   )r#   r   r   Úhandle_async_requestr%   r&   Úacloser   r(   r)   r*   r+   Úasyncior-   r.   r   r   r/   r0   r1   r   r2   s	            r   rL   z(AsyncRetryTransport.handle_async_request‹   sJ  è ø€ Ø/3ˆä˜T×.Ñ.°Ñ2×3ˆGØ%¨×):Ñ):Ñ:ˆOð8Ø!%§¡×!EÑ!EÀgÓ!N×N�Ø (�â&Ø×+Ñ+Ô/EÑEØ&Ÿo™oÓ/×/Ð/Ü%5°gÓ%>˜
ÜŸ™ØWØ#ŸN™NØ#ŸK™KØ$×0Ñ0Ø# a™KØ ×-Ñ-Ø&ôô &Ÿm™m¨JÓ7×7Ð7Ø à×+Ñ+¨sÒ2Ü&8¸Ó&B˜Ø%0°1°g±:Ñ%=ÄÇÁÃÑ%O˜
Ø&Ÿo™oÓ/×/Ð/ÜŸ™ð.à#ŸN™NØ#ŸK™KØ&Ø# a™KØ ×-Ñ-ôô &Ÿm™m¨JÓ7×7Ð7Ù à’ðO 4ðz Ð(Ð(Ð(ØÐðu Oùð
 0ùð 8øð 0øð 8ùô
 ×&Ñ&¬×(<Ñ(<¼e×>OÑ>OÐPò Ù&Ü!1°'Ó!:�JÜ—L‘Lð>àŸ™ØŸ™Ø !™Ø×)Ñ)Ø"Øô	ô "Ÿ-™-¨
Ó3×3Ñ3ÝÜ,Ø8Ø×(Ñ(¨1Ñ,Ð-¨[¸¸ð?óð ðûðüs¶   ‚.I8±F2ÁF&Á.F2Á>F)Á?A-F2Ã,F,Ã-F2Ã1I8Ã2A
F2Ä<F.Ä=AF2ÆF0ÆF2ÆI8ÆF2Æ
I8Æ&F2Æ)F2Æ,F2Æ.F2Æ0F2Æ22I5Ç$A!I0ÉIÉI0ÉI8ÉI0É0I5É5I8c              ƒ  óT   K  — | j                   j                  «       ƒ d {  –—†  y 7 Œ­wr   )r   rM   r;   s    r   rM   zAsyncRetryTransport.acloseÎ   s   è ø€ Ø�o‰o×$Ñ$Ó&×&Ò&ús   ‚( &¡()r   r<   r   zhttpx.AsyncBaseTransport | Noner=   r>   r?   rA   )rB   rC   rD   rE   r   rL   rM   rF   r   r   rH   rH   |   s>   „ ñð Ø59ñ	(ð ð(ð 3ð	(ð
 
ó(óAôF'r   rH   c                ó�   — | j                   j                  dd«      }	 t        t        |«      d«      S # t        t
        f$ r Y yw xY w)z9Parse Retry-After header value, defaulting to 1.0 second.zretry-afterÚ1g        g      ð?)ÚheadersÚgetÚmaxÚfloatÚ
ValueErrorÚ	TypeError)r6   Úraws     r   r.   r.   Ò   sG   € à
×
Ñ
×
Ñ
˜}¨cÓ
2€CðÜ”5˜“:˜sÓ#Ð#øÜœ	Ð"ò Ùðús   ž3 ³AÁA)r   r<   r=   rU   )r6   r@   r=   rU   )rE   Ú
__future__r   rN   Úloggingr   r,   r   Úlangsmith.sandbox._exceptionsr   Ú	getLoggerrB   r(   Ú	frozensetr&   r   r   ÚBaseTransportr   ÚAsyncBaseTransportrH   r.   rF   r   r   Ú<module>r`      sw   ðñõ #ã Û Û Û ã å @à	ˆ×	Ñ	˜8Ó	$€á"¢?Ó3Ð à€ó;ô
Y �U×(Ñ(ô Y ôxS'˜%×2Ñ2ô S'ôlr   