Vercel AI SDK je unifikované rozhranie pre prácu s rôznymi LLM providermi. Streamovanie, React hooks a edge-ready.

Prečo AI SDK?

Bez AI SDK

// Manuálne streamovanie je komplexné
const response = await fetch('/api/chat', {
  method: 'POST',
  body: JSON.stringify({ messages })
})

const reader = response.body?.getReader()
const decoder = new TextDecoder()

while (true) {
  const { done, value } = await reader.read()
  if (done) break
  const text = decoder.decode(value)
  // Parse SSE format...
}

S AI SDK

import { useChat } from 'ai/react'

function Chat() {
  const { messages, input, handleInputChange, handleSubmit } = useChat()

  return (
    <form onSubmit={handleSubmit}>
      {messages.map(m => <div key={m.id}>{m.content}</div>)}
      <input value={input} onChange={handleInputChange} />
    </form>
  )
}

Core Concepts

generateText

import { generateText } from 'ai'
import { openai } from '@ai-sdk/openai'

const { text } = await generateText({
  model: openai('gpt-4o'),
  prompt: 'Vysvetli TypeScript generics'
})

streamText

import { streamText } from 'ai'

const result = await streamText({
  model: openai('gpt-4o'),
  messages: [
    { role: 'user', content: 'Napíš esej o AI' }
  ]
})

for await (const chunk of result.textStream) {
  process.stdout.write(chunk)
}

generateObject

Štruktúrovaný output s type safety:

import { generateObject } from 'ai'
import { z } from 'zod'

const { object } = await generateObject({
  model: openai('gpt-4o'),
  schema: z.object({
    name: z.string(),
    age: z.number(),
    interests: z.array(z.string())
  }),
  prompt: 'Vygeneruj profil vývojára'
})

// object je plne typovaný
console.log(object.name)

React Hooks

useChat

'use client'

import { useChat } from 'ai/react'

export function ChatComponent() {
  const {
    messages,
    input,
    handleInputChange,
    handleSubmit,
    isLoading,
    error
  } = useChat({
    api: '/api/chat',
    onFinish: (message) => {
      console.log('Finished:', message)
    }
  })

  return (
    <div>
      {messages.map(m => (
        <div key={m.id} className={m.role}>
          {m.content}
        </div>
      ))}

      <form onSubmit={handleSubmit}>
        <input
          value={input}
          onChange={handleInputChange}
          placeholder="Napíš správu..."
          disabled={isLoading}
        />
        <button type="submit">Odoslať</button>
      </form>

      {error && <div className="error">{error.message}</div>}
    </div>
  )
}

useCompletion

Pre single-turn completions:

const { completion, input, handleInputChange, handleSubmit } = useCompletion({
  api: '/api/complete'
})

API Route (Next.js)

// app/api/chat/route.ts
import { openai } from '@ai-sdk/openai'
import { streamText } from 'ai'

export async function POST(req: Request) {
  const { messages } = await req.json()

  const result = await streamText({
    model: openai('gpt-4o'),
    messages,
    system: 'Si helpful asistent pre vývojárov.'
  })

  return result.toDataStreamResponse()
}

Multi-Provider Support

import { openai } from '@ai-sdk/openai'
import { anthropic } from '@ai-sdk/anthropic'
import { google } from '@ai-sdk/google'

// Rovnaké API pre všetkých
const providers = {
  openai: openai('gpt-4o'),
  claude: anthropic('claude-3-5-sonnet-20241022'),
  gemini: google('gemini-pro')
}

const { text } = await generateText({
  model: providers[selectedProvider],
  prompt: userPrompt
})

Tool Calling

import { tool } from 'ai'
import { z } from 'zod'

const result = await generateText({
  model: openai('gpt-4o'),
  tools: {
    weather: tool({
      description: 'Získa počasie',
      parameters: z.object({
        city: z.string()
      }),
      execute: async ({ city }) => {
        return await fetchWeather(city)
      }
    })
  },
  prompt: 'Aké je počasie v Bratislave?'
})

Záver

Vercel AI SDK výrazne zjednodušuje budovanie AI aplikácií. Unified API, streaming out-of-the-box a React integration - všetko čo potrebujete.