Ë
    ³ŒjxË  ã                  óÔ  — 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Zddl	m
Z
mZ ddlmZ ddlmZmZmZmZ ddlmZ ddlZddlmZ dd	lmZ dd
lmZmZmZmZm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 erddl6m7Z7 ddl8m9Z9 dd„Z:dd„Z;eee<e<f      Z=dd„Z>dd„Z?d d„Z@	 	 	 	 	 	 d!d„ZA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d"d„ZB G d„ d«      ZCy)#zEMain SandboxClient class for interacting with the sandbox server API.é    )ÚannotationsN)ÚCallableÚMapping)ÚPath)ÚTYPE_CHECKINGÚAnyÚOptionalÚUnion)Úquote)Úutils)Ú	Langsmith)ÚResourceCreationErrorÚResourceNameConflictErrorÚResourceNotFoundErrorÚResourceTimeoutErrorÚSandboxAPIError)Úhandle_client_http_errorÚhandle_sandbox_creation_errorÚmerge_headersÚvalidate_service_paramsÚvalidate_ttl)ÚDownloadContentDispositionÚDownloadURLÚResourceStatusÚ
ServiceURLÚSnapshot)ÚSandboxMountConfigÚ"validate_mount_config_proxy_config)ÚSandboxProxyConfig)ÚSandbox)ÚRetryTransport)ÚRegistriesResource©ÚAsyncSandboxClientc                 óX   — t        j                  dd¬«      } | j                  d«      › d�S )z†Get the default sandbox API endpoint from environment.

    Derives the endpoint from LANGSMITH_ENDPOINT (or LANGCHAIN_ENDPOINT).
    ÚENDPOINTzhttps://api.smith.langchain.com)ÚdefaultÚ/ú/v2/sandboxes)Úls_utilsÚget_env_varÚrstrip)Úbases    úc/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/sandbox/_client.pyÚ_get_default_api_endpointr/   8   s.   € ô
 ×Ñ 
Ð4UÔV€DØ�k‰k˜#ÓÐ˜}Ð-Ð-ó    c                 ó,   — t        j                  d«      S )z)Get the default API key from environment.ÚAPI_KEY)r*   r+   © r0   r.   Ú_get_default_api_keyr4   A   s   € ä×Ñ 	Ó*Ð*r0   c                ó6   — | st        d«      ‚t        | d¬«      S )zCQuote a user-controlled value for use as a single URL path segment.z+URL path segment must be a non-empty stringÚ )Úsafe)Ú
ValueErrorr   )Úvalues    r.   Ú_quote_path_segmentr:   I   s   € áÜÐFÓGÐGÜ�˜RÔ Ð r0   c                óV   — |rddj                  |«      z   nd}| › dt        |«      › |› �S )zDBuild the URL for a sandbox, optionally with trailing path segments.r(   r6   z/boxes/)Újoinr:   )Úbase_urlÚnameÚsegmentsÚsuffixs       r.   Ú_box_urlrA   P   s5   € á)1ˆS�3—8‘8˜HÓ%Ò%°r€FØˆZ�wÔ2°4Ó8Ð9¸&¸ÐBÐBr0   c                ó¤  — t        j                  «       }t        j                  |d¬«      5 }t	        | j                  d«      «      D ]T  }|j                  | «      }|j                  r|j                  d   dk(  rŒ3|j                  ||j                  «       d¬«       ŒV 	 d d d «       |j                  «       S # 1 sw Y   |j                  «       S xY w)NÚw)ÚfileobjÚmodeÚ*r   z.gitF)ÚarcnameÚ	recursive)ÚioÚBytesIOÚtarfileÚopenÚsortedÚrglobÚrelative_toÚpartsÚaddÚas_posixÚgetvalue)Úcontext_pathÚbufÚtarÚpathÚrels        r.   Ú_make_docker_context_tarrY   V   sŸ   € Ü
�*‰*‹,€CÜ	�‰˜c¨Õ	,°Ü˜<×-Ñ-¨cÓ2Ö3ˆDØ×"Ñ" <Ó0ˆCØ�yŠy˜SŸY™Y q™\¨VÒ3ØØ�G‰G�D #§,¡,£.¸EˆGÕBñ	 4÷ 
-ð �<‰<‹>Ð÷ 
-ð �<‰<‹>Ðús   ¬A2B7Â7Cc                óÆ  — t        |«      j                  «       j                  «       }t        | «      j                  «       }|j                  «       s||z  }|j                  «       }|j	                  «       st        d|› �«      ‚|j                  «       st        d|› �«      ‚	 |j                  |«      }||j                  «       fS # t
        $ r}t        d«      |‚d }~ww xY w)Nzcontext must be a directory: zdockerfile must be a file: z!dockerfile must be inside context)	r   Ú
expanduserÚresolveÚis_absoluteÚis_dirr8   Úis_filerO   rR   )Ú
dockerfileÚcontextrT   Údockerfile_pathÚdockerfile_relÚexcs         r.   Ú_resolve_dockerfile_contextre   a   sã   € ô ˜“=×+Ñ+Ó-×5Ñ5Ó7€LÜ˜:Ó&×1Ñ1Ó3€OØ×&Ñ&Ô(Ø&¨Ñ8ˆØ%×-Ñ-Ó/€OØ×ÑÔ ÜÐ8¸¸ÐGÓHÐHØ×"Ñ"Ô$ÜÐ6°Ð6GÐHÓIÐIðGØ(×4Ñ4°\ÓBˆð ˜×0Ñ0Ó2Ð2Ð2øô ò GÜÐ<Ó=À3ÐFûðGús   Â#C Ã	C ÃCÃC c                óv  — t        j                  | |«      }t        j                  |«      }t        j                  |«      }	t        j                  |d«      }
ddd|
z   ddddd	d
| z   d	d|z   dd|	z   dd|z   g}|�|j	                  dd|z   g«       t        |xs i j                  «       «      D ]  \  }}|j	                  dd|› d|› �g«       Œ  dt        j                  |«      › dt        j                  |«      › dt        j                  d|
z   «      › dt        j                  |«      › dt        j                  |dz   «      › dt        j                  d|
z   «      › dt        j                  |dz   «      › dt        j                  |dz   «      › dt        j                  |«      › dt        j                  |«      › d�S )Nzbuildkitd.sockÚbuildctlz--addrzunix://Úbuildz--progress=plainz
--frontendzdockerfile.v0z--localzcontext=zdockerfile=z--optz	filename=z--outputztype=docker,name=ztarget=z
build-arg:Ú=zset -euo pipefail
mkdir -p Ú z
buildkitd --addr z --root zq --oci-worker=true --containerd-worker=false --oci-worker-snapshotter=native --oci-worker-binary buildkit-runc > z/buildkitd.logz— 2>&1 &
buildkitd_pid=$!
cleanup() { kill "$buildkitd_pid" >/dev/null 2>&1 || true; }
trap cleanup EXIT
for i in $(seq 1 300); do
  if buildctl --addr zi debug workers >/dev/null 2>&1; then break; fi
  if ! kill -0 "$buildkitd_pid" >/dev/null 2>&1; then cat z+; exit 1; fi
  if [ "$i" = 300 ]; then cat z¬; exit 1; fi
  sleep 0.1
done
for i in $(seq 1 300); do
  if docker info >/dev/null 2>&1; then break; fi
  if [ "$i" = 300 ]; then docker info; exit 1; fi
  sleep 0.1
