
    a
i                        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    C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langsmith/sandbox/_transport.py_compute_backoffr      s!    q'zFMOO+\:::    c                  2    e Zd ZdZdddddZddZddZdS )RetryTransportad  Sync httpx transport that retries on transient errors.

    Retries on:
    - 502/503/504 with exponential backoff
    - 429 with Retry-After header support
    - Connection errors 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    rt          |          }|d|z  z  t          j                    z   }|                                 t          	                    d|j
        |j        ||dz   | j                   t          j        |           <|c S # t           j        $ 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   ConnectErrorr   	r#   r%   last_responser   is_last_attemptresponse
sleep_timeretry_afterexcs	            r   r,   zRetryTransport.handle_request5   sI   /3T.233 ;	 ;	G%)::O8?99'BB (& !+/EEE (((%5g%>%>
W#N#K$0#aK -&   
:... +s22&8&B&B%01g:%=%O
 (((.#N#K&#aK -   
:... %   & !1'!:!:JLL>!)"	 	 	 Jz***HHHH,?(1,? ?9<? ?  ( (((s,   BEBEEG))AG$G$$G)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 )AsyncRetryTransportzAsync 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'     $Au'?'A'A'r   r%   r&   r'   c                0  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    rt          |          }|d|z  z  t          j                    z   }|                                 d {V  t          	                    d|j
        |j        ||dz   | j                   t          j        |           d {V  Z|c S # t           j        $ 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   r   r8   s	            r   rN   z(AsyncRetryTransport.handle_async_request   s     /3T.233 ;	 ;	G%)::O8!%!E!Eg!N!NNNNNNN (& !+/EEE&oo/////////%5g%>%>
W#N#K$0#aK -&   &mJ777777777 +s22&8&B&B%01g:%=%O
&oo/////////.#N#K&#aK -   &mJ777777777 %   & !1'!:!:JLL>!)"	 	 	 "-
333333333HHHH,?(1,? ?9<? ?  ( (((s,   B-E:BE:6E::H	AH
,H

Hc                H   K   | j                                          d {V  d S r   )r    rO   r@   s    r   rO   zAsyncRetryTransport.aclose   s2      o$$&&&&&&&&&&&r   )r   r	   r   rJ   r
   r   rA   rB   )rC   rD   rE   rF   r$   rN   rO   rG   r   r   rI   rI   |   sq          59	( ( ( ( ( (A A A AF' ' ' ' ' 'r   rI   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
2C5::s###	"   sss   : AA)r   r	   r
   r   )r;   r'   r
   r   )rF   
__future__r   rP   loggingr   r4   r   langsmith.sandbox._exceptionsr   	getLoggerrC   r0   	frozensetr.   r   r   BaseTransportr   AsyncBaseTransportrI   r6   rG   r   r   <module>ra      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   