[控场AI]
· 6 分钟阅读· 3,247 字

@ai-sdk/vue 3.0.305 发布:修复 useObject 两个关键问题

@ai-sdk/vue 3.0.305 发布:修复 useObject 两个关键问题

@ai-sdk/vue 发布 3.0.305,修复 useObject 中止竞态与 Headers 请求头丢失问题。

Vercel AI SDK 的 Vue 适配包 @ai-sdk/vue 发布 3.0.305 补丁版本,包含两项针对 useObject 组合式函数的关键修复。其一是解决请求在真正启动前被中止时无法正确取消提交的竞态问题,确保流式对象生成的中止语义在请求生命周期任意阶段都能被正确响应;其二是修复以 Headers 实例形式传入的请求头未被保留的问题,避免鉴权信息或自定义元数据在传输中丢失。同时依赖 @ai-sdk/provider-utils 更新至 4.0.58,ai 主包同步至 6.0.305。该版本无破坏性变更,建议涉及频繁中断操作或自定义请求头的 Vue AI 项目尽快升级。

Vercel 旗下的 AI SDK 项目持续高频迭代,其 Vue 适配包 @ai-sdk/vue 发布了 3.0.305 版本。这个补丁版本虽然体积不大,却修复了 useObject 组合式函数中两个容易被忽视、但在实际项目中可能造成困扰的问题。

rss source: @ai-sdk/vue@3.0.305

两个补丁修复了什么

根据 GitHub 上的发布说明,本次 3.0.305 是一个纯粹的 patch 版本,包含两项针对 Vue 端的修复,以及一次依赖更新。

修复一:取消在请求启动前被中止的 useObject 提交

第一个修复对应提交 fac482b,描述为「fix(vue): cancel useObject submissions stopped before their request starts」。

这个问题指向一个典型的竞态场景:在 Vue 组件中使用 useObject 发起流式对象生成时,用户可能在请求真正发出之前就触发了中止操作(例如快速切换页面、关闭弹窗,或主动调用 stop)。如果中止发生在请求尚未启动的窗口期内,原先的实现可能无法正确取消这次提交,导致请求仍然被发出,或者状态回调出现异常。

修复之后,无论中止信号在请求生命周期的哪个阶段到达,useObject 都能正确响应,避免「已经取消却仍在请求」的不一致状态。

什么是 useObject 组合式函数?

useObject 是 @ai-sdk/vue 提供的核心组合式函数之一,用于在 Vue 组件中发起"流式对象生成"请求。与返回纯文本的流式接口不同,它请求大模型按照预设的 JSON Schema 输出结构化对象,并随着 token 的到达逐步增量构建出对象实例。

典型用法是:

const { object, submit, stop, isLoading } = useObject({
  api: '/api/generate',
  schema: z.object({ name: z.string(), age: z.number() }),
})

其中 object 是响应式的 ref,会随着流式数据不断更新;submit(input) 触发一次请求;stop() 主动中止当前流。由于这套机制依赖 AbortController 管理请求生命周期,因此"何时算请求已启动"成为一个关键的时间点——本次修复正是针对该时间窗口内的中止行为。

修复二:保留以 Headers 实例形式传入的请求头

第二个修复对应提交 2479c33,描述为「fix(vue): preserve headers supplied as a Headers instance in useObject requests」。

在 Web 标准中,请求头可以以普通对象、数组,或者 Headers 实例的形式提供。此前 useObject 在处理 Headers 实例时可能未能正确保留其中的自定义头部,造成鉴权信息、追踪标识或自定义元数据丢失。对于依赖请求头传递 API Key 或租户信息的应用来说,这类问题往往难以在开发阶段暴露,却会在生产环境引发 401 或路由错乱。

这次修复确保了无论是普通对象还是 Headers 实例,请求头都会被完整传递。

为什么 Headers 实例需要被单独处理?

Headers 是 Fetch API 定义的标准接口,它和普通对象虽然在使用者看来相似,但行为并不完全一致。首先,Headers 的键名不区分大小写,访问时会被规范化;其次,它支持 append、get、has 等方法,且能够在 Request、Response 之间传递。

在 TypeScript 生态中,fetch 的 headers 参数类型是 HeadersInit,即 Headers | string[][] | Record<string, string> 三者之一。很多 SDK 在实现时只遍历了普通对象(Object.entries),对 Headers 实例直接当作空对象处理,导致其中的键值全部丢失。

本次修复意味着 useObject 现在会识别 Headers 实例并通过其自身的方法进行读取或合并。对于使用 new Headers({ Authorization: ... }) 传递鉴权信息、或借助 headers.append 动态追加追踪字段的场景,这是一次必要且及时的修正。

依赖同步更新

除了两项 Vue 侧修复,本次发布还同步更新了依赖项 @ai-sdk/provider-utils 至 4.0.58,对应提交 604b4d3。provider-utils 是 AI SDK 各 provider 适配层共享的工具包,其版本跟进通常意味着底层能力或类型定义的对齐。同時 ai 包同步到 6.0.305,保持整条版本线一致。

这种「主包 + 框架适配包 + 工具包」同步发版的节奏,是 AI SDK 一贯的做法。对使用者而言,最省心的升级方式通常是让 ai 与 @ai-sdk/vue 保持同一小版本号,避免出现类型或行为上的细微错位。

@ai-sdk/provider-utils 是什么?

provider-utils 是 AI SDK 的"共享底座",为各个模型供应商适配包(如 @ai-sdk/openai、@ai-sdk/anthropic)以及各框架适配包(如 @ai-sdk/vue、@ai-sdk/react)提供通用工具和类型定义。它包含诸如请求重试、流式响应解析、Headers 合并、错误标准化等底层能力。

由于框架适配包会直接调用 provider-utils 中的工具函数,因此当 provider-utils 修复了某个边界行为(例如上文提到的 Headers 处理),适配包需要同步升级才能真正受益。这也是 AI SDK 坚持"主包 ai + 框架适配包 + provider-utils"三者小版本对齐的原因:只有三者版本匹配,行为契约才一致。

这次更新意味着什么

单看这两个提交,都是非常具体的边界情况修复,不涉及新 API 或破坏性变更。但它们反映出 AI SDK 在 Vue 生态中已经进入「打磨细节」的阶段:

  • 流式 UI 的取消语义正在被认真对待。随着 AI 应用越来越多地采用流式输出,中断、重试、切换这类交互成为常态,请求生命周期管理的健壮性直接影响用户体验。
  • 请求头处理的标准化得到加强。Headers 实例是 Fetch API 的标准组成部分,正确处理它对构建可组合、可测试的请求层至关重要。

对于正在使用 useObject 构建 Vue AI 应用的开发者,建议直接升级到 3.0.305。如果你的应用涉及频繁的中断操作或自定义请求头,这两个修复值得优先纳入。

升级建议

升级方式与往常一致,通过 npm、pnpm 或 yarn 安装最新版本即可。由于是 patch 版本,理论上不包含破坏性变更,但仍建议在升级后重点验证两类场景:一是快速中止请求时的状态一致性,二是自定义请求头是否被服务端正确接收。

对于尚未使用 AI SDK 的 Vue 开发者,3.0.305 这类持续修复的节奏本身也是一个积极信号——它说明该适配层正在被实际项目反复验证,而非停留在示例阶段。

#@ai-sdk/vue#useObject#AI SDK#Vue AI 应用#Vercel AI SDK#请求中止#Headers 请求头
分享:

相关推荐