Pular para o conteúdo principal
Crie um assistente de pesquisa com IA completo que possa fazer scraping de sites e buscar na web para responder perguntas. O assistente decide automaticamente quando usar ferramentas de scraping ou de busca para reunir informações e, em seguida, fornece respostas abrangentes com base nos dados coletados. Interface de chatbot de assistente de pesquisa com IA mostrando scraping em tempo real na web com Firecrawl e respostas conversacionais impulsionadas pela OpenAI

O que você vai construir

Uma interface de chat com IA em que os usuários podem fazer perguntas sobre qualquer assunto. O assistente de IA decide automaticamente quando usar ferramentas de scraping ou de busca na web para reunir informações e, então, fornece respostas completas com base nos dados coletados.

Pré-requisitos

  • Node.js 18 ou posterior instalado
  • Uma chave de API da OpenAI em platform.openai.com
  • Uma chave de API do Firecrawl em firecrawl.dev
  • Conhecimentos básicos de React e Next.js
1

Criar um novo projeto do Next.js

Comece criando um novo projeto Next.js e navegue até o diretório do projeto:
npx create-next-app@latest ai-sdk-firecrawl && cd ai-sdk-firecrawl
Quando solicitado, selecione as seguintes opções:
  • TypeScript: Sim
  • ESLint: Sim
  • Tailwind CSS: Sim
  • App Router: Sim
  • Usar diretório src/: Não
  • Alias de importação: Sim (@/*)
2

Instale as dependências

Instalar pacotes do AI SDK

O AI SDK é um kit de ferramentas em TypeScript que fornece uma API unificada para trabalhar com diferentes provedores de LLM:
npm i ai @ai-sdk/react zod
Esses pacotes oferecem:
  • ai: SDK principal com streaming, chamamento de ferramentas e tratamento de respostas
  • @ai-sdk/react: Hooks do React como useChat para criar interfaces de chat
  • zod: Validação de esquemas para entradas de ferramentas
Saiba mais em ai-sdk.dev/docs.

Instalar o AI Elements

O AI Elements fornece componentes de UI predefinidos para aplicações de IA. Execute o seguinte comando para gerar todos os componentes necessários:
npx ai-elements@latest
Isso configura os AI Elements no seu projeto, incluindo componentes de conversa, exibição de mensagens, campos de prompt e visualizações de chamadas de ferramentas.Documentação: ai-sdk.dev/elements/overview.

Instalar o provedor OpenAI

Instale o provedor OpenAI para se conectar aos modelos da OpenAI:
npm install @ai-sdk/openai
3

Crie a interface de chat do front-end

Crie a página principal em app/page.tsx e copie o código da aba Code abaixo. Esta será a interface de chat onde os usuários interagem com o assistente de IA.
  • Prévia
  • Código
Interface de chatbot de assistente de pesquisa em IA exibindo coleta de dados da web em tempo real com o Firecrawl e respostas conversacionais alimentadas pela OpenAI

Entendendo o Frontend

O frontend utiliza componentes AI Elements para fornecer uma interface de chat completa:Principais Recursos:
  • Exibição da conversa: O componente Conversation lida automaticamente com a rolagem e a exibição das mensagens
  • Renderização de mensagens: Cada parte da mensagem é renderizada conforme seu tipo (texto, raciocínio, chamadas de ferramentas)
  • Visualização de ferramentas: As chamadas de ferramenta são exibidas em seções recolhíveis que mostram entradas e saídas
  • Controles interativos: os usuários podem ativar/desativar a pesquisa na web, escolher modelos e anexar arquivos
  • Ações de mensagem: opções de copiar e tentar novamente para mensagens do assistente
4

Adicionar suporte para renderização de Markdown

Para garantir que o Markdown gerado pelo LLM seja renderizado corretamente, adicione a seguinte importação ao arquivo app/globals.css:
@source "../node_modules/streamdown/dist/index.js";
Isso importa os estilos necessários para renderizar conteúdo em Markdown nas respostas de mensagens.
5

Crie a rota básica da API

Crie o endpoint da API de chat em app/api/chat/route.ts. Essa rota vai lidar com as mensagens recebidas e transmitir as respostas da IA.
import { streamText, UIMessage, convertToModelMessages } from "ai";
import { createOpenAI } from "@ai-sdk/openai";

const openai = createOpenAI({
  apiKey: process.env.OPENAI_API_KEY!,
});

// Permite respostas em streaming por até 5 minutos
export const maxDuration = 300;

export async function POST(req: Request) {
  const {
    messages,
    model,
    webSearch,
  }: {
    messages: UIMessage[];
    model: string;
    webSearch: boolean;
  } = await req.json();

  const result = streamText({
    model: openai(model),
    messages: convertToModelMessages(messages),
    system:
      "Você é um assistente útil que pode responder perguntas e ajudar com tarefas.",
  });

  // envia fontes e raciocínio de volta para o cliente
  return result.toUIMessageStreamResponse({
    sendSources: true,
    sendReasoning: true,
  });
}
Esta rota básica:
  • Recebe mensagens do frontend
  • Usa o modelo da OpenAI selecionado pelo usuário
  • Transmite as respostas de volta para o cliente
  • Ainda não inclui ferramentas — vamos adicioná-las em seguida
6

Configurar variáveis de ambiente

Crie um arquivo .env.local na raiz do projeto:
touch .env.local
Adicione sua chave de API da OpenAI:
OPENAI_API_KEY=sk-your-openai-api-key
A variável OPENAI_API_KEY é necessária para o funcionamento do modelo de IA.
7

Teste o chat básico

Agora você pode testar o chatbot do SDK de IA sem integração com o Firecrawl. Inicie o servidor de desenvolvimento:
npm run dev
Abra localhost:3000 no seu navegador e teste a funcionalidade básica de chat. O assistente deve responder às mensagens, mas ainda não terá recursos de web scraping ou de pesquisa.Chatbot de IA básico sem recursos de web scraping
8

Adicionar ferramentas do Firecrawl

Agora vamos aprimorar o assistente com recursos de extração de dados da web e busca usando o Firecrawl.

Instalar o SDK do Firecrawl

O Firecrawl converte sites em formatos prontos para LLM, com recursos de extração e busca:
npm i @mendable/firecrawl-js

Crie o arquivo de ferramentas

Crie uma pasta lib e adicione um arquivo tools.ts dentro dela:
mkdir lib && touch lib/tools.ts
Adicione o seguinte código para definir as ferramentas de raspagem e busca na web:
lib/tools.ts
import FirecrawlApp from "@mendable/firecrawl-js";
import { tool } from "ai";
import { z } from "zod";

const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });

export const scrapeWebsiteTool = tool({
  description: 'Extrair conteúdo de qualquer URL',
  inputSchema: z.object({
    url: z.string().url().describe('A URL a ser extraída')
  }),
  execute: async ({ url }) => {
    console.log('Extraindo:', url);
    const result = await firecrawl.scrape(url, {
      formats: ['markdown'],
      onlyMainContent: true,
      timeout: 30000
    });
    console.log('Prévia do conteúdo extraído:', result.markdown?.slice(0, 200) + '...');
    return { content: result.markdown };
  }
});

export const searchWebTool = tool({
  description: 'Buscar na web usando Firecrawl',
  inputSchema: z.object({
    query: z.string().describe('A consulta de busca'),
    limit: z.number().optional().describe('Número de resultados'),
    location: z.string().optional().describe('Localização para resultados regionalizados'),
    tbs: z.string().optional().describe('Filtro de tempo (qdr:h, qdr:d, qdr:w, qdr:m, qdr:y)'),
    sources: z.array(z.enum(['web', 'news', 'images'])).optional().describe('Tipos de resultado'),
    categories: z.array(z.enum(['github', 'research', 'pdf'])).optional().describe('Categorias de filtro'),
  }),
  execute: async ({ query, limit, location, tbs, sources, categories }) => {
    console.log('Buscando:', query);
    const response = await firecrawl.search(query, {
      ...(limit && { limit }),
      ...(location && { location }),
      ...(tbs && { tbs }),
      ...(sources && { sources }),
      ...(categories && { categories }),
    }) as { web?: Array<{ title?: string; url?: string; description?: string }> };

    const results = (response.web || []).map((item) => ({
      title: item.title || item.url || 'Sem título',
      url: item.url || '',
      description: item.description || '',
    }));

    console.log('Resultados da busca:', results.length);
    return { results };
  },
});

Entendendo as Ferramentas

Ferramenta de Scrape de Site:
  • Aceita uma URL como entrada (validada por um esquema Zod)
  • Usa o método scrape do Firecrawl para obter a página em markdown
  • Extrai apenas o conteúdo principal para reduzir o uso de tokens
  • Retorna o conteúdo extraído para a IA analisar
Ferramenta de Busca na Web:
  • Aceita uma consulta com filtros opcionais
  • Usa o método search do Firecrawl para encontrar páginas relevantes
  • Suporta filtros avançados, como localização, intervalo de tempo e categorias de conteúdo
  • Retorna resultados estruturados com títulos, URLs e descrições
Saiba mais sobre as ferramentas: ai-sdk.dev/docs/foundations/tools.
9

Atualize a rota da API com as ferramentas do Firecrawl

Agora atualize o arquivo app/api/chat/route.ts para incluir as ferramentas do Firecrawl que acabamos de criar.
import { streamText, UIMessage, stepCountIs, convertToModelMessages } from "ai";
import { createOpenAI } from "@ai-sdk/openai";
import { scrapeWebsiteTool, searchWebTool } from "@/lib/tools";

const openai = createOpenAI({
  apiKey: process.env.OPENAI_API_KEY!,
});

export const maxDuration = 300;

export async function POST(req: Request) {
  const {
    messages,
    model,
    webSearch,
  }: {
    messages: UIMessage[];
    model: string;
    webSearch: boolean;
  } = await req.json();

  const result = streamText({
    model: openai(model),
    messages: convertToModelMessages(messages),
    system:
      "You are a helpful assistant that can answer questions and help with tasks.",
    // Adicione as ferramentas do Firecrawl aqui
    tools: {
      scrapeWebsite: scrapeWebsiteTool,
      searchWeb: searchWebTool,
    },
    stopWhen: stepCountIs(5),
    toolChoice: webSearch ? "auto" : "none",
  });

  return result.toUIMessageStreamResponse({
    sendSources: true,
    sendReasoning: true,
  });
}
As principais mudanças em relação à rota básica:
  • Importe stepCountIs do AI SDK
  • Importe as ferramentas do Firecrawl de @/lib/tools
  • Adicione o objeto tools com as ferramentas scrapeWebsite e searchWeb
  • Adicione stopWhen: stepCountIs(5) para limitar as etapas de execução
  • Defina toolChoice como “auto” quando a pesquisa na web estiver ativada e “none” caso contrário
Saiba mais sobre streamText: ai-sdk.dev/docs/reference/ai-sdk-core/stream-text.
10

Adicione sua chave de API do Firecrawl

Atualize seu arquivo .env.local para incluir sua chave de API da Firecrawl:
OPENAI_API_KEY=sk-your-openai-api-key
FIRECRAWL_API_KEY=fc-your-firecrawl-api-key
Obtenha sua chave de API do Firecrawl em firecrawl.dev.
11

Teste o aplicativo completo

Reinicie o servidor de desenvolvimento:
npm run dev
Chatbot de IA com ferramentas do Firecrawl ativasAbra localhost:3000 e teste o assistente aprimorado:
  1. Ative o botão “Search” para habilitar a pesquisa na web
  2. Pergunte: “Quais são os recursos mais recentes do firecrawl.dev?”
  3. Observe enquanto a IA chama a ferramenta searchWeb ou scrapeWebsite
  4. Veja a execução da ferramenta na UI com entradas e saídas
  5. Leia a análise da IA com base nos dados extraídos

Como funciona

Fluxo de mensagens

  1. Usuário envia uma mensagem: O usuário digita uma pergunta e clica em Enviar
  2. Frontend envia a solicitação: useChat envia a mensagem para /api/chat com o modelo selecionado e a configuração de busca na web
  3. Backend processa a mensagem: A rota da API recebe a mensagem e chama streamText
  4. IA decide sobre as ferramentas: O modelo analisa a pergunta e decide se deve usar scrapeWebsite ou searchWeb (apenas se a busca na web estiver ativada)
  5. Ferramentas executam: Se as ferramentas forem chamadas, o Firecrawl faz o scraping ou realiza a busca na web
  6. IA gera a resposta: O modelo analisa os resultados das ferramentas e gera uma resposta em linguagem natural
  7. Frontend exibe os resultados: A UI mostra as chamadas de ferramentas e a resposta final em tempo real

Processo de Chamada de Ferramentas

O sistema de chamada de ferramentas do AI SDK (ai-sdk.dev/docs/foundations/tools) funciona da seguinte forma:
  1. O modelo recebe a mensagem do usuário e as descrições das ferramentas disponíveis
  2. Se o modelo determinar que é necessário usar uma ferramenta, ele gera uma chamada de ferramenta com parâmetros
  3. O SDK executa a função da ferramenta com esses parâmetros
  4. O resultado da ferramenta é enviado de volta ao modelo
  5. O modelo usa o resultado para gerar sua resposta final
Tudo isso acontece automaticamente em uma única chamada a streamText, com os resultados sendo transmitidos para o frontend em tempo real.

Principais recursos

Seleção de modelo

O aplicativo oferece suporte a vários modelos da OpenAI:
  • GPT-5 Mini (Thinking): Modelo recente da OpenAI com capacidades avançadas de raciocínio
  • GPT-4o Mini: Modelo rápido e econômico
Os usuários podem alternar entre os modelos usando o seletor suspenso.

Alternância de busca na web

O botão Search controla se a IA pode usar as ferramentas do Firecrawl:
  • Ativado: a IA pode chamar as ferramentas scrapeWebsite e searchWeb conforme necessário
  • Desativado: a IA responde apenas com o conhecimento com o qual foi treinada
Isso dá aos usuários controle sobre quando usar dados da web versus o conhecimento embutido no modelo.

Ideias de customização

Adicionar mais ferramentas

Amplie o assistente com ferramentas adicionais:
  • Consultas ao banco de dados para dados internos da empresa
  • Integração ao CRM para buscar informações de clientes
  • Envio de e-mails
  • Geração de documentos
Cada ferramenta segue o mesmo padrão: defina um schema com Zod, implemente a função execute e registre-a no objeto tools.

Alterar o modelo de IA

Substitua o OpenAI por outro provedor:
import { anthropic } from "@ai-sdk/anthropic";

const result = streamText({
  model: anthropic("claude-4.5-sonnet"),
  // ... restante da config
});
O SDK de IA oferece suporte a mais de 20 provedores com a mesma API. Saiba mais: ai-sdk.dev/docs/foundations/providers-and-models.

Personalize a interface

Os componentes do AI Elements são baseados no shadcn/ui, então você pode:
  • Modificar os estilos nos arquivos dos próprios componentes
  • Adicionar novas variantes aos componentes existentes
  • Criar componentes personalizados que sigam o sistema de design

Melhores práticas

  1. Use as ferramentas certas: Escolha searchWeb para primeiro encontrar páginas relevantes, scrapeWebsite para páginas individuais ou deixe a IA decidir
  2. Monitore o uso da API: Acompanhe o uso das APIs da Firecrawl e da OpenAI para evitar custos inesperados
  3. Trate erros de forma adequada: As ferramentas incluem tratamento de erros, mas considere adicionar mensagens voltadas ao usuário
  4. Otimize o desempenho: Use streaming para fornecer feedback imediato e considere colocar em cache conteúdo acessado com frequência
  5. Defina limites razoáveis: stopWhen: stepCountIs(5) evita chamadas excessivas de ferramentas e custos fora de controle