done
z | docker load
rm -rf z	 || true
)	Ú	posixpathr<   ÚdirnameÚbasenameÚextendrM   ÚitemsÚshlexr   )Úremote_contextrc   Ú	image_refÚbuildkit_rootÚbuildkit_runÚ
build_argsÚtargetÚdockerfile_remoteÚdockerfile_dirÚdockerfile_nameÚsocket_pathrg   Úkeyr9   s                 r.   Ú_make_dockerfile_build_commandr|   u   sé  € ô "Ÿ™ ~°~ÓFÐÜ×&Ñ&Ð'8Ó9€NÜ×(Ñ(Ð):Ó;€OÜ—.‘. Ð/?Ó@€KàØØ�KÑØØØØØØ�^Ñ#ØØ˜Ñ&ØØ�oÑ%ØØ˜iÑ'ð€Hð" ÐØ�‰˜ )¨fÑ"4Ð5Ô6Ü˜jÒ.¨B×5Ñ5Ó7Ö8‰
ˆˆUØ�‰˜ J¨s¨e°1°U°GÐ"<Ð=Õ>ð 9ð	Ü—K‘K Ó.Ð/¨q´·±¸\Ó1JÐ0Kð LÜ!ŸK™K¨	°KÑ(?Ó@ÐAð BÜ—+‘+˜mÓ,Ð-ð .ô �[‰[˜Ð(8Ñ8Ó9Ð:ð ; ô
 !&§¡¨I¸Ñ,CÓ DÐEð Fô �{‰{˜<Ð*:Ñ:Ó;Ð<ð =ä�{‰{˜<Ð*:Ñ:Ó;Ð<ð =ô �:‰:�hÓÐ
 ð !Ü—+‘+˜mÓ,Ð-¨Zð5	9ðr0   c                  ó†  — e Zd ZdZddddddœ	 	 	 	 	 	 	 	 	 d9d„Zd:d„Zed;d„«       Zd<d	„Zd<d
„Z	d=d„Z
d>d„Zd>d„Zd?d„Z	 	 	 	 	 	 	 	 d@d„Zd:d„Z	 dAddddddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBd„Z	 dAdddddddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCd„ZddœdDd„ZddœdEd„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 dFd„ZddœdGd„Zddœ	 	 	 	 	 dHd„Zdddœ	 	 	 	 	 	 	 	 	 dId „Zddddd!œ	 	 	 	 	 	 	 	 	 	 	 	 	 dJd"„Zd#d$dd%œ	 	 	 	 	 	 	 	 	 dKd&„Zd#dd'œ	 	 	 	 	 	 	 dLd(„ZddœdGd)„Zdd*dd+œ	 	 	 	 	 	 	 	 	 	 	 	 	 dMd,„Z	 dAd-dddddd*dd.œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dNd/„Zddd*dd0œ	 	 	 	 	 	 	 	 	 	 	 	 	 dOd1„Zddœ	 	 	 	 	 dPd2„Zddddd3œ	 	 	 	 	 	 	 	 	 dQd4„Z ddœ	 	 	 	 	 dRd5„Z!d6d7dd%œ	 	 	 	 	 	 	 	 	 dSd8„Z"y)TÚSandboxClientaŠ  Client for interacting with the Sandbox Server API.

    This client provides a simple interface for managing sandboxes and snapshots.

    Example:
        # Uses LANGSMITH_ENDPOINT and LANGSMITH_API_KEY from environment
        client = SandboxClient()

        # Or with explicit configuration
        client = SandboxClient(
            api_endpoint="https://api.smith.langchain.com/v2/sandboxes",
            api_key="your-api-key",
        )

        # Create a sandbox with the default runtime and run commands
        with client.sandbox() as sandbox:
            result = sandbox.run("python --version")
            print(result.stdout)
    Ng      $@é   ©Úapi_endpointÚtimeoutÚapi_keyÚmax_retriesÚheadersc               ól  — |xs
 t        «       j                  d«      | _        |xs
 t        «       }|| _        || _        || _        |rt        |«      ni | _        i }|r||d<   | j                  rt        || j                  «      }t        |¬«      }t        j                  |||¬«      | _        d| _        y)a©  Initialize the SandboxClient.

        Args:
            api_endpoint: Full URL of the sandbox API endpoint. If not provided,
                          derived from LANGSMITH_ENDPOINT environment variable.
            timeout: Default HTTP timeout in seconds.
            api_key: API key for authentication. If not provided, uses
                     LANGSMITH_API_KEY environment variable.
            max_retries: Maximum number of retries for transient errors (502, 503,
                         504), rate limits (429), and connection failures. Set to 0
                         to disable retries. Default: 3.
            headers: Optional default headers attached to every request on this
                     client, including the data-plane ``/execute`` HTTP endpoint
                     and the ``/execute/ws`` WebSocket upgrade. Use this to pass
                     additional auth headers (e.g. ``X-Service-Key``).
        r(   z	X-Api-Key)r„   )Ú	transportr‚   r…   N)r/   r,   Ú	_base_urlr4   Ú_api_keyÚ_timeoutÚ_max_retriesÚdictÚ_default_headersr   r!   ÚhttpxÚClientÚ_httpÚ_registries_client)	Úselfr�   r‚   rƒ   r„   r…   Úresolved_api_keyÚclient_headersr‡   s	            r.   Ú__init__zSandboxClient.__init__Ì   s¬   € ð2 'ÒEÔ*CÓ*E×MÑMÈcÓRˆŒØ"Ò<Ô&:Ó&<ÐØ(ˆŒØˆŒØ'ˆÔÙAH´°W´ÈbˆÔØ)+ˆÙØ*:ˆN˜;Ñ'Ø× Ò Ü*¨>¸4×;PÑ;PÓQˆNÜ"¨{Ô;ˆ	Ü—\‘\Ø¨¸.ô
ˆŒ
ð 8<ˆÕr0   c                ó†   — d}| j                   j                  |«      r| j                   dt        |«        S | j                   S )z>Return the API root URL, without the ``/v2/sandboxes`` suffix.r)   N)rˆ   ÚendswithÚlen)r’   r@   s     r.   Ú	_api_rootzSandboxClient._api_rootö   s:   € à ˆØ�>‰>×"Ñ" 6Ô*Ø—>‘> .¤S¨£[ LÐ1Ð1Ø�~‰~Ðr0   c                óÌ   — | j                   €9t        | j                  | j                  «       | j                  xs d¬«      | _         | j                   j
                  j                  S )aæ  Manage sandbox image registries: create, list, retrieve, update, delete.

        A registry stores credentials for pulling private images. Create one,
        then pass its ``id`` as ``registry_id`` when building a snapshot.

        Example:
            registry = client.registries.create(
                name="internal",
                url="registry.example.com",
                username="robot",
                password=os.environ["REGISTRY_PASSWORD"],
            )
            snapshot = client.create_snapshot(
                "internal-python",
                docker_image="registry.example.com/internal/python:3.12",
                fs_capacity_bytes=2 * 1024**3,
                registry_id=registry.id,
            )
        N)rƒ   r=   Údefault_headers)r‘   r   r‰   r™   r�   Ú	sandboxesÚ
