Update dependency e2b - #248
Merged
Merged
Conversation
renovate
Bot
force-pushed
the
renovate/e2b-2.x-lockfile
branch
from
August 13, 2026 20:15
06f64a1 to
94f87d6
Compare
renovate
Bot
force-pushed
the
renovate/e2b-2.x-lockfile
branch
from
August 17, 2026 07:12
94f87d6 to
be4a6b1
Compare
mishushakov
enabled auto-merge (squash)
August 17, 2026 13:23
mishushakov
approved these changes
Aug 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
2.36.0→2.39.12.38.0→2.39.12.38.3→2.39.0Release Notes
e2b-dev/e2b (e2b)
v2.39.1Patch Changes
0d507cd: Restore thehttp2parameter onget_transportandget_envd_transport, which the pyqwest migration dropped in 2.38.0.http2=Falseagain returns a transport pinned to HTTP/1.1, on its own connection pool.v2.39.0Compare Source
Minor Changes
07eb9be: Allow a network rule'stransformto be a callback, so a workload identity token from theiamoption can be injected into egress requests without the SDK ever seeing its value. The callback receives placeholder strings that the egress proxy resolves per request —iam.tokens.awsis${e2b.identity.tokens.aws}on the wire — and referencing a token that is not registered iniam.tokensfails withInvalidArgumentError/InvalidArgumentExceptioninstead of silently sending a placeholder no token will ever replace.updateNetwork/update_networkaccepts the same callbacks, but its payload carries noiamconfig, so token names cannot be checked there and every name resolves to its placeholder.Token names are validated where they are registered and again before they are interpolated: a name cannot be empty or contain
{,}or control characters, since the proxy reads a placeholder up to its first}and a brace in the name would resolve a different token than the one referenced.64b25bb: Add theiamoption toSandbox.createfor configuring sandbox workload identity, and aSecretclass with aniamToken/iam_tokenmethod for defining the workload tokens. Passing a non-emptytokensmap (name →{ audience, tokenType }) enables workload identity for the sandbox:Plain
{ audience, tokenType }objects ({"audience": ..., "token_type": ...}dicts in Python) are accepted as token values too.Patch Changes
11912ff: Build the envd HTTP API client once per syncSandboxand share it across thefilesystem, commands, and PTY modules, which now receive it instead of each
constructing their own — matching
AsyncSandbox. No behavior change: thepyqwest transport underneath is already cached process-wide per
(proxy, for_streaming), so the separate clients shared one connection pooleither way.
Filesystemstill builds the streaming sibling client whosetransport carries the idle read timeout, in both flavors.
v2.38.0Minor Changes
b048369: Move the envd HTTP API client (sandbox file transfers, health checks) ontopyqwestvia its httpx-compatibletransport adapter. envd RPC already runs on pyqwest through
connectrpc, soall sandbox traffic now shares one HTTP stack built from the same transport
pieces (with separate connection pools per use).
The per-thread (sync) and per-loop (async) envd httpx clients are gone: the
pyqwest transports are thread-safe and loop-independent, so a single client
per module serves all threads and event loops.
Timeout semantics through the adapter:
files.read(format="stream")): arequest_timeoutset explicitly for the call is the deadline for the whole transfer — by
default the transfer is unbounded in total, as before. A stalled stream is
reclaimed by a 60-second idle read timeout that resets on every chunk.
stream_idle_timeoutkeeps working on the async client (applied perread); the sync client cannot interrupt a blocking read, so it relies on
the transport-wide idle bound and now ignores the parameter.
request_timeoutas awhole-request deadline, and a streamed (file-like) upload carries no
client-side timeout (a stalled one is bounded server-side by envd's idle
read timeout) — both matching the JS SDK.
files.read()as text or bytes) and buffered uploadsare bounded by
request_timeoutfor the whole transfer (default60 seconds), where the previous transport bounded each socket operation
and left total duration unbounded. Reading or writing a file too large to
transfer inside the deadline now raises
httpx.ReadTimeout— pass alarger
request_timeout(or0to disable), or useformat="stream"/file-like data, for large transfers.E2B_MAX_CONNECTIONSis no longer read: it configured httpx's globalconnection cap, and the last transport that took one is gone (reqwest has no
counterpart — it does not cap concurrent connections).
E2B_KEEPALIVE_EXPIRYand
E2B_MAX_KEEPALIVE_CONNECTIONSkeep tuning the pools.a874ced: Move the REST API client (sandbox lifecycle, listing, templates, volumescontrol plane) onto
pyqwest(Rustreqwest/hyper) via its httpx-compatible transport adapter, replacing the
httpx-native
HTTPTransport/AsyncHTTPTransport. The generated httpx clientAPI is unchanged — only the transport underneath is swapped — so logging
event hooks, headers, and redirect handling (
follow_redirects,response.history) behave as before.One timeout semantics change: through the adapter,
request_timeoutis adeadline for the whole API call, where the previous transports applied it to
each phase (connect, read, write) separately — a slow request could exceed it
in total. For the REST API's small JSON exchanges this tightening is what
request_timeoutreads as promising;0still disables it.Because pyqwest transports are thread-safe and loop-independent (I/O runs on
a Rust runtime), the API connection pool is now shared process-wide per
proxy, instead of one pool per thread (sync) or per event loop (async), and
ApiClientno longer maintains per-thread/per-loop httpx client caches — asingle httpx client serves all threads and event loops.
Connection-establishment failures are retried with backoff
(
E2B_CONNECTION_RETRIES, default 3), matching the connect-only retries ofthe previous transports. Timeouts keep raising
httpx.ReadTimeout(anhttpx.TimeoutException), as before, whether they fire while waiting for theresponse head or while reading the response body, and connection, network, and
protocol failures keep raising their
httpxcounterparts (httpx.ConnectError,httpx.ReadError,httpx.RemoteProtocolError).proxyfor API calls takes a URL string (e.g.proxy="http://user:pass@localhost:8030", scheme http, https, socks5, orsocks5h), an
httpx.URL, or anhttpx.Proxy— including its credentials(sent as
Proxy-Authorization) and any headers configured for the proxy. Theone
httpx.Proxyoption pyqwest cannot express, a per-proxyssl_context,raises
InvalidArgumentExceptionrather than being silently dropped.Low-level HTTP logs stay available: where enabling the
httpcorelogger usedto show connection-level detail, pyqwest logs one line per request on the
pyqwest.accesslogger and request lifecycle records onpyqwest, both atDEBUGand off unless enabled:The SDK's own
loggeroption is unchanged and independent of these.envd traffic is not affected: RPC (commands, PTY, filesystem watch) already
runs on pyqwest via
connectrpc, and the envd HTTP API (file transfers,health checks) keeps its httpx transports.
b3a7c9f: Move template build-context uploads (to S3 presigned URLs) ontopyqwestvia its httpx-compatibletransport adapter. Content-Length framing for the streamed archive body is
preserved (S3 rejects chunked transfer encoding), and redirects stay with the
httpx client instead of being followed inside the transport. The 1-hour upload
timeout now bounds the entire upload rather than each socket operation, and
verify_ssl=Falseon the client is no longer honored for uploads (pyqwesthas no insecure-TLS option).
458c2c4: Move the volume content client (Volume/AsyncVolumefile operations) ontopyqwestvia its httpx-compatibletransport adapter, the same stack the REST API client uses. The connection
pool is shared process-wide per proxy instead of one pool per thread (sync)
or per event loop (async), and connection-establishment failures are retried
with backoff (
E2B_CONNECTION_RETRIES, default 3), as before.For streamed volume reads (
Volume.read_file(format="stream")), a stalledstream is by default bounded by a transport-wide idle read timeout of
60 seconds that resets on every chunk (still surfaced as
httpx.ReadTimeout; matches the JS SDK's default stream idle timeout).AsyncVolume.read_filekeeps honoring an explicitstream_idle_timeoutper read (including
0to disable); the sync client ignores it — it cannotinterrupt a blocking read. Passing
request_timeoutto a streamed read nowbounds the whole transfer rather than individual socket operations.
The same whole-transfer semantics apply to non-streamed operations:
read_file(format="text"/"bytes")and uploads are bounded byrequest_timeoutas a total deadline (default 1 hour for file contentoperations), where the previous transports bounded each socket operation
and left total duration unbounded. Pass a larger
request_timeout(or0to disable) for very large transfers on slow links.
Patch Changes
cab27aa: Kill newly created sandboxes when MCP gateway startup fails. The failure now surfaces asSandboxError(JS) /SandboxException(Python) with aFailed to start MCP gateway: <stderr>message instead of a bare command exit error.v2.37.1Patch Changes
88f41f3: Align ANSI stripping of template build log messages across both SDKs. The Python SDK'sstrip_ansi_escape_codesnow ports the JS SDK'sstripAnsiregex: OSC sequences (hyperlinks, window titles) are matched non-greedily up to the first string terminator — including sequences spanning newlines — and CSI sequences are stripped without requiring a terminator. Both implementations additionally strip the remaining ECMA-48 string controls (DCS/Sixel, SOS, PM, APC) through their string terminator so control payloads no longer leak into cleaned logs.998e560: Relax the Python SDK'swcmatchrequirement from>=10.1,<11to>=10.1,<12soe2bcan be installed alongside packages that already requirewcmatch>=11(for exampledeepagents>=0.7.0), which previously failed to resolve. The SDK only callsglob.glob()withGLOBSTAR | DOTMATCHfor template context matching; wcmatch 11.0's single breaking change affectstranslate()callers using extended-glob capture groups, so it is a no-op here. The template glob test suite passes against 10.1, 10.2.1 and 11.0.v2.37.0Compare Source
Minor Changes
2821fb0: Route volume content requests to a team's custom (BYOC) cluster. When a team is connected to a custom cluster, the volume create and get endpoints now return that cluster'sdomain, and the SDK uses it as the destination for volume content requests instead of the defaultapi.<E2B_DOMAIN>host. Teams on the default cluster are unaffected and keep their configured domain.e2b-dev/e2b (e2b)
v2.39.0Compare Source
Minor Changes
07eb9be: Allow a network rule'stransformto be a callback, so a workload identity token from theiamoption can be injected into egress requests without the SDK ever seeing its value. The callback receives placeholder strings that the egress proxy resolves per request —iam.tokens.awsis${e2b.identity.tokens.aws}on the wire — and referencing a token that is not registered iniam.tokensfails withInvalidArgumentError/InvalidArgumentExceptioninstead of silently sending a placeholder no token will ever replace.updateNetwork/update_networkaccepts the same callbacks, but its payload carries noiamconfig, so token names cannot be checked there and every name resolves to its placeholder.Token names are validated where they are registered and again before they are interpolated: a name cannot be empty or contain
{,}or control characters, since the proxy reads a placeholder up to its first}and a brace in the name would resolve a different token than the one referenced.64b25bb: Add theiamoption toSandbox.createfor configuring sandbox workload identity, and aSecretclass with aniamToken/iam_tokenmethod for defining the workload tokens. Passing a non-emptytokensmap (name →{ audience, tokenType }) enables workload identity for the sandbox:Plain
{ audience, tokenType }objects ({"audience": ..., "token_type": ...}dicts in Python) are accepted as token values too.Configuration
📅 Schedule: (in timezone UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.