Memulai Vercel AI SDK di Node.js

 – Beragampengetahuan
6 mins read

Memulai Vercel AI SDK di Node.js – Beragampengetahuan

Jika Anda sudah lama membangun kemampuan AI di Node.js, Anda mungkin melakukan hal “OpenAI mentah” setelah bosan dengan paket OpenAI npm.

  1. Membangun pesan secara manual
  2. POST tiba /v1/chat/completions
  3. menguraikan choices[0].message.content

Ini berfungsi dengan baik sampai Anda ingin mendukung banyak penyedia – bagaimana jika Anda juga ingin mendukung Claude atau Gemini? Claude dan Gemini tidak hanya memiliki struktur dan izin API yang berbeda, tetapi formatnya juga berbeda messages Dalam jumlah besar. Menulis integrasi yang berhasil untuk semua ini adalah tugas yang berat.

Di sinilah tepatnya Mongoose Studio diposisikan. Kami menulis ulang kode untuk menggunakan Vercel AI SDK (PR di sini), dan hasilnya adalah abstraksi yang lebih sederhana dan bersih yang mendukung OpenAI, Claude, dan Gemini dengan kode minimal.

Contents

Pengantar Vercel AI SDK

AI SDK Vercel menyediakan antarmuka terpadu untuk berbagai penyedia LLM. mereka memiliki inti ai paket, dan kemudian pisahkan paket integrasi untuk penyedia LLM yang berbeda, misalnya. @ai-sdk/openai Dan @ai-sdk/anthropic.

Memasang:

npm install ai @ai-sdk/openai @ai-sdk/anthropic

terkecil callLLMWrapper()

Ini adalah abstraksi inti yang kami usulkan untuk pemfaktoran ulang (non-streaming). ini @ai-sdk/openai Ekspor paket a createOpenAI() Fungsi yang dapat digunakan untuk membuat OpenAI penyediadan yang serupa createAnthropic() Untuk Claude.Core ai Ada satu paket generateText() Fungsi ini menerima serangkaian model (termasuk penyedia), perintah sistem, dan pesan.

import { createAnthropic } from '@ai-sdk/anthropic';
import { createOpenAI } from '@ai-sdk/openai';
import { generateText } from 'ai';

module.exports = async function callLLM(messages, system, options) {
  let provider = null;
  let model = null;

  if (options?.openAIAPIKey && options?.anthropicAPIKey) {
    throw new Error('Cannot set both OpenAI and Anthropic API keys');
  }

  if (options?.openAIAPIKey) {
    provider = createOpenAI({ apiKey: options.openAIAPIKey });
    model = options?.model ?? 'gpt-4o-mini';
  } else if (options?.anthropicAPIKey) {
    provider = createAnthropic({ apiKey: options.anthropicAPIKey });
    model = options?.model ?? 'claude-haiku-4-5-20251001';
  } else {
    throw new Error('Must set either OpenAI key or Anthropic API key');
  }

  return generateText({
    model: provider(model),
    system,
    messages
  });
};

Kemudian Anda bisa menelepon callLLM() sebagai berikut:

const res = await callLLM(
  [{    
    role: 'user',
    content: 'reverse a string' 
  }],
  'You are an assistant that writes JavaScript programs like a pirate',
  { openAIAPIKey: process.env.OPENAI_API_KEY }
);

console.log(res.text);

Respon streaming

generateText() Ini bagus untuk keluaran teks kecil (seperti ringkasan teks), tetapi untuk kasus yang lebih kompleks di mana Anda ingin LLM menghasilkan teks dalam jumlah besar, streaming adalah pilihan terbaik. Jika tidak, pengguna Anda tidak akan melihat teks apa pun hingga saat ini semua Respons selesai. Misalnya, di UI ChatGPT, Anda tidak perlu menunggu respons penuh; Anda melihat teks seperti yang dihasilkan oleh model.

Vercel AI SDK memaparkan hal ini melalui streamText()yang mengembalikan potongan teks saat dibuat, daripada menunggu respons lengkap. Secara khusus, streamText() Mengembalikan iterator asinkron. Jika Anda menampilkan hasil berupa teks kepada pengguna, streaming menyebabkan latensi yang dirasakan turun drastis.

Untuk Mongoose Studio, saya menerapkan yang terpisah streamLLM() Asistennya adalah sebagai berikut. streamLLM() adalah fungsi generator asinkron.

