使用 Vercel AI SDK 內建的 Prompt API

發布日期:2026 年 7 月 16 日

Vercel AI SDK 是與供應商無關的 TypeScript 工具包,可協助您使用 Next.js、React、Svelte、Vue、Angular 等熱門 UI 架構,以及 Node.js 等執行階段,建構 AI 輔助應用程式和代理程式。雖然大多數供應商都以雲端為基礎,但本系列文章的第一部分 (共兩部分) 將著重於由 Jakob Hoeg Mørk 建立的社群供應商「Browser AI」(由 Google 贊助)。透過 Browser AI,您可以使用 Vercel 的 AI SDK 搭配 Prompt API。本系列文章的第二部分說明如何為 AI 應用程式新增圖形使用者介面。

安裝程式庫

@browser-ai/core 套件是 Prompt API 的 AI SDK 供應商。您可以使用 npm 安裝。 套件會自動安裝基礎 Vercel AI SDK 做為同層級依附元件。

npm install @browser-ai/core

基本用法

如要使用供應商,請按照下列步驟操作:

  1. @browser-ai/core 套件匯入 browserAI 建構函式。
  2. 從 Vercel AI SDK 匯入 generateText()streamText() 函式。這兩個函式都會使用語言模型,針對指定提示生成文字並呼叫工具:
  • generateText() 函式不支援串流,適合用於簡短輸出內容,或只能在收到完整輸出內容後繼續作業的輸出內容。
  • streamText() 函式會串流語言模型生成的文字。您可以使用這項功能處理互動式用途,例如聊天機器人和其他即時應用程式。

如要建立模型執行個體,請按照下列步驟操作:

  1. 呼叫 browserAI()。注意:最佳做法是一律檢查模型的 availability(),以便在模型為 'unavailable' 時使用備用方案 (請參閱「混合使用」),或在模型為 'downloadable''downloading' 時顯示進度更新。

  2. 接著,您可以呼叫 generateText()streamText()。如需完整的參數清單,請參閱 Vercel AI SDK 說明文件。舉例來說,您也可以傳遞更複雜的 messages 物件,進行多重提示,或傳遞 system 提示,而不是像下列程式碼範例一樣直接傳遞 prompt

import { browserAI } from '@browser-ai/core';
import { generateText, streamText } from 'ai';

(async () => {
  const model = browserAI();
  const availability = await model.availability();

  if (availability === 'unavailable') {
    console.log('Your browser cannot run the built-in AI model.');
    return;
  }

  if (availability === 'downloadable' || availability === 'downloading') {
    await model.createSessionWithProgress((progress) => {
      console.log(`Download progress: ${Math.round(progress * 100)}%`);
    });
  }

  // Non-streaming text generation.
  const { text } = await generateText({
    model,
    prompt: 'Tell me a short joke',
  });
  console.log(text);

  // Streaming text generation.
  const result = streamText({
    model,
    prompt: 'Tell me a long joke',
  });

  for await (const chunk of result.textStream) {
    console.log(chunk);
  }
})();

多模態使用量

@browser-ai/core 套件支援多模態輸入,方法是在 messages 陣列的內容物件中使用 type: 'file' 物件。

content 物件欄位 (type: 'file')

欄位 可接受的值類型 說明

type

'file'

將這個內容物件標示為檔案輸入

data

string | Uint8Array | Buffer | ArrayBuffer | URL

檔案內容 (支援多種格式)

如果 datastring,則必須是下列其中一項:

格式 說明
Base64 編碼內容 以 Base64 編碼的原始檔案位元組
Base64 資料網址 例如:data:image/png;base64,...
http(s) 網址 系統將從中擷取檔案的遠端網址

請參考以下程式碼片段:

import { streamText } from 'ai';
import { browserAI } from '@browser-ai/core';

const base64ImageData = await getBase64ImageData();
const audioData = await getAudioBuffer();

const result = streamText({
  model: browserAI(),
  messages: [
    {
      role: 'user',
      content: [
        { type: 'text', text: "What's in this image?" },
        { type: 'file', mediaType: 'image/png', data: base64ImageData },
      ],
    },
    {
      role: 'user',
      content: [
        { type: 'text', text: 'Transcribe this audio file!' },
        { type: 'file', mediaType: 'audio/mp3', data: audioData },
      ],
    },
  ],
});

for await (const chunk of result.textStream) {
  console.log(chunk);
}

結構化輸出內容

Vercel AI SDK 透過 zod 支援結構化輸出,這項 TypeScript 優先的結構定義驗證功能具有靜態型別推論功能。詳情請參閱 zod 的「定義結構定義」說明文件。

如要要求與結構定義相符的 JSON 物件,請將 output: Output.object({ schema }) 傳遞至 generateText()streamText()

  • generateText() with Output.object() 會在生成完成後,於 output 欄位中傳回最終的 JSON 物件。
  • streamText()Output.object() 搭配使用時,會提供 partialOutputStream 非同步可疊代項目,保證每個中繼結果都能正確剖析為 JSON。舉例來說,如果結構定義強制執行兩個數字的陣列,您會收到 [] 做為第一個部分結果、[123] 做為第二個部分結果,以及 [123, 456] 做為最終結果。
