Skip to content

feat(eve): tag workflows with channel request ids#215

Open
ruiconti wants to merge 1 commit into
mainfrom
rui/channel-request-ids
Open

feat(eve): tag workflows with channel request ids#215
ruiconti wants to merge 1 commit into
mainfrom
rui/channel-request-ids

Conversation

@ruiconti

@ruiconti ruiconti commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Inbound Vercel requests carry x-vercel-id, but we never wrote it to workflow rows. When a platform request opened a session or resumed a turn, there was no way to join that workflow run back to the request that caused it. This records the id as a workflow attribute.

What

  • Read x-vercel-id off the inbound channel route and thread it through send, run, and deliver as requestId.
  • Serialize it into workflow context as eve.channelRequestId.
  • Emit $eve.channel_request_id on session, subagent, and turn rows.
  • Missing header means no id. We don't invent one.

Route → runtime

channel-dispatch.ts reads the header once per request and builds a route agent that injects requestId into deliver/run. It spreads into a fresh input each call, so a frozen caller input is never mutated. createSendFn takes the id as a metadata.requestId argument.

Context

New ChannelRequestIdKey. buildRunContext sets it from RunInput.requestId, so run carries it into the serialized context the driver starts with. deliver puts it on the resume hook payload, so a resumed turn picks it up too.

Attributes

readChannelRequestId reads the slot and drops empty or non-string values. The session, subagent, and turn attribute builders emit $eve.channel_request_id from it — undefined when the run didn't start from an inbound route, like a schedule.

Doesn't touch

Driver hook timing, rekey, cross-channel receive, subagent callback routing. No behavior change beyond the new attribute.

Ported from ash#1004, with three changes for this repo

  • The run test stubs VERCEL_ENV=production. Latest-deployment routing is gated on it here (shouldRouteToLatestDeployment), so without the stub the run pins to the current deployment and the deploymentId: "latest" assertion fails.
  • Changeset is patch, not minor. The change only adds optional fields and new exports, so nothing breaks — a patch under the pre-1.0 rule.
  • workflow-entry.ts was already sitting at the 700-line cap, so the two new requestId fields tip it over. The two deliver payloads stay inline (no extra consts) and the file gets a temporary allowlist entry with a TODO to extract the deliver-routing helpers (routeDeliverForChildren, waitForNextDeliver).

@vercel

vercel Bot commented Jun 23, 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 23, 2026 8:28pm

@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs main (69aba4f).

Delta vs main (69aba4f)

Area Metric Baseline Current Delta
Package Packed tarball 3.39 MB 3.39 MB +138 B ⚠️
Package Unpacked publish size 12.35 MB 12.35 MB +2.0 kB ⚠️
Package Installed footprint 52.56 MB 52.56 MB +2.0 kB ⚠️
Package Published files 2280 2280 0
Package Installed files 5485 5485 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 9.35 MB 9.37 MB +26.3 kB ⚠️
Runtime Public routes 9 9 0
Changed function payloads vs main (69aba4f) (2)
Function Status Baseline Current Delta Route changes
functions/.well-known/workflow/v1/flow.func changed 5.48 MB 5.51 MB +25.7 kB ⚠️ none
functions/__server.func changed 3.87 MB 3.87 MB +613 B ⚠️ none
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-06-23T20:28:56.278Z
  • 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.13.2
  • Package directory: packages/eve
  • Tarball: 3.39 MB (eve-0.13.2.tgz)
  • Unpacked payload: 12.35 MB across 2280 published files
  • Installed footprint: 52.56 MB across 5485 installed files
  • Installed root package: 11.08 MB
  • Installed dependencies: 41.48 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.61 MB (39.2%)
  • eve: 11.08 MB (21.1%)
  • ai: 6.20 MB (11.8%)
  • 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 12.2%
