Integração de Inteligência Artificial: Vercel AI SDK e Edge Streaming
Índice do Manual
A integração de LLMs (Large Language Models) em sistemas corporativos exige uma quebra de paradigma na forma como pensamos em requisições HTTP.
Se um sistema B2B utilizar arquitetura REST convencional para aguardar a resposta de uma IA antes de devolver a página ao usuário, o sistema vai travar, e a infraestrutura Serverless matará o processo por Timeout.
1. A Regra de Ouro (Evitando Timeouts)
A melhor prática corporativa é evitar arquitetar rotas de IA utilizando requisições assíncronas bloqueantes (await fetch) que prendam a Thread esperando a IA terminar de pensar (comportamento síncrono para o cliente).
Por que as APIs tradicionais falham?
Um prompt complexo enviado ao ChatGPT ou Claude pode levar de 15 a 45 segundos para gerar a resposta completa. Ao utilizar uma arquitetura padrão de Servidor Node.js (Serverless) na Vercel:
- O usuário clica no botão "Gerar Relatório".
- A tela congela.
- Aos 15 segundos, a Vercel corta a conexão do servidor (Timeout de planos Pro).
- O usuário recebe um trágico
Erro 504 Gateway Timeout.
2. A Arquitetura Recomendada: Edge Runtime + Streaming
A arquitetura ideal para processamento de IA é o uso de WebStreams operando na Borda (Edge Network).
O pacote que rege esta infraestrutura é o @ai-sdk (Vercel AI SDK). Ele abstrai os conectores complexos (OpenAI, Anthropic, Google) e converte a resposta em um Stream contínuo.
O Padrão de Rota de API (Edge)
Abaixo está o contrato arquitetural de como uma rota (ex: app/api/chat/route.ts) deve ser estruturada:
import { streamText } from 'ai';
import { openai } from '@ai-sdk/openai';
// 1. Força a execução na Borda para evitar gargalos
// O Edge Runtime ignora o limite de Timeout de 15s do Node.js
export const runtime = 'edge';
export async function POST(req: Request) {
const { messages } = await req.json();
// 2. Chama a IA via streamText (Vercel AI SDK)
const result = await streamText({
model: openai('gpt-4o'),
messages,
});
// 3. Ejeta os pedaços de texto em Tempo Real via WebStreams
return result.toDataStreamResponse();
}
3. A Experiência do Usuário (Client Component)
No Frontend (React), deve-se consumir esse Stream para criar o efeito "máquina de escrever", garantindo que a interface do usuário reaja instantaneamente (latência quase zero), recebendo palavra por palavra à medida que o modelo as cospe.
Utilize o hook useChat ou useCompletion do @ai-sdk/react:
'use client';
import { useChat } from '@ai-sdk/react';
export default function ChatCorporativo() {
const { messages, input, handleInputChange, handleSubmit, isLoading } = useChat();
return (
<div>
{/* As mensagens aparecem progressivamente na tela */}
{messages.map(m => (
<div key={m.id}>
<strong>{m.role === 'user' ? 'Usuário: ' : 'IA: '}</strong>
{m.content}
</div>
))}
<form onSubmit={handleSubmit}>
<input
value={input}
onChange={handleInputChange}
disabled={isLoading}
/>
<button type="submit">Enviar</button>
</form>
</div>
);
}
4. O Impacto Direto
- Fim dos Erros 504: Ao usar
runtime = 'edge'devolvendo um Stream, a conexão HTTP não é mantida em espera (idle). Os dados fluem imediatamente, evitando Timeouts em rotas demoradas. - Percepção Instantânea: O usuário vê a primeira letra em ~400ms, em vez de encarar um botão de carregamento estático por 30 segundos.
- Custos Minimais: O Edge Runtime consome frações mínimas de memória se comparado a um conteiner Node.js completo gerando respostas longas.
5. Geração de Relatórios e JSON Estruturado (Object Generation)
Nem toda interação com IA é um chat. Em sistemas B2B, o uso mais valioso da Inteligência Artificial é ler dados desestruturados e devolver um objeto estruturado (ex: processar PDFs, gerar um relatório financeiro analítico ou classificar leads).
Para cenários não conversacionais, a recomendação arquitetural é utilizar as funções de Object Generation do pacote @ai-sdk combinadas com a biblioteca zod para impor uma tipagem rígida ao retorno da IA.
streamObject: Para Relatórios Longos e Painéis
Se o objeto JSON a ser gerado for muito complexo, utiliza-se o streamObject. Ele transmite o JSON parcialmente enquanto a IA ainda o constrói. No Frontend, as tabelas e gráficos começam a ser desenhados linha a linha, entregando valor imediato sem estourar o Timeout.
import { streamObject } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';
export const runtime = 'edge';
export async function POST(req: Request) {
const result = await streamObject({
model: openai('gpt-4o'),
// A IA é forçada a obedecer este formato matemático
schema: z.object({
receitaTotal: z.number(),
pontosAtencao: z.array(z.string()),
}),
prompt: 'Analise os dados financeiros e gere um relatório...',
});
return result.toTextStreamResponse();
}
generateObject: Para Micro-Tarefas
Se a tarefa for gerar um JSON minúsculo (ex: "classifique o sentimento do e-mail"), a resposta levará apenas 1 ou 2 segundos. Neste cenário isolado, pode-se utilizar a função bloqueante generateObject. Como a resposta é instantânea, ela devolve a resposta inteira de uma só vez antes da Vercel acusar qualquer atraso na rede.
[!NOTE]
O uso do Zod é obrigatório não apenas na Inteligência Artificial, mas em todo o tráfego de dados. Para aprender como blindar submissões de formulário no banco de dados, leia o manual de Validação Blindada de Dados: Zod + Server Actions.