Skip to content

Conversation

@ctate
Copy link
Contributor

@ctate ctate commented Dec 21, 2025

Key Changes

Generation Settings

  • Support for temperature, maxOutputTokens, topP, topK, presencePenalty, frequencyPenalty, stopSequences, seed at constructor and per-stream level

Step Control

  • Added maxSteps to limit LLM calls (default: unlimited for backwards compatibility)
  • Added toolChoice (auto, none, required, or specific tool)
  • Added activeTools to filter available tools per-stream call

Callbacks

  • onChunk - called for each stream chunk
  • onStepFinish - called after each step completes
  • onFinish - called when all steps complete
  • onError - called on errors
  • onAbort - called when aborted via AbortSignal

Structured Output

  • Added experimental_output with Output.object({ schema }) for parsing structured responses

Context & Telemetry

  • Added experimental_context to pass data to tool executions
  • Added experimental_telemetry for observability

Stream Result

  • stream() now returns { messages, steps, experimental_output } instead of just { messages }

Other

  • prepareStep can now override generation settings, toolChoice, and context
  • Added experimental_repairToolCall for handling malformed tool calls
  • Enabled file, source, and tool input streaming chunks
  • Exported all new types from @workflow/ai

@vercel
Copy link
Contributor

vercel bot commented Dec 21, 2025

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

Project Deployment Review Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Dec 24, 2025 5:31pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Dec 24, 2025 5:31pm
example-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-astro-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-express-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-fastify-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-hono-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-nitro-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-nuxt-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workbench-vite-workflow Ready Ready Preview, Comment Dec 24, 2025 5:31pm
workflow-docs Ready Ready Preview, Comment Dec 24, 2025 5:31pm

@changeset-bot
Copy link

changeset-bot bot commented Dec 21, 2025

🦋 Changeset detected

Latest commit: 0c0dfe1

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@workflow/ai Patch

Not sure what this means? Click here to learn what changesets are.

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

@github-actions
Copy link
Contributor

github-actions bot commented Dec 21, 2025

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 286 0 11 297
❌ 💻 Local Development 236 26 8 270
✅ 📦 Local Production 262 0 8 270
✅ 🐘 Local Postgres 262 0 8 270
❌ 🪟 Windows 0 27 0 27
❌ 🌍 Community Worlds 58 62 0 120
Total 1104 115 35 1254

❌ Failed Tests

💻 Local Development (26 failed)