registries©r’   s    r.   r�   zSandboxClient.registriesý   sV   € ð* ×"Ñ"Ð*Ü&/ØŸ™ØŸ™Ó)Ø $× 5Ñ 5Ò =¸ô'ˆDÔ#ð
 ×&Ñ&×0Ñ0×;Ñ;Ð;r0   c                óH   — |€yt        | j                  j                  |«      S )z8Merge default client headers with per-request overrides.N)r   r�   r…   ©r’   r…   s     r.   Ú_request_headerszSandboxClient._request_headers  s!   € àˆ?ØÜ˜TŸZ™Z×/Ñ/°Ó9Ð9r0   c                óL   — | j                   s|€yt        | j                   |«      S )zÜMerge constructor-supplied default headers with per-request overrides.

        Used by the WebSocket exec path so headers like ``X-Service-Key``
        set on the client are attached to the WS upgrade request.
        N)r�   r   r    s     r.   Ú_ws_default_headersz!SandboxClient._ws_default_headers   s'   € ð ×$Ò$¨¨ØÜ˜T×2Ñ2°GÓ<Ð<r0   c                ó”   — ddl m}  || j                  | j                  | j                  | j
                  | j                  xs d¬«      S )a[  Create an AsyncSandboxClient with the same configuration.

        The returned client has its own HTTP connection pool; close it
        independently (``await client.aclose()`` or ``async with``).

        Returns:
            AsyncSandboxClient with the same endpoint, credentials, timeout,
            retry, and header configuration.
        r   r#   Nr€   )Úlangsmith.sandbox._async_clientr$   rˆ   rŠ   r‰   r‹   r�   )r’   r$   s     r.   Úto_asynczSandboxClient.to_async*  sA   € õ 	Gá!ØŸ™Ø—M‘MØ—M‘MØ×)Ñ)Ø×)Ñ)Ò1¨Tô
ð 	
r0   c                ó†   — | j                   j                  «        | j                  �| j                  j                  «        yy)zClose the HTTP client.N)r�   Úcloser‘   rž   s    r.   r¨   zSandboxClient.close>  s5   € à�
‰
×ÑÔØ×"Ñ"Ð.Ø×#Ñ#×)Ñ)Õ+ð /r0   c                óÒ   — 	 | j                   j                  s| j                   j                  «        | j                  �| j                  j                  «        yy# t        $ r Y yw xY w)z,Close the HTTP client on garbage collection.N)r�   Ú	is_closedr¨   r‘   Ú	Exceptionrž   s    r.   Ú__del__zSandboxClient.__del__D  sY   € ð	Ø—:‘:×'Ò'Ø—
‘
× Ñ Ô"Ø×&Ñ&Ð2Ø×'Ñ'×-Ñ-Õ/ð 3øäò 	Ùð	ús   ‚AA Á	A&Á%A&c                ó   — | S )zEnter context manager.r3   rž   s    r.   Ú	__enter__zSandboxClient.__enter__N  s   € àˆr0   c                ó$   — | j                  «        y)zExit context manager.N)r¨   )r’   Úexc_typeÚexc_valÚexc_tbs       r.   Ú__exit__zSandboxClient.__exit__R  s   € ð 	�
‰
�r0   c                ó"   — d| j                   › d�S )z�Return a string representation of the instance.

        Returns:
            The string representation of the instance.
        zSandboxClient (API URL: Ú))rˆ   rž   s    r.   Ú__repr__zSandboxClient.__repr__[  s   € ð *¨$¯.©.Ð)9¸Ð;Ð;r0   é   ©Úsnapshot_namer>   r‚   Úidle_ttl_secondsÚdelete_after_stop_secondsÚvcpusÚ	mem_bytesÚfs_capacity_bytesÚmount_configÚproxy_configr…   c               óN   — | j                  |||||||||	|
||¬«      }d|_        |S )a   Create a sandbox and return a Sandbox instance.

        This is the primary method for creating sandboxes. Use it as a
        context manager for automatic cleanup:

            with client.sandbox(snapshot_id="<uuid>") as sandbox:
                result = sandbox.run("echo hello")

            # Resolve by snapshot name instead of ID:
            with client.sandbox(snapshot_name="my-snap") as sandbox:
                result = sandbox.run("echo hello")

        The sandbox is automatically deleted when exiting the context manager.
        For sandboxes with manual lifecycle management, use create_sandbox().

        Args:
            snapshot_id: Optional snapshot ID to boot from. Mutually exclusive
                with ``snapshot_name``.
            snapshot_name: Snapshot name to boot from. Resolved server-side to a
                snapshot owned by the caller's tenant. Mutually exclusive with
                ``snapshot_id``.
            name: Optional sandbox name (auto-generated if not provided).
            timeout: Timeout in seconds when waiting for ready.
            idle_ttl_seconds: Idle timeout in seconds. The launcher
                automatically stops the sandbox after this duration of
                inactivity. Must be a multiple of 60. ``0`` explicitly
                disables the idle stop. When omitted (``None``), the server
                applies a default of ``600`` seconds (10 minutes).
            delete_after_stop_seconds: Seconds after the sandbox enters the
                ``stopped`` state before it (and its filesystem clone) are
                permanently deleted. Must be a multiple of 60. ``0`` disables
                stop-anchored deletion (manual cleanup required). When
                omitted (``None``), the server applies its configured default.
            vcpus: Number of vCPUs.
            mem_bytes: Memory in bytes.
            fs_capacity_bytes: Root filesystem capacity in bytes.
            mount_config: Mount configuration forwarded to the server as
                ``mount_config``. The backend expands mount auth into runtime
                proxy rules. Explicit AWS/GCP proxy rules in ``proxy_config``
                conflict with mount auth for the same provider.
            proxy_config: Per-sandbox proxy configuration forwarded to the
                server as-is. Shape matches the backend `proxy_config` field:
                ``{"rules": [...], "no_proxy": [...], "access_control":
                {"allow_list": [...]}}`` or ``{"access_control":
                {"deny_list": [...]}}``. Use ``access_control.allow_list`` to
                restrict outbound HTTPS to a set of host patterns (exact
                domains, globs like ``*.example.com``, IPs, CIDRs, or
                ``~regex``). Use ``proxy_config`` with provider rule helpers
                such as ``aws_auth`` to let the proxy sign supported
                AWS HTTPS requests on the sandbox's behalf.

        Returns:
            Sandbox instance.

        Raises:
            ResourceTimeoutError: If timeout waiting for sandbox to be ready.
            ResourceCreationError: If sandbox creation fails.
            SandboxClientError: For other errors.
            ValueError: If TTL values are invalid, or if both ``snapshot_id`` and
                ``snapshot_name`` are provided.
        r¸   T)Úcreate_sandboxÚ_auto_delete)r’   Úsnapshot_idr¹   r>   r‚   rº   r»   r¼   r½   r¾   r¿   rÀ   r…   Úsbs                 r.   ÚsandboxzSandboxClient.sandboxg  sL   € ðZ × Ñ ØØ'ØØØ-Ø&?ØØØ/Ø%Ø%Øð !ó 
ˆð ˆŒØˆ	r0   T)r¹   r>   r‚   Úwait_for_readyrº   r»   r¼   r½   r¾   r¿   rÀ   r…   c               óR  — |r|rt        d«      ‚t        |d«       t        |d«       | j                  › d�}d|i}|r||d<   |r||d<   |r||d<   |r||d	<   |�||d<   |�||d<   |�||d<   |	�|	|d<   |
�|
|d<   |�t        ||«       ||d<   |�||d<   |r|dz   nd}	 | j                  j                  |||| j                  |«      ¬«      }|j                  «        t        j                  |j                  «       | d¬«      S # t        j                  $ r}t        |«       ‚ d
}~ww xY w)a
  Create a new Sandbox.

        The sandbox is NOT automatically deleted. Use delete_sandbox() for cleanup,
        or use sandbox() for automatic cleanup with a context manager.

        Args:
            snapshot_id: Optional snapshot ID to boot from. Mutually exclusive
                with ``snapshot_name``.
            snapshot_name: Snapshot name to boot from. Resolved server-side to a
                snapshot owned by the caller's tenant. Mutually exclusive with
                ``snapshot_id``.
            name: Optional sandbox name (auto-generated if not provided).
            timeout: Timeout in seconds when waiting for ready (only used when
                wait_for_ready=True).
            wait_for_ready: If True (default), block until sandbox is ready.
                If False, return immediately with status "provisioning". Use
                get_sandbox_status() or wait_for_sandbox() to poll for readiness.
            idle_ttl_seconds: Idle timeout in seconds. The launcher
                automatically stops the sandbox after this duration of
                inactivity. Must be a multiple of 60. ``0`` explicitly
                disables the idle stop. When omitted (``None``), the server
                applies a default of ``600`` seconds (10 minutes).
            delete_after_stop_seconds: Seconds after the sandbox enters the
                ``stopped`` state before it (and its filesystem clone) are
                permanently deleted. Must be a multiple of 60. ``0`` disables
                stop-anchored deletion (manual cleanup required). When
                omitted (``None``), the server applies its configured default.
            vcpus: Number of vCPUs.
            mem_bytes: Memory in bytes.
            fs_capacity_bytes: Root filesystem capacity in bytes.
            mount_config: Mount configuration forwarded to the server as
                ``mount_config``. The backend expands mount auth into runtime
                proxy rules. Explicit AWS/GCP proxy rules in ``proxy_config``
                conflict with mount auth for the same provider.
            proxy_config: Per-sandbox proxy configuration forwarded to the
                server as-is. Shape matches the backend `proxy_config` field:
                ``{"rules": [...], "no_proxy": [...], "access_control":
                {"allow_list": [...]}}`` or ``{"access_control":
                {"deny_list": [...]}}``. Use ``access_control.allow_list`` to
                restrict outbound HTTPS to a set of host patterns (exact
                domains, globs like ``*.example.com``, IPs, CIDRs, or
                ``~regex``). Use ``proxy_config`` with provider rule helpers
                such as ``aws_auth`` to let the proxy sign supported
                AWS HTTPS requests on the sandbox's behalf.

        Returns:
            Created Sandbox. When wait_for_ready=False, the sandbox will have
            status="provisioning" and cannot be used for operations until ready.

        Raises:
            ResourceTimeoutError: If timeout waiting for sandbox to be ready.
            ResourceCreationError: If sandbox creation fails.
            SandboxClientError: For other errors.
            ValueError: If TTL values are invalid, or if both ``snapshot_id`` and
                ``snapshot_name`` are provided.
        z6At most one of snapshot_id or snapshot_name may be setrº   r»   ú/boxesrÇ   rÄ   r¹   r‚   r>   Nr¼   r½   r¾   r¿   rÀ   r·   )Újsonr‚   r…   F©ÚclientÚauto_delete)r8   r   rˆ   r   r�   Úpostr¡   Úraise_for_statusr    Ú	from_dictrÊ   rŽ   ÚHTTPStatusErrorr   )r’   rÄ   r¹   r>   r‚   rÇ   rº   r»   r¼   r½   r¾   r¿   rÀ   r…   ÚurlÚpayloadÚhttp_timeoutÚresponseÚes                      r.   rÂ   zSandboxClient.create_sandboxÅ  s‰  € ñR ™=ÜÐUÓVÐVÜÐ%Ð'9Ô:ÜÐ.Ð0KÔLà—‘Ð  Ð'ˆð ˜nð#