export default async function* streamLLM(messages, system, options) {
  let provider = null;
  let model = null;
  if (options?.openAIAPIKey && options?.anthropicAPIKey) {
    throw new Error('Cannot set both OpenAI and Anthropic API keys');
  }

  if (options?.openAIAPIKey) {
    provider = createOpenAI({ apiKey: options.openAIAPIKey });
    model = options?.model ?? 'gpt-4o-mini';
  } else if (options?.anthropicAPIKey) {
    provider = createAnthropic({ apiKey: options.anthropicAPIKey });
    model = options?.model ?? 'claude-haiku-4-5-20251001';
  } else {
    throw new Error('Must specify either OpenAI or Anthropic key');
  }

  const { textStream } = streamText({
    model: provider(model),
    system,
    messages
  });
  for await (const chunk of textStream) {
    yield chunk;
  }
  return;
}

Ini digunakan streamLLM() terlihat seperti. Cara paling sederhana untuk melakukan iterasi pada iterator asinkron adalah dengan menggunakan for/await/of bentuk cincin.

const stream = streamLLM(
  [{
    role: 'user',
    content: 'reverse a string'
  }],
  'You are an assistant that writes JavaScript programs like a pirate',
  { openAIAPIKey: process.env.OPENAI_API_KEY }
);

for await (const chunk of stream) {
  process.stdout.write(chunk);
}

Keluaran terstruktur generateObject()

Sejauh ini kita telah belajar:

  • generateText(): mengembalikan sebuah string
  • streamText(): rangkaian streaming

Namun dalam aplikasi nyata, biasanya Anda tidak terlalu membutuhkan teks tersebut. Anda menginginkan data terstruktur. dan mengandalkan generateText() Menghasilkan JSON atau YAML yang valid dan dapat diurai sangatlah rapuh, bahkan jika Anda memberi tahu LLM “tolong kembalikan JSON saja atau saya akan kehilangan pekerjaan.”

generateObject() Selesaikan masalah ini. masukkan ke dalam a prompt dan sebuah schemaAnda kemudian akan mengembalikan objek yang cocok dengan polanya. Pada tulisan ini, skema harus didefinisikan menggunakan Zod.

import { createAnthropic } from '@ai-sdk/anthropic';
import { createOpenAI } from '@ai-sdk/openai';
import { generateObject } from 'ai';
import z from 'zod';

export default async function myGenerateObject(prompt, schema, options) {
  let provider = null;
  let model = null;
  if (options?.openAIAPIKey && options?.anthropicAPIKey) {
    throw new Error('Cannot set both OpenAI and Anthropic API keys');
  }

  if (options?.openAIAPIKey) {
    provider = createOpenAI({ apiKey: options.openAIAPIKey });
    model = options?.model ?? 'gpt-4o-mini';
  } else if (options?.anthropicAPIKey) {
    provider = createAnthropic({ apiKey: options.anthropicAPIKey });
    model = options?.model ?? 'claude-haiku-4-5-20251001';
  } else {
    throw new Error('Must specify either OpenAI or Anthropic key');
  }

  const result = await generateObject({
    model: provider(model),
    schema,
    prompt
  });
  return result.object;
}

Kemudian Anda bisa menelepon myGenerateObject() sebagai berikut. Ya, LLM modern sangat pandai mendapatkan koordinat kota-kota besar.


console.log(
  await myGenerateObject(
    'Get me the coordinates of Boise, Idaho',
    z.object({ lat: z.number(), lng: z.number() }),
    { openAIAPIKey: process.env.OPENAI_API_KEY }
  )
);

terus berlanjut

Vercel AI SDK memberi Anda banyak primitif ringkas untuk bekerja dengan penyedia LLM yang berbeda sambil mengabstraksi penyedia yang mendasarinya. Menurut pengalaman saya, contoh di atas berfungsi untuk model OpenAI, Anthropic, dan Gemini, yang tidak semua penyedia didukung oleh AI SDK. AI SDK juga mendukung agen, memori, dan berbagai fitur luar biasa lainnya. Lain kali Anda ingin menambahkan penyedia LLM lain ke proyek Anda, cobalah.

rencana pengembangan website



metode pengembangan website

jelaskan beberapa rencana untuk pengembangan website, proses pengembangan website, kekuatan dan kelemahan bisnis pengembangan website
, jasa pengembangan website, tahap pengembangan website, biaya pengembangan website

#Memulai #Vercel #SDK #Node.js

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *