fix(eve): resume duplicate Vercel sandbox creates#394
Draft
ruiconti wants to merge 1 commit into
Draft
Conversation
Vercel sandbox sessions are named deterministically from the runtime session and node. A retried or concurrent first open can create the sandbox in one execution context while another context still observes no persisted sandbox metadata and receives Vercel's duplicate-name 400. Treat that duplicate create as a resumable open: re-read the named sandbox, preserve the original error if it is still missing, and keep template-less resumed sessions on the same base-runtime setup path as the winning create. Signed-off-by: Rui Conti <ruiconti@gmail.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Bundle + Package Summary:
|
| Area | Metric | Baseline | Current | Delta |
|---|---|---|---|---|
| Package | Packed tarball | 3.48 MB | 3.48 MB | +248 B |
| Package | Unpacked publish size | 12.64 MB | 12.64 MB | +1.2 kB |
| Package | Installed footprint | 52.64 MB | 52.64 MB | +1.2 kB |
| Package | Published files | 2371 | 2371 | 0 |
| Package | Installed files | 5579 | 5579 | 0 |
| Runtime | Unique function payloads | 2 | 2 | 0 |
| Runtime | Total function bytes | 9.18 MB | 9.18 MB | +2.4 kB |
| Runtime | Public routes | 9 | 9 | 0 |
Changed function payloads vs main (6dc84fc) (2)
| Function | Status | Baseline | Current | Delta | Route changes |
|---|---|---|---|---|---|
functions/.well-known/workflow/v1/flow.func |
changed | 5.72 MB | 5.72 MB | +1.3 kB |
none |
functions/__server.func |
changed | 3.46 MB | 3.46 MB | +1.1 kB |
none |
Build Metadata
- Preset:
vercel - Nitro:
nitro@3.0.260610-beta - Output directory:
apps/fixtures/weather-agent/.vercel/output - Build metadata timestamp: 2026-06-28T21:08:57.226Z
- Route aliases: 9 public, 1 internal (10 total aliases)
- Vercel routes in config: 10
- Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down
Package Details
- Package:
eve@0.16.2 - Package directory:
packages/eve - Tarball: 3.48 MB (
eve-0.16.2.tgz) - Unpacked payload: 12.64 MB across 2371 published files
- Installed footprint: 52.64 MB across 5579 installed files
- Installed root package: 11.37 MB
- Installed dependencies: 41.27 MB
- Runtime dependencies: 1
- Peer dependencies: 12 (11 optional)
Installed footprint is measured from an isolated temporary npm install of the packed tarball.
Heavy installed dependencies
@rolldown/binding-linux-x64-gnu: 20.26 MB (38.5%)eve: 11.37 MB (21.6%)ai: 6.27 MB (11.9%)zod: 5.04 MB (9.6%)nitro: 2.41 MB (4.6%)
Publish payload breakdown
Published file size
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [####....................] 1.51 MB 11.9%
🟡 dist/src/compiled/@workflow/core/runtime.js [##......................] 788.4 kB 6.2%
🟡 dist/src/compiled/@vercel/sandbox/index.js [##......................] 632.0 kB 5.0%
🟡 dist/src/compiled/@chat-adapter/slack/index.js [#.......................] 438.4 kB 3.5%
🟡 dist/src/compiled/_chunks/workflow/attribute-... [#.......................] 371.6 kB 2.9%
🔴 Other published files [########################] 8.91 MB 70.4%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 20.26 MB 38.5%
🔴 eve [#############...........] 11.37 MB 21.6%
🔴 ai [#######.................] 6.27 MB 11.9%
🔴 zod [######..................] 5.04 MB 9.6%
🟠 nitro [###.....................] 2.41 MB 4.6%
🟡 rolldown [#.......................] 771.7 kB 1.5%
🔴 Other installed packages [########................] 6.52 MB 12.4%
Runtime dependencies (1)
| Package | Range | Notes |
|---|---|---|
nitro |
3.0.260610-beta |
Peer dependencies (12)
| Package | Range | Notes |
|---|---|---|
@opentelemetry/api |
^1.0.0 |
optional peer |
@sveltejs/kit |
^2.0.0 |
optional peer |
ai |
catalog: |
|
braintrust |
^3.0.0 |
optional peer |
just-bash |
^3.0.0 |
optional peer |
microsandbox |
^0.5.0 |
optional peer |
next |
^16.0.0 |
optional peer |
nuxt |
^4.0.0 |
optional peer |
react |
^19.0.0 |
optional peer |
svelte |
^5.0.0 |
optional peer |
vite |
^8.0.0 |
optional peer |
vue |
^3.5.0 |
optional peer |
Function Drill-Down
Payload Size Graph
Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func [########################] 5.72 MB 62.3%
🟠 functions/__server.func [###############.........] 3.46 MB 37.7%
Top Function Payloads
🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 5.72 MB
| Metric | Value |
|---|---|
| Public routes | /.well-known/workflow/v1/flow |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 5.72 MB |
| Function files | 5.72 MB across 26 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file __eve_nitro_handler__.mjs is 1.96 MB (34.2%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 __eve_nitro_handler__.mjs [########################] 1.96 MB 34.2%
🟠 _chunks/runtime.mjs [############............] 975.4 kB 17.0%
🟡 _chunks/sandbox.mjs [#########...............] 766.0 kB 13.4%
🟡 _chunks/attribute-changes-DUxG-Gic.mjs [######..................] 473.2 kB 8.3%
🟡 _libs/@ai-sdk/gateway+[...].mjs [#####...................] 413.5 kB 7.2%
🟠 Other bundled files [##############..........] 1.14 MB 19.9%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x",
"environment": {
"NODE_OPTIONS": "--experimental-require-module"
},
"maxDuration": "max",
"experimentalTriggers": [
{
"type": "queue/v2beta",
"topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
"consumer": "default",
"retryAfterSeconds": 5,
"initialDelaySeconds": 0
}
]
}🟠 functions/__server.func • 8 public routes, 1 internal alias • 3.46 MB
| Metric | Value |
|---|---|
| Public routes | //eve/v1/callback/[token]/eve/v1/connections/[name]/callback/[token]/eve/v1/health/eve/v1/info/eve/v1/session/eve/v1/session/[sessionId]/eve/v1/session/[sessionId]/stream |
| Internal aliases | /__server |
| Runtime | nodejs24.x |
| Handler | index.mjs |
| Payload | 3.46 MB |
| Function files | 3.46 MB across 19 files |
| Traced dependencies | 0 B |
| Signal | 🟠 Bundled file index.mjs is 992.0 kB (28.7%) |
🟠 🔎 Dependency Analysis
📦 Bundled files:
Bundled file size
🟠 index.mjs [########################] 992.0 kB 28.7%
🟠 _chunks/runtime.mjs [#####################...] 883.8 kB 25.5%
🟠 _chunks/sandbox.mjs [###################.....] 766.0 kB 22.1%
🟡 _chunks/attribute-changes-DUxG-Gic.mjs [###########.............] 448.9 kB 13.0%
⚪ _libs/zod.mjs [###.....................] 114.2 kB 3.3%
🟡 Other bundled files [######..................] 255.4 kB 7.4%
🧾 Vercel Config
{
"handler": "index.mjs",
"launcherType": "Nodejs",
"shouldAddHelpers": false,
"supportsResponseStreaming": true,
"runtime": "nodejs24.x"
}
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.
What
Sandbox.createloses a duplicate-name race.Failure mode
The incident shape was a
load_skillfailure after Vercel returned400 bad_requestfrom sandbox create: the named sandbox already existed, and Vercel told the caller to useGET /sandboxes/:nameto resume it.That can happen because eve names Vercel sandbox sessions deterministically from the backend, deployment scope, runtime session, and graph node. A concurrent first open, or a retried step after the sandbox was created but before eve persisted sandbox metadata, can leave one execution context creating the sandbox while another still sees no session metadata. The losing create got treated as fatal even though the sandbox now existed.
Impact
The Vercel backend now treats that duplicate create as a resumable open. It re-reads the named sandbox and adopts it, while keeping the old error behavior for unrelated create failures.
This lives in the backend rather than
load_skillbecauseload_skillonly exposed the race.ensureSandboxAccessalready dedupes within one provider instance. This handles the cross-provider, workflow retry, and serverless execution cases where process-local state is not enough.Template-less resumed sessions still run the base runtime setup path, so a caller that adopts the sandbox does not skip the readiness work that a winning create would have done.
Checked locally with the Vercel sandbox unit file, eve typecheck, targeted lint, and
git diff --check.