Skip to content

feat(eve): show provider-executed tool calls in the trace conversation view - #1445

Merged
chadhietala merged 3 commits into
trace-conversationfrom
trace-provider-tools
Jul 31, 2026
Merged

feat(eve): show provider-executed tool calls in the trace conversation view#1445
chadhietala merged 3 commits into
trace-conversationfrom
trace-provider-tools

Conversation

@chadhietala

@chadhietala chadhietala commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Stacked on #1403base is trace-conversation, review that first.

Provider-executed tools were invisible in /traces. A gateway tool like web_search runs inside the model call — it never reaches eve's tool loop, so no onToolExecutionStart fires, no ai.toolCall span is recorded, and the viewer had nothing to render. A trace could show five searches' worth of results in the reply with no trace of the searches themselves (the real trace that surfaced this had 7 model calls carrying web_search in tool_calls but only 2 ai.toolCall spans — the local glob and bash).

What changed

Capture. A provider-executed tool's outcome exists only as tool-result/tool-error content parts on the model response. Those are now serialized to a new ai.response.tool_results attribute on the model span ({toolName, input, output} or {toolName, input, error} entries).

Truncation needed its own path: websearch outputs routinely blow past the 32 KiB attribute cap, and the generic text truncation appended … [truncated] mid-string — leaving invalid JSON that a consumer can only drop. toolResultsContentAttribute instead collapses each entry's input/output to capped text at shrinking budgets until the array fits, so the attribute always parses and always keeps toolName and the error flag.

Viewer. Each entry renders as a regular tool card right after its assistant card (same span start, stable sort keeps emission order): Input: from the call arguments, Output: from the result, red error surface for tool-error, no duration shown since there is no span timing for provider-side execution. The parser accepts both structured values and truncation-flattened strings. The new payload attributes (ai.response.tool_results, and ai.response.reasoning which the cards already show as Thought:) join the drawer's excluded content keys so the metadata drawer stays metadata.

One structural consequence: several cards can now share one span (a model span carries its provider tool cards), so selection re-mapping across live polls matches by occurrence rather than first spanId+kind hit — without that, a poll would snap selection from the second web_search card back to the first.

Verification

Unit tests at this layer: capture shape and error entries on the provider, truncation validity (single oversized entry, error-key preservation, budget split across 8 oversized entries), viewer card emission/ordering/error mapping (90 tests across the touched suites). Reproduced against the real websearch trace that surfaced the bug — cards render with truncated output. Sweep green; full suite at the stack top.

@vercel

vercel Bot commented Jul 31, 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 Jul 31, 2026 1:53pm
eve-docs-4759 Ready Ready Preview, v0 Jul 31, 2026 1:53pm

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

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

Key takeaways

  • No notable deltas vs trace-conversation (44372f1).

Delta vs trace-conversation (44372f1)

Area Metric Baseline Current Delta
Package Packed tarball 7.48 MB 7.48 MB +2.0 kB ⚠️
Package Unpacked publish size 27.90 MB 27.90 MB +2.2 kB ⚠️
Package Installed footprint 84.87 MB 84.88 MB +2.2 kB ⚠️
Package Published files 2915 2915 0
Package Installed files 6708 6708 0
Runtime Unique function payloads 2 2 0
Runtime Total function bytes 16.91 MB 16.91 MB -40 B ✅
Runtime Public routes 11 11 0
Changed function payloads vs trace-conversation (44372f1) (2)
Function Status Baseline Current Delta Route changes
functions/__server.func changed 8.45 MB 8.45 MB -20 B ✅ none
functions/.well-known/workflow/v1/flow.func changed 8.45 MB 8.45 MB -20 B ✅ none

eve init install

Metric Baseline Current Delta
Installed footprint 123.28 MB 123.29 MB +2.2 kB ⚠️
Installed packages 128 128 0
dependencies 4 4 0
devDependencies 2 2 0
Dependency package bytes 42.27 MB 42.27 MB +2.2 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-07-31T13:55:54.817Z
  • Route aliases: 11 public, 1 internal (12 total aliases)
  • Vercel routes in config: 14
  • Severity legend: 🔴 dominant/large, 🟠 notable, 🟡 watch, ⚪ small
