Skip to content

fix(eve): resume duplicate Vercel sandbox creates#394

Draft
ruiconti wants to merge 1 commit into
mainfrom
rui/vercel-sandbox-duplicate-create
Draft

fix(eve): resume duplicate Vercel sandbox creates#394
ruiconti wants to merge 1 commit into
mainfrom
rui/vercel-sandbox-duplicate-create

Conversation

@ruiconti

Copy link
Copy Markdown
Contributor

What

  • Resume a named Vercel sandbox when Sandbox.create loses a duplicate-name race.
  • Preserve non-duplicate create failures. If the follow-up lookup still cannot find the sandbox, the original create error stays visible.
  • Add a regression test for two concurrent first opens of the same Vercel sandbox session.

Failure mode

The incident shape was a load_skill failure after Vercel returned 400 bad_request from sandbox create: the named sandbox already existed, and Vercel told the caller to use GET /sandboxes/:name to 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_skill because load_skill only exposed the race. ensureSandboxAccess already 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.

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>
@vercel

vercel Bot commented Jun 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview, Comment, Open in v0 Jun 28, 2026 9:08pm

@github-actions

Copy link
Copy Markdown
Contributor

Bundle + Package Summary: apps/fixtures/weather-agent

Key takeaways

  • No notable deltas vs main (6dc84fc).

Delta vs main (6dc84fc)

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"
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant