▲ 社区会议:适用于 Claude Code 的 Vercel 插件

VVercel
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00大家好,欢迎来到本周的 Vercel 社区直播。我是 Amy,这位是
00:00:26Jacob。我们是 Vercel 的社区团队成员。提醒一下,我们正在
00:00:31X 和 YouTube 上进行直播,但如果你想确保我们能在聊天框中看到
00:00:36你的提问和评论,请前往社区并登录。网址是 [community.vercel.com/live](https://community.vercel.com/live),你会
00:00:43看到它是列表中的第一个活动。
00:00:44是的,在会议结束时,我们会留出一点时间来回答问题。如果你想
00:00:49在观看会议期间参与聊天,请记得遵守
00:00:55我们的行为准则。没错,你可以随时提出任何问题,
00:00:59我们会确保进行提问。我想介绍一下我们的嘉宾。我们邀请到了 Jon Lindquist 来
00:01:05向我们展示适用于 Cloud Code 的新 Vercel 插件。嘿,Jon。
00:01:09嘿,Jacob。嘿,Amy。谢谢你们邀请我。好了,让我们直接开始
00:01:16共享我的屏幕,展示一下这里的情况。有一段时间了,“技能 (Skills)”
00:01:23一直非常火热,每个人都在讨论该使用哪些技能来提升项目水平,
00:01:29并让你的智能体 (Agents) 能够完成它们通常无法完成的任务。现在从
00:01:37技能中演变出来的下一代产物,就是我们所说的“插件 (Plugins)”。这还是
00:01:43一个非常新鲜的概念。目前市面上的插件并不多,人们仍在
00:01:48探索究竟该如何构建它们。我构建了 Vercel 插件的初稿,而
00:01:56我想讨论的是为什么要构建插件,什么时候应该构建插件,为什么选择
00:02:03插件而不是技能,以及它们如何互补等诸如此类的问题。所以
00:02:09如果你对插件能为你实现什么,或者你是否应该在内部或个人项目中
00:02:16构建插件有任何疑问,我很乐意讨论,我们会在今天的会议中详细交流。
00:02:22首先,插件最初是由
00:02:32Cloud Code 发起的,Gemini 也有参与,但采取了截然不同的方法。而且
00:02:39插件的标准化是一项持续的工作。这是我们希望实现的,
00:02:44我很快会分享更多信息,即单个插件可以在所有编辑器中运行。
00:02:49目前我们讨论的是 Cloud Code 和 Cursor 的支持。CodeX 很快就会推出,
00:02:54如果不是今天的话,那也快了,其他许多编辑器也是如此。目前有一个插件标准
00:03:01正在制定中。因此,我们可以预见插件将成为一种可以打包并在
00:03:08你使用的任何工具中共享的东西。话虽如此,你们可能对技能
00:03:15比较熟悉,它们是 Markdown 文件,可以由你的智能体加载以提供额外的指令。
00:03:23你可以手动调用它,比如输入斜杠来调用技能,或者
00:03:29智能体根据描述检测到应该加载该技能。所以它主要由用户调用或
00:03:36由智能体根据描述中的条件来决定。现在,插件的升级之处在于
00:03:44它们拥有所谓的“钩子 (Hooks)”。如果你想到插件,或者想到你
00:03:53与 Cloud Code 或任何智能体框架进行的对话,你会想到它们是有生命周期的。
00:03:59现在我正在 Vercel 插件目录中,如果我在这里启动 Cloud Code,
00:04:07我要问它这个插件使用了哪些钩子。
00:04:18它会列出定义生命周期的各种钩子。
00:04:27生命周期包括:会话开始时、工具被调用前、
00:04:33调用后、用户输入文本时以及会话结束时。里面还有很多其他的钩子。
00:04:39但就 Vercel 插件而言,这些是我们目前根据初步目标所使用的钩子。
00:04:44明确地说,Vercel 插件的最初目标是帮助人们
00:04:51在 Vercel 上发布智能体。所以核心想法是,我们如何让智能体感知 Vercel 生态系统,
00:05:02比如平台上与 AI SDK、网关相关的一切内容。
00:05:11还有我们的工作流,这里几乎都是 JSON。所以任何关于工作流的内容,基本上 Vercel CLI 已经更新了很多。
00:05:19而所有关于智能体 SDK,或者说关于在 Vercel 上
00:05:26发布智能体的这些内容,都是在过去几天、几周、几个月内发布的。
00:05:33而像 Cloud Code 这样的任何智能体框架,它们的知识截止日期
00:05:39大概是在六个月到一年前。这取决于具体的模型和许多变量。
00:05:46但重点是,所有这些智能体都不知道
00:05:52我们最近发布的这些惊人功能。所以 Vercel 插件的目标就是
00:05:57阻止智能体编写过时的代码、使用过时的实践,并将其
00:06:06提升到 Vercel 平台最新的水平。这就是
00:06:11巨大的优势,模型虽然聪明,但它们只是不了解这些最新的东西。
00:06:19与其要求它们每次都去做调研,或者
00:06:25为每件事都准备一大堆技能,如果我们能找到某种方式基本上
00:06:32强制智能体加载关于 Vercel 平台最好的内容,那对我们来说就是巨大的胜利。
00:06:38如果你观察智能体生命周期中的这些钩子,再次强调,还有许多
00:06:45我们将来可以利用或者你可以利用的钩子。但目前最关键的是
00:06:49会话开始 (Session Start)。我们通过几种不同的方式使用它:工具使用前、用户提示词
00:06:56提交、工具使用后和会话结束。会话开始和会话结束分别是
00:07:03与智能体对话的开始和结束。你可以认为
00:07:12智能体的 MD 文件或 cloud.md 文件通常是你会在会话开始时处理的东西。那么在会话开始时,
00:07:19我们能为 Vercel 平台做些什么呢?我们可以做的是加载一个 Vercel 平台文件,
00:07:27意思是如果我们查看,我就说描述一下 vercel.md 吧。这个文件是我们可以
00:07:40在会话开始时与 cloud.md 一起包含的内容。本质上,你可以拥有一个插件,如果
00:07:48你只想共享一个 cloud.md 文件并让人能够轻松地
00:07:52安装它。你可以构建一个插件,它所做的只是注入一个 Vercel 的
00:07:59知识图谱。这是我们不断微调的东西。我们正在
00:08:04寻找压缩它的方法,使其尽可能小,但仍保持良好的性能,
00:08:08并在应包含和不应包含的内容之间取得平衡。要针对
00:08:15所有不同的模型和框架运行评估是非常困难的。但我们正在慢慢摸索这些。
00:08:21所以其中的内容基本上是 Vercel 生态系统中围绕 AI 的关系,
00:08:28何时使用哪个产品,何时调用哪些内容,
00:08:35比如对整个 Vercel 生态系统的结构化理解。这个概念,
00:08:44我喜欢它将其称为“目录”。就像你开始一段对话时的书序。
00:08:50我们构思和构建它的方式是,如果你思考
00:08:56我该如何与智能体交流,我有一套特定的词汇,它们也有一套词汇。
00:09:02如果你能给它一个术语表,将这些术语映射到文档、
00:09:07映射到技能、映射到它应该加载的内容。一旦你触及这些内容,你可以
00:09:12预想到我会说什么,以及
00:09:19智能体应该加载并调用什么,尝试预先开发出那种思维导图,这样我就可以
00:09:24自然地与之交流,而不必担心甚至需要
00:09:30提到 AI SDK。甚至不必提到任何功能。如果我能
00:09:38找到某种方式直接说“帮我构建这个应用并发布它”。然后插件就会处理一切。
00:09:45抱歉,由插件处理一切,这样就能
00:09:52在 Vercel 上发布一个精美的应用,然后用户可以从那里进行迭代。类似于
00:09:57v0 和我们的一些其他项目的工作方式。如果我们能让用户拥有
00:10:02绝佳的体验,而无需去考虑生态系统的细节。那将是巨大的成功。这
00:10:09听起来合理吗?Jacob, Amy,对此有任何初步问题或聊天室里的反馈吗?
00:10:16Jacob,我想你在会议中有个问题。抱歉,非常抱歉。我想问
00:10:24你,John。既然这个插件充当的是目录的角色,这是否就是为什么
00:10:30插件不需要在每次有新文档
00:10:38发布时都不断更新?因为它基本上是一组 URL 集合,智能体可以跟随这些链接来寻找
00:10:43最新的文档?还是说插件有一个立即更新的系统?这种
00:10:49方法是如何运作的?是的。所以本质上,如果你想到预先加载的知识图谱,
00:10:58它很大程度上只需指向最新的文档。如果你
00:11:07考虑这个在技能管理以及我们如何按库管理技能时经常出现的问题。
00:11:14如果你有人的 SDK 是第 5 版,而另一个人的 SDK 是
00:11:18第 6 版,而你尝试用来自不同版本且相互冲突的技能来影响他们,
00:11:22你该如何处理?很大程度上是根据用户
00:11:31安装的内容,你可以检查他们的 package.json 文件,检查版本。并基于此
00:11:36想出一种聪明的方法来决定应该查看哪些文档 URL 以及
00:11:44应该加载哪些技能等诸如此类的事情。所以这是预加载阶段
00:11:51也就是会话开始时的另一部分工作,即检查用户的项目。
00:11:58再次强调,这都是在本地进行的。它只是检查项目,看看你使用了哪些库?
00:12:02使用了哪些配置?以便它知道引导你走向正确的方向。
00:12:07最常见的错误之一是,试图在最新版本的
00:12:12SDK 上使用 `generateObject`,而你明明知道那个 API 已经变了。所以,
00:12:21插件会处理好这些,你不需要担心你是在旧项目
00:12:27还是在绝对全新的最新项目上使用它,插件
00:12:32应该能够处理好,你不需要担心版本号,不需要
00:12:34担心包名,不需要担心任何事情,因为
00:12:41让 Vercel 来为你处理。没错。我们正在持续研究更出色的
00:12:49实现方式,有很多新主意。插件将继续更新并推动这一进程。
00:12:54还有其他问题吗?
00:12:58是的,那么这个插件的总范围是多少?它是否只处理 Vercel 的
00:13:04服务?即我在仪表盘中能看到的任何东西?还是说它也包含我们
00:13:11支持的开源库,比如 Next.js、AI SDK、工作流等等?
00:13:16是的,最初的范围,我们最初决定的目标是涵盖尽可能多的内容,
00:13:25把每个库、平台上的所有东西都放进去,
00:13:32看看哪些被使用得最多。在内部,我们会让每个人都开启遥测功能,
00:13:36你也可以选择加入并分享遥测数据。我们会发现哪些技能实际上正在
00:13:40被使用,哪些没有。这样我们就可以移除一些我们可能
00:13:48不需要那么多信息的内容,或者根据使用频率增加更多信息。显而易见,
00:13:53Next.js、AI SDK 以及那些最热门的下载项应该拥有最丰富的信息。
00:13:59所以这在前期是一个平衡,我们在初始发布时
00:14:08刻意做得很全面,未来我们会将其精简到更轻量(Svelte)的
00:14:15程度。所以,
00:14:16是的,这非常有道理。谢谢。好的。那么,如果你正在
00:14:24构建插件,我之所以用这种比较宽泛的术语来讨论它,
00:14:29是因为我非常推崇“智能体驱动开发”。与其向你展示
00:14:36一切是如何运作的,我认为学习如何讨论它并
00:14:40从中掌握一些术语更为重要。这样你就可以直接要求你的 AI 助手
00:14:45去做类似的事情。如果你告诉 Cloud Code 为 Cloud Code 构建
00:14:52一个插件,并给它提供文档,它是可以做到的。所以与其
00:14:58深挖代码,不如讨论其中的概念和想法。话虽如此,
00:15:05会话开始是注入平台“目录”的绝佳时机,
00:15:11比如告知哪些东西已经过时了,根据
00:15:19对我而言重要且对大多数模型而言已经过时的情况。正是这一点
00:15:24让一切同步到 Vercel 今天的样子。这样即使
00:15:31插件只做了这一件事,它也知道在未来的操作中
00:15:37应该去检查。但我们还能做的是,顺便
00:15:44提一下,你在 Cloud Code 中的每个会话都有其唯一的 ID,这让你能够
00:15:52在会话进行过程中,确保它拥有类似“技能预算”的东西,
00:16:01并了解哪些技能已经被加载。因此,我们可以
00:16:07将信息写入会话环境或会话存储空间,
00:16:15这样在整个会话过程中,我们能确保不会
00:16:20重复加载已经存在的东西,或做任何重复劳动,因为我们可以
00:16:26追踪已经发生的事情。所以这是关于会话的另一个重点,
00:16:30它让你有机会获取会话 ID,以便在后续的
00:16:35任何钩子中,或在会话内运行的任何程序中,你都有一个 ID 可以挂载
00:16:40并为你的特定插件存储关于该会话的信息。
00:16:47如果你看 Cloud Code 的 .cloud 目录下的项目,它也有这种机制,
00:16:50你可以看到会话等信息。你可以将同样的概念应用到你自己的插件
00:16:56和工具中。好了,说了这么多,关于工具使用前 (Pre-tool Use),
00:17:05我们会同时讨论 Pre-tool 和 Post-tool。这些钩子给了你一个
00:17:11查看文件更改的机会。在 Pre-tool 中,你可以获取即将更改的
00:17:20文件的内容。这涉及到读取文件、写入文件,
00:17:29或者是读取、编辑、创建文件。Pre-tool 还涵盖了许多其他
00:17:34可能使用的工具,例如在 Bash 中运行命令。你可以在这些事情发生之前,
00:17:40决定是否要做些什么。比如,如果我们看到有人正在
00:17:47尝试运行某个特定的 Vercel CLI 命令,而我们注意到在
00:17:55现在的 Vercel CLI 中有更好的方法,例如 Vercel CLI 现在有一个 API 选项,
00:18:00我们可以进行更高级的查询。如果你最近没有更新过
00:18:05Vercel CLI,它增加了很多很棒的新功能。我们可以给出提示,
00:18:11说明你正尝试这样做,甚至可以检查你的 Vercel CLI 是否过时了。
00:18:17如果能更新一下就太好了。所以你有了更多的选择空间。它让你有机会
00:18:21检查它是否即将进行某种工具调用,无论是 CLI 调用。
00:18:27这对于 Sandbox CLI、Workflow CLI,对于所有这些模型
00:18:34还一无所知的全新 CLI 来说非常重要,因为它们是在
00:18:39知识截止日期之后才发布的,以此确保它们的操作是正确的。所以
00:18:47对于工具调用(如 Bash 调用)以及文件编辑,情况变得非常有趣。
00:18:52我们正在深入探索的一件事是对比文件差异:这个文件以前是这样的,
00:18:59智能体正试图把它变成这样。基于我们的库,
00:19:06这种改变正确吗?还是说其中有些可疑的地方?这又回到了
00:19:11那个例子:假设你安装了第 6 版 SDK,而它尝试将 `generateObject` 作为
00:19:18API 使用,这是一个很常见的例子。如果你在那一刻发现,
00:19:25发现你正尝试使用 `generateObject`,我们可以停下来提醒智能体 AI SDK 实际是
00:19:32什么样的,这样在你进行测试或部署之前,
00:19:36你就已经在智能体尝试修改文件的精确时刻拦截了它。
00:19:46如果你试图依赖技能,而技能只是
00:19:54文本提示,比如如果你尝试在 cloud.md 或技能中写下,
00:20:03“永远不要提交某些文件”或“除非我在某个分支,否则永远不要推送”。你可能
00:20:13经历过,这些提示并不总能保护你。Pre-tool 使用
00:20:21让你有机会通过编程和工程化的方式,真正拦截这些行为。
00:20:28你可以给它不同的指令和
00:20:32不同的示例。这就是技能与
00:20:41cloud.md 或 agents.md 文件之间的巨大区别:你实际上可以控制正在改变的内容,
00:20:47以及它是否发生,或者控制更改的内容。如果你
00:20:51想要那种改变,那就是它的精妙所在。从那里
00:21:01你在工具使用后 (Post-tool) 也能获得类似的能力。有机会检查在
00:21:07Bash 命令运行后到底改变了什么,在工具调用后
00:21:13现在有哪些不同?所以,它虽然不能阻止某些事情
00:21:19发生,但它能让你看到发生后的结果。而且
00:21:25如果它改变了某些东西或做了意料之外的事,
00:21:31那是另一个获取差异对比的机会,并说“这看起来有点奇怪”。让我们告诉智能体这看起来很可疑。
00:21:38所以这些是在构建时需要了解的两个重要的生命周期钩子。对我们来说,
00:21:43再次强调,这一切都关乎知识截止日期。这是
00:21:49Vercel 必须应对的挑战,因为我们迭代快、发布频繁,而且
00:21:55我们正在如此迅速地推出所有这些新技术。这太神奇了,
00:22:00我们想把这些展现给人们。这就是插件真正能派上用场的地方。
00:22:09关于这点有什么问题吗?
00:22:11是的。如果它使用文件路径来决定注入哪些技能,那是否意味着
00:22:21我们实际上可以通过将项目中的文件范围缩小到更单一的用途
00:22:27来获得很多收益,这样它就能更准确地确定需要哪些技能,
00:22:34需要添加哪些技能。例如,如果我有一个大文件,可能使用了我们五六个
00:22:39库,而现在它只能在那里添加最多三个技能,或者它可能无法
00:22:47根据文件路径识别。所以你认为现在使用这些工具构建软件时
00:22:51应该考虑这个问题吗?
00:22:54我会说,你不必关心智能体写的代码,
00:23:02这取决于插件作者。取决于框架作者去把这些事情
00:23:12做好。比如那些实际运行评估(evals)并观察
00:23:17这是否会产生差异的人。而我认为,人们很容易重新进入工程师模式
00:23:27并思考“我要解决这个问题,因为这是人类会做的”。
00:23:33这绝对是智能体想要的。那是目前开发者面临的最大诱惑之一,
00:23:39就是解决问题,比如寻找那些称不上问题的问题。因为是的,如果,
00:23:50如果你试图修复某些东西,却不知道如何测试它,比如
00:23:53如果你知道如何针对智能体进行测试,那就去做吧。如果你没有这种愿望,
00:24:00那就让那些构建插件和框架的人
00:24:05去处理吧,因为测试和评估非常昂贵。比如,针对这些变化
00:24:12运行所有这些模型要花很多钱。这需要很长时间,而且非常痛苦。
00:24:17所以,这就是其中一件事。我希望没有人需要关心那个。
00:24:23我想我会把精力花在其他事情上。是的。
00:24:33我明白了,明白了。所以如果模型的下一个版本
00:24:40是以一种让所有这些改动都变得不必要的方式构建的,
00:24:47那么改变我构建事物的方式就没有意义了。
00:24:48是的。而且我认为,我的意思是,所有框架以及 Vercel 的终极目标是
00:24:56你真的不需要过多地思考或查看代码。我不是说
00:25:01现在就是这样。我是说,那是,那是我们的终极目标。那是
00:25:07我们努力的方向,即你想交付精美的软件。你想能够思考,
00:25:11你想随心所欲地交流想法,获得各种变化,并看看哪些真正能引起你的共鸣,
00:25:19然后真正地将其精简为对你、你的家人或客户来说
00:25:25都很美好的东西。比如,我们只想要一种美妙的体验,
00:25:33让你不会过分纠结于文件有多大。如果你在写代码,
00:25:39你知道,正确的设​​计模式,选择哪些库。我完全同意。
00:25:48比如,诱惑是说“让我们使用所有这些模式,因为智能体
00:25:53处理它们更得心应手。让我们做所有这些事情”。这绝对是我们
00:25:58正在通过插件进行实验和测试的东西。但是同样,如果你无法测试它,那么,
00:26:07那种说“我做了这个改动,现在显然运行得更好了”的想法太诱人了。
00:26:18那是容易搬起石头砸自己脚的地方,因为,既然你做了这个改动,
00:26:23你就没有看它以前是如何工作的,以及这会对其他地方产生什么影响。
00:26:28也许那次会话它运行得很好。所以工程学现在不同了。抱歉,
00:26:35我想我变得有点哲学化了。是的。我想,我想我们理解了。是的。好的。
00:26:44所以另一个钩子是用户提示提交(user prompt submit)。这是一个非常重要的钩子,因为它
00:26:50允许你获取用户输入的文本。如果他们提到了一个库,提到了
00:26:55一个概念,如果他们,你知道,如果他们提到了“计划(schedule)”这个词,让我们,让我们
00:27:00引入 cron 技能。这非常类似于技能的工作方式,比如,如果用户或者
00:27:07如果在对话中检测到与描述匹配的内容,但这实际上
00:27:12给你一个对用户提示运行正则(regex)的机会。如果你检测到某些关键词
00:27:20或模式或其他什么,加载那些技能,做这些事情并给智能体提示,
00:27:26比如“也许你应该问更多的后续问题”。这是互动的部分,
00:27:33你有机会说“用户说了这个,也许我们应该获得更多澄清,
00:27:38或者我们应该直接加载所有这些东西并推进它”。你可以做
00:27:44一些非常有趣的事情,你可以使用用户提示提交,如果你想
00:27:48拥有自己定制的、供自己使用的命令术语表或语言,
00:27:56你想给事情加上美元符号前缀。如果某件事以美元符号开头,那么就这样做。或者
00:28:00如果某件事有,你知道,这有点像在用户提示提交内部
00:28:07写一些小的 bash 脚本之类的,如果你检测到这个,那么你可以马上运行一个工具,
00:28:13而且它不需要,它可以在你运行任何 bash 脚本、node 脚本的地方运行,
00:28:20在该钩子内部运行任何东西,这都是在会话上下文之外的。所以你可以
00:28:28在里面做各种疯狂快捷的事情。如果你想检测“commit”这个词,
00:28:37然后避免让智能体采取几个步骤来提交某些东西。相反,
00:28:47你只需要一个基于任何内容的提交脚本。就像在提示词 commit 之后,
00:28:53你可以告诉智能体:“我运行了这个提交操作,你不必担心它”。
00:28:59你可以为智能体节省几个回合。那里有一些
00:29:03你可以做的非常有趣的小技巧,如果有很多事情是
00:29:09重复性的,那么与其每次都要求智能体去做,不如真正地加速它。
00:29:15如果你想为自己构建一个小型的用户提示提交,并想出你自己的
00:29:19与智能体交谈的语言,这是一个有趣的项目。但对我们来说,
00:29:25它更多是关于,如果他们说了这个,谈到了这个概念,在
00:29:30Vercel 的术语中这意味着什么,所以它就像是在匹配词汇,特别是像
00:29:37“调度(scheduling)”对应 crons 和 workflows。还有像“并行”、“性能”之类的词,
00:29:45你可以找到并引导智能体去处理你所知道的关于 Vercel 的特定事物。如果你有一个周末
00:29:53可以折腾的话,玩玩用户提示提交会非常有趣。
00:29:58我再重申一遍,完全可以在这里说:“帮我
00:30:03构建一个带有用户提示提交的 Claude code 插件,它可以检测美元符号,
00:30:09如果出现美元符号,就在用户提示提交内运行提交,这样我就”
00:30:14你知道,有了那个提示,我就能构建出这个,所以不要太担心
00:30:19代码,你可以直接开始玩它。好了,既然你已经
00:30:26处理好了这一切,会话结束(session end)就是一个清理会话期间
00:30:32编写的任何文件或任何内容的机会。所以如果你开始收集哪些技能已经运行,
00:30:39如果你开始收集任何关于被调用的工具结果的信息,
00:30:48或者你在整个会话中跟踪的任何预算或事项,这就是进入并
00:30:51清理它的机会。在会话结束时你可以做一些迷人的事情。因为它基本上
00:30:57运行在 Ctrl C(即会话退出)时。你可以启动其他智能体
00:31:05并说:好吧,看看会话中所有更改的文件。它们是否匹配
00:31:09我们不……我们不那样做。只是你可以在会话结束时做一些
00:31:13非常有趣的事情,比如我的会话结束了。那个会话是否代表了
00:31:20这个项目的进展?它代表了冗余代码(cruft)吗?它是否检查了所有更改的文件?
00:31:26这是否与项目中已有的内容重复?如果是的话,
00:31:30去清理并发出提醒,你必须通过某种方式提醒用户,比如通过系统通知
00:31:37或其他手段,因为你的会话已经消失了。但确实是
00:31:43一些非常有趣的事情。好了。说了这么多,我只想
00:31:50在这里写一个小演示。所以我要启动一个运行着
00:31:56Vercel 插件的 Claude code 版本,对比没运行 Vercel 插件的版本。我要使用
00:32:04“Claude dangerously skip permissions”,我会保持 debug 开启,稍后展示。
00:32:08这个模型将设置为 haiku。那是 Claude code 中最快、也最平庸的
00:32:13模型。我要说:“写一个关于 AI SDK 的教程”。
00:32:26我们将看看会发生什么。然后我们会并排地
00:32:30进行比较,你可以看到它已经开始加载技能了。这个已经加载了插件。
00:32:37如果我想启动一个没有任何插件加载的会话,有一个“setting sources”
00:32:46标志,让你可以禁用用户级别的源、用户级别的设置或者
00:32:53项目级别的设置,基本上就是忽略任何设置。这样我就可以在不加载插件的情况下
00:32:59加载它。“No flicker”,喔。这个“no flicker”是昨天新增的,这是一个在
00:33:05Claude code 内部实现平滑滚动的不错方式。所以我也会启用它。然后
00:33:12我要把模型设置为 Opus,这是最聪明的模型。如果我只用相同的提示词
00:33:20写一个关于 SDK 的教程。这就是这里的原生版本。我们将
00:33:28对比一下结果。噢,糟了,我需要……我没有删除之前的那个。让我们
00:33:36重新开始。让我启动这个并运行进去。这是我今天早上运行的,
00:33:50在开始之前清理一下。让我再次启动它。
00:33:56做个比较。是的。
00:34:01好的。那么
00:34:04这里巨大的区别是,这是 haiku 4.5 对比 Opus 4.6,对吧?这个
00:34:15要便宜一百万倍,而且快得多。而且它只是加载了更多的
00:34:22Vercel 信息。所以即使你比较我们包含的额外 token 的预算成本,
00:34:32包括 haiku 对比 Opus。当这个进入……
00:34:38我本该说只写一个 markdown 文件。我想它正在实际编写代码,
00:34:45但这也会很有趣。让我们看看。这是关于我们正在对许多技能
00:34:59采取的方法之一,正如前面提到的,因为
00:35:05版本号,因为不同的技能可能会针对版本号进行固定。
00:35:13让我换个说法。由于我们库的不同版本将需要
00:35:21不同的技能。我们的许多技能都会说,请查看 node modules,我们会在那里
00:35:28捆绑很多文档,以便文档也与版本固定。查看这里,
00:35:34你可以看到它实际上正在读取本地文档。它正在浏览这些文档
00:35:40并整合这份教程。好了。现在,看看这个。这真的没有
00:35:53做任何研究。所以这会很有趣。上次我做了更多的研究。而且
00:36:01我已经看到,它正在使用过时的模型 sonnet 4 而不是
00:36:074.6。它在使用过时的东西。它提到了 generate object,这不是我们想要使用的。我们
00:36:15使用 V6。而且已经有一堆东西过时了。我不会说它们是
00:36:23错误的,但如果你想要 SDK 的最佳性能和最佳实践,它们就非常过时了。
00:36:28好了。这有没有捕捉到
00:36:37这里面的东西?是的,看起来……是的,SDK 技能捕捉到了,看起来它最初
00:36:51在这里写了一份教程。然后技能捕捉到它没有更新到 V6,在我没说
00:36:58任何话的情况下。现在它正在进行更新。它从 generate object 变成了 generate text。
00:37:03它正在更新一切,以确保使用了最新版本。好了,
00:37:10我可以比较这两个。我就开始一个新会话。让我们在这里比较一下
00:37:23没有插件的教程对比 Vercel 插件的教程的准确性。这
00:37:44将很有趣,看看……以前每次我运行这个时,Opus 都会写一个 markdown 文件,
00:37:48这次它写了代码片段。看看这个区别会很有趣。
00:37:54当你做这个时,是的,特别是如果你有其他技能与这个
00:38:03插件一起工作,是否存在它们发生冲突的风险,从而导致
00:38:10旧的东西被优先使用,还是说插件会获得更高的优先级?
00:38:16插件基本上会,我会说,根据其模式强制注入技能。所以
00:38:27如果存在……总会有那种风险,就像这都只是一些上下文,
00:38:34就像所有那些被塞进会话中的文本文件一样。所以我总是会说
00:38:41只在当前项目中使用你想要的东西,作为一个……抱歉,极少
00:38:49在用户级别安装技能,除非你知道你在每一个项目中都想要它。
00:38:58即使对于 Vercel 插件,我们也在努力寻找尽可能好的方法,以便
00:39:06只加载你所在项目需要的东西。关于这一点我们有很多想法。
00:39:11但其中一个最可能引起争议的想法是,比如,什么时候
00:39:23用户会说他们安装了 Vercel 插件。对此你可以做什么假设?
00:39:30如果他们安装了 Vercel 插件,但他们却在竞争对手的平台上,并在竞争对手的平台上
00:39:35打开了一个项目?我们应该向他们推销我们的东西吗?比如,这,
00:39:42是非常引起争议的事情,对吧?如果一个人看到了这个,
00:39:47而他们并不想要,也不真的有兴趣迁移到 Vercel,
00:39:53他们会非常生气。如果另一个人感兴趣,他们会非常高兴。比如,有一些
00:39:59非常吸引人的地方。如果你赞同每个人都将
00:40:05与智能体互动的理论。那么,在插件中告知智能体
00:40:15关于你平台上的新事物的礼仪是什么,同时又不
00:40:24踩到其他平台的脚。所以有很多事情。这与我
00:40:31现在正在做的事情非常相关,我们的 workflow 即将进入 GA 阶段。所以我正在编写
00:40:37迁移指南。如果有人想从 workflow 的竞争对手那里迁移过来,那,
00:40:43你可以直接使用一项技能说:从这个迁移到 workflow。这就是你,
00:40:49这就是你做这件事的方法。如果你想那样做,在智能体的哪个时间点我会通知
00:40:55某人?那类东西对我来说真的非常非常有趣。特别是因为
00:41:00这是我目前工作的重中之重。但是,是的,就像上下文
00:41:07冲突一样,这在未来会成为一个问题。我不知道该如何根据
00:41:14用户项目的上下文以及他们目前提出的要求来推断用户想要什么。
00:41:19如果能做到就太棒了。比如我们技术上可以查看过去的对话,看看他们
00:41:27做了什么。我们可以看提交记录。比如我们可以告诉 GitHub CLI,去查看
00:41:35项目中的任何东西。你可以做很多事情去收集上下文,
00:41:40但那也跨越了一些边界,比如调用了他们不需要你调用的工具。
00:41:46很多非常有趣的东西,如果……直接在 Vercel 中完成所有操作
00:41:53会容易得多,而不是……并为一类智能体提供特定的规则集
00:42:00和插件,从而在那里完美地交付所有东西,而不需要
00:42:05担心所有那些冲突。总之。我希望能提到,是的。
00:42:14在插件上下文中,我们的技能,比如在这个过程中的哪个点技能
00:42:19通常会出现?例如,如果我有一个“将 React 应用迁移到 Next.js”的技能,而它
00:42:26只是放在我的技能文件夹里,它是否更有可能在任何时候
00:42:32我在一个 React 应用项目上时被自动调用?相比之下,如果我有 Vercel 插件,我就可以
00:42:39决定它什么时候被调用,而且,如果我把同样的迁移构建成一个插件,
00:42:47我可以让它只在用户明确要求时才发生。这是正确的
00:42:52思维模型吗?我想是的。比如,我们一直在讨论
00:42:59“一次性技能”或“单次使用技能”的概念,它们更像是,我
00:43:06想做一件事,比如迁移,那是你的一项任务,或者
00:43:12与任务相关的技能,你不想在其他任何时候加载它,除了执行任务时。
00:43:17比如你希望它,你希望它的作用域限定在任务中。你不希望它的作用域限定在项目中。
00:43:22你不希望它的作用域限定在用户中,你希望它限定在任务中。这些都是
00:43:27我们正在讨论的内容。我想我没有一个完美的答案,因为目前,如果你加载了
00:43:33那样的技能,那么它将根据模型和其他技能在框架和模型中
00:43:41产生影响。如果不确切知道项目中还有
00:43:47其他什么东西,就很难说。但是,是的,那绝对是,那也是我们最关注的,
00:43:55即“任务作用域技能”。我脑子里的另一个问题是,
00:44:04这种插件架构有多少是专门针对 Claude code 的?所以如果我想在 Cursor
00:44:12或 Codex 或任何其他工具中获得类似的行为,它们有自己的插件格式吗?我是否
00:44:18需要为它们每个都写一个插件?这是如何运作的?是的。我们很快
00:44:25就会有一些关于插件规范的公告,大家最终会达成一致,拥有
00:44:33能够普遍运行且跨平台兼容的插件。基本上
00:44:39每个人都赞成这一点。我不会说就在今天,但如果你今天以 Claude code 格式构建一个插件,
00:44:45您可以预见它在短时间内就能与其他工具兼容。
00:44:54但没错,这太棒了。现在的技能文件夹已经太多了,我很高兴我们终于
00:45:00开始在这方面实现标准化了。是的,一旦有了这个想法... 就像
00:45:07我在和 Anthropic 讨论插件时,他们选择“插件”而不是
00:45:13“扩展”这个词的原因是,插件意味着它是你可以插进去,
00:45:18也可以拔出来的东西。比如,如果你构建了一个包含一组技能的插件,而你只想
00:45:24在执行单个任务时再次使用它,这应该是非常可行的。
00:45:33如果我在我的项目中,而我是一名设计师,我不想让我的所有设计技能
00:45:40去干扰所有的开发技能之类的。你会希望能够只
00:45:46插入那些部分。我非常认同这些概念,
00:45:52每个人都会有各自的任务、角色和项目。而且
00:45:59他们会比技能更想要插件,因为他们可以,而且他们可能还想
00:46:05策划自己的插件,比如构建自己的一套技能和钩子,
00:46:10这些都是完全根据他们的工作方式定制的。
00:46:16这是否意味着,如果我正在做一个非 Vercel 项目,
00:46:21也许我应该考虑断开 Vercel 插件?
00:46:25我会说,就目前而言,是的,因为它的自我推进
00:46:34非常积极。希望我说这话不会惹麻烦。但
00:46:39Vercel 插件的全部意图是:如果你想加载你的
00:46:46智能体并说“帮我构建这个东西”,然后那个东西就像
00:46:53变魔术一样出现在 Vercel 上。这就是最初的目标。我们正在观察其效果,
00:46:59根据我们收到的反馈,我们正在收敛一些,我们意识到确实需要
00:47:04做更多的项目内容检测,以便自动禁用等等。
00:47:09这些功能很快、很快、很快就会推出。所以,你知道,可能
00:47:15还是保持安装和启用状态吧,因为我们正在积极开发中,
00:47:18就像我们今天早上刚讨论过的一样。所以...
00:47:23我明白了。所以这算是一种权衡,也许在未来,它会更清楚地
00:47:29理解什么时候应该调用自己。但目前,用户控制这个
00:47:36插件是否调用的方式,就是通过在不同会话中插入或拔出它。
00:47:42是的。现在如果你输入 slash plugin,就可以进入已安装的插件,
00:47:48只需切换标签,找到你想禁用的任何插件。你可以更新、
00:47:54卸载或执行任何操作。所以你可以通过这种方式禁用它。还有
00:48:03其他更高级的技巧,比如设置自定义的 ZSH 函数之类的,
00:48:10根据不同的用户加载特定的设置。这就像...
00:48:17关于“坐在电脑前的人的画像”的概念。比如,
00:48:23根据他们正在看的内容,他们需要哪些插件?目前还没有一个完美的
00:48:29解决方案。但希望能想出一个。
00:48:34这就像 Waymo 停在面前时,你一走进去,
00:48:39它就已经为你调整好了所有的座位。
00:48:40没错,没错。而且我确实认为,在某种程度上,我能想象到智能体会
00:48:49更多地询问关于你的信息。我觉得这是一个巨大的缺失,比如个人画像、身份和角色的概念,
00:48:57对我来说,这感觉像是一个缺失的部分。除非你想假设每个人现在
00:49:05都是整个项目的项目经理。我只是不认为这会很快发生。
00:49:12我只是觉得有些人在某些事情上比其他人更有主见。
00:49:19所以...
00:49:20是的,让我们回顾一下。这很有意思,看看这些,是的,
00:49:33有意思的是,我让 Opus 审查 Opus,但它还是错了,对吧?它
00:49:37仍在推荐 generate object 和 v6。让我们根据文档进行验证。所以它尝试
00:49:50验证,然后说,你知道,我写的那个是不正确的。这
00:49:56仍然显示有效但已过时。所以,比如我们的 Haiku 推荐了最新的模型,
00:50:05对我来说,这非常重要。我不知道有多少次你尝试
00:50:08使用智能体来写东西,写一些关于 AI 的东西。它会说“我们用 GPT-4 吧”,
00:50:14不,那太老了。它完全达不到我们需要的一流质量。
00:50:20这只是你可以检测、捕捉并说“检查一下 AI 网关里
00:50:25最新的模型”的事情之一。你可以说检测最新模型并询问用户
00:50:31他们想要哪一个,描述每个模型等等。而现在,
00:50:36这些智能体总是只用 GPT-4。这很有意思,只是作为一个旁注,
00:50:43最近看到 Claude Code 越来越多地推荐 Anthropic SDK,而之前
00:50:49并不会。你会觉得,我想是有人在幕后调整了一些系统提示词,
00:50:55比如“推荐我们自己的 SDK”。我不怪他们。这就是生意,对吧?好吧。
00:51:03是的,generate object 仍然在那里面。所以没错,这很好。在查看了
00:51:13文档后,教程更准确了。我说的几件虚构的事情实际上是存在的。
00:51:19所以没错,这是 Opus 意识到这些是真实存在的东西,就像这是带有插件的
00:51:25Haiku,而 Opus 在写教程并尝试验证教程,就像我
00:51:32不得不告诉它去仔细看文档才能发现,带有插件的 Haiku
00:51:39一次性就搞定了,对吧。如果你知道 Opus
00:51:44和 Haiku 之间的区别,那是件了不起的事。所以这里是一个关于它在挑战
00:51:53或变化中所做对的所有内容的对比。总之,希望这能以一种简单的方式展示出来。
00:52:04就像其中的一个场景,AI SDK,这要多得多。这对于像 Workflow
00:52:15和 Sandbox 这样使用更新的 Vercel 技术的东西来说是非常棒的,但这些技术并不在
00:52:21模型的知识截止日期内。这些区别变得更大了,因为模型甚至
00:52:28不知道它们,对吧。所以这就是 Vercel 插件的用途。如果有人有
00:52:35任何问题,请随时在 X 上或任何你能找到我的地方联系我。我喜欢聊这些东西,
00:52:41很高兴能解决任何疑虑。这绝对是一个正在进行中的工作,
00:52:48我们会不断迭代、迭代、迭代,直到它变成这种神奇的体验。
00:52:52希望你们今天能看到它的开端。如果有人有
00:52:59任何问题,我很乐意回答。如果有人有任何插件的想法,想要头脑风暴,
00:53:04我也很乐意讨论。所以,除非有人想让我深入研究
00:53:14别的东西。这就是我今天要讲的内容。
00:53:20非常感谢你抽出时间。信息量很大。这是一个巨大的转变。我们
00:53:25一直在这些 AI 工具上发展得如此之快。
00:53:28是的,遗憾的是它不会慢下来。
00:53:33我有一个问题,如果人们想以任何方式做出贡献,或者如果他们发现了 Bug 并想
00:53:38报告,给你的最佳方式是什么?
00:53:41噢,是的,那个仓库。Vercel/Vercel/plugin 还是 Vercel/
00:53:49Vercel-plugin?
00:53:51是的,Vercel/Vercel/Vercel-dash-plugin。
00:53:58好的。我也会把它发在聊天框里,方便大家查看。
00:54:03谢了。是的,在上面的 Issue 就很好。它变化会很快。我知道我在
00:54:10这次通话前刚批准了一个大的 PR。
00:54:14太棒了。好了,Jacob,你还有其他问题吗?
00:54:20没有了,我想我们已经在直播中涵盖了所有内容。是的,感谢你进行了
00:54:24如此深入且精彩的演示。我觉得我现在已经准备好构建我自己的 Claude 插件了。
00:54:30而不是在智能体决定强制推送到我的 main 分支时
00:54:37对着它大喊大叫,我现在知道我应该告诉它使用哪些钩子来确保它不再
00:54:42那样做了。所以这非常有帮助。
00:54:45Pre-tools 是你的朋友,是你防御那些你不想要发生的事情的最佳防线。
00:54:51太好了。非常感谢你,John。不客气。谢谢大家。
00:54:56也感谢各位的加入。你可以在 [community.vercel.com/events](https://community.vercel.com/events)
00:55:01找到接下来的活动。我们下次见。
00:55:05好的,好的。社区见。祝大家有愉快的一天。

Key Takeaway

Vercel 插件利用生命周期钩子拦截并修正 AI 智能体的行为,通过注入最新的技术文档和版本校验逻辑,使廉价模型在生成 Vercel 生态代码时的准确度超越了未优化的顶级模型。

Highlights

Vercel 插件通过 Session Start、Pre-tool Use、Post-tool Use、User Prompt Submit 和 Session End 等生命周期钩子实现对 AI 智能体的编程级控制。

插件的主要功能是弥补大模型 6 到 12 个月的知识滞后,确保智能体使用最新的 Vercel AI SDK V6 和组件库,而非过时的 API。

Pre-tool Use 钩子允许在智能体执行 Bash 命令或修改文件前进行拦截,能够强制执行“禁止推送到主分支”等工程安全策略。

实验对比显示,加载插件的低成本模型 Claude 3 Haiku 在编写 AI SDK 教程的准确性上超过了未加插件的顶级模型 Claude 3 Opus。

插件规范正在标准化,目前支持 Claude Code 和 Cursor,并计划在短期内实现跨所有主流 AI 编辑器的通用兼容性。

通过 User Prompt Submit 钩子,开发者可以自定义快捷指令,例如检测到“$”符号时自动触发特定的 Git 提交脚本以减少对话轮次。

Timeline

插件与技能的技术演进与标准化

  • 插件是技能(Skills)的进化形式,目前正处于从简单的 Markdown 指令向标准化生命周期钩子转变的初期阶段。
  • 跨平台的插件标准正在制定中,旨在确保同一个插件能在 Claude Code、Cursor 和未来的 CodeX 等所有编辑器中运行。

当前的 AI 辅助开发正在从简单的提示词工程转向更具结构化的插件系统。虽然市场上的插件数量尚少,但行业正在推动标准化的接口,使开发者编写一次逻辑即可在不同智能体框架中复用。这标志着 AI 开发工具从“用户手动调用”向“环境自动感知”的跨越。

生命周期钩子对智能体行为的精确控制

  • 插件系统通过五个核心钩子介入智能体的工作流程,包括会话开始、工具调用前后以及用户输入阶段。
  • Session Start 钩子用于在对话之初注入特定的知识图谱,作为智能体理解项目的“术语表”或“目录”。

技能通常依赖于模型对 Markdown 描述的检测,而插件则提供了编程化的生命周期。通过在会话开始时加载 Vercel 平台文件,智能体能够预先获得关于 AI SDK、网关和工作流的结构化上下文。这种机制类似于书本的序言,在用户提出具体要求前就完成了思维导图的构建。

解决模型知识截止日期引发的过时代码问题

  • 大模型通常存在 6 个月以上的知识断层,无法感知 Vercel 近期发布的 AI SDK 迭代和 CLI 更新。
  • 插件通过注入最新文档链接和版本校验逻辑,强制模型放弃已过时的 generateObject 等旧版 API。

Vercel 的技术栈迭代速度极快,而模型原生携带的知识往往停留在旧版本。插件的核心任务是防止智能体编写虽能运行但已过时的代码。通过检查 package.json 中的库版本,插件能引导模型查阅最新的官方文档 URL,从而实现与平台最新功能的实时同步。

基于 Pre-tool 钩子的工程安全防御

  • Pre-tool Use 钩子能在文件编辑或 Bash 命令执行前对比内容差异,拦截不符合最佳实践的修改。
  • 相比于容易被模型忽略的文本提示,插件提供的拦截机制是防止误操作的硬性工程防线。

在智能体尝试修改代码的精确时刻,Pre-tool 钩子会介入并执行差异分析。如果智能体试图将代码更改为已知存在错误的过时模式,插件会立即暂停任务并发出修正提醒。这种基于代码逻辑的防御比简单的提示词更可靠,尤其在限制敏感操作(如代码推送)时表现显著。

自定义指令与会话清理机制

  • User Prompt Submit 钩子支持对用户提示词进行正则匹配,从而触发自动化的技能加载或脚本运行。
  • Session End 钩子在会话退出时运行,负责清理临时文件并评估会话是否产生了冗余代码。

开发者可以利用提示词钩子构建个人化的命令集,例如通过特定符号前缀快速触发任务,节省智能体的推理回合。在会话结束阶段,插件可以监控项目的整体进展。如果会话导致了代码膨胀或冲突,它能通过系统通知提醒用户进行后续处理,确保项目结构的纯净。

Haiku 插件版与原生 Opus 的性能实测对比

  • 实测显示,搭载 Vercel 插件的 Claude 3 Haiku 在遵循 AI SDK V6 最新标准方面优于原生的 Claude 3 Opus。
  • 插件能够根据项目上下文自动开启或禁用功能,未来将实现全自动的项目环境检测。

在编写 AI SDK 教程的实验中,原生的 Opus 模型错误地推荐了旧版模型和已废弃的 API。相比之下,通过插件获得最新文档支持的 Haiku 虽然模型规模较小,却一次性生成了完全准确的代码。目前 Vercel 正在优化插件的检测逻辑,以避免在非 Vercel 项目中产生冲突,并不断完善其作为开发者的“自动调节身份画像”。

Community Posts

View all posts