Skip to content

[Docs] Fix cookbook pattern for AI SDK#2099

Open
karthikscale3 wants to merge 2 commits into
mainfrom
karthik/cookbook-ai-sdk-tools-not-durable
Open

[Docs] Fix cookbook pattern for AI SDK#2099
karthikscale3 wants to merge 2 commits into
mainfrom
karthik/cookbook-ai-sdk-tools-not-durable

Conversation

@karthikscale3
Copy link
Copy Markdown
Contributor

Summary

The AI SDK cookbook entry (docs/content/docs/v{4,5}/cookbook/integrations/ai-sdk.mdx) shows streamText inside a "use step" turn function with the example tools (lookupOrder, processRefund) also marked "use step". That presentation implies tool calls are individually durable, but per Workflows & Steps the "use step" directive is a no-op when called from another step. So in this pattern tools run as plain inline functions inside runTurn, and the durability boundary is the entire turn — if anything in the turn throws, every tool call that already ran is replayed.

This PR fixes the cookbook to reflect that reality and gives readers an explicit migration path (idempotent tools or DurableAgent).

Changes (applied identically to v4 and v5)

  • Removed the "use step" directive from lookupOrder and processRefund in the workflow code sample, with an inline comment explaining why.
  • Updated the frontmatter summary and intro paragraph: dropped the inaccurate "tools remain durable steps" claim; explicitly call out the per-turn durability boundary.
  • Added a new Tools are not individually durable entry to Pitfalls covering:
    • The retry unit is runTurn, not the tool call.
    • A side-effectful tool (e.g. processRefund) can run multiple times if the turn retries.
    • Mitigations: idempotent tool implementations, or DurableAgent (each tool call becomes its own durable step).
  • Added a runTurn durability-boundary bullet to How it works.
  • Added a Tool call durability row to the streamText vs DurableAgent table.
  • Rewrote two misleading Key APIs bullets:
    • tool() no longer claims tools wrap "use step" functions / are replayed from the log.
    • "use step" is now described as applied to runTurn, not to "tool executions".

