Skip to content

feat(eve): let a provider say how much of an event it needs - #1823

Draft
chadhietala wants to merge 1 commit into
instr/09-docs-and-compositionfrom
instr/10-capture-below-otel
Draft

feat(eve): let a provider say how much of an event it needs#1823
chadhietala wants to merge 1 commit into
instr/09-docs-and-compositionfrom
instr/10-capture-below-otel

Conversation

@chadhietala

Copy link
Copy Markdown
Contributor

Tenth and last PR of the instrumentation-providers stack. Base is
instr/09-docs-and-composition (#1795). Everything here is behind
experimental.instrumentationProviders, which stays off.

Problem

Capture policy lived entirely inside the OpenTelemetry layer. recordInputs and
recordOutputs were resolved per destination, unioned into the pipeline
settings, and enforced by contentFilteringProcessor — a span processor. Two
consequences, both of which the design doc calls out:

  • A provider authored under agent/instrumentation/ that is not an OTel
    destination — an audit log, a metrics counter, a hosted eval SDK with its own
    transport — received the prompt, the response, and every tool argument and
    result, with no lever to decline them. The span-processor lever is reachable
    only from inside the OTel pipeline, so it could not serve those providers at
    all.
  • eve built the content projection on every event whether or not anything
    downstream would read it. An agent tracing to a metadata-only destination
    still paid to serialize each prompt.

Solution

A provider declares capture. "metadata" — the default — is structure,
identity, usage, and timing. "content" adds what the conversation said.

The bus computes the union across registered providers once and exposes it as
hooks.capturesContent. The AI SDK bridge reads that flag and skips
constructing content at all when it is false, which is what makes the saving
real rather than a filter applied after the fact. When some provider did ask,
the ones that did not are handed a stripped copy of the event — built at most
once per event and shared between them, since the original belongs to whoever
asked and must not be edited underneath them.

The OpenTelemetry pipeline is itself one provider in that list, and now declares
its own capture from the destinations behind it. That is what keeps the two
layers consistent: a pipeline whose destinations all declined content asks for
"metadata" like anything else, and the per-destination span processor keeps
serving OTel-only concerns, which the design explicitly preserves.

Behavior changes

  • Content fields become optional on the events that carry them: input on
    model.call.started and action.started, content on
    model.call.completed, and the payloads inside action.completed's output.
  • InstrumentationActionOutput's discriminator survives declining. Only the
    inner output/error is stripped, so a provider counting tool failures never
    has to ask for content to learn that one failed. Same for
    model.call.completed's finishReason and usage.
  • The shipped agent/instrumentation.ts layout is unaffected. Its only event is
    step.started, which is the runtimeContext surface rather than a bus
    subscriber, and the OTel provider derives its capture from the same
    recordInputs/recordOutputs it already honored.

Validation

pnpm fmt, pnpm lint, pnpm typecheck, pnpm guard:invariants,
pnpm docs:check, pnpm test:unit (6126 passed), pnpm test:integration (617
passed).

New unit coverage: the projection is absent end-to-end when no provider asked;
a metadata provider sharing a bus with a content one sees structure but not
content; and the capturesContent union itself.

Capture policy lived entirely inside the OpenTelemetry layer: recordInputs and
recordOutputs were resolved per destination and enforced by a span processor, so
a provider authored under agent/instrumentation/ saw the prompt, the response,
and every tool payload with no lever to decline them — and eve built that
projection whether or not anyone downstream would read it.

A provider now declares capture. "metadata", the default, is structure,
identity, usage, and timing; "content" adds what the conversation said. The bus
computes the union once, and the AI SDK bridge skips building content when the
union is false, so a directory in which nobody asked never serializes a prompt.
Providers that did not ask are handed a stripped copy — built at most once per
event and shared, since the original belongs to whoever did ask.

The OpenTelemetry pipeline is one provider among them and declares its own
capture from the destinations behind it, which is what keeps the two layers
consistent: a pipeline whose destinations all declined asks for metadata, and
the per-destination span processor keeps serving OTel-only concerns.

Structure survives declining. action.completed still carries whether the tool
returned or threw, so a provider counting failures never has to ask for content.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
eve-docs Ready Ready Preview Aug 7, 2026 11:08pm
eve-docs-4759 Ready Ready Preview, v0 Aug 7, 2026 11:08pm

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs instr/09-docs-and-composition (249dca0).

Delta vs instr/09-docs-and-composition (249dca0)

Area Metric Baseline Current Delta
Package Packed tarball 7.71 MB 7.71 MB +1.1 kB ⚠️
Package Unpacked publish size 28.88 MB 28.88 MB +4.1 kB ⚠️
Package Installed footprint 72.31 MB 72.31 MB +4.1 kB ⚠️
Package Published files 3086 3086 0
Package Installed files 6794 6794 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 17.07 MB 17.07 MB +352 B ⚠️
Runtime Public routes 13 13 0
Changed function payloads vs instr/09-docs-and-composition (249dca0) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 8.53 MB 8.53 MB +176 B ⚠️ none
functions/.well-known/workflow/v1/flow.func changed 8.53 MB 8.53 MB +176 B ⚠️ none

eve init install

Metric Baseline Current Delta
Installed footprint 110.72 MB 110.72 MB +4.1 kB ⚠️
Installed packages 121 121 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 43.35 MB 43.36 MB +4.1 kB ⚠️
devDependency package bytes 5.04 MB 5.04 MB 0 B ➖
Build Metadata
  • Preset: vercel
  • Nitro: nitro@3.0.260610-beta
  • Output directory: apps/fixtures/weather-agent/.vercel/output
  • Build metadata timestamp: 2026-08-07T23:10:31.023Z
  • Route aliases: 13 public, 1 internal (14 total aliases)
  • Vercel routes in config: 16
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.31.2
  • Package directory: packages/eve
  • Tarball: 7.71 MB (eve-0.31.2.tgz)
  • Unpacked payload: 28.88 MB across 3086 published files
  • Installed footprint: 72.31 MB across 6794 installed files
  • Installed root package: 27.52 MB
  • Installed dependencies: 44.78 MB
  • Runtime dependencies: 2
  • Peer dependencies: 5 (4 optional)

Installed footprint is measured from an isolated temporary npm install of the packed tarball.

Heavy installed dependencies

  • eve: 27.52 MB (38.1%)
  • @rolldown/binding-linux-x64-gnu: 19.35 MB (26.8%)
  • ai: 6.67 MB (9.2%)
  • zod: 5.07 MB (7.0%)
  • undici: 3.50 MB (4.8%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js       [################........] 9.68 MB 33.5%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [####....................] 2.42 MB 8.4%
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [###.....................] 1.51 MB 5.2%
🟡 dist/src/compiled/_chunks/workflow/undici-CUI... [#.......................] 508.8 kB 1.8%
🟡 dist/src/compiled/_chunks/node/undici-DWL_MYm... [#.......................] 502.4 kB 1.7%
🔴 Other published files                            [########################] 14.26 MB 49.4%
Installed footprint breakdown
Installed package size
🔴 eve                             [########################] 27.52 MB 38.1%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.35 MB 26.8%
🔴 ai                              [######..................] 6.67 MB 9.2%
🔴 zod                             [####....................] 5.07 MB 7.0%
🟠 undici                          [###.....................] 3.50 MB 4.8%
🟠 nitro                           [##......................] 2.41 MB 3.3%
🔴 Other installed packages        [#######.................] 7.79 MB 10.8%
Runtime dependencies (2)
Package Range Notes
nitro 3.0.260610-beta
undici 8.9.0
Peer dependencies (5)
Package Range Notes
@opentelemetry/api ^1.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
eve init install drill-down

eve init install details

  • Command: eve init my-agent
  • Package manager: npm
  • Installed footprint: 110.72 MB across 8670 installed files
  • Installed packages: 121 total (115 transitive-only)
  • dependencies: 4 direct packages totaling 43.36 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 62.32 MB

Installed footprint is measured from an isolated temporary eve init my-agent using the current packed eve tarball.

Heavy installed dependencies

  • @typescript/typescript-linux-x64: 27.95 MB (25.2%)
  • eve: 27.52 MB (24.9%)
  • @rolldown/binding-linux-x64-gnu: 19.35 MB (17.5%)
  • zod: 9.02 MB (8.2%)
  • ai: 6.67 MB (6.0%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 25.2%
🔴 eve                              [########################] 27.52 MB 24.9%
🔴 @rolldown/binding-linux-x64-gnu  [#################.......] 19.35 MB 17.5%
🔴 zod                              [########................] 9.02 MB 8.2%
🔴 ai                               [######..................] 6.67 MB 6.0%
🟠 undici                           [###.....................] 3.50 MB 3.2%
🔴 Other installed packages         [##############..........] 16.71 MB 15.1%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.4.3 141.0 kB 0.1%
ai ^7.0.38 6.67 MB 6.0%
eve file:eve-0.31.2.tgz 27.52 MB 24.9%
zod 4.4.3 9.02 MB 8.2%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.3%
typescript 7.0.2 2.50 MB 2.3%
Function Drill-Down

Payload Size Graph

Unique function payload size and share of total
🔴 functions/.well-known/workflow/v1/flow.func     [########################] 8.53 MB 50.0%
🔴 functions/__server.func                         [########################] 8.53 MB 50.0%

Top Function Payloads

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

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [########################] 2.33 MB 27.4%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.63 MB 19.1%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.5%
🟡 _chunks/sandbox.mjs             [########................] 769.0 kB 9.0%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.38 MB 27.9%

🧾 Vercel Config

{
  "handler": "index.mjs",
  "launcherType": "Nodejs",
  "shouldAddHelpers": false,
  "supportsResponseStreaming": true,
  "runtime": "nodejs24.x",
  "maxDuration": "max",
  "experimentalTriggers": [
    {
      "type": "queue/v2beta",
      "topic": "__eve776561746865722d6167656e74_wkf_workflow_*",
      "consumer": "default",
      "retryAfterSeconds": 5,
      "initialDelaySeconds": 0
    }
  ],
  "environment": {
    "WORKFLOW_PRECONDITION_GUARD": "1"
  }
}

🟠 functions/__server.func • 12 public routes, 1 internal alias • 8.53 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]/cancel
/eve/v1/session/[sessionId]/clear
/eve/v1/session/[sessionId]/compact
/eve/v1/session/[sessionId]/reset
/eve/v1/session/[sessionId]/stream
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 8.53 MB
Function files 8.53 MB across 44 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 2.33 MB (27.4%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [########################] 2.33 MB 27.4%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.63 MB 19.1%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.5%
🟡 _chunks/sandbox.mjs             [########................] 769.0 kB 9.0%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.38 MB 27.9%

🧾 Vercel Config

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

Build Timing: e2e/fixtures/agent-tools-sandbox

This is an informational timing measurement inside eve build, from preflight through publication. Output-size measurement and profile writing are excluded.

Build mode: deployable Vercel build with sandbox template prewarm included.

  • Build pipeline: 2.04 s -> 2.23 s (+189.4 ms) vs instr/09-docs-and-composition (249dca0).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `instr/09-docs-and-composition (249dca0)`
Phase Baseline Current Delta
extension.check 10.6 ms 1.1 ms -9.5 ms
project.resolve 1.3 ms 0.6 ms -0.7 ms
workspace.create 1.3 ms 0.6 ms -0.7 ms
host.prepare 241.3 ms 206.4 ms -34.9 ms
vercel.service-prefix.resolve 1.9 ms 1.9 ms 0.0 ms
nitro.create 196.8 ms 229.1 ms +32.3 ms
sandbox.prewarm 221.5 ms 450.3 ms +228.8 ms
nitro.cache.prepare 0.3 ms 0.3 ms 0.0 ms
nitro.prepare 0.7 ms 0.7 ms 0.0 ms
nitro.public-assets 0.8 ms 0.8 ms 0.0 ms
nitro.prerender 0.5 ms 0.5 ms 0.0 ms
nitro.bundle 1.34 s 1.31 s -25.8 ms
nitro.cache.write 0.3 ms 0.3 ms 0.0 ms
vercel.workflow-function.materialize 21.4 ms 21.3 ms -0.1 ms
agent-summary.emit 0.6 ms 0.6 ms 0.0 ms
nitro.close 0.2 ms 0.2 ms 0.0 ms
output.publish 3.2 ms 3.4 ms +0.2 ms
workspace.remove 2.0 ms 1.8 ms -0.2 ms

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