ˆñ Ø%0ˆG�MÑ"ÙØ'4ˆG�OÑ$ÙØ!(ˆG�IÑÙØ"ˆG�F‰OØÐ'Ø*:ˆGÐ&Ñ'Ø$Ð0Ø3LˆGÐ/Ñ0ØÐØ$ˆG�GÑØÐ Ø#,ˆG�KÑ ØÐ(Ø+<ˆGÐ'Ñ(ØÐ#Ü.¨|¸\ÔJØ&2ˆG�NÑ#ØÐ#Ø&2ˆG�NÑ#á)7˜ "š¸Rˆð	Ø—z‘z—‘ØØØ$Ø×-Ñ-¨gÓ6ð	 'ó ˆHð ×%Ñ%Ô'Ü×$Ñ$ X§]¡]£_¸TÈuÔUÐUøÜ×$Ñ$ò 	Ü)¨!Ô,Øûð	ús   ÂA#D ÄD&ÄD!Ä!D&©r…   c               ó˜  — t        | j                  |«      }	 | j                  j                  || j	                  |«      ¬«      }|j                  «        t        j                  |j                  «       | d¬«      S # t        j                  $ r<}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       ‚ d	}~ww xY w)
aF  Get a Sandbox by name.

        The sandbox is NOT automatically deleted. Use delete_sandbox() for cleanup.

        Args:
            name: Sandbox name.

        Returns:
            Sandbox.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            SandboxClientError: For other errors.
        r×   FrË   é”  ú	Sandbox 'ú' not foundrÆ   ©Úresource_typeN)rA   rˆ   r�   Úgetr¡   rÏ   r    rÐ   rÊ   rŽ   rÑ   rÕ   Ústatus_coder   r   ©r’   r>   r…   rÒ   rÕ   rÖ   s         r.   Úget_sandboxzSandboxClient.get_sandbox?  s´   € ô �t—~‘~ tÓ,ˆð
	Ø—z‘z—~‘~ c°4×3HÑ3HÈÓ3Q�~ÓRˆHØ×%Ñ%Ô'Ü×$Ñ$ X§]¡]£_¸TÈuÔUÐUøÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % QÔ'Øûð	ús   ˜A!A: Á:C	Â7CÃC	c               óÐ  — | j                   › d�}	 | j                  j                  || j                  |«      ¬«      }|j	                  «        |j                  «       }|j                  dg «      D �cg c]  }t        j                  || d¬«      ‘Œ c}S c c}w # t        j                  $ r:}|j                  j                  dk(  rt        d|› d�«      |‚t        |«       ‚ d	}~ww xY w)
zMList all Sandboxes.

        Returns:
            List of Sandboxes.
        rÉ   r×   rœ   FrË   rÙ   úAPI endpoint not found: ú%. Check that api_endpoint is correct.N)rˆ   r�   rÞ   r¡   rÏ   rÊ   r    rÐ   rŽ   rÑ   rÕ   rß   r   r   )r’   r…   rÒ   rÕ   ÚdataÚcrÖ   s          r.   Úlist_sandboxeszSandboxClient.list_sandboxes\  sí   € ð —‘Ð  Ð'ˆð	Ø—z‘z—~‘~ c°4×3HÑ3HÈÓ3Q�~ÓRˆHØ×%Ñ%Ô'Ø—=‘=“?ˆDð Ÿ™ +¨rÔ2óá2�Aô ×!Ñ! !¨D¸eÖDØ2ñð ùò øô ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü%Ø.¨s¨eð 4:ð ;óð ðô % QÔ'Øûð	ús*   ‘A B Á1BÂB ÂB ÂC%Â+5C Ã C%)Únew_namerº   r»   r…   c               óN  — t        |d«       t        |d«       t        | j                  |«      }i }|�||d<   |�||d<   |�||d<   	 | j                  j	                  ||| j                  |«      ¬«      }|j                  «        t        j                  |j                  «       | d¬«      S # t        j                  $ rg}	|	j                  j                  dk(  rt        d	|› d
�d¬«      |	‚|	j                  j                  dk(  rt        d|› d�d¬«      |	‚t!        |	«       ‚ d}	~	ww xY w)a]  Update a sandbox's properties.

        Args:
            name: Current sandbox name.
            new_name: New display name.
            idle_ttl_seconds: Idle timeout in seconds. Must be a multiple of
                60. ``0`` disables idle-stop. ``None`` leaves the existing
                value unchanged.
            delete_after_stop_seconds: Seconds after entering ``stopped``
                before deletion. Must be a multiple of 60. ``0`` disables
                stop-anchored deletion. ``None`` leaves the existing value
                unchanged.

        Returns:
            Updated Sandbox.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            ResourceNameConflictError: If new_name is already in use.
            SandboxClientError: For other errors.
            ValueError: If TTL values are invalid.
        rº   r»   Nr>   ©rÊ   r…   FrË   rÙ   rÚ   rÛ   rÆ   rÜ   i™  zSandbox name 'z' already in use)r   rA   rˆ   r�   Úpatchr¡   rÏ   r    rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   r   )
