§
    ~Štj  ã                  óä   — 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dS )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      $@ÚattemptÚintÚreturnÚfloatc                óZ   — t          d| z  t          j        ¦   «         z   t          ¦  «        S )z@Compute exponential backoff with jitter, capped at _MAX_BACKOFF.é   )ÚminÚrandomÚ_MAX_BACKOFF)r   s    úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/sandbox/_transport.pyÚ_compute_backoffr      s!   € åˆq�'‰z�FœM™OœOÑ+­\Ñ:Ô:Ð:ó    c                  ó2   — e Zd ZdZdddœdd„Zdd„Zdd„ZdS )Ú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Ú	transportr   r	   r   úhttpx.BaseTransport | Noner
   ÚNonec               óH   — |pt          j        ¦   «         | _        || _        d S ©N)ÚhttpxÚHTTPTransportÚ
_transportÚ_max_retries©Úselfr   r   s      r   Ú__init__zRetryTransport.__init__,   s'   € ð $Ð<¥uÔ':Ñ'<Ô'<ˆŒØ'ˆÔÐÐr   Úrequestúhttpx.Requestúhttpx.Responsec                ó  — d }t          | j        dz   ¦  «        D �]ç}|| j        k    }	 | j                             |¦  «        }|}|�s|j        t
          v ro|                     ¦   «          t          |¦  «        }t           	                    d|j
        |j        |j        |dz   | j        |¦  «         t          j        |¦  «         Œ«|j        dk    r†t          |¦  «        }|d|z  z  t          j        ¦   «         z   }|                     ¦   «          t           	                    d|j
        |j        ||dz   | j        ¦  «         t          j        |¦  «         �Œ<|c S # t           j        t           j        t           j        f$ r€}|s[t          |¦  «        }t           	                    d|j
        |j        |dz   | j        ||¦  «         t          j        |¦  «         Y d }~�ŒÃt)          d| j        dz   › d|› �¦  «        |‚d }~ww xY w|€J ‚|S ©	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#   r%   Úlast_responser   Úis_last_attemptÚresponseÚ
sleep_timeÚretry_afterÚexcs	            r   r,   zRetryTransport.handle_request5   sV  € Ø/3ˆå˜TÔ.°Ñ2Ñ3Ô3ð ;	ñ ;	ˆGØ%¨Ô):Ò:ˆOð8Øœ?×9Ò9¸'ÑBÔB�Ø (�à&ñ !ØÔ+Õ/EÐEÐEØ ŸšÑ(Ô(Ð(Ý%5°gÑ%>Ô%>˜
ÝŸšØWØ#œNØ#œKØ$Ô0Ø# a™KØ Ô-Ø&ñô ð õ œ
 :Ñ.Ô.Ð.Ø àÔ+¨sÒ2Ð2Ý&8¸Ñ&BÔ&B˜Ø%0°1°g±:Ñ%=ÅÄÁÄÑ%O˜
