ó
    üÞ jA  ã                  óð   • S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  \R                  " \5      r\" 1 Sk5      rSrSS jr " S	 S
\R$                  5      r " S S\R(                  5      rSS jrg)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)Úhttpx)ÚSandboxConnectionError>   éö  é÷  éø  g      $@c                óT   • [        SU -  [        R                  " 5       -   [        5      $ )z@Compute exponential backoff with jitter, capped at _MAX_BACKOFF.é   )ÚminÚrandomÚ_MAX_BACKOFF)Úattempts    ÚV/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/sandbox/_transport.pyÚ_compute_backoffr      s   € äˆq�'‰zœFŸMšM›OÑ+¬\Ó:Ð:ó    c                  óJ   • \ rS rSrSrSSS.     S
S jjrSS jrSS jrS	rg)ÚRetryTransporté   aQ  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               óV   • U=(       d    [         R                  " 5       U l        Xl        g ©N)r   ÚHTTPTransportÚ
_transportÚ_max_retries©Úselfr   r   s      r   Ú__init__ÚRetryTransport.__init__+   s   € ð $×<¤u×':Ò':Ó'<ˆŒØ'Õr   c                óž  • S n[        U R                  S-   5       GHc  nX0R                  :H  n U R                  R                  U5      nUnU(       Gd*  UR                  [
        ;   ay  UR                  5         [        U5      n[        R                  SUR                  UR                  UR                  US-   U R                  U5        [        R                  " U5        MÅ  UR                  S:X  a�  [        U5      nUSU-  -  [        R                  " 5       -   nUR                  5         [        R                  SUR                  UR                  UUS-   U R                  5        [        R                  " U5        GMb  Us  $    Uc   eU$ ! [         R"                  [         R$                  [         R&                  4 a�  nU(       dd  [        U5      n[        R                  SUR                  UR                  US-   U R                  UU5        [        R                  " U5         S nAGM  [)        SU R                  S-    SU 35      UeS nAff = f©	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&   ÚRetryTransport.handle_request4   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,   ®B0F
Ã BF
Å=F
Æ
3IÆ=A$IÈ(IÉIc                ó8   • U R                   R                  5         g r   )r   r)   ©r   s    r   r)   ÚRetryTransport.closew   s   € Ø�‰×ÑÕr   ©r   r   )r   Úintr   zhttpx.BaseTransport | NoneÚreturnÚNone©r5   zhttpx.RequestrB   úhttpx.Response©rB   rC   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r    r&   r)   Ú__static_attributes__© r   r   r   r      s>   † ñ	ð Ø04ñ	(ð ð(ð .ð	(ð
 
õ(ôA÷F r   r   c                  óJ   • \ rS rSrSrSSS.     S
S jjrSS jrSS jrS	rg)ÚAsyncRetryTransporté{   z}Async httpx transport that retries on transient errors.

Async equivalent of RetryTransport. See RetryTransport for details.
r   Nr   c               óV   • U=(       d    [         R                  " 5       U l        Xl        g r   )r   ÚAsyncHTTPTransportr   r   r   s      r   r    ÚAsyncRetryTransport.__init__�   s   € ð $×A¤u×'?Ò'?Ó'AˆŒØ'Õr   c              ƒ  ó   #   • S n[        U R                  S-   5       GH‹  nX0R                  :H  n U R                  R                  U5      I S h  v•N nUnU(       GdJ  UR                  [
        ;   a‰  UR                  5       I S h  v•N   [        U5      n[        R                  SUR                  UR                  UR                  US-   U R                  U5        [        R                  " U5      I S h  v•N   MÝ  UR                  S:X  a�  [        U5      nUSU-  -  [        R                  " 5       -   nUR                  5       I S h  v•N   [        R                  SUR                  UR                  UUS-   U R                  5        [        R                  " U5      I S h  v•N   GMŠ  Us  $    Uc   eU$  GNf GN3 NÆ Nu N! [         R"                  [         R$                  [         R&                  4 a˜  nU(       dm  [        U5      n[        R                  SUR                  UR                  US-   U R                  UU5        [        R                  " U5      I S h  v•N     S nAGMJ  [)        SU R                  S-    SU 35      UeS nAff = f7fr#   )r%   r   r   Úhandle_async_requestr'   r(   Úacloser   r*   r+   r,   r-   Úasyncior/   r0   r   r   r1   r2   r3   r   r4   s	            r   rU   Ú(AsyncRetryTransport.handle_async_requestŠ   sC  é € Ø/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¶   ‚-J°G ÁF4Á5G ÂF7ÂA.G Ã3F:Ã4G Ã8JÃ:AG ÅF<ÅAG ÆF>Æ G Æ$JÆ'G Æ(JÆ4G Æ7G Æ:G Æ<G Æ>G Ç 3JÇ3A'JÉIÉJÉ JÉ'JÊJÊJc              ƒ  óT   #   • U R                   R                  5       I S h  v•N   g  N7fr   )r   rV   r>   s    r   rV   ÚAsyncRetryTransport.acloseÍ   s   é € Ø�o‰o×$Ñ$Ó&×&Ó&ùs   ‚( &¡(r@   )r   rA   r   zhttpx.AsyncBaseTransport | NonerB   rC   rD   rF   )	rG   rH   rI   rJ   rK   r    rU   rV   rL   rM   r   r   rO   rO   {   s>   † ñð Ø59ñ	(ð ð(ð 3ð	(ð
 
õ(ôA÷F'r   rO   c                ó’   • U R                   R                  SS5      n [        [        U5      S5      $ ! [        [
        4 a     gf = f)z9Parse Retry-After header value, defaulting to 1.0 second.zretry-afterÚ1g        g      ð?)ÚheadersÚgetÚmaxÚfloatÚ
ValueErrorÚ	TypeError)r8   Úraws     r   r0   r0   Ñ   sG   € à
×
Ñ
×
Ñ
˜}¨cÓ
2€CðÜ”5˜“:˜sÓ#Ð#øÜœ	Ð"ó Ùðús   ž3 ³AÁA)r   rA   rB   r`   )r8   rE   rB   r`   )rK   Ú
__future__r   rW   Úloggingr   r.   Ú langsmith._openapi_client._httpxr   Úlangsmith.sandbox._exceptionsr   Ú	getLoggerrG   r*   Ú	frozensetr(   r   r   ÚBaseTransportr   ÚAsyncBaseTransportrO   r0   rM   r   r   Ú<module>rl      su   ðñõ #ã Û Û Û å 2Ý @à	×	Ò	˜8Ó	$€á"¢?Ó3Ð à€ô;ô
Y �U×(Ñ(ô Y ôxS'˜%×2Ñ2ô S'õlr   