r’   r>   rè   rº   r»   r…   rÒ   rÓ   rÕ   rÖ   s
             r.   Úupdate_sandboxzSandboxClient.update_sandboxu  sD  € ô> 	Ð%Ð'9Ô:ÜÐ.Ð0KÔLä�t—~‘~ tÓ,ˆØ"$ˆØÐØ&ˆG�F‰OØÐ'Ø*:ˆGÐ&Ñ'Ø$Ð0Ø3LˆGÐ/Ñ0ð	Ø—z‘z×'Ñ'Ø˜'¨4×+@Ñ+@ÀÓ+Ið (ó ˆHð ×%Ñ%Ô'Ü×$Ñ$ X§]¡]£_¸TÈuÔUÐUøÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðð �z‰z×%Ñ%¨Ò,Ü/Ø$ X JÐ.>Ð?Ø"+ôð ðô % QÔ'Øûð	ús   ÁA"B* Â*D$Â=A"DÄD$c               óV  — t        | j                  |«      }	 | j                  j                  || j	                  |«      ¬«      }|j                  «        y# t        j                  $ r@}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       Y d}~yd}~ww xY w)zÅDelete a Sandbox.

        Args:
            name: Sandbox name.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            SandboxClientError: For other errors.
        r×   rÙ   rÚ   rÛ   rÆ   rÜ   N)rA   rˆ   r�   Údeleter¡   rÏ   rŽ   rÑ   rÕ   rß   r   r   rà   s         r.   Údelete_sandboxzSandboxClient.delete_sandbox³  sœ   € ô �t—~‘~ tÓ,ˆð	(Ø—z‘z×(Ñ(¨°d×6KÑ6KÈGÓ6TÐ(ÓUˆHØ×%Ñ%Õ'øÜ×$Ñ$ò 	(Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % Q×'Ñ'ûð	(ús   ˜<A ÁB(Á(6B#Â#B(c               ó”  — t        | j                  |d«      }	 | j                  j                  || j	                  |«      ¬«      }|j                  «        t        j                  |j                  «       «      S # t        j                  $ r<}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       ‚ d}~ww xY w)	aà  Get the provisioning status of a sandbox.

        This is a lightweight endpoint designed for high-frequency polling
        during sandbox provisioning. It returns only the status fields
        without full sandbox data.

        Args:
            name: Sandbox name.

        Returns:
            ResourceStatus with status and status_message.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            SandboxClientError: For other errors.
        Ústatusr×   rÙ   rÚ   rÛ   rÆ   rÜ   N)rA   rˆ   r�   rÞ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   rà   s         r.   Úget_sandbox_statusz SandboxClient.get_sandbox_statusÉ  s²   € ô& �t—~‘~ t¨XÓ6ˆð
	Ø—z‘z—~‘~ c°4×3HÑ3HÈÓ3Q�~ÓRˆHØ×%Ñ%Ô'Ü!×+Ñ+¨H¯M©M«OÓ<Ð<øÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % QÔ'Øûð	ús   ™AA8 Á8CÂ7CÃCiX  ©Úexpires_in_secondsr…   c               óÚ  ‡ ‡‡‡‡— t        ‰‰«       t        ‰ j                  ‰d«      }‰‰dœ}dˆˆˆˆˆ fd„}	 ‰ j                  j	                  ||‰ j                  ‰«      ¬«      }|j                  «        t        j                  |j                  «       |¬«      S # t        j                  $ r<}	|	j                  j                  dk(  rt        d‰› d�d	¬
«      |	‚t        |	«       ‚ d}	~	ww xY w)ai  Get an authenticated URL for a service running inside a sandbox.

        Returns a :class:`ServiceURL` whose properties auto-refresh the
        token transparently before it expires.  The object also provides
        HTTP helper methods (``.get``, ``.post``, etc.) that inject the
        authentication header automatically.

        Args:
            name: Sandbox name.
            port: Port the service is listening on inside the sandbox.
            expires_in_seconds: Token TTL in seconds (1--86400, default 600).
            headers: Optional per-request header overrides.

        Returns:
            ServiceURL with auto-refreshing token and HTTP helpers.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            ValueError: If port or expires_in_seconds is out of range.
            SandboxClientError: For other errors.
        zservice-url)Úportrô   c                 ó.   •— ‰j                  ‰‰‰ ‰¬«      S )Nró   )Úservice)rô   r…   r>   rö   r’   s   €€€€€r.   Ú
