00:00:00- 嘿,大家早安。
00:00:02非常感谢你们今天加入我们。
00:00:03我对我即将要分享的内容感到非常兴奋。
00:00:06十年来,在 Vercel 上运行的代码
00:00:10主要是为了即时网络请求而构建的。
00:00:14但我们的客户今天创造的最有趣的软件
00:00:17已经不再符合那个模型了。
00:00:20而且这些新项目的数量正在爆炸式增长。
00:00:23就在过去的几个月里,
00:00:25Vercel 的每周部署量翻了一番。
00:00:28其中三分之一的新部署来自编码代理,
00:00:31这个数字在短短六个月内
00:00:34增长了一千倍。
00:00:35但对我来说最有趣的部分
00:00:38不是我们部署了多少,而是我们部署了什么。
00:00:41那些代理正在交付代理。
00:00:44我们的客户构建的代理,
00:00:48它们不仅仅是响应一次然后等待。
00:00:50它们需要推理、调用工具、等待人类回复,
00:00:53然后再次重复这一切。
00:00:55而每一个工作流都需要一个能跟上步伐的后端。
00:00:58所以我在 Vercel 看到的是,
00:01:02目前交付速度最快的团队,
00:01:05他们并没有自己重建基础架构
00:01:07和编写队列代码,
00:01:08或者从头编写重试逻辑,
00:01:11甚至连可观测性也不需要自己搭建。
00:01:13这些工作都已经完成了。
00:01:15所以他们正在使用我们的基础架构原语,
00:01:17也就是我们过去十年构建的成果,
00:01:20这样他们就可以全身心地投入到他们的产品上。
00:01:24这正是我们构建 Workflows 要解决的问题。
00:01:27我们在六个月前推出了测试版,
00:01:30反响非常热烈。
00:01:33现在,在经历了一亿次运行之后,
00:01:36我们非常激动地宣布,Workflows 今天正式商用 (GA)。
00:01:41让我来给你们演示一下它是如何运作的。
00:01:43我要展示的应用
00:01:44是我构建的一个生日卡生成器。
00:01:47现在,它可以是任何东西,
00:01:49但它涵盖了我们刚才讨论的所有内容。
00:01:51它无法在一个请求中完成,
00:01:54它需要等待人类响应,在失败时重试,
00:01:57并且向用户实时流式传输进度。
00:02:00那么,这就是它的运行方式。
00:02:02让我给自己发一张卡片,
00:02:04首先输入我的电子邮件。
00:02:05接下来,我选一个日期,
00:02:09我选 4 月 23 日。
00:02:11我喜欢在生日时办篝火晚会,
00:02:14所以我会写 Ocean Beach 篝火晚会,
00:02:17由于是发给我自己的,就写给 Pernet。
00:02:21我在这里输入我自己的邮箱,方便演示。
00:02:24所以,这会让我也回复自己生日的 RSVP。
00:02:27好,现在我点击“生成并发送”,
00:02:30我会看到生日卡开始生成。
00:02:34我转到 Vercel 控制面板,
00:02:35在那里我可以看到刚才这个运行请求进来了。
00:02:37让我点进去。
00:02:39我可以实时看到它生成提示词,
00:02:42然后生成消息,
00:02:43接着也生成了一张图片。
00:02:45这就是我们谈论的可观测性。
00:02:48每一个步骤在这里都是可见的。
00:02:50你可以清楚地看到什么在运行,
00:02:52什么已完成,以及什么在等待。
00:02:54在用户端,
00:02:57我可以看到卡片已经生成,
00:02:58RSVP 邮件也已经发出了。
00:03:01此时,工作流处于挂起状态。
00:03:04实际上并没有发生任何计算。
00:03:07它在等待人类的响应,
00:03:09我可以现在就去查看邮件并回复,
00:03:12甚至等几个小时或几天后再回复。
00:03:15它会继续跟踪进度。
00:03:18现在,在展示邮件之前,
00:03:20我其实想让你们看看 CLI。
00:03:22Workflow 在发布首日就配备了 CLI,
00:03:25让你能够检查可观测性控制面板上
00:03:27提供的所有信息。
00:03:29这意味着当你和你的代理
00:03:32试图调试出错的问题时,
00:03:35可以访问到完整的全景信息。
00:03:37好了,回到我的邮件。
00:03:40我应该能看到邮件发进来了。
00:03:43它在那儿。
00:03:44它只是让我确认 RSVP。
00:03:46我点“是”,就在那儿。
00:03:49回到控制面板,我可以看到钩子已恢复,
00:03:53然后应该进入休眠状态。
00:03:55回到用户面板,我也会看到同样的情况。
00:03:58我们不再等待 RSVP 了,
00:04:00现在只是在等待 23 号,
00:04:01以便它可以发送生日祝福。
00:04:03现在,我不想让你们等两周时间,
00:04:05所以我回到控制面板,
00:04:06直接在这里唤醒休眠。
00:04:09这应该会立即恢复工作流,
00:04:12然后我们会看到工作流完成。
00:04:14让我回到用户面板。
00:04:17明信片已经发出了。
00:04:18在我的邮件里,我应该会收到一张生日卡,
00:04:22里面还有 RSVP 的信息。
00:04:23酷。
00:04:24现在,我想给你们看看代码,
00:04:26记住我们之前说过的话。
00:04:29现今交付最快的团队不需要处理队列
00:04:32以及管理状态和基础架构。
00:04:34那是老办法了。
00:04:35在 Workflow 中,我们今天看到的一切
00:04:38都是一个单一的函数,
00:04:40它从这个指令 `useWorkflow` 开始。
00:04:43正是这一个指令让这个函数能够运行数天,
00:04:48在步骤之间挂起,并从上次中断的地方精确恢复。
00:04:52因此,当工作流调用一个步骤时,
00:04:53例如生成提示词或生成图像,
00:04:56工作流会挂起该函数,
00:04:58在后台排队执行工作。
00:05:00如果失败了它甚至会重试,
00:05:02然后在完成后恢复工作流。
00:05:05整个过程中,我都能在 Vercel 控制面板上
00:05:07对每一个步骤获得完整的可观测性。
00:05:11我甚至可以点击其中一个,
00:05:13默认情况下,在 Vercel 上一切都是加密的,
00:05:16但我会解密数据,以便你们能看到输入。
00:05:19是的,这在控制面板和 CLI 上都可以查看。
00:05:22Workflows 还带有内置的流式传输。
00:05:24这就是我如何向客户端推送实时更新
00:05:29以实时跟踪进度的。
00:05:31我不需要引入某种数据库
00:05:33来完成这项工作。
00:05:34客户端甚至可以断开并重新连接,都没问题。
00:05:37这是一个持久流。
00:05:39好了,这就是钩子 (hook)。
00:05:42对于每一个 RSVP,我都会即时创建一个
00:05:46临时的 webhook URL,然后将其发送到邮件中,
00:05:50接着我只需在下面等待它。
00:05:52工作流会在这里暂停,
00:05:56直到每个人都点击了他们的链接。
00:05:59这里没有涉及数据库,
00:06:01结果甚至就存在本地 JavaScript 变量中。
00:06:05工作流持有其自身的所有状态。
00:06:08这就是我们说已经消失了的
00:06:11分布式系统机制。
00:06:12你不再需要考虑这些东西了。
00:06:14最后,让我们在结尾处休眠,
00:06:17为我的生日而休眠。
00:06:18就在这里。
00:06:19这个休眠可以是几秒钟,
00:06:21也可以像我们刚才做的那样是几天甚至几周。
00:06:24在它休眠时,工作流只是挂起,
00:06:27零计算运行。
00:06:29当它醒来时,它会从上次中断的地方继续,
00:06:33并在此过程中保持状态。
00:06:34这就是全部内容。
00:06:37这是一个你可以从头到尾阅读
00:06:40并进行全程推理的单一函数。
00:06:43每一步都有队列支持,
00:06:45会自动重试,
00:06:47并在其自身的无服务器函数上运行。
00:06:49没有超时限制,
00:06:51所以工作流可以根据需要运行任意长的时间。
00:06:54这就是当我们说
00:06:56Vercel 处理底层一切时的意思。
00:06:59你只需编写逻辑,剩下的由我们处理。
00:07:02现在,在这个演示中,我展示了一个简单的用例,
00:07:07但我们的客户正在使用 Workflows
00:07:09以巨大的规模在生产中运行代理。
00:07:12Mux 使用 Workflows 来确保视频生成管道
00:07:17每次都能可靠地运行。
00:07:19Flora 正在编排跨越 50 个图像生成模型的
00:07:23并行创意代理,全部使用 Workflow 实现。
00:07:27Durable 是一个小型团队,
00:07:30托管着 300 万个客户网站,
00:07:33他们使用 Workflows 每天向其用户
00:07:35发布新的代理。
00:07:38现在,我开始这个演示时说,
00:07:40我们的客户构建的最有趣的软件
00:07:42已经不再符合单一请求的模式。
00:07:46我们看到每天都有越来越多
00:07:50像这样的应用在部署。
00:07:51代理正在交付代理,
00:07:54构建它们的团队并不考虑队列,
00:07:58他们专注于解决客户的问题。
00:08:01这种转变不仅仅发生在 Vercel 内部。
00:08:05我们的客户部署量正在翻倍,
00:08:07而亲手搭建基础架构的工程师比以往任何时候都少。
00:08:11所以无论你想构建什么样的应用或代理,
00:08:16Workflows 都会让它变得可靠、
00:08:18长效运行、持久且可观测。
00:08:22从你的笔记本电脑到一百万个用户,
00:08:25使用的都是相同的应用程序代码。
00:08:27Workflows 今天正式商用,
00:08:31去发布一些真正可用的东西吧。
00:08:37[无声]