Ø ŸšÑ(Ô(Ð(ÝŸšð.à#œNØ#œKØ&Ø# a™KØ Ô-ñô ð õ œ
 :Ñ.Ô.Ð.Ù à���øåÔ&­Ô(<½eÔ>OÐPð ð ð Ø&ð Ý!1°'Ñ!:Ô!:�JÝ—L’Lð>àœØœØ !™ØÔ)Ø"Øñ	ô 	ð 	õ ”J˜zÑ*Ô*Ð*Ø�H�H�H‘HÝ,ð?ØÔ(¨1Ñ,ð?ð ?Ø9<ð?ð ?ñô ð ðøøøøðøøøð( Ð(Ð(Ð(ØÐs,   ©BEÃBEÅEÅ&H Æ AG;ÇG;Ç;H c                ó8   — | j                              ¦   «          d S r   )r    r/   ©r#   s    r   r/   zRetryTransport.closex   s   € ØŒ×ÒÑÔÐÐÐr   )r   r	   r   r   r
   r   ©r%   r&   r
   r'   ©r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r,   r/   © r   r   r   r       sq   € € € € € ð	ð 	ð Ø04ð	(ð (ð (ð (ð (ð (ðAð Að Að AðF ð  ð  ð  ð  ð  r   r   c                  ó2   — e Zd ZdZdddœdd„Zdd„Zdd„ZdS )ÚAsyncRetryTransportz…Async httpx transport that retries on transient errors.

    Async equivalent of RetryTransport. See RetryTransport for details.
    r   Nr   r   r	   r   úhttpx.AsyncBaseTransport | Noner
   r   c               óH   — |pt          j        ¦   «         | _        || _        d S r   )r   ÚAsyncHTTPTransportr    r!   r"   s      r   r$   zAsyncRetryTransport.__init__‚   s'   € ð $ÐA¥uÔ'?Ñ'AÔ'AˆŒØ'ˆÔÐÐr   r%   r&   r'   c              ƒ  ó^  K  — d }t          | j        dz   ¦  «        D �]}|| j        k    }	 | j                             |¦  «        ƒ d {V —†}|}|�s&|j        t
          v r{|                     ¦   «         ƒ d {V —† t          |¦  «        }t           	                    d|j
        |j        |j        |dz   | j        |¦  «         t          j        |¦  «        ƒ d {V —† Œ½|j        dk    r’t          |¦  «        }|d|z  z  t          j        ¦   «         z   }|                     ¦   «         ƒ d {V —† t           	                    d|j
        |j        ||dz   | j        ¦  «         t          j        |¦  «        ƒ d {V —† �ŒZ|c S # t           j        t           j        t           j        f$ r†}|sat          |¦  «        }t           	                    d|j
        |j        |dz   | j        ||¦  «         t          j        |¦  «        ƒ d {V —† Y d }~�Œçt)          d| j        dz   › d|› �¦  «        |‚d }~ww xY w|€J ‚|S r)   )r+   r!   r    Úhandle_async_requestr-   r.   Úacloser   r0   r1   r2   r3   Úasyncior5   r6   r   r   r7   r8   r9   r   r:   s	            r   rP   z(AsyncRetryTransport.handle_async_request‹   sÆ  è è € Ø/3ˆå˜TÔ.°Ñ2Ñ3Ô3ð ;	ñ ;	ˆGØ%¨Ô):Ò:ˆOð8Ø!%¤×!EÒ!EÀgÑ!NÔ!NÐNÐNÐNÐNÐNÐN�Ø (�à&ñ !ØÔ+Õ/EÐEÐEØ&ŸošoÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ý%5°gÑ%>Ô%>˜
ÝŸšØWØ#œNØ#œKØ$Ô0Ø# a™KØ Ô-Ø&ñô ð õ &œm¨JÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ø àÔ+¨sÒ2Ð2Ý&8¸Ñ&BÔ&B˜Ø%0°1°g±:Ñ%=ÅÄÁÄÑ%O˜
Ø&ŸošoÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ÝŸšð.à#œNØ#œKØ&Ø# a™KØ Ô-ñô ð õ &œm¨JÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ù à���øåÔ&­Ô(<½eÔ>OÐPð ð ð Ø&ð Ý!1°'Ñ!:Ô!:�JÝ—L’Lð>àœØœØ !™ØÔ)Ø"Øñ	ô 	ð 	õ "œ-¨
Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø�H�H�H‘HÝ,ð?ØÔ(¨1Ñ,ð?ð ?Ø9<ð?ð ?ñô ð ðøøøøðøøøð( Ð(Ð(Ð(ØÐs,   «B-E:ÃBE:Å6E:Å:&H&Æ AH!ÈH!È!H&c              ƒ  óH   K  — | j                              ¦   «         ƒ d {V —† d S r   )r    rQ   rB   s    r   rQ   zAsyncRetryTransport.acloseÎ   s2   è è € ØŒo×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&r   )r   r	   r   rL   r
   r   rC   rD   )rE   rF   rG   rH   r$   rP   rQ   rI   r   r   rK   rK   |   sq   € € € € € ðð ð Ø59ð	(ð (ð (ð (ð (ð (ðAð Að Að AðF'ð 'ð 'ð 'ð 'ð 'r   rK   r=   r'   c                ó¤   — | j                              dd¦  «        }	 t          t          |¦  «        d¦  «        S # t          t
          f$ r Y dS w xY w)z9Parse Retry-After header value, defaulting to 1.0 second.zretry-afterÚ1g        g      ð?)ÚheadersÚgetÚmaxr   Ú
ValueErrorÚ	TypeError)r=   Úraws     r   r6   r6   Ò   s\   € à
Ô
×
Ò
˜}¨cÑ
2Ô
2€CðÝ•5˜‘:”:˜sÑ#Ô#Ð#øÝ�	Ð"ð ð ð Øˆsˆsðøøøs   �: ºAÁA)r   r	   r
   r   )r=   r'   r
   r   )rH   Ú
__future__r   rR   Úloggingr   r4   r   Úlangsmith.sandbox._exceptionsr   Ú	getLoggerrE   r0   Ú	frozensetr.   r   r   ÚBaseTransportr   ÚAsyncBaseTransportrK   r6   rI   r   r   ú<module>rc      s+  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€à €€€à @Ð @Ð @Ð @Ð @Ð @à	ˆÔ	˜8Ñ	$Ô	$€à"˜ ? ? ?Ñ3Ô3Ð à€ð;ð ;ð ;ð ;ð
Y ð Y ð Y ð Y ð Y �UÔ(ñ Y ô Y ð Y ðxS'ð S'ð S'ð S'ð S'˜%Ô2ñ S'ô S'ð S'ðlð ð ð ð ð r   