Receber por email
← Voltar para o catálogo

ai-sdk-ui

Vercel AI SDK v5 React hooks (useChat, useCompletion, useObject) for AI chat interfaces. Use for React/Next.js AI apps or encountering parse stream errors, no response, streaming issues.

178estrelas
Atualizado há 5 meses

Ver no GitHub ↗ Licença: MIT

Como adicionar

/plugin marketplace add secondsky/claude-skills

O comando exato pode variar conforme o repositório. Confira o README no GitHub.

Para o autor da skill

Cole no README do seu repo

Mostra que sua skill está catalogada na Skillteca, gera backlink e tráfego rastreável.

[![Skillteca](https://www.skillteca.com.br/api/badge/ai-sdk-ui-secondsky/svg)](https://www.skillteca.com.br/skills/ai-sdk-ui-secondsky)

Alerta por categoria

Receba novas skills de Design e Frontend toda segunda

1 email curto, só com as skills novas de Design e Frontend. 4 minutos de leitura, sem spam, cancela com 1 clique.

Você confirma o email no primeiro envio. Sem spam. Cancela com 1 clique.

Ler descrição completa

AI SDK UI - Frontend React Hooks

Frontend React hooks for AI-powered user interfaces with Vercel AI SDK v5.

Version: AI SDK v5.0.116 (Stable) Framework: React 18+, Next.js 15+ Last Updated: 2025-12-22

Table of Contents

  1. [Quick Start](#quick-start-5-minutes)
  2. [When to Load References](#when-to-load-references)
  3. [useChat Hook](#usechat-hook---complete-reference)
  4. [useCompletion Hook](#usecompletion-hook---complete-reference)
  5. [useObject Hook](#useobject-hook---complete-reference)
  6. [Next.js Integration](#nextjs-integration)
  7. [Top UI Errors & Solutions](#top-ui-errors--solutions)
  8. [Streaming Best Practices](#streaming-best-practices)
  9. [When to Use This Skill](#when-to-use-this-skill)
  10. [Package Versions](#package-versions)

Quick Start (5 Minutes)

Installation

bun add ai @ai-sdk/openai  # preferred
# or: bun add ai @ai-sdk/openai

Basic Chat Component (v5)

// app/chat/page.tsx
'use client';
import { useChat } from 'ai/react';
import { useState, FormEvent } from 'react';

export default function Chat() {
  const { messages, sendMessage, isLoading } = useChat({
    api: '/api/chat',
  });
  const [input, setInput] = useState('');

  const handleSubmit = (e: FormEvent) => {
    e.preventDefault();
    sendMessage({ content: input });
    setInput('');
  };

  return (
    <div>
      <div>
        {messages.map(m => (
          <div key={m.id}>
            <strong>{m.role}:</strong> {m.content}
          </div>
        ))}
      </div>
      <form onSubmit={handleSubmit}>
        <input
          value={input}
          onChange={(e) => setInput(e.target.value)}
          placeholder="Type a message..."
          disabled={isLoading}
        />
      </form>
    </div>
  );
}

API Route (Next.js App Router)

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

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

  const result = streamText({
    model: openai('gpt-4-turbo'),
    messages,
  });

  return result.toDataStreamResponse();
}

Result: A functional chat interface with streaming AI responses in ~10 lines of frontend code.

When to Load References

For detailed implementation guides, API references, and advanced patterns, load the following reference files:

| Reference File | Load When... | |----------------|--------------| | references/use-chat-migration.md | Migrating from v4 to v5, understanding breaking changes | | references/streaming-patterns.md | UI streaming best practices, performance optimization | | references/top-ui-errors.md | Debugging common UI errors, error prevention | | references/nextjs-integration.md | Next.js setup patterns, App vs Pages Router differences | | references/links-to-official-docs.md | Finding official Vercel AI SDK documentation | | references/tool-calling-ui.md | Implementing tool/function calling in chat UI | | references/file-attachments-guide.md | Adding file upload/attachment support to chat | | references/message-persistence.md | Persisting chat history with localStorage | | references/use-completion-full-reference.md | Complete useCompletion API and examples | | references/use-object-full-reference.md | Complete useObject API with Zod schemas | | references/nextjs-app-router-full.md | Full Next.js App Router implementation | | references/nextjs-pages-router-full.md | Full Next.js Pages Router implementation |

useChat Hook - Complete Reference

Basic Usage (v5 Pattern)

'use client';
import { useChat } from 'ai/react';
import { useState, FormEvent } from 'react';

export default function ChatComponent() {
  const { messages, sendMessage, isLoading, error } = useChat({
    api: '/api/chat',
  });
  const [input, setInput] = useState('');

  const handleSubmit = (e: FormEvent) => {
    e.preventDefault();
    if (!input.trim()) return;

    sendMessage({ content: input });
    setInput('');
  };

  return (
    <div className="flex flex-col h-screen">
      {/* Messages */}
      <div className="flex-1 overflow-y-auto p-4">
        {messages.map(message => (
          <div
            key={message.id}
            className={message.role === 'user' ? 'text-right' : 'text-left'}
          >
            <div className="inline-block p-2 rounded bg-gray-100">
              {message.content}
            </div>
          </div>
        ))}
        {isLoading && <div className="text-gray-500">AI is thinking...</div>}
      </div>

      {/* Input */}
      <form onSubmit={handleSubmit} className="p-4 border-t">
        <input
          value={input}
          onChange={(e) => setInput(e.target.value)}
          placeholder="Type a message..."
          disabled={isLoading}
          className="w-full p-2 border rounded"
        />
      </form>

      {/* Error */}
      {error && <div className="text-red-500 p-4">{error.message}</div>}
    </div>
  );
}

Full API Reference

const {
  // Messages
  messages,           // Message[] - Chat history
  setMessages,        // (messages: Message[]) => void - Update messages

  // Actions
  sendMessage,        // (message: { content: string }) => void - Send message (v5)
  reload,             // () => void - Reload last response
  stop,               // () => void - Stop current generation

  // State
  isLoading,          // boolean - Is AI responding?
  error,              // Error | undefined - Error if any

  // Data
  data,               // any[] - Custom data from stream
  metadata,           // object - Response metadata
} = useChat({
  // Required
  api: '/api/chat',   // API endpoint

  // Optional
  id: 'chat-1',       // Chat ID for persistence
  initialMessages: [], // Initial messages (controlled mode)

  // Callbacks
  onFinish: (message, options) => {},  // Called when response completes
  onError: (error) => {},              // Called on error

  // Configuration
  headers: {},        // Custom headers
  body: {},           // Additional body data
  credentials: 'same-origin', // Fetch credentials

  // Streaming
  streamProtocol: 'data', // 'data' | 'text' (default: 'data')
});

v4 → v5 Breaking Changes

CRITICAL: useChat no longer manages input state in v5!

v4 (OLD - DON'T USE):

const { messages, input, handleInputChange, handleSubmit, append } = useChat();

<form onSubmit={handleSubmit}>
  <input value={input} onChange={handleInputChange} />
</form>

v5 (NEW - CORRECT):

const { messages, sendMessage } = useChat();
const [input, setInput] = useState('');

<form onSubmit={(e) => {
  e.preventDefault();
  sendMessage({ content: input });
  setInput('');
}}>
  <input value={input} onChange={(e) => setInput(e.target.value)} />
</form>

Summary of v5 Changes:

  1. Input management removed: input, handleInputChange, handleSubmit no longer exist
  2. append() → sendMessage(): New method for sending messages
  3. onResponse removed: Use onFinish instead
  4. initialMessages → controlled mode: Use messages prop for full control
  5. maxSteps removed: Handle on server-side only

See references/use-chat-migration.md for complete migration guide.

Advanced Features: useChat supports tool calling (display message.toolInvocations), file attachments (experimental_attachments), and message persistence (localStorage with id + initialMessages). See official docs for implementation examples.

useCompletion & useObject Hooks

useCompletion: For single-prompt completions (not multi-turn chat). Returns { completion, complete, isLoading }. Call complete(prompt) to generate. API route uses streamText().

useObject: Stream structured JSON with live updates using Zod schemas. Returns { object, submit, isLoading } where object is Partial<T> that updates progressi

Compartilhar X LinkedIn