Buttons and modals in Chat SDK now accept a 𝚌𝚊𝚕𝚕𝚋𝚊𝚌𝚔𝚄𝚛𝚕 prop.
Pair it with a @workflowsdk webhook to pause a run, then resume it when a human in the loop clicks a button.
vercel.com/changelog/chat…
@vercel Ship26 is live!
This year, we shipped a 3D device that can create WASM apps using wterm, just-bash, and @workflowsdk
...and a landing full of agents that walk around the site using a dynamic navigation mesh.
The hardest thing about agents and backends is durability. @workflowsdk fixes this.
That LLM you're calling *will* go down. That service *will* rate limit you. That database *will* unexpectedly slow down. You *will* get paged 💀
I've been looking for a unicorn for a decade. I wanted the level of reliability of combining stuff like SQS / Kafka / microservices, and I absolutely did not want *that* at the same time 😂
Truly reliable systems like that are notoriously difficult to reason about, to develop locally, to test, to simulate, to deploy… Workflow SDK solves that without compromises.
We're doing what Next.js did for the frontend, but for one of the most important problems of the new generation of backend applications.
Notably, Workflow SDK has an incredible self-hosting and multi-cloud story from day 0. We've taken amazing lessons from Next.js and poured them into the many Worlds (adapters) you can deploy to.
Congrats to Pranay and the Workflow team on a generational ship: vercel.com/blog/a-new-pro…
Vercel Workflows is GA.
Your code is the orchestrator. Ship agents, backends, or any long-running process without managing queues, retries, or workers. vercel.com/blog/a-new-pro…
Vercel Workflows is GA.
Your code is the orchestrator. Ship agents, backends, or any long-running process without managing queues, retries, or workers. vercel.com/blog/a-new-pro…
You can now filter workflow logs to easily view all logs for a workflow run in one place.
Jump directly from a run to logs, filter by steps, and quickly find relevant requests.
A fascinating aspect of Open Agents is how it uses the @WorkflowDevKit SDK to elegantly orchestrate agent sessions efficiently.
But before we go deeper, let's understand the problem:
Open Agents is a coding agent that runs in the cloud. Naturally, the expectation here is that I should be able to kick off multiple sessions and go to sleep and then wake up to a stack of PRs.
This inherently means, the sessions should be
- long running
- stateful
- resumable
- reliable
A naive way to solve this:
- Write an API to start a session, create a session ID and store it in a database - along with other metadata.
- Trigger the session inside a sandbox (Vercel sandboxes can run up to 5hours) and stream the responses back to the client using a websocket
- Store the responses to the db so when a client reconnects to a session using a session ID, we can resume it by fetching the results and restarting the session
Why wouldn't you just do this?
3 months ago I started building a coding agent that runs in the cloud.
It's since written every line of code I've shipped, including itself.
Today, I'm open sourcing it. Introducing Open Agents.
This setup handles transient retries automatically while stopping permanent failures immediately.
You can track everything without a coordinator service, dead letter queues, or complex retry policies.
Explore the interactive demo on v0: v0.app/chat/yNVqbF72C…
Using Promise.allSettled() provides parallel execution alongside per-channel failure tracking.
Each step is independent, so throwing a FatalError stops retries for that specific channel while the others continue.
Sending an alert to four channels sequentially means the last channel waits for the first three.
If you send them in parallel without coordination, you lose track of which specific channels failed.
Promise.allSettled() provides the best of both worlds.
No queue. No cron. No dead-letter table. Exponential backoff in a for-loop that survives restarts.
Explore the interactive demo on v0:
v0.app/chat/retry-bac…
The backoff is just math in a local variable. `sleep()` pauses for real wall time and zero compute while waiting.
Crash between attempts? The loop picks up exactly where it left off.
The webhook is scoped to one order. `for await` suspends between events at zero compute. Each hit runs as a `"use step"`, retried independently.
`ledger` is a local array. It survives across events, restarts, and deploys.
30 Days of Workflow DevKit — Day 4 — Payment Webhooks
What if your webhook tracked an order from first charge to final refund — remembering every event — without a database?
`createWebhook()` can do that in a simple loop:
Each `"use step"` function runs to completion or not at all. `run.cancel()` exits at the next step boundary.
Completed sections are preserved in your dashboard, pending ones are dropped. The cancelled run is yours to inspect.
30 Days of Workflow DevKit — Day 3 — Easy Cancel
You tweaked the system prompt and kicked off a test workflow. Three sections in, every paragraph reads like a fever dream. Stop the run, keep what's there, fix the prompt.
All thanks to a simple cancel():
That's the whole email drip campaign. No scheduler. No queue. No state machine. Seven lines of async/await.
Explore the interactive demo on v0:
v0.app/chat/onboardin…
Each `sleep()` is real. `sleep("4d")` pauses for four actual days. Deploy in between? It picks up exactly where it left off.
Each send is a `"use step"` which retries independently.
30 Days of Workflow DevKit — Day 2 — Email Drip Campaign
You need to send 4 emails over 7 days. So you set up a cron, a state table, a "last sent" column, retry logic...
Or you write this:
0 Followers 30 FollowingTech enthusiast, CTO @introproai | Emerging entrepreneur | Gen Z coder | Innovating with AI & Web | Dreaming big, coding bigger | Here to redefine technology 🌐
28 Followers 142 Followingbuilding manifest mosaic 🌙 ai vision boards that put YOUR face in your dream life. daily affirmations, voice journaling, an ai coach who remembers.