模型 / 資料集
vercel/ai avatar
vercel/ai

AI SDK:把模型供應商抽象成一層 TypeScript 介面

The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents

26,761 個 Star5,141 個 ForkTypeScriptNOASSERTION

秒懂

它是什麼?
vercel/ai 提供統一的 generateText、ToolLoopAgent 與 UI hook,讓同一段程式碼可以換模型、換框架。判斷重點在於你願不願意接受預設走 Vercel AI Gateway,以及能不能跟上它每週多次的版本節奏。
適合誰用?
若你的產品是 TypeScript 前端專案,需要在同一份程式碼裡切換 OpenAI、Anthropic、Google 等模型,並且接受預設經由 Vercel AI Gateway 呼叫,AI SDK 省下的樣板碼很直接。若你的團隊必須自建推論閘道、以非 Node 執行環境為主,或無法承受每週多次的版本更新,這個套件會變成負擔。
可以商用嗎?
請先確認。這個儲存庫使用的授權不在我們自動分類的範圍內,商用前請閱讀儲存庫中的 LICENSE 檔案。
還在維護嗎?
有在維護。儲存庫在最近一天內有新的提交。
用什麼語言寫的?
主要是 TypeScript(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它要解的問題:模型供應商介面各自為政

在 AI SDK 出現之前,同一個對話功能要接三家模型,就得寫三套請求格式、三套串流解析、三套錯誤型別。切換模型的成本高到多數團隊乾脆綁死一家。這個專案把呼叫端收斂成一組函式,README 的說法是「provider-agnostic TypeScript toolkit」,目標受眾是使用 Next.js、React、Svelte、Vue、Angular 這類前端框架,執行環境為 Node.js 的開發者。

它同時處理兩個層次。第一層是伺服器端的模型呼叫,統一在 generateText 這類函式底下;第二層是前端與伺服器之間的串流與工具呼叫狀態,交給 @ai-sdk/react 這類框架套件。兩層都做,是它與單純的 API wrapper 最大的差別。

兩條呼叫路徑:Gateway 字串與直連供應商套件

README 給的第一個範例是把模型寫成字串:model: 'anthropic/claude-opus-4.6',或 'openai/gpt-5.4'、'google/gemini-3-flash'。這種寫法預設經過 Vercel AI Gateway,官方說法是「give you access to all major providers out of the box」。也就是說,開箱即用的代價是流量預設走 Vercel 的閘道。

第二條路是安裝 @ai-sdk/openai、@ai-sdk/anthropic、@ai-sdk/google,然後用 anthropic('claude-opus-4-6') 這種形式傳入模型物件。README 的註解把兩種寫法並列,字串給 Gateway、函式呼叫給直連。這個切換點是評估時最該先確認的事:你的金鑰、計費與資料落地要求,決定你能不能接受第一條路。

值得注意的是兩邊的模型識別字不同。Gateway 字串用點號(claude-opus-4.6),供應商套件用連字號(claude-opus-4-6)。文件沒有解釋這個差異的原因,但遷移時貼錯就會直接失敗。

結構化輸出:schema 交給 Zod,型別由推導取得

generateText 搭配 Output.object 時,schema 用 Zod 定義,範例是一份食譜物件,內含 name、ingredients 陣列(每項有 name 與 amount)、steps 字串陣列。回傳值從 text 換成 output。

這個設計把「模型回傳自由文字、你再自己想辦法解析」的流程,改成由 SDK 依 schema 約束並驗證。對需要穩定欄位的表單填寫、資料抽取場景,這比在 prompt 裡反覆叮嚀 JSON 格式可靠。但 README 沒有交代驗證失敗時的重試策略或錯誤型別,這一段在正式使用前必須自己從 API Reference 補齊,不能假設它會自動重試。

ToolLoopAgent:把工具迴圈包成一個類別

代理的部分由 ToolLoopAgent 承擔。README 的 shell 範例傳入 model、system 提示,以及一個 tools 物件,裡面用 openai.tools.localShell 包住 execute 函式;execute 內再呼叫外部沙箱執行命令,取回 stdout。

這裡的架構重點是:SDK 負責「模型要求呼叫工具、執行、把結果餵回模型」這個迴圈,工具本身的實作完全在你手上。範例註解寫著 getSandbox() 對應 Vercel Sandbox,但那只是一個佔位函式,任何能回傳 stdout 的沙箱都可以替換。

圖像生成的範例展示了同一套機制的另一面:openai.tools.imageGeneration 帶 partialImages: 3,前端用 UIToolInvocation 型別,依 invocation.state 在 'input-available' 與 'output-available' 之間切換畫面。工具呼叫的中間狀態因此變成 UI 可渲染的資料,而不是黑箱。

UI 層的資料流:從 agent 檔案到 useChat

README 給了一條完整的 Next.js App Router 路徑。先在 @/agent/image-generation-agent.ts 匯出 agent 與 InferAgentUIMessage 推導出的訊息型別;接著在 @/app/api/chat/route.ts 用 createAgentUIStreamResponse 把 agent 與 messages 包成 POST 回應;最後在 'use client' 的頁面用 useChat<ImageGenerationAgentMessage>() 取得 messages、status、sendMessage。

渲染時走 message.parts,依 part.type 分岔:'text' 直接輸出文字,'tool-generateImage' 交給自訂元件。這個 parts 陣列的設計意味著訊息不再只是字串,而是文字與工具呼叫交錯的序列。

狀態管理也反映在 UI 上:輸入框的 disabled 綁定 status !== 'ready'。這行程式碼背後是一套串流狀態機,文件沒有在 README 展開,實作前需要查 API Reference 確認各狀態的轉換時機。

安裝與執行環境的硬性門檻

README 明寫需要 Node.js 22+ 與 npm 或其它套件管理器。主套件是 npm install ai,前端 hook 另外裝,例如 npm install @ai-sdk/react,供應商直連則裝 @ai-sdk/openai、@ai-sdk/anthropic、@ai-sdk/google。

README 另外建議使用 Claude Code 或 Cursor 這類編碼代理時,在專案中加入 AI SDK skill,指令是 npx skills add vercel/ai。這是把套件知識餵給代理的做法,不是執行期依賴。

Node.js 22+ 這個門檻比多數前端專案現行的版本高。若你的 CI 或部署環境還停在 20,升級節點會是採用前的前置工作,而不是裝完套件就能跑。

版本節奏與授權狀態這兩個現實問題

release 清單顯示同一天內發佈了 ai@7.0.95、ai@6.0.279、ai@5.0.254。三個主版本同時維護,且各自持續出修補版,代表這個專案對舊版並不放生,但也代表變更頻率高。鎖定版本並在升級前讀 release notes,是使用這個套件的基本紀律。

授權欄位在倉庫資訊中是 NOASSERTION,也就是 GitHub 無法自動判定為標準授權條款。README 沒有提到授權內容。要在商業產品中使用,必須自行到倉庫根目錄確認實際的 LICENSE 檔案內容,這不是可以靠推測帶過的事項,本文也不對其法律效果做判斷。

另外,README 的社群段落只指向 Vercel Community 的 AI SDK 分類,沒有列出其他支援管道。若你的團隊需要商業等級的支援承諾,這裡沒有對應資訊。

什麼情況下該選別的方案

如果你的團隊已經自建推論閘道,或在非 Node 環境(例如 Python 服務、邊緣 runtime)為主,這個套件的價值會大幅下降。它的抽象建立在 TypeScript 與 Node.js 22+ 之上,跨語言重用並不成立。

以 Python 為主的後端可以直接使用各家供應商官方 SDK,或採用 LiteLLM 這類同為多供應商抽象的函式庫。差別在於 AI SDK 把前端 hook 與工具呼叫狀態一起納入範圍,而 LiteLLM 聚焦在伺服器端的統一呼叫與代理。反過來說,若你只需要伺服器端呼叫、不需要 React 或 Svelte 的串流整合,AI SDK 的 UI 模組對你就是多餘的依賴。

還有一種情況要避開:如果你的產品必須完全掌控請求路徑、不能經過第三方閘道,那預設的模型字串寫法就不適用,必須改走 @ai-sdk/* 直連套件,並自行確認每家的金鑰管理與配額行為。

維護成本落在誰身上

使用這個套件的長期成本有兩塊。第一塊是版本跟進:三個主版本並行維護,升級路徑需要你持續讀 release notes,尤其當你同時使用 UI hook 與 agent 時,兩層的變更可能不同步。

第二塊是抽象洩漏。工具迴圈、串流狀態、schema 驗證這些機制,SDK 只提供骨架,沙箱、儲存、錯誤處理仍由你實作。README 的 shell 範例用註解標出 getSandbox(),實際要接哪個執行環境並沒有預設答案。

相對地,這個套件確實把「換模型」從重寫請求層降級為改一行字串或換一個函式呼叫。對模型選型還在變動的早期產品,這個交換是划算的;對模型已經固定、只需要穩定呼叫的系統,抽象的維護成本可能高於它省下的程式碼。

編輯結論

若你的產品是 TypeScript 前端專案,需要在同一份程式碼裡切換 OpenAI、Anthropic、Google 等模型,並且接受預設經由 Vercel AI Gateway 呼叫,AI SDK 省下的樣板碼很直接。若你的團隊必須自建推論閘道、以非 Node 執行環境為主,或無法承受每週多次的版本更新,這個套件會變成負擔。動手前先確認三件事:Node.js 是否為 22 以上、模型字串走 Gateway 還是自裝 @ai-sdk/* 供應商套件、以及 Output.object 的 schema 驗證失敗時你的錯誤處理路徑。

官方來源

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. vercel/ai on GitHub
社群筆記

社群筆記