_refresherz)SandboxClient.service.<locals>._refresher  s%   ø€ Ø—<‘<ØØØ#5Øð	  ó ð r0   rê   )rù   rÙ   rÚ   rÛ   rÆ   rÜ   N)Úreturnr   )r   rA   rˆ   r�   rÎ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   )
r’   r>   rö   rô   r…   rÒ   rÓ   rù   rÕ   rÖ   s
   `````     r.   rø   zSandboxClient.serviceê  sß   ü€ ô: 	  Ð&8Ô9Ü�t—~‘~ t¨]Ó;ˆØÐ7IÑJˆ÷	ñ 	ð	Ø—z‘z—‘Ø˜'¨4×+@Ñ+@ÀÓ+Ið 'ó ˆHð ×%Ñ%Ô'Ü×'Ñ'¨¯©«ÀJÔOÐOøÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % QÔ'Øûð	ús   ¹A!B ÂC*Â.7C%Ã%C*)rô   Úcontent_typeÚcontent_dispositionr…   c               óô  — |�|dk  rt        d|› d�«      ‚t        | j                  |d«      }d|i}|�||d<   |�||d<   |�||d	<   	 | j                  j	                  ||| j                  |«      ¬
«      }	|	j                  «        t        j                  |	j                  «       «      S # t        j                  $ r<}
|
j                  j                  dk(  rt        d|› d�d¬«      |
‚t        |
«       ‚ d}
~
ww xY w)aM  Create a link that downloads one file from a sandbox.

        The link carries its own token, so anyone holding the URL can fetch
        that one file without a LangSmith credential. It is pinned to the
        sandbox and the exact path and cannot be repointed at another file.
        Fetching wakes a stopped sandbox.

        Do not modify the file after minting a link for it. The link is
        pinned to a path, not to a snapshot of the contents, so a later
        write to that path may or may not be reflected in what the link
        serves. Write a new file and mint a new link when the contents
        change.

        Args:
            name: Sandbox name.
            path: File path inside the sandbox.
            expires_in_seconds: Link TTL in seconds. Omit for a link that
                never expires.
            content_type: Content-Type to serve the file as.
            content_disposition: Content-Disposition to serve the file with,
                either ``"attachment"`` or ``"inline"``.
            headers: Optional per-request header overrides.

        Returns:
            DownloadURL with the link and its expiry, if any.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            ValueError: If expires_in_seconds is not positive.
            SandboxClientError: For other errors.
        Né   z/expires_in_seconds must be greater than 0 (got z(); omit it for a link that never expireszdownload-urlrW   rô   rû   rü   rê   rÙ   rÚ   rÛ   rÆ   rÜ   )r8   rA   rˆ   r�   rÎ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   )r’   r>   rW   rô   rû   rü   r…   rÒ   rÓ   rÕ   rÖ   s              r.   Úgenerate_download_urlz#SandboxClient.generate_download_url!  s)  € ðR Ð)Ð.@À1Ò.DÜðØ*Ð+Ð+SðUóð ô �t—~‘~ t¨^Ó<ˆØ#)¨4 .ˆØÐ)Ø,>ˆGÐ(Ñ)ØÐ#Ø&2ˆG�NÑ#ØÐ*Ø-@ˆGÐ)Ñ*ð	Ø—z‘z—‘Ø˜'¨4×+@Ñ+@ÀÓ+Ið 'ó ˆHð ×%Ñ%Ô'Ü×(Ñ(¨¯©«Ó9Ð9øÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % QÔ'Øûð	ús   ÁAB( Â(C7Â;7C2Ã2C7éx   g      ð?)r‚   Úpoll_intervalr…   c               ó–  — ddl }|j                  «       |z   }	 | j                  ||¬«      }|j                  dk(  r| j	                  ||¬«      S |j                  dk(  rt        |j                  xs dd¬«      ‚||j                  «       z
  }|dk  rt        d	|› d
|› d�d|j                  ¬«      ‚|j                  t        ||«      «       Œ²)a§  Poll until a sandbox reaches "ready" or "failed" status.

        Uses the lightweight status endpoint for polling, then fetches the
        full sandbox data once ready.

        Args:
            name: Sandbox name.
            timeout: Maximum time to wait in seconds.
            poll_interval: Time between status checks in seconds.

        Returns:
            Sandbox in "ready" status.

        Raises:
            ResourceCreationError: If sandbox status becomes "failed".
            ResourceTimeoutError: If timeout expires while still "provisioning".
            ResourceNotFoundError: If sandbox not found.
            SandboxClientError: For other errors.
        r   Nr×   ÚreadyÚfailedzSandbox provisioning failedrÆ   rÜ   rÚ   ú' not ready after Ús©rÝ   Úlast_status)
ÚtimeÚ	monotonicrò   rñ   rá   r   Ústatus_messager   ÚsleepÚmin)	r’   r>   r‚   r  r…   r	  Údeadlinerñ   Ú	remainings	            r.   Úwait_for_sandboxzSandboxClient.wait_for_sandboxf  sÛ   € ó6 	à—>‘>Ó# gÑ-ˆØØ×,Ñ,¨T¸7Ð,ÓCˆFØ�}‰} Ò'Ø×'Ñ'¨°gÐ'Ó>Ð>Ø�}‰} Ò(Ü+Ø×)Ñ)ÒJÐ-JØ"+ôð ð ! 4§>¡>Ó#3Ñ3ˆIØ˜AŠ~Ü*Ø ˜vÐ%7¸°yÀÐBØ"+Ø &§¡ôð ð
 �J‰J”s˜=¨)Ó4Ô5ð! r0   ©r‚   r…   c               ó€  — t        | j                  |d«      }	 | j                  j                  |i | j	                  |«      ¬«      }|j                  «        | j                  |||¬	«      S # t        j                  $ r@}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       Y d}~Œbd}~ww xY w)
að  Start a stopped sandbox and wait until ready.

        Args:
            name: Sandbox name.
            timeout: Timeout in seconds when waiting for ready.

        Returns:
            Sandbox in "ready" status.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            ResourceCreationError: If sandbox fails during startup.
            ResourceTimeoutError: If sandbox doesn't become ready within timeout.
            SandboxClientError: For other errors.
        Ústartrê   rÙ   rÚ   rÛ   rÆ   rÜ   Nr  )rA   rˆ   r�   rÎ   r¡   rÏ   rŽ   rÑ   rÕ   rß   r   r   r  )r’   r>   r‚   r…   rÒ   rÕ   rÖ   s          r.   Ústart_sandboxzSandboxClient.start_sandbox–  sÁ   € ô, �t—~‘~ t¨WÓ5ˆð
	(Ø—z‘z—‘Ø˜" d×&;Ñ&;¸GÓ&Dð 'ó ˆHð ×%Ñ%Ô'ð ×$Ñ$ T°7ÀGÐ$ÓLÐLøô ×$Ñ$ò 	(Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % Q×'Ñ'ûð	(ús   ™=A* Á*B=Á=6B8Â8B=c               óZ  — t        | j                  |d«      }	 | j                  j                  |i | j	                  |«      ¬«      }|j                  «        y# t        j                  $ r@}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       Y d}~yd}~ww xY w)	z÷Stop a running sandbox (preserves sandbox files for later restart).

        Args:
            name: Sandbox name.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            SandboxClientError: For other errors.
        Ústoprê   rÙ   rÚ   rÛ   rÆ   rÜ   N)rA   rˆ   r�   rÎ   r¡   rÏ   rŽ   rÑ   rÕ   rß   r   r   rà   s         r.   Ústop_sandboxzSandboxClient.stop_sandbox¼  s¥   € ô �t—~‘~ t¨VÓ4ˆð
	(Ø—z‘z—‘Ø˜" d×&;Ñ&;¸GÓ&Dð 'ó ˆHð ×%Ñ%Õ'øÜ×$Ñ$ò 	(Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜v [Ð1Àôàðô % Q×'Ñ'ûð	(ús   ™=A ÁB*Á*6B%Â%B*é<   )Úregistry_idr‚   r…   c               ó†  — | j                   › d�}|||dœ}|�||d<   	 | j                  j                  ||| j                  |«      ¬«      }	|	j	                  «        t        j                  |	j                  «       «      }
| j                  |
j                  ||¬«      S # t        j                  $ r}t        |«       ‚ d}~ww xY w)a¬  Build a snapshot from a Docker image.

        Blocks until the snapshot is ready (polls with 2s interval).

        Args:
            name: Snapshot name.
            docker_image: Docker image to build from (e.g., "python:3.12-slim").
            fs_capacity_bytes: Filesystem capacity in bytes.
            registry_id: Private registry ID.
            timeout: Timeout in seconds when waiting for ready.

        Returns:
            Snapshot in "ready" status.

        Raises:
            ResourceTimeoutError: If snapshot doesn't become ready within timeout.
            ResourceCreationError: If snapshot build fails.
            SandboxClientError: For other errors.
        ú
/snapshots)r>   Údocker_imager¾   Nr  rê   r  )rˆ   r�   rÎ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   r   Úwait_for_snapshotÚid)r’   r>   r  r¾   r  r‚   r…   rÒ   rÓ   rÕ   ÚsnapshotrÖ   s               r.   Úcreate_snapshotzSandboxClient.create_snapshotØ  sÌ   € ð: —‘Ð  
Ð+ˆð Ø(Ø!2ñ#
ˆð
 Ð"Ø%0ˆG�MÑ"ð	Ø—z‘z—‘Ø˜'¨4×+@Ñ+@ÀÓ+Ið 'ó ˆHð ×%Ñ%Ô'Ü×)Ñ)¨(¯-©-«/Ó:ˆHð
 ×%Ñ% h§k¡k¸7ÈGÐ%ÓTÐTøô	 ×$Ñ$ò 	Ü$ QÔ'Øûð	ús   žA B ÂC Â/B;Â;C Ú.)ra   ru   rv   Úon_build_logr¼   r½   r‚   r…   c               óè  — t        ||«      \  }}dt        j                  «       j                  dd › �}dt        j                  «       j                  dd › �}t	        j
                  |d«      }t	        j
                  |d«      }dt        j                  «       j                  › �}t	        j
                  |d«      }t	        j
                  |d	«      }| j                  ||
||	||¬
«      5 }|j                  |t        |«      |
|¬«       |j                  dt        j                  |«      z   dz   t        j                  |«      z   dz   t        j                  |«      z   dz   t        j                  |«      z   |
|¬«       |j                  t        |||||||¬«      |
|||¬«      }|j                  dk7  rt        dd¬«      ‚| j                  |j                   ||||
|¬«      cddd«       S # 1 sw Y   yxY w)a¸  Build a snapshot from a local Dockerfile context.

        When ``fs_capacity_bytes`` is omitted, the server applies its default.
        ``vcpus`` and ``mem_bytes`` size the temporary builder sandbox. The
        build runs BuildKit plus the native snapshotter's layer copies inside
        it, which contend for a single core by default, so giving the builder
        an extra vCPU can cut a cold build's wall time substantially.
        zsnapshot-builder-Né   z/var/lib/langsmith-build/ra   zcontext.tarzlangsmith-snapshot-build:zbuildkit-rootzbuildkit-run)r>   r‚   r¼   r½   r¾   r…   r  zrm -rf z && mkdir -p z && tar -xf z -C )rq   rc   rr   rs   rt   ru   rv   )r‚   Ú	on_stdoutÚ	on_stderrr…   r   z Dockerfile snapshot build failedr  rÜ   ©r  r¾   r‚   r…   )re   ÚuuidÚuuid4Úhexrk   r<   rÆ   ÚwriterY   Úrunrp   r   r|   Ú	exit_coder   Úcapture_snapshotr>   )r’   r>   r`   r¾   ra   ru   rv   r"  r¼   r½   r‚   r…   rT   rc   Úbuilder_nameÚ