🟡 dist/src/compiled/@workflow/core/runtime.js      [##......................] 775.4 kB 6.3%
🟡 dist/src/compiled/@vercel/sandbox/index.js       [##......................] 632.0 kB 5.1%
🟡 dist/src/compiled/@chat-adapter/slack/index.js   [#.......................] 438.4 kB 3.5%
🟡 dist/src/compiled/_chunks/workflow/attribute-... [#.......................] 370.9 kB 3.0%
🔴 Other published files                            [########################] 8.63 MB 69.9%
Installed footprint breakdown
Installed package size
🔴 @rolldown/binding-linux-x64-gnu [########################] 20.61 MB 39.2%
🔴 eve                             [#############...........] 11.08 MB 21.1%
🔴 ai                              [#######.................] 6.20 MB 11.8%
🔴 zod                             [######..................] 5.04 MB 9.6%
🟠 nitro                           [###.....................] 2.41 MB 4.6%
🟡 rolldown                        [#.......................] 771.0 kB 1.5%
🔴 Other installed packages        [########................] 6.46 MB 12.3%
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.51 MB 58.7%
🔴 functions/__server.func                         [#################.......] 3.87 MB 41.3%

Top Function Payloads

🟠 functions/.well-known/workflow/v1/flow.func • 1 public route • 5.51 MB
Metric Value
Public routes /.well-known/workflow/v1/flow
Runtime nodejs24.x
Handler index.mjs
Payload 5.51 MB
Function files 5.51 MB across 27 files
Traced dependencies 0 B
Signal 🟠 Bundled file __eve_nitro_handler__.mjs is 1.54 MB (27.9%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 __eve_nitro_handler__.mjs              [########################] 1.54 MB 27.9%
🟠 _chunks/runtime.mjs                    [###############.........] 958.4 kB 17.4%
🟡 _chunks/sandbox.mjs                    [############............] 766.0 kB 13.9%
🟡 _chunks/attribute-changes-Bi5DLT8S.mjs [#######.................] 472.2 kB 8.6%
🟡 _chunks/dist-DTchiX0N.mjs              [#######.................] 460.6 kB 8.4%
🟠 Other bundled files                    [#####################...] 1.31 MB 23.8%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "environment": {
    "NODE_OPTIONS": "--experimental-require-module",
    "WORKFLOW_QUEUE_NAMESPACE": "eve"
  },
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ]
}

🟠 functions/__server.func • 8 public routes, 1 internal alias • 3.87 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.87 MB
Function files 3.87 MB across 21 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 1.40 MB (36.3%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                              [########################] 1.40 MB 36.3%
🟠 _chunks/runtime.mjs                    [###############.........] 875.8 kB 22.6%
🟠 _chunks/sandbox.mjs                    [#############...........] 766.0 kB 19.8%
🟡 _chunks/attribute-changes-Bi5DLT8S.mjs [########................] 448.5 kB 11.6%
⚪ _libs/zod.mjs                          [##......................] 114.2 kB 3.0%
🟡 Other bundled files                    [####....................] 258.8 kB 6.7%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x"
}

Inbound Vercel channel requests carry `x-vercel-id`, but eve was not
recording it on workflow rows, so a platform request could not be joined
to the session and turn runs it created.

Thread that header through the channel route path as `requestId`: `send`,
route-agent `run`, and route-agent `deliver` pass it into the runtime, the
workflow runtime serializes it as `eve.channelRequestId`, and session,
subagent, and turn rows emit `$eve.channel_request_id`. When the header is
absent, eve does not synthesize a replacement.

Ported from vercel/ash#1004. Three adaptations for this repo: the run test
stubs `VERCEL_ENV=production` because latest-deployment routing is gated on
it here; the changeset is `patch` (additive optional fields only) per the
pre-1.0 convention rather than `minor`; and because workflow-entry.ts was
already at the 700-line cap, the two deliver payloads stay inline and the
file is temporarily allowlisted with a TODO to extract the deliver-routing
helpers.

Signed-off-by: Rui Conti <ruiconti@gmail.com>
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