import { browserAI } from '@browser-ai/core';
import { generateText, streamText, Output } from 'ai';
import z from 'zod';

const model = browserAI();

const schema = z.object({
  recipe: z.object({
    name: z.string(),
    ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
    steps: z.array(z.string()),
  }),
});

const prompt = 'Generate a lasagna recipe.';

// Non-streaming object generation.
const { output } = await generateText({
  model,
  output: Output.object({ schema }),
  prompt,
});

console.log(output);

// Streaming object generation.
const { partialOutputStream } = streamText({
  model,
  output: Output.object({ schema }),
  prompt,
});

for await (const partialObject of partialOutputStream) {
  console.log(partialObject);
}

混合使用

Vercel 的 AI SDK 最擅長的是混合使用。它在基礎供應商的低層級實作項目之上,提供更高層級的抽象層。使用 Prompt API 做為供應商時,請呼叫 browserAI 建構函式來建立 model

import { browserAI } from '@browser-ai/core';

const model = browserAI();

如要使用其他供應商 (例如 Google 生成式 AI 供應商),請按照下列步驟操作:

  1. 安裝所選供應商。

    npm install @ai-sdk/google
    
  2. 使用供應商的建構函式例項化 model,對於 Google 生成式 AI 等雲端服務供應商,這通常需要傳遞 API 金鑰。如果是 Google Generative AI 提供者,您也可以傳遞雲端模型 ID,例如 'gemini-2.5-flash'。其餘程式碼 (例如對 streamText() 的呼叫) 則完全不變。

    import { createGoogleGenerativeAI } from '@ai-sdk/google';
    
    const API_KEY = 'YOUR_GOOGLE_AI_API_KEY';
    
    const google = createGoogleGenerativeAI({ apiKey: API_KEY });
    const model = google('gemini-2.5-flash');
    

雲端備用廣告

在混合式情境中,常見的用途是在 Prompt API 可用時使用該 API,並在其他情況下改用雲端供應商。如要檢查 Prompt API 是否可用,@browser-ai/core 套件提供 doesBrowserSupportBuiltInAI() 函式。您可以使用此函式,將 model 動態例項化為雲端式模型或內建模型。

import { doesBrowserSupportBuiltInAI } from '@browser-ai/core';

const API_KEY = 'YOUR_GOOGLE_AI_API_KEY';

const model = await (async () => {
  if (doesBrowserSupportBuiltInAI()) {
    const { browserAI } = await import('@browser-ai/core');
    return browserAI();
  }
  const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
  const google = createGoogleGenerativeAI({ apiKey: API_KEY });
  return google('gemini-2.5-flash');
})();

內建備用機制

另一個混合式用途是盡可能在連線時使用雲端供應商,但如果支援 Prompt API,則會改用內建供應商。

import { doesBrowserSupportBuiltInAI } from '@browser-ai/core';

const API_KEY = 'YOUR_GOOGLE_AI_API_KEY';

let model;

const switchProvider = async (forceCloud = false) => {
  model = await (async () => {
    if (navigator.onLine || forceCloud) {
      const { createGoogleGenerativeAI } = await import('@ai-sdk/google');
      const google = createGoogleGenerativeAI({ apiKey: API_KEY });
      return google('gemini-2.5-flash');
    }
    const { browserAI } = await import('@browser-ai/core');
    return browserAI();
  })();
};

if (doesBrowserSupportBuiltInAI()) {
  window.addEventListener('online', switchProvider);
  window.addEventListener('offline', switchProvider);
}
await switchProvider(true);

示範

透過 即時試用 ,你可以並排比較兩家供應商的服務。從圓形按鈕選取「Cloud API (Gemini 2.5 Flash)」或「Built-in AI」,然後按下「Run」,即可看到頁面依序填入四個部分:使用 generateText() 一次生成的短笑話、使用 streamText() 逐一串流的長笑話、以完整 JSON 物件形式傳回的千層麵食譜,以及使用 partialOutputStream 串流的相同食譜 (以遞增方式驗證 JSON)。如果選取「內建 AI」,但瀏覽器尚未下載模型,系統會在開始展示前顯示進度指標。

Vercel AI 示範

後續步驟

您現在已瞭解如何搭配使用 Prompt API 和 Vercel AI SDK,接下來的步驟是使用 AI SDK UIAI 元素,在應用程式中加入圖形使用者介面。

AI SDK UI 旨在協助您輕鬆建構互動式聊天、完成和助理應用程式。這項工具組與架構無關,可簡化將進階 AI 功能整合至應用程式的程序。

AI 元素是元件程式庫和自訂登錄檔,可協助您更快建構 AI 原生應用程式。並提供預先建構的元件,例如對話和訊息等。

請參閱「Use the Vercel AI SDK UI and AI Elements with the Prompt API」,瞭解如何為應用程式新增 GUI。