build_rootrq   Ú
remote_tarrr   rs   rt   rÆ   Úresults                          r.   Úcreate_snapshot_from_dockerfilez-SandboxClient.create_snapshot_from_dockerfile  s  € ô. (CÀ:ÈwÓ'WÑ$ˆ�nà*¬4¯:©:«<×+;Ñ+;¸C¸RÐ+@Ð*AÐBˆð 1´·±³×1AÑ1AÀ#À2Ð1FÐ0GÐHˆ
Ü"Ÿ™¨
°IÓ>ˆÜ—^‘^ J°Ó>ˆ
Ø/´·
±
³×0@Ñ0@Ð/AÐBˆ	Ü!Ÿ™ z°?ÓCˆÜ —~‘~ j°.ÓAˆà�\‰\ØØØØØ/Øð ô 
ð Ø�M‰MØÜ(¨Ó6ØØð	 ô ð �K‰KØÜ—+‘+˜nÓ-ñ.à!ñ"ô —+‘+˜nÓ-ñ.ð !ñ	!ô
 —+‘+˜jÓ)ñ*ð ñô —+‘+˜nÓ-ñ.ð  Øð ô ð —[‘[Ü.Ø#1Ø#1Ø'Ø"/Ø!-Ø)Ø!ôð  Ø&Ø&Øð !ó ˆFð ×Ñ 1Ò$Ü+Ø6Ø",ôð ð ×(Ñ(Ø—‘ØØ&Ø"3ØØð )ó ÷_
÷ 
ò 
ús   Ã(C6G(Ç(G1r'  c               óö  — t        | j                  |d«      }d|i}|�||d<   |�||d<   	 | j                  j                  ||| j	                  |«      ¬«      }	|	j                  «        t        j                  |	j                  «       «      }
| j                  |
j                   ||¬«      S # t        j                  $ r<}|j                  j                  dk(  rt        d|› d	�d
¬«      |‚t        |«       ‚ d}~ww xY w)af  Capture a snapshot from a running sandbox.

        Blocks until the snapshot is ready (polls with 2s interval).

        Args:
            sandbox_name: Name of the sandbox to capture from.
            name: Snapshot name.
            docker_image: Optional Docker image tag inside the sandbox to export
                into the snapshot instead of capturing the live root filesystem.
            fs_capacity_bytes: Filesystem capacity in bytes for Docker image export.
            timeout: Timeout in seconds when waiting for ready.

        Returns:
            Snapshot in "ready" status.

        Raises:
            ResourceNotFoundError: If sandbox not found.
            ResourceTimeoutError: If snapshot doesn't become ready within timeout.
            ResourceCreationError: If snapshot capture fails.
            SandboxClientError: For other errors.
        r  r>   Nr  r¾   rê   rÙ   rÚ   rÛ   rÆ   rÜ   r  )rA   rˆ   r�   rÎ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   r  r  )r’   Úsandbox_namer>   r  r¾   r‚   r…   rÒ   rÓ   rÕ   r  rÖ   s               r.   r.  zSandboxClient.capture_snapshoti  s  € ô> �t—~‘~ |°ZÓ@ˆà#)¨4 .ˆØÐ#Ø&2ˆG�NÑ#ØÐ(Ø+<ˆGÐ'Ñ(ð	Ø—z‘z—‘Ø˜'¨4×+@Ñ+@ÀÓ+Ið 'ó ˆHð ×%Ñ%Ô'Ü×)Ñ)¨(¯-©-«/Ó:ˆHð ×%Ñ% h§k¡k¸7ÈGÐ%ÓTÐTøô ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø ˜~¨[Ð9Èôàðô % QÔ'Øûð	ús   «A B) Â)C8Â<7C3Ã3C8c               óš  — | j                   › dt        |«      › �}	 | j                  j                  || j	                  |«      ¬«      }|j                  «        t        j                  |j                  «       «      S # t        j                  $ r<}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       ‚ d}~ww xY w)	zúGet a snapshot by ID.

        Args:
            snapshot_id: Snapshot UUID.

        Returns:
            Snapshot.

        Raises:
            ResourceNotFoundError: If snapshot not found.
            SandboxClientError: For other errors.
        ú/snapshots/r×   rÙ   ú
Snapshot 'rÛ   r  rÜ   N)rˆ   r:   r�   rÞ   r¡   rÏ   r   rÐ   rÊ   rŽ   rÑ   rÕ   rß   r   r   ©r’   rÄ   r…   rÒ   rÕ   rÖ   s         r.   Úget_snapshotzSandboxClient.get_snapshot   s¼   € ð —‘Ð  Ô,?ÀÓ,LÐ+MÐNˆð
	Ø—z‘z—~‘~ c°4×3HÑ3HÈÓ3Q�~ÓRˆHØ×%Ñ%Ô'Ü×%Ñ% h§m¡m£oÓ6Ð6øÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü+Ø   ¨[Ð9Èôàðô % QÔ'Øûð	ús   œAA; Á;C
Â7CÃC
)Úname_containsÚlimitÚoffsetr…   c               ó  — | j                   › d�}i }|�||d<   |�||d<   |�||d<   	 | j                  j                  ||xs d| j                  |«      ¬«      }|j	                  «        |j                  «       }|j                  dg «      D �	cg c]  }	t        j                  |	«      ‘Œ c}	S c c}	w # t        j                  $ r:}
|
j                  j                  dk(  rt        d	|› d
�«      |
‚t        |
«       ‚ d}
~
ww xY w)aV  List snapshots.

        The backend always paginates this endpoint. When ``limit`` is omitted
        the server applies a default page size (currently 50), so a single
        call is not guaranteed to return every snapshot. To iterate through
        all results, repeat the call with increasing ``offset`` values (or an
        explicit ``limit``) until fewer than ``limit`` snapshots come back.

        Args:
            name_contains: Optional case-insensitive substring filter applied
                to snapshot names server-side.
            limit: Optional maximum number of snapshots to return for a single
                request. Must be between 1 and 500 (inclusive); the server
                rejects values outside that range. Defaults to 50 server-side
                when omitted.
            offset: Optional number of snapshots to skip before returning
                results. Must be ``>= 0``. Useful for paginating through
                large result sets in combination with ``limit``.

        Returns:
            A single page of Snapshots matching the provided filters.
        r  Nr;  r<  r=  )Úparamsr…   Ú	snapshotsrÙ   rã   rä   )rˆ   r�   rÞ   r¡   rÏ   rÊ   r   rÐ   rŽ   rÑ   rÕ   rß   r   r   )r’   r;  r<  r=  r…   rÒ   r?  rÕ   rå   r  rÖ   s              r.   Úlist_snapshotszSandboxClient.list_snapshots½  s  € ð< —‘Ð  
Ð+ˆà!#ˆØÐ$Ø&3ˆF�?Ñ#ØÐØ#ˆF�7‰OØÐØ%ˆF�8Ñð	Ø—z‘z—~‘~ØØ’~ Ø×-Ñ-¨gÓ6ð &ó ˆHð
 ×%Ñ%Ô'Ø—=‘=“?ˆDØ37·8±8¸KÈÔ3LÓMÑ3L¨a”H×&Ñ& qÕ)Ð3LÑMÐMùÒMøÜ×$Ñ$ò 	Ø�z‰z×%Ñ%¨Ò,Ü%Ø.¨s¨eð 4:ð ;óð ðô % QÔ'Øûð	ús*   ¨A%B1 ÂB,Â)B1 Â,B1 Â1C>Ã5C9Ã9C>c               ó^  — | j                   › dt        |«      › �}	 | j                  j                  || j	                  |«      ¬«      }|j                  «        y# t        j                  $ r@}|j                  j                  dk(  rt        d|› d�d¬«      |‚t        |«       Y d}~yd}~ww xY w)	zÏDelete a snapshot.

        Args:
            snapshot_id: Snapshot UUID.

        Raises:
            ResourceNotFoundError: If snapshot not found.
            SandboxClientError: For other errors.
        r7  r×   rÙ   r8  rÛ   r  rÜ   N)rˆ   r:   r�   rî   r¡   rÏ   rŽ   rÑ   rÕ   rß   r   r   r9  s         r.   Údelete_snapshotzSandboxClient.delete_snapshot÷  s¨   € ð —‘Ð  Ô,?ÀÓ,LÐ+MÐNˆð	(Ø—z‘z×(Ñ(¨°d×6KÑ6KÈGÓ6TÐ(ÓUˆHØ×%Ñ%Õ'øÜ×$Ñ$ò 	(Ø�z‰z×%Ñ%¨Ò,Ü+Ø   ¨[Ð9Èôàðô % Q×'Ñ'ûð	(ús   œ<A ÁB,Á,6B'Â'B,i,  g       @c               ót  — ddl }|j                  «       |z   }	 | j                  ||¬«      }|j                  dk(  r|S |j                  dk(  rt	        |j
                  xs dd¬«      ‚||j                  «       z
  }|dk  rt        d	|› d
|› d�d|j                  ¬«      ‚|j                  t        ||«      «       Œ¡)a&  Poll until a snapshot reaches "ready" or "failed" status.

        Args:
            snapshot_id: Snapshot UUID.
            timeout: Maximum time to wait in seconds.
            poll_interval: Time between status checks in seconds.

        Returns:
            Snapshot in "ready" status.

        Raises:
            ResourceCreationError: If snapshot status becomes "failed".
            ResourceTimeoutError: If timeout expires.
            ResourceNotFoundError: If snapshot not found.
            SandboxClientError: For other errors.
        r   Nr×   r  r  zSnapshot build failedr  rÜ   r8  r  r  r  )	r	  r
  r:  rñ   r   r  r   r  r  )	r’   rÄ   r‚   r  r…   r	  r  r  r  s	            r.   r  zSandboxClient.wait_for_snapshot  sÊ   € ó0 	à—>‘>Ó# gÑ-ˆØØ×(Ñ(¨¸gÐ(ÓFˆHØ�‰ 'Ò)Ø�Ø�‰ (Ò*Ü+Ø×+Ñ+ÒFÐ/FØ",ôð ð ! 4§>¡>Ó#3Ñ3ˆIØ˜AŠ~Ü*Ø   Ð-?À¸yÈÐJØ",Ø (§¡ôð ð
 �J‰J”s˜=¨)Ó4Ô5ð! r0   )