nuxt-stable (26 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • webhook route with invalid token
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • retryAttemptCounterWorkflow
  • retryableAndFatalErrorWorkflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check endpoint - workflow and step endpoints respond to __health query parameter
🪟 Windows (27 failed)

nextjs-turbopack (27 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • webhook route with invalid token
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • retryAttemptCounterWorkflow
  • retryableAndFatalErrorWorkflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check endpoint - workflow and step endpoints respond to __health query parameter
🌍 Community Worlds (62 failed)

mongodb (1 failed):

  • webhookWorkflow

redis (1 failed):

  • webhookWorkflow

starter-dev (3 failed):

  • dev e2e should rebuild on step change
  • dev e2e should rebuild on workflow change
  • dev e2e should rebuild on adding workflow file

starter (27 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • webhook route with invalid token
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • retryAttemptCounterWorkflow
  • retryableAndFatalErrorWorkflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check endpoint - workflow and step endpoints respond to __health query parameter

turso-dev (3 failed):

  • dev e2e should rebuild on step change
  • dev e2e should rebuild on workflow change
  • dev e2e should rebuild on adding workflow file

turso (27 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • webhookWorkflow
  • webhook route with invalid token
  • sleepingWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • retryAttemptCounterWorkflow
  • retryableAndFatalErrorWorkflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check endpoint - workflow and step endpoints respond to __health query parameter

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 26 0 1
✅ example 26 0 1
✅ express 26 0 1
✅ fastify 26 0 1
✅ hono 26 0 1
✅ nextjs-turbopack 26 0 1
✅ nextjs-webpack 26 0 1
✅ nitro 26 0 1
✅ nuxt 26 0 1
✅ sveltekit 26 0 1
✅ vite 26 0 1
❌ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
✅ hono-stable 26 0 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
❌ nuxt-stable 0 26 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
✅ hono-stable 26 0 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
✅ nuxt-stable 26 0 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
✅ hono-stable 26 0 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
✅ nuxt-stable 26 0 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
❌ 🪟 Windows
App Passed Failed Skipped
❌ nextjs-turbopack 0 27 0
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 0
❌ mongodb 26 1 0
✅ redis-dev 3 0 0
❌ redis 26 1 0
❌ starter-dev 0 3 0
❌ starter 0 27 0
❌ turso-dev 0 3 0
❌ turso 0 27 0

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Contributor

github-actions bot commented Dec 21, 2025

📊 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 🥇 Nitro 0.031s (-26.1% 🟢) 1.007s (~) 0.975s 10 1.00x
🌐 Starter Next.js (Turbopack) 0.036s (-8.7% 🟢) 1.014s (~) 0.978s 10 1.15x
🌐 Redis Next.js (Turbopack) 0.037s (-8.2% 🟢) 1.018s (~) 0.982s 10 1.18x
💻 Local Next.js (Turbopack) 0.038s (-4.5%) 1.018s (~) 0.980s 10 1.21x
💻 Local Express 0.042s (-5.8% 🟢) 1.007s (~) 0.965s 10 1.35x
🌐 Turso Next.js (Turbopack) 0.104s (-3.3%) 1.014s (~) 0.910s 10 3.34x
🌐 MongoDB Next.js (Turbopack) 0.110s (-12.9% 🟢) 1.014s (~) 0.904s 10 3.52x
🐘 Postgres Nitro 0.201s (-11.7% 🟢) 1.027s (+0.7%) 0.827s 10 6.43x
🐘 Postgres Next.js (Turbopack) 0.247s (+11.7% 🔺) 1.020s (~) 0.773s 10 7.92x
🐘 Postgres Express 0.380s (+28.2% 🔺) 1.013s (~) 0.633s 10 12.19x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.569s (-3.6%) 1.560s (-2.5%) 0.991s 10 1.00x
▲ Vercel Next.js (Turbopack) 0.588s (-7.3% 🟢) 1.642s (+10.5% 🔺) 1.054s 10 1.03x
▲ Vercel Nitro 0.649s (+29.2% 🔺) 1.603s (+6.1% 🔺) 0.954s 10 1.14x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.078s (-3.2%) 2.005s (~) 0.927s 10 1.00x
🌐 Redis Next.js (Turbopack) 1.082s (-1.6%) 2.015s (~) 0.933s 10 1.00x
💻 Local Next.js (Turbopack) 1.095s (~) 2.011s (~) 0.917s 10 1.02x
🌐 Starter Next.js (Turbopack) 1.095s (~) 2.009s (~) 0.915s 10 1.02x
💻 Local Express 1.112s (~) 2.006s (~) 0.894s 10 1.03x
🌐 Turso Next.js (Turbopack) 1.306s (~) 2.013s (~) 0.706s 10 1.21x
🌐 MongoDB Next.js (Turbopack) 1.311s (~) 2.013s (~) 0.702s 10 1.22x
🐘 Postgres Next.js (Turbopack) 1.817s (-4.5%) 2.015s (~) 0.198s 10 1.69x
🐘 Postgres Express 2.237s (+5.4% 🔺) 3.015s (~) 0.778s 10 2.08x
🐘 Postgres Nitro 2.450s (+7.3% 🔺) 3.014s (~) 0.565s 10 2.27x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.680s (~) 3.564s (-1.5%) 0.884s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.720s (-1.7%) 3.807s (+3.9%) 1.087s 10 1.01x
▲ Vercel Express 2.915s (-9.0% 🟢) 3.798s (-8.9% 🟢) 0.883s 10 1.09x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.530s (-2.3%) 11.011s (~) 0.481s 5 1.00x
🌐 Redis Next.js (Turbopack) 10.592s (~) 11.024s (~) 0.432s 5 1.01x
🌐 Starter Next.js (Turbopack) 10.593s (~) 11.010s (~) 0.418s 5 1.01x
💻 Local Next.js (Turbopack) 10.655s (~) 11.016s (~) 0.361s 5 1.01x
💻 Local Express 10.788s (~) 11.013s (~) 0.225s 5 1.02x
🌐 Turso Next.js (Turbopack) 12.184s (~) 13.021s (~) 0.837s 5 1.16x
🌐 MongoDB Next.js (Turbopack) 12.220s (~) 13.021s (~) 0.801s 5 1.16x
🐘 Postgres Next.js (Turbopack) 15.222s (+1.1%) 16.037s (+2.6%) 0.816s 5 1.45x
🐘 Postgres Express 16.138s (-21.1% 🟢) 16.831s (-20.0% 🟢) 0.693s 5 1.53x
🐘 Postgres Nitro 20.335s (~) 21.039s (~) 0.704s 5 1.93x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 21.391s (+1.5%) 22.091s (~) 0.700s 5 1.00x
▲ Vercel Next.js (Turbopack) 21.549s (+0.8%) 22.240s (~) 0.691s 5 1.01x
▲ Vercel Nitro 22.032s (~) 22.680s (-1.1%) 0.647s 5 1.03x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.329s (-5.3% 🟢) 2.006s (~) 0.678s 15 1.00x
🌐 Starter Next.js (Turbopack) 1.344s (~) 2.009s (~) 0.665s 15 1.01x
🌐 Redis Next.js (Turbopack) 1.356s (~) 2.012s (~) 0.656s 15 1.02x
💻 Local Next.js (Turbopack) 1.381s (-0.9%) 2.012s (~) 0.631s 15 1.04x
💻 Local Express 1.418s (~) 2.007s (~) 0.588s 15 1.07x
🐘 Postgres Next.js (Turbopack) 1.988s (-8.4% 🟢) 2.325s (-3.1%) 0.337s 13 1.50x
🐘 Postgres Express 2.003s (-13.8% 🟢) 2.225s (-26.2% 🟢) 0.222s 14 1.51x
🌐 MongoDB Next.js (Turbopack) 2.135s (~) 3.011s (~) 0.876s 10 1.61x
🌐 Turso Next.js (Turbopack) 2.208s (~) 3.013s (~) 0.805s 10 1.66x
🐘 Postgres Nitro 2.661s (+11.4% 🔺) 3.013s (~) 0.352s 10 2.00x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.801s (-25.1% 🟢) 3.588s (-22.2% 🟢) 0.787s 9 1.00x
▲ Vercel Express 2.944s (-3.6%) 3.818s (-3.8%) 0.873s 8 1.05x
▲ Vercel Next.js (Turbopack) 3.151s (+12.6% 🔺) 3.923s (-0.7%) 0.772s 8 1.13x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.981s (-8.7% 🟢) 2.159s (-29.1% 🟢) 0.178s 14 1.00x
💻 Local Next.js (Turbopack) 2.095s (-3.8%) 2.945s (-5.8% 🟢) 0.850s 11 1.06x
💻 Local Express 2.197s (-1.5%) 3.124s (-1.4%) 0.927s 10 1.11x
🌐 Redis Next.js (Turbopack) 2.401s (-0.5%) 3.017s (~) 0.615s 10 1.21x
🌐 Starter Next.js (Turbopack) 2.464s (+0.7%) 3.009s (~) 0.545s 10 1.24x
🐘 Postgres Next.js (Turbopack) 2.640s (-4.0%) 3.017s (~) 0.378s 10 1.33x
🐘 Postgres Express 2.890s (-7.1% 🟢) 3.011s (-20.3% 🟢) 0.122s 10 1.46x
🐘 Postgres Nitro 2.996s (-10.3% 🟢) 3.361s (-16.6% 🟢) 0.365s 9 1.51x
🌐 Turso Next.js (Turbopack) 4.685s (-1.3%) 5.179s (~) 0.494s 6 2.37x
🌐 MongoDB Next.js (Turbopack) 4.787s (+0.6%) 5.179s (~) 0.392s 6 2.42x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.254s (-2.0%) 3.847s (-2.0%) 0.593s 8 1.00x
▲ Vercel Express 3.540s (-6.3% 🟢) 4.122s (-13.6% 🟢) 0.582s 8 1.09x
▲ Vercel Next.js (Turbopack) 3.618s (-4.7%) 4.338s (~) 0.720s 8 1.11x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.340s (-4.2%) 2.006s (~) 0.665s 15 1.00x
💻 Local Next.js (Turbopack) 1.367s (-2.7%) 2.011s (~) 0.644s 15 1.02x
🌐 Starter Next.js (Turbopack) 1.371s (+1.6%) 2.007s (~) 0.636s 15 1.02x
🌐 Redis Next.js (Turbopack) 1.377s (-0.7%) 2.012s (~) 0.635s 15 1.03x
💻 Local Express 1.414s (-1.3%) 2.005s (~) 0.592s 15 1.05x
🐘 Postgres Express 1.642s (-9.9% 🟢) 2.010s (-6.7% 🟢) 0.368s 15 1.23x
🐘 Postgres Next.js (Turbopack) 1.825s (-8.4% 🟢) 2.012s (-7.1% 🟢) 0.187s 15 1.36x
🐘 Postgres Nitro 1.904s (+3.9%) 2.237s (+3.9%) 0.333s 14 1.42x
🌐 MongoDB Next.js (Turbopack) 2.147s (~) 3.014s (~) 0.867s 10 1.60x
🌐 Turso Next.js (Turbopack) 2.214s (-0.9%) 3.011s (~) 0.796s 10 1.65x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.627s (-13.8% 🟢) 3.680s (-6.5% 🟢) 1.053s 9 1.00x
▲ Vercel Next.js (Turbopack) 2.740s (-1.5%) 3.778s (+5.5% 🔺) 1.038s 8 1.04x
▲ Vercel Nitro 2.823s (-1.4%) 3.686s (-3.7%) 0.863s 9 1.07x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 2.150s (-2.5%) 3.035s (-3.4%) 0.885s 10 1.00x
💻 Local Next.js (Turbopack) 2.159s (-6.8% 🟢) 3.125s (-4.3%) 0.966s 10 1.00x
💻 Local Express 2.269s (-3.4%) 3.198s (-2.3%) 0.929s 10 1.06x
🌐 Redis Next.js (Turbopack) 2.375s (-1.7%) 3.013s (~) 0.638s 10 1.10x
🌐 Starter Next.js (Turbopack) 2.454s (~) 3.010s (~) 0.556s 10 1.14x
🐘 Postgres Express 2.621s (-1.2%) 3.023s (~) 0.402s 10 1.22x
🐘 Postgres Next.js (Turbopack) 2.637s (+2.4%) 3.021s (~) 0.385s 10 1.23x
🐘 Postgres Nitro 2.771s (~) 3.011s (-3.7%) 0.241s 10 1.29x
🌐 Turso Next.js (Turbopack) 4.748s (+0.9%) 5.186s (~) 0.438s 6 2.21x
🌐 MongoDB Next.js (Turbopack) 4.783s (~) 5.179s (~) 0.396s 6 2.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.099s (+0.9%) 3.810s (+3.2%) 0.711s 8 1.00x
▲ Vercel Nitro 3.130s (+6.4% 🔺) 3.720s (+2.8%) 0.590s 9 1.01x
▲ Vercel Next.js (Turbopack) 3.139s (-3.5%) 3.719s (~) 0.580s 9 1.01x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.117s (-32.0% 🟢) 0.999s (~) 0.014s (-13.9% 🟢) 1.020s (~) 0.903s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.121s (-9.6% 🟢) 1.005s (~) 0.000s (~) 1.017s (~) 0.896s 10 1.03x
🌐 Starter Next.js (Turbopack) 0.126s (-3.5%) 1.005s (~) 0.000s (-100.0% 🟢) 1.011s (~) 0.884s 10 1.08x
💻 Local Next.js (Turbopack) 0.138s (-1.4%) 1.003s (~) 0.017s (-1.2%) 1.028s (~) 0.890s 10 1.18x
💻 Local Express 0.173s (-2.5%) 0.993s (~) 0.015s (+4.1%) 1.022s (~) 0.849s 10 1.47x
🌐 MongoDB Next.js (Turbopack) 0.480s (~) 0.968s (~) 0.000s (-100.0% 🟢) 1.012s (~) 0.533s 10 4.09x
🌐 Turso Next.js (Turbopack) 0.503s (+1.7%) 0.949s (-0.6%) 0.000s (-100.0% 🟢) 1.014s (~) 0.510s 10 4.29x
🐘 Postgres Next.js (Turbopack) 1.212s (+12.5% 🔺) 1.831s (-7.2% 🟢) 0.000s (NaN%) 2.017s (~) 0.805s 10 10.33x
🐘 Postgres Express 1.431s (-36.2% 🟢) 1.655s (-40.9% 🟢) 0.000s (-66.7% 🟢) 2.014s (-33.2% 🟢) 0.583s 10 12.20x
🐘 Postgres Nitro 2.153s (-2.2%) 2.892s (+1.7%) 0.000s (NaN%) 3.016s (~) 0.863s 10 18.35x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.581s (-6.5% 🟢) 3.256s (-0.9%) 0.907s (+151.4% 🔺) 4.588s (+13.4% 🔺) 2.007s 10 1.00x
▲ Vercel Express 2.700s (+4.6%) 3.253s (-3.2%) 0.934s (+100.7% 🔺) 4.707s (+10.2% 🔺) 2.007s 10 1.05x
▲ Vercel Nitro 2.805s (+11.1% 🔺) 3.149s (+8.5% 🔺) 0.876s (+32.8% 🔺) 4.533s (+14.4% 🔺) 1.727s 10 1.09x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Nitro 8/8
🐘 Postgres Next.js (Turbopack) 5/8
▲ Vercel Express 4/8
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 8/8
Next.js (Turbopack) 🌐 Redis 3/8
Nitro 💻 Local 8/8
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
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

I, Chris Tate <chris@ctate.dev>, hereby add my Signed-off-by to this commit: f41c090

Signed-off-by: Chris Tate <chris@ctate.dev>
const controller = new AbortController();

// Set a timeout to abort after 30 seconds
setTimeout(() => controller.abort(), 30000);
Copy link
Collaborator

@pranaygp pranaygp Dec 24, 2025

Choose a reason for hiding this comment

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

this doesn't work. You can't use setTimeout in the workflow context since it makes things non-deterministic. calling setTimeout will throw

Copy link
Collaborator

Choose a reason for hiding this comment

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

I took out the example

@pranaygp pranaygp merged commit 26d9769 into main Dec 24, 2025
88 of 90 checks passed
@pranaygp pranaygp deleted the ctate/da-parity branch December 24, 2025 17:37
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.

5 participants