Chatbot de IA
Regras
- Use o Vercel AI SDK (pacote
ai) para streaming — hook useChat() no cliente, streamText() no servidor
- Stream de respostas com
text/event-stream — nunca armazene respostas completas antes de enviá-las
- Formato da mensagem:
{ role: "user" | "assistant" | "system", content: string }
- Gerenciamento da janela de contexto: remova as mensagens mais antigas quando se aproximar do limite de tokens, sempre mantenha o prompt do sistema
- Padrão RAG: incorpore a consulta do usuário → busca vetorial → injete os top-k resultados como contexto antes da mensagem do usuário
- UI de chat: auto-scroll para o final, indicador de carregamento com pontos animados, renderize Markdown nas mensagens do assistente
- Persista o histórico da conversa no servidor — use uma tabela
messages com chatId, role, content, createdAt
- O prompt do sistema vai primeiro no array de mensagens — nunca deixe mensagens do usuário sobrescrevê-lo
- Endpoint de chat YepAPI:
POST /v1/ai/chat com { messages, model?, stream? }
- Botão de parar geração — use
AbortController para cancelar streams em andamento
Patterns
const { messages, input, handleInputChange, handleSubmit, isLoading, stop } = useChat({
api: "/api/chat",
});
import { streamText } from "ai";
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({ model, messages });
return result.toDataStreamResponse();
}
Evite
- Enviar todo o histórico da conversa sem truncagem — excederá a janela de contexto
- Bloquear a UI enquanto espera a resposta completa — sempre faça streaming
- Armazenar mensagens apenas no estado do cliente — persista no servidor para histórico
- Hardcodar nomes de modelos — use variáveis de ambiente ou configuração