Test plan

  • Visual check of the rendered /cookbook/integrations/ai-sdk page on v4 and v5.
  • Confirm the new in-page anchor (#tools-are-not-individually-durable) resolves from the intro paragraph, How it works, and Key APIs cross-links.
  • Confirm the code sample still typechecks in the docs typecheck pipeline.

Made with Cursor

@karthikscale3 karthikscale3 requested a review from a team as a code owner May 22, 2026 23:54
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

⚠️ No Changeset found

Latest commit: f5f1655

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.025s (-44.2% 🟢) 1.007s (~) 0.982s 10 1.00x
💻 Local Nitro 0.031s (-27.8% 🟢) 1.005s (~) 0.974s 10 1.26x
💻 Local Next.js (Turbopack) 0.047s 1.005s 0.958s 10 1.91x
🐘 Postgres Express 0.049s (-15.9% 🟢) 1.012s (~) 0.963s 10 1.98x
🐘 Postgres Nitro 0.052s (-44.9% 🟢) 1.013s (-2.9%) 0.960s 10 2.13x
🐘 Postgres Next.js (Turbopack) 0.056s 1.011s 0.955s 10 2.27x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.280s (+11.3% 🔺) 2.062s (-11.6% 🟢) 1.782s 10 1.00x
▲ Vercel Nitro 0.778s (+89.9% 🔺) 2.885s (+15.0% 🔺) 2.107s 10 2.78x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.054s (-6.4% 🟢) 2.005s (~) 0.951s 10 1.00x
💻 Local Nitro 1.075s (-5.0%) 2.006s (~) 0.931s 10 1.02x
🐘 Postgres Nitro 1.081s (-5.2% 🟢) 2.009s (~) 0.928s 10 1.03x
🐘 Postgres Express 1.095s (-4.5%) 2.010s (~) 0.915s 10 1.04x
💻 Local Next.js (Turbopack) 1.117s 2.006s 0.889s 10 1.06x
🐘 Postgres Next.js (Turbopack) 1.122s 2.010s 0.888s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.722s (-55.8% 🟢) 3.728s (-36.9% 🟢) 2.007s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.121s (+4.2%) 4.007s (+4.6%) 1.886s 10 1.23x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.325s (-5.5% 🟢) 11.020s (~) 0.695s 3 1.00x
🐘 Postgres Nitro 10.420s (-4.1%) 11.020s (~) 0.600s 3 1.01x
💻 Local Nitro 10.422s (-4.8%) 11.023s (~) 0.601s 3 1.01x
🐘 Postgres Express 10.461s (-4.6%) 11.021s (~) 0.561s 3 1.01x
💻 Local Next.js (Turbopack) 10.644s 11.021s 0.378s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.707s 11.018s 0.311s 3 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.466s (-43.3% 🟢) 15.443s (-38.5% 🟢) 1.977s 2 1.00x
▲ Vercel Next.js (Turbopack) 13.597s (-21.5% 🟢) 15.609s (-19.5% 🟢) 2.012s 2 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.278s (-11.3% 🟢) 14.025s (-6.7% 🟢) 0.747s 5 1.00x
🐘 Postgres Nitro 13.492s (-7.6% 🟢) 14.022s (-6.7% 🟢) 0.530s 5 1.02x
💻 Local Nitro 13.517s (-10.3% 🟢) 14.028s (-12.5% 🟢) 0.511s 5 1.02x
🐘 Postgres Express 13.561s (-7.0% 🟢) 14.017s (-6.7% 🟢) 0.456s 5 1.02x
💻 Local Next.js (Turbopack) 14.036s 15.029s 0.992s 4 1.06x
🐘 Postgres Next.js (Turbopack) 14.210s 15.016s 0.805s 4 1.07x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 20.997s (-67.4% 🟢) 23.220s (-65.1% 🟢) 2.223s 3 1.00x
▲ Vercel Next.js (Turbopack) 21.088s (-59.9% 🟢) 22.890s (-58.1% 🟢) 1.802s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 11.495s (-30.8% 🟢) 12.021s (-29.4% 🟢) 0.526s 8 1.00x
💻 Local Nitro 11.983s (-28.6% 🟢) 12.398s (-27.2% 🟢) 0.414s 8 1.04x
🐘 Postgres Express 12.060s (-13.9% 🟢) 12.875s (-11.8% 🟢) 0.816s 7 1.05x
🐘 Postgres Nitro 12.183s (-12.8% 🟢) 12.875s (-10.0% 🟢) 0.693s 7 1.06x
🐘 Postgres Next.js (Turbopack) 13.055s 14.017s 0.962s 7 1.14x
💻 Local Next.js (Turbopack) 13.086s 13.741s 0.655s 7 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 29.622s (-93.0% 🟢) 31.647s (-92.5% 🟢) 2.026s 3 1.00x
▲ Vercel Next.js (Turbopack) 30.482s (-92.3% 🟢) 32.323s (-91.8% 🟢) 1.841s 3 1.03x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.137s (-23.6% 🟢) 2.005s (~) 0.868s 15 1.00x
🐘 Postgres Nitro 1.152s (-9.7% 🟢) 2.010s (~) 0.858s 15 1.01x
🐘 Postgres Express 1.161s (-7.9% 🟢) 2.008s (~) 0.847s 15 1.02x
💻 Local Nitro 1.175s (-28.0% 🟢) 2.006s (-3.3%) 0.831s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.217s 2.006s 0.789s 15 1.07x
💻 Local Next.js (Turbopack) 1.274s 2.006s 0.732s 15 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.507s (-11.0% 🟢) 4.066s (-5.9% 🟢) 1.559s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.701s (-20.5% 🟢) 4.223s (-14.4% 🟢) 1.522s 8 1.08x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.218s (-48.4% 🟢) 2.008s (-33.3% 🟢) 0.790s 15 1.00x
🐘 Postgres Nitro 1.228s (-47.8% 🟢) 2.007s (-33.3% 🟢) 0.779s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.334s 2.006s 0.672s 15 1.10x
💻 Local Express 1.554s (-47.4% 🟢) 2.005s (-41.9% 🟢) 0.451s 15 1.28x
💻 Local Next.js (Turbopack) 1.783s 2.220s 0.438s 14 1.46x
💻 Local Nitro 1.811s (-42.4% 🟢) 2.073s (-46.6% 🟢) 0.262s 15 1.49x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.373s (-16.8% 🟢) 5.135s (-13.3% 🟢) 1.762s 6 1.00x
▲ Vercel Next.js (Turbopack) 4.306s (-39.3% 🟢) 6.038s (-32.2% 🟢) 1.732s 5 1.28x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.337s (-61.6% 🟢) 2.008s (-49.9% 🟢) 0.671s 15 1.00x
🐘 Postgres Express 1.348s (-61.3% 🟢) 2.008s (-49.9% 🟢) 0.660s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.640s 2.075s 0.434s 15 1.23x
💻 Local Express 3.604s (-56.8% 🟢) 4.011s (-55.6% 🟢) 0.406s 8 2.70x
💻 Local Next.js (Turbopack) 4.792s 5.344s 0.552s 6 3.58x
💻 Local Nitro 5.476s (-34.4% 🟢) 6.012s (-33.3% 🟢) 0.536s 5 4.10x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.633s (-25.6% 🟢) 8.539s (-22.1% 🟢) 1.906s 4 1.00x
▲ Vercel Nitro 10.485s (+197.4% 🔺) 12.449s (+125.0% 🔺) 1.964s 3 1.58x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.152s (-8.3% 🟢) 2.007s (~) 0.855s 15 1.00x
🐘 Postgres Express 1.161s (-7.7% 🟢) 2.011s (~) 0.850s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.206s 2.006s 0.800s 15 1.05x
💻 Local Express 1.270s (-32.9% 🟢) 2.005s (-15.2% 🟢) 0.735s 15 1.10x
💻 Local Next.js (Turbopack) 1.307s 2.006s 0.699s 15 1.13x
💻 Local Nitro 1.422s (-23.8% 🟢) 2.006s (-14.3% 🟢) 0.585s 15 1.23x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.450s (-16.4% 🟢) 3.765s (-18.9% 🟢) 1.315s 8 1.00x
▲ Vercel Nitro 2.474s (+0.6%) 3.893s (-6.6% 🟢) 1.419s 8 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.203s (-48.6% 🟢) 2.008s (-33.3% 🟢) 0.805s 15 1.00x
🐘 Postgres Express 1.211s (-48.3% 🟢) 2.008s (-33.3% 🟢) 0.797s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.356s 2.008s 0.651s 15 1.13x
💻 Local Express 1.643s (-47.5% 🟢) 2.004s (-46.7% 🟢) 0.361s 15 1.37x
💻 Local Next.js (Turbopack) 2.042s 2.508s 0.465s 12 1.70x
💻 Local Nitro 2.046s (-33.3% 🟢) 2.508s (-35.5% 🟢) 0.463s 12 1.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.908s (+24.4% 🔺) 5.687s (+25.8% 🔺) 1.779s 6 1.00x
▲ Vercel Nitro 4.346s (+34.4% 🔺) 5.934s (+16.9% 🔺) 1.588s 6 1.11x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.312s (-62.3% 🟢) 2.007s (-49.9% 🟢) 0.695s 15 1.00x
🐘 Postgres Express 1.368s (-60.9% 🟢) 2.008s (-49.9% 🟢) 0.640s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.594s 2.007s 0.413s 15 1.21x
💻 Local Express 4.334s (-50.8% 🟢) 5.012s (-46.0% 🟢) 0.677s 6 3.30x
💻 Local Next.js (Turbopack) 5.107s 5.513s 0.406s 6 3.89x
💻 Local Nitro 6.278s (-31.3% 🟢) 6.617s (-34.0% 🟢) 0.339s 5 4.79x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.444s (+26.5% 🔺) 8.033s (+17.8% 🔺) 1.589s 4 1.00x
▲ Vercel Next.js (Turbopack) 8.351s (+23.6% 🔺) 10.240s (+19.8% 🔺) 1.890s 3 1.30x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.409s (-58.4% 🟢) 1.004s (-6.7% 🟢) 0.595s 60 1.00x
🐘 Postgres Nitro 0.427s (-48.0% 🟢) 1.007s (~) 0.580s 60 1.04x
🐘 Postgres Express 0.467s (-44.3% 🟢) 1.023s (~) 0.556s 60 1.14x
💻 Local Nitro 0.485s (-50.5% 🟢) 1.004s (-8.2% 🟢) 0.519s 60 1.19x
🐘 Postgres Next.js (Turbopack) 0.650s 1.006s 0.356s 60 1.59x
💻 Local Next.js (Turbopack) 0.722s 1.005s 0.283s 60 1.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.142s (-76.7% 🟢) 6.851s (-71.5% 🟢) 1.708s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.490s (-62.1% 🟢) 7.141s (-55.6% 🟢) 1.650s 9 1.07x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.053s (-45.3% 🟢) 1.585s (-24.5% 🟢) 0.532s 57 1.00x
🐘 Postgres Express 1.069s (-45.9% 🟢) 1.903s (-15.7% 🟢) 0.834s 48 1.02x
💻 Local Express 1.087s (-63.9% 🟢) 1.581s (-55.9% 🟢) 0.493s 57 1.03x
💻 Local Nitro 1.194s (-60.7% 🟢) 2.006s (-46.6% 🟢) 0.812s 45 1.13x
🐘 Postgres Next.js (Turbopack) 1.631s 2.030s 0.398s 45 1.55x
💻 Local Next.js (Turbopack) 1.792s 2.005s 0.213s 45 1.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 12.408s (-68.6% 🟢) 14.406s (-65.1% 🟢) 1.999s 7 1.00x
▲ Vercel Next.js (Turbopack) 12.973s (-74.0% 🟢) 15.089s (-70.8% 🟢) 2.117s 6 1.05x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.024s (-50.7% 🟢) 2.477s (-46.2% 🟢) 0.453s 49 1.00x
🐘 Postgres Express 2.040s (-48.9% 🟢) 2.582s (-40.9% 🟢) 0.541s 47 1.01x
💻 Local Express 2.336s (-74.6% 🟢) 3.007s (-70.0% 🟢) 0.670s 40 1.15x
💻 Local Nitro 2.697s (-71.0% 🟢) 3.008s (-70.0% 🟢) 0.311s 40 1.33x
🐘 Postgres Next.js (Turbopack) 3.081s 4.009s 0.928s 30 1.52x
💻 Local Next.js (Turbopack) 3.838s 4.041s 0.203s 30 1.90x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 25.853s (-73.3% 🟢) 28.260s (-71.3% 🟢) 2.407s 5 1.00x
▲ Vercel Next.js (Turbopack) 28.880s (-73.0% 🟢) 31.134s (-71.4% 🟢) 2.255s 4 1.12x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.174s (-38.7% 🟢) 1.006s (~) 0.832s 60 1.00x
🐘 Postgres Express 0.185s (-34.6% 🟢) 1.006s (~) 0.821s 60 1.06x
🐘 Postgres Next.js (Turbopack) 0.226s 1.006s 0.780s 60 1.30x
💻 Local Express 0.323s (-42.5% 🟢) 1.003s (~) 0.680s 60 1.86x
💻 Local Nitro 0.405s (-33.0% 🟢) 1.004s (-1.7%) 0.599s 60 2.33x
💻 Local Next.js (Turbopack) 0.513s 1.004s 0.491s 60 2.96x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.127s (+28.0% 🔺) 3.862s (+15.3% 🔺) 1.736s 16 1.00x
▲ Vercel Next.js (Turbopack) 78.672s (+3789.9% 🔺) 80.646s (+2025.9% 🔺) 1.974s 4 37.00x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.302s (-40.7% 🟢) 1.006s (~) 0.704s 90 1.00x
🐘 Postgres Nitro 0.311s (-37.4% 🟢) 1.006s (~) 0.695s 90 1.03x
🐘 Postgres Next.js (Turbopack) 0.445s 1.006s 0.561s 90 1.47x
💻 Local Express 1.824s (-27.4% 🟢) 2.150s (-28.5% 🟢) 0.326s 42 6.03x
💻 Local Nitro 2.160s (-14.9% 🟢) 2.795s (-7.1% 🟢) 0.635s 33 7.14x
💻 Local Next.js (Turbopack) 2.262s 2.976s 0.715s 31 7.48x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.307s (+50.1% 🔺) 6.944s (+33.7% 🔺) 1.637s 14 1.00x
▲ Vercel Nitro 5.392s (+67.2% 🔺) 7.071s (+46.6% 🔺) 1.679s 13 1.02x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.641s (-21.7% 🟢) 1.006s (-1.1%) 0.365s 120 1.00x
🐘 Postgres Nitro 0.642s (-18.7% 🟢) 1.007s (~) 0.364s 120 1.00x
🐘 Postgres Next.js (Turbopack) 0.925s 1.150s 0.224s 105 1.44x
💻 Local Express 8.003s (-28.5% 🟢) 8.559s (-28.3% 🟢) 0.555s 15 12.49x
💻 Local Nitro 10.406s (-7.0% 🟢) 10.939s (-6.2% 🟢) 0.533s 11 16.24x
💻 Local Next.js (Turbopack) 10.412s 11.121s 0.708s 11 16.25x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 12.912s (+25.0% 🔺) 14.548s (+18.4% 🔺) 1.637s 9 1.00x
▲ Vercel Nitro 14.623s (+89.4% 🔺) 16.444s (+74.9% 🔺) 1.821s 8 1.13x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.105s (+454.9% 🔺) 2.004s (+99.5% 🔺) 0.008s (-33.9% 🟢) 2.014s (+97.9% 🔺) 0.909s 10 1.00x
💻 Local Nitro 1.135s (+431.0% 🔺) 2.005s (+99.6% 🔺) 0.013s (+0.8%) 2.020s (+98.3% 🔺) 0.885s 10 1.03x
🐘 Postgres Nitro 1.145s (+458.3% 🔺) 1.999s (+100.0% 🔺) 0.001s (-26.7% 🟢) 2.010s (+98.8% 🔺) 0.866s 10 1.04x
🐘 Postgres Express 1.145s (+458.3% 🔺) 1.997s (+100.0% 🔺) 0.002s (+6.2% 🔺) 2.011s (+98.9% 🔺) 0.866s 10 1.04x
💻 Local Next.js (Turbopack) 1.174s 2.003s 0.011s 2.017s 0.843s 10 1.06x
🐘 Postgres Next.js (Turbopack) 1.202s 2.000s 0.002s 2.010s 0.807s 10 1.09x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.209s (-42.4% 🟢) 3.408s (-35.4% 🟢) 1.775s (+139.2% 🔺) 5.660s (-12.7% 🟢) 3.450s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.281s (-66.7% 🟢) 3.118s (-64.0% 🟢) 2.449s (+287.5% 🔺) 6.043s (-38.3% 🟢) 3.761s 10 1.03x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.522s (+141.6% 🔺) 2.007s (+99.4% 🔺) 0.004s (-1.7%) 2.024s (+97.9% 🔺) 0.503s 30 1.00x
🐘 Postgres Nitro 1.541s (+146.9% 🔺) 2.002s (+98.9% 🔺) 0.004s (-8.9% 🟢) 2.026s (+98.2% 🔺) 0.485s 30 1.01x
🐘 Postgres Next.js (Turbopack) 1.689s 2.011s 0.004s 2.026s 0.337s 30 1.11x
💻 Local Express 1.823s (+140.8% 🔺) 2.009s (+95.2% 🔺) 0.006s (-32.9% 🟢) 2.418s (+132.5% 🔺) 0.595s 25 1.20x
💻 Local Next.js (Turbopack) 1.842s 2.011s 0.010s 2.203s 0.361s 28 1.21x
💻 Local Nitro 1.949s (+132.4% 🔺) 2.011s (+98.8% 🔺) 0.010s (+2.5%) 2.424s (+117.2% 🔺) 0.475s 25 1.28x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.940s (-79.8% 🟢) 7.502s (-75.6% 🟢) 0.172s (+53.3% 🔺) 8.173s (-74.3% 🟢) 2.234s 8 1.00x
▲ Vercel Next.js (Turbopack) 6.033s (-64.3% 🟢) 7.498s (-58.9% 🟢) 0.161s (-23.9% 🟢) 8.134s (-57.0% 🟢) 2.101s 8 1.02x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.658s (-32.1% 🟢) 1.033s (-17.2% 🟢) 0.000s (-58.6% 🟢) 1.041s (-17.2% 🟢) 0.383s 58 1.00x
🐘 Postgres Express 0.675s (-29.7% 🟢) 1.031s (-19.3% 🟢) 0.000s (-20.7% 🟢) 1.043s (-20.2% 🟢) 0.367s 58 1.03x
🐘 Postgres Next.js (Turbopack) 0.796s 1.053s 0.000s 1.068s 0.272s 57 1.21x
💻 Local Express 1.135s (-7.3% 🟢) 1.981s (-1.9%) 0.000s (+16.1% 🔺) 1.983s (-1.9%) 0.848s 31 1.73x
💻 Local Nitro 1.340s (+9.6% 🔺) 2.015s (~) 0.000s (+333.3% 🔺) 2.017s (~) 0.678s 30 2.04x
💻 Local Next.js (Turbopack) 1.432s 2.014s 0.000s 2.017s 0.585s 30 2.18x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.812s (-62.6% 🟢) 4.992s (-56.7% 🟢) 0.000s (+Infinity% 🔺) 5.457s (-54.7% 🟢) 1.645s 11 1.00x
▲ Vercel Nitro 4.160s (+36.4% 🔺) 5.415s (+23.3% 🔺) 0.000s (+18.2% 🔺) 5.898s (+22.7% 🔺) 1.738s 11 1.09x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.335s (-25.5% 🟢) 2.000s (-6.6% 🟢) 0.000s (-6.7% 🟢) 2.032s (-6.6% 🟢) 0.696s 30 1.00x
🐘 Postgres Express 1.421s (-19.8% 🟢) 2.102s (-3.5%) 0.000s (NaN%) 2.115s (-3.8%) 0.694s 29 1.06x
🐘 Postgres Next.js (Turbopack) 1.643s 2.181s 0.000s 2.204s 0.561s 28 1.23x
💻 Local Express 2.393s (-31.0% 🟢) 2.881s (-28.6% 🟢) 0.001s (-10.7% 🟢) 2.887s (-28.5% 🟢) 0.494s 21 1.79x
💻 Local Next.js (Turbopack) 2.811s 3.292s 0.001s 3.296s 0.486s 19 2.10x
💻 Local Nitro 3.077s (-9.2% 🟢) 3.841s (-4.8%) 0.000s (-41.4% 🟢) 3.843s (-4.8%) 0.766s 16 2.30x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.383s (-4.2%) 6.939s (-0.6%) 0.000s (-100.0% 🟢) 7.456s (-1.1%) 2.074s 9 1.00x
▲ Vercel Nitro 5.798s (+41.6% 🔺) 7.326s (+36.3% 🔺) 0.002s (+587.5% 🔺) 7.867s (+35.8% 🔺) 2.069s 8 1.08x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 21/21
🐘 Postgres Nitro 15/21
▲ Vercel Nitro 13/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 13/21
Next.js (Turbopack) 🐘 Postgres 16/21
Nitro 🐘 Postgres 17/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1220 2 219 1441
✅ 💻 Local Development 1509 0 194 1703
❌ 📦 Local Production 1614 1 219 1834
✅ 🐘 Local Postgres 1615 0 219 1834
✅ 🪟 Windows 131 0 0 131
✅ 📋 Other 741 0 176 917
Total 6830 3 1027 7860

❌ Failed Tests

▲ Vercel Production (2 failed)

astro (1 failed):

  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step

nuxt (1 failed):

  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
📦 Local Production (1 failed)

nextjs-turbopack-stable-lazy-discovery-enabled (1 failed):

  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KSB31NYZAHPJX9DA49BW5PKY

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
❌ astro 104 1 26
✅ example 105 0 26
✅ express 105 0 26
✅ fastify 105 0 26
✅ hono 105 0 26
✅ nextjs-turbopack 129 0 2
✅ nextjs-webpack 129 0 2
✅ nitro 105 0 26
❌ nuxt 104 1 26
✅ sveltekit 124 0 7
✅ vite 105 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
❌ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
❌ nextjs-turbopack-stable-lazy-discovery-enabled 130 1 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 106 0 25
✅ express-stable 106 0 25
✅ fastify-stable 106 0 25
✅ hono-stable 106 0 25
✅ nextjs-turbopack-canary 112 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 131 0 0
✅ nextjs-webpack-canary 112 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 131 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 131 0 0
✅ nitro-stable 106 0 25
✅ nuxt-stable 106 0 25
✅ sveltekit-stable 125 0 6
✅ vite-stable 106 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 131 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 106 0 25
✅ e2e-local-dev-tanstack-start- 106 0 25
✅ e2e-local-postgres-nest-stable 106 0 25
✅ e2e-local-postgres-tanstack-start- 106 0 25
✅ e2e-local-prod-nest-stable 106 0 25
✅ e2e-local-prod-tanstack-start- 106 0 25
✅ e2e-vercel-prod-tanstack-start 105 0 26

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: failure
  • Local Prod: failure
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

@karthikscale3 karthikscale3 changed the title docs(cookbook): clarify tools are not individually durable in streamText pattern Fix cookbook pattern for AI SDK May 22, 2026
@karthikscale3 karthikscale3 changed the title Fix cookbook pattern for AI SDK [Docs] Fix cookbook pattern for AI SDK May 22, 2026
@karthikscale3 karthikscale3 force-pushed the karthik/cookbook-ai-sdk-tools-not-durable branch from 027316f to c661ac8 Compare May 22, 2026 23:56
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 22, 2026

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 23, 2026 6:56pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 23, 2026 6:56pm
example-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-astro-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-express-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-fastify-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-hono-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-nitro-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workbench-vite-workflow Ready Ready Preview, Comment May 23, 2026 6:56pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 23, 2026 6:56pm
workflow-swc-playground Ready Ready Preview, Comment May 23, 2026 6:56pm
workflow-tarballs Ready Ready Preview, Comment May 23, 2026 6:56pm
workflow-web Ready Ready Preview, Comment May 23, 2026 6:56pm

@karthikscale3 karthikscale3 reopened this May 22, 2026
@karthikscale3 karthikscale3 deleted the karthik/cookbook-ai-sdk-tools-not-durable branch May 22, 2026 23:57
@karthikscale3 karthikscale3 restored the karthik/cookbook-ai-sdk-tools-not-durable branch May 22, 2026 23:59
@karthikscale3 karthikscale3 reopened this May 22, 2026
@karthikscale3 karthikscale3 force-pushed the karthik/cookbook-ai-sdk-tools-not-durable branch from 2c782ac to cd5e4b7 Compare May 23, 2026 00:12
});

// Tools are plain async functions in this pattern. `streamText` calls them
// from inside `runTurn` (a step), and the `"use step"` directive is a no-op
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like this comment is more of a changelog than describing the current state? Since we removed the "use step"

Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM assuming this was tested, some wording nits

Comment thread docs/content/docs/v4/cookbook/integrations/ai-sdk.mdx Outdated
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Karthik Kalyan <105607645+karthikscale3@users.noreply.github.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.

2 participants