Package Drill-Down

Package Details

  • Package: eve@0.29.2
  • Package directory: packages/eve
  • Tarball: 7.48 MB (eve-0.29.2.tgz)
  • Unpacked payload: 27.90 MB across 2915 published files
  • Installed footprint: 84.88 MB across 6708 installed files
  • Installed root package: 26.55 MB
  • Installed dependencies: 58.33 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: 26.55 MB (31.3%)
  • @rolldown/binding-linux-x64-gnu: 19.28 MB (22.7%)
  • @rolldown/binding-wasm32-wasi: 10.66 MB (12.6%)
  • ai: 6.56 MB (7.7%)
  • zod: 5.07 MB (6.0%)
Publish payload breakdown
Published file size
🔴 dist/src/compiled/shadcn-registry/index.js       [#################.......] 9.68 MB 34.7%
🟠 dist/src/compiled/@photon-ai/chat-adapter-ime... [####....................] 2.42 MB 8.7%
🟠 dist/src/compiled/experimental-ai-sdk-code-mo... [###.....................] 1.51 MB 5.4%
🟡 dist/src/compiled/_chunks/node/undici-DWL_MYm... [#.......................] 502.4 kB 1.8%
🟡 dist/src/compiled/_chunks/workflow/undici-DWL... [#.......................] 502.4 kB 1.8%
🔴 Other published files                            [########################] 13.29 MB 47.6%
Installed footprint breakdown
Installed package size
🔴 eve                             [########################] 26.55 MB 31.3%
🔴 @rolldown/binding-linux-x64-gnu [#################.......] 19.28 MB 22.7%
🔴 @rolldown/binding-wasm32-wasi   [##########..............] 10.66 MB 12.6%
🔴 ai                              [######..................] 6.56 MB 7.7%
🔴 zod                             [#####...................] 5.07 MB 6.0%
🟠 undici                          [###.....................] 3.50 MB 4.1%
🔴 Other installed packages        [############............] 13.26 MB 15.6%
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: 123.29 MB across 8584 installed files
  • Installed packages: 128 total (122 transitive-only)
  • dependencies: 4 direct packages totaling 42.27 MB
  • devDependencies: 2 direct packages totaling 5.04 MB
  • Other transitive package files: 75.97 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 (22.7%)
  • eve: 26.55 MB (21.5%)
  • @rolldown/binding-linux-x64-gnu: 19.28 MB (15.6%)
  • @rolldown/binding-wasm32-wasi: 10.66 MB (8.6%)
  • zod: 9.02 MB (7.3%)
Installed footprint breakdown
Installed package size
🔴 @typescript/typescript-linux-x64 [########################] 27.95 MB 22.7%
🔴 eve                              [#######################.] 26.55 MB 21.5%
🔴 @rolldown/binding-linux-x64-gnu  [#################.......] 19.28 MB 15.6%
🔴 @rolldown/binding-wasm32-wasi    [#########...............] 10.66 MB 8.6%
🔴 zod                              [########................] 9.02 MB 7.3%
🔴 ai                               [######..................] 6.56 MB 5.3%
🔴 Other installed packages         [####################....] 23.27 MB 18.9%
dependencies (4)
Package Range Installed size Share
@vercel/connect 0.4.3 141.0 kB 0.1%
ai ^7.0.38 6.56 MB 5.3%
eve file:eve-0.29.2.tgz 26.55 MB 21.5%
zod 4.4.3 9.02 MB 7.3%
devDependencies (2)
Package Range Installed size Share
@types/node 24.x 2.54 MB 2.1%
typescript 7.0.2 2.50 MB 2.0%
Function Drill-Down

Payload Size Graph

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

Top Function Payloads

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

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [#######################.] 2.31 MB 27.4%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.59 MB 18.9%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.6%
🟡 _chunks/sandbox.mjs             [########................] 769.0 kB 9.1%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.37 MB 28.0%

🧾 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 • 10 public routes, 1 internal alias • 8.45 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]/stream
/eve/v1/session/reset
Internal aliases /__server
Runtime nodejs24.x
Handler index.mjs
Payload 8.45 MB
Function files 8.45 MB across 43 files
Traced dependencies 0 B
Signal 🟠 Bundled file index.mjs is 2.31 MB (27.4%)

🟠 🔎 Dependency Analysis

📦 Bundled files:

Bundled file size
🟠 index.mjs                       [#######################.] 2.31 MB 27.4%
🟠 _chunks/runtime-artifacts.mjs   [################........] 1.59 MB 18.9%
🟡 _libs/undici.mjs                [##########..............] 980.5 kB 11.6%
🟡 _chunks/sandbox.mjs             [########................] 769.0 kB 9.1%
🟡 _libs/@ai-sdk/gateway+[...].mjs [####....................] 432.8 kB 5.1%
🟠 Other bundled files             [########################] 2.36 MB 28.0%

🧾 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.02 s -> 1.98 s (-34.4 ms) vs trace-conversation (44372f1).
  • Timing is informational: shared GitHub runners are too variable for a hard timing budget.
Detailed phase timings vs `trace-conversation (44372f1)`
Phase Baseline Current Delta
extension.check 6.7 ms 1.2 ms -5.5 ms
project.resolve 1.5 ms 0.7 ms -0.8 ms
workspace.create 1.3 ms 0.8 ms -0.5 ms
host.prepare 185.0 ms 147.0 ms -38.0 ms
vercel.service-prefix.resolve 2.4 ms 2.4 ms 0.0 ms
nitro.create 211.5 ms 230.1 ms +18.6 ms
sandbox.prewarm 268.5 ms 270.9 ms +2.4 ms
nitro.cache.prepare 0.3 ms 0.3 ms 0.0 ms
nitro.prepare 0.8 ms 0.9 ms +0.1 ms
nitro.public-assets 0.8 ms 0.8 ms 0.0 ms
nitro.prerender 0.6 ms 0.5 ms -0.1 ms
nitro.bundle 1.31 s 1.30 s -10.2 ms
nitro.cache.write 0.4 ms 0.4 ms 0.0 ms
vercel.workflow-function.materialize 23.3 ms 23.6 ms +0.3 ms
agent-summary.emit 0.5 ms 0.5 ms 0.0 ms
nitro.close 0.1 ms 0.1 ms 0.0 ms
output.publish 4.0 ms 3.5 ms -0.5 ms
workspace.remove 2.2 ms 2.2 ms 0.0 ms

@chadhietala chadhietala changed the title Show provider-executed tool calls in the trace conversation view feat(eve): show provider-executed tool calls in the trace conversation view Jul 31, 2026
@chadhietala
chadhietala force-pushed the trace-provider-tools branch from 49947f5 to a3a8ef4 Compare July 31, 2026 11:12
Provider-executed tools (e.g. web_search) run inside the model call and
never reach eve's tool loop, so they got no ai.toolCall span and were
invisible in /traces. Capture their tool-result/tool-error content parts
as ai.response.tool_results on the model span, and render one tool card
per result after the assistant card. Selection re-mapping now matches by
occurrence since several cards can share one span.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
web_search outputs regularly exceed the 32KiB content attribute limit, and
the generic text truncation left ai.response.tool_results as invalid JSON
that the viewer silently dropped — the exact symptom of missing websearch
cards. Truncate per-entry input/output text at shrinking budgets instead,
so the array always parses; the viewer now accepts both structured values
and truncation-flattened strings.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
The reasoning and tool_results content attributes render on the cards;
the drawer stays metadata-only like the other payload keys.

Signed-off-by: Chad Hietala <chadhietala@gmail.com>
@chadhietala
chadhietala merged commit 680db59 into main Jul 31, 2026
148 of 164 checks passed
@chadhietala
chadhietala deleted the trace-provider-tools branch July 31, 2026 14:22
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.

2 participants