r�   úOptional[str]r‚   Úfloatrƒ   rE  r„   Úintr…   zOptional[RequestHeaders]©rú   Ústr)rú   r"   )r…   ÚRequestHeadersrú   zOptional[dict[str, str]])rú   r$   )rú   ÚNone)rú   r~   )r°   zOptional[type]r±   zOptional[BaseException]r²   zOptional[Any]rú   rK  )N)rÄ   rE  r¹   rE  r>   rE  r‚   rG  rº   úOptional[int]r»   rL  r¼   rL  r½   rL  r¾   rL  r¿   úOptional[SandboxMountConfig]rÀ   úOptional[SandboxProxyConfig]r…   rJ  rú   r    )rÄ   rE  r¹   rE  r>   rE  r‚   rG  rÇ   Úboolrº   rL  r»   rL  r¼   rL  r½   rL  r¾   rL  r¿   rM  rÀ   rN  r…   rJ  rú   r    )r>   rI  r…   rJ  rú   r    )r…   rJ  rú   zlist[Sandbox])r>   rI  rè   rE  rº   rL  r»   rL  r…   rJ  rú   r    )r>   rI  r…   rJ  rú   rK  )r>   rI  r…   rJ  rú   r   )
r>   rI  rö   rG  rô   rG  r…   rJ  rú   r   )r>   rI  rW   rI  rô   rL  rû   rE  rü   z$Optional[DownloadContentDisposition]r…   rJ  rú   r   )
r>   rI  r‚   rG  r  rF  r…   rJ  rú   r    )r>   rI  r‚   rG  r…   rJ  rú   r    )r>   rI  r  rI  r¾   rG  r  rE  r‚   rG  r…   rJ  rú   r   )r>   rI  r`   úUnion[str, os.PathLike[str]]r¾   rL  ra   rP  ru   úOptional[Mapping[str, str]]rv   rE  r"  zOptional[Callable[[str], Any]]r¼   rL  r½   rL  r‚   rG  r…   rJ  rú   r   )r5  rI  r>   rI  r  rE  r¾   rL  r‚   rG  r…   rJ  rú   r   )rÄ   rI  r…   rJ  rú   r   )
r;  rE  r<  rL  r=  rL  r…   rJ  rú   zlist[Snapshot])rÄ   rI  r…   rJ  rú   rK  )
rÄ   rI  r‚   rG  r  rF  r…   rJ  rú   r   )#Ú__name__Ú
__module__Ú__qualname__Ú__doc__r•   r™   Úpropertyr�   r¡   r£   r¦   r¨   r¬   r®   r³   r¶   rÆ   rÂ   rá   rç   rì   rï   rò   rø   rÿ   r  r  r  r   r3  r.  r:  rA  rC  r  r3   r0   r.   r~   r~   ·   s:  „ ñð. '+ØØ!%ØØ,0ñ(<ð $ð(<ð ð	(<ð
 ð(<ð ð(<ð *ó(<óTð ò<ó ð<ó8:ó=ó
ó(,óóðà ðð )ðð ð	ð
 
óó<ð &*ð\ð (,Ø"ØØ*.Ø37Ø#Ø#'Ø+/Ø59Ø59Ø"&ñ\à"ð\ð %ð	\ð
 ð\ð ð\ð (ð\ð $1ð\ð ð\ð !ð\ð )ð\ð 3ð\ð 3ð\ð  ð\ð 
ó\ð@ &*ðxð (,Ø"ØØ#Ø*.Ø37Ø#Ø#'Ø+/Ø59Ø59Ø"&ñxà"ðxð %ð	xð
 ðxð ðxð ðxð (ðxð $1ðxð ðxð !ðxð )ðxð 3ðxð 3ðxð  ðxð  
ó!xðt CGõ ð: ;?õ ð: #'Ø*.Ø37Ø"&ñ<àð<ð  ð	<ð
 (ð<ð $1ð<ð  ð<ð 
ó<ð| FJõ (ð. 7;ñØðØ%3ðà	óðL #&Ø"&ñ5àð5ð ð5ð
  ð5ð  ð5ð 
ó5ðx -1Ø&*ØDHØ"&ñCàðCð ðCð
 *ðCð $ðCð BðCð  ðCð 
óCðR Ø"Ø"&ñ.6àð.6ð ð	.6ð
 ð.6ð  ð.6ð 
ó.6ðh Ø"&ñ$Màð$Mð ð	$Mð
  ð$Mð 
ó$MðL DHõ (ðD &*ØØ"&ñ1Uàð1Uð ð1Uð ð	1Uð #ð1Uð ð1Uð  ð1Uð 
ó1Uðn ,0ð	\ð 14Ø26Ø $Ø7;Ø#Ø#'ØØ"&ñ\àð\ð 1ð\ð )ð	\ð .ð\ð 0ð\ð ð\ð 5ð\ð ð\ð !ð\ð ð\ð  ð\ð 
ó\ðF '+Ø+/ØØ"&ñ5Uàð5Uð ð5Uð
 $ð5Uð )ð5Uð ð5Uð  ð5Uð 
ó5Uðp >BñØðØ,:ðà	óð@ (,Ø#Ø $Ø"&ñ8ð %ð8ð ð	8ð
 ð8ð  ð8ð 
ó8ðv >Bñ(Øð(Ø,:ð(à	ó(ð8 Ø"Ø"&ñ+6àð+6ð ð	+6ð
 ð+6ð  ð+6ð 
ô+6r0   r~   rH  )rú   rE  )r9   rI  rú   rI  )r=   rI  r>   rI  r?   rI  rú   rI  )rT   r   rú   Úbytes)r`   rP  ra   rP  rú   ztuple[Path, str])rq   rI  rc   rI  rr   rI  rs   rI  rt   rI  ru   rQ  rv   rE  rú   rI  )DrU  Ú
__future__r   rI   Úosrk   rp   rK   r(  Úcollections.abcr   r   Úpathlibr   Útypingr   r   r	   r
   Úurllib.parser   rŽ   Ú	langsmithr   r*   Úlangsmith._openapi_clientr   Úlangsmith.sandbox._exceptionsr   r   r   r   r   Úlangsmith.sandbox._helpersr   r   r   r   r   Úlangsmith.sandbox._modelsr   r   r   r   r   Úlangsmith.sandbox._mountsr   r   Úlangsmith.sandbox._proxy_configr   Úlangsmith.sandbox._sandboxr    Úlangsmith.sandbox._transportr!   Ú8langsmith._openapi_client.resources.sandboxes.registriesr"   r¥   r$   r/   r4   rI  rJ  r:   rA   rY   re   r|   r~   r3   r0   r.   Ú<module>rh     s  ðÙ Kå "ã 	Û 	Û Û Û Û ß -Ý ß 6Ó 6Ý ã å 'Ý /÷õ ÷õ ÷õ ÷õ ?Ý .Ý 7áõõ Có.ó+ð
 ˜' # s (Ñ+Ñ,€ó!óCóð3Ø,ð3à)ð3ð ó3ð(?àð?ð ð?ð ð	?ð
 ð?ð ð?ð ,ð?ð ð?ð 	ó?÷DC6ò C6r0   