Saltar al contenido principal
Herramientas de Firecrawl para Vercel AI SDK. Busca, haz scraping, interactúa con páginas y rastrea la web en tus aplicaciones de IA.

Instalación

npm install firecrawl-aisdk ai
Configura las variables de entorno:
FIRECRAWL_API_KEY=fc-your-key       # https://firecrawl.dev
AI_GATEWAY_API_KEY=your-key         # https://vercel.com/ai-gateway
Estos ejemplos usan el formato de modelo string de Vercel AI Gateway, pero las herramientas de Firecrawl funcionan con cualquier proveedor de SDK de IA. También puedes usar importaciones de proveedores como anthropic('claude-sonnet-4-5-20250514') de @ai-sdk/anthropic.

Inicio rápido

FirecrawlTools() incluye search, scrape e interact de forma predeterminada.
import { generateText, stepCountIs } from 'ai';
import { FirecrawlTools } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  tools: FirecrawlTools(),
  stopWhen: stepCountIs(30),
  prompt: `
    1. Use interact on Hacker News to identify the top story
    2. Search for other perspectives on the same topic
    3. Scrape the most relevant pages you found
    4. Summarize everything you found
  `,
});

FirecrawlTools

FirecrawlTools() incluye las herramientas predeterminadas y un systemPrompt generado automáticamente que puedes pasar a generateText.
import { generateText, stepCountIs } from 'ai';
import { FirecrawlTools } from 'firecrawl-aisdk';

const tools = FirecrawlTools();

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  system: `${tools.systemPrompt}\n\nAnswer with citations when possible.`,
  tools,
  stopWhen: stepCountIs(20),
  prompt: 'Find the current Firecrawl pricing page and explain the available plans.',
});
Puedes personalizar los valores predeterminados, usar herramientas asíncronas o deshabilitar herramientas individuales:
const tools = FirecrawlTools({
  search: { limit: 5 },
  scrape: { formats: ['markdown'], onlyMainContent: true },
  interact: { profile: { name: 'my-session', saveChanges: true } },
  crawl: true,
  agent: true,
});
// Deshabilitar interact, mantener search + scrape
FirecrawlTools({ interact: false });

// Activar compatibilidad con browser obsoleto
FirecrawlTools({ browser: {} });

// Incluir todas las herramientas disponibles
FirecrawlTools({ all: true });
Al hacer scraping para responder una pregunta sobre una página, prefiere el formato de consulta:
formats: [{ type: 'query', prompt: 'What does this page say about pricing and rate limits?' }]
Usa formats: ['markdown'] solo cuando necesites el contenido completo de la página.

Herramientas individuales

Cada herramienta se puede usar directamente o invocar con opciones:
import { generateText } from 'ai';
import { scrape, search } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Buscar Firecrawl, then scraping the most relevant result.',
  tools: { search, scrape },
});

const customScrape = scrape({ apiKey: 'fc-custom-key', apiUrl: 'https://api.firecrawl.dev' });

Búsqueda + Scraping

import { generateText } from 'ai';
import { search, scrape } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Busca Firecrawl, extrae el resultado oficial principal y explica qué hace.',
  tools: { search, scrape },
});

Mapeo

import { generateText } from 'ai';
import { map } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Mapea https://docs.firecrawl.dev y lista las secciones principales.',
  tools: { map },
});

Streaming

import { streamText, stepCountIs } from 'ai';
import { scrape } from 'firecrawl-aisdk';

const result = streamText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'What is the first 100 words of firecrawl.dev?',
  tools: { scrape },
  stopWhen: stepCountIs(3),
});

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

await result.fullStream;

Interact

interact() crea una sesión interactiva basada en scraping. Llama a start(url) para iniciar una sesión y obtener una URL de vista en vivo, y luego permite que el modelo reutilice esa sesión mediante la herramienta interact.
import { generateText, stepCountIs } from 'ai';
import { interact, search } from 'firecrawl-aisdk';

const interactTool = interact();
console.log('Live view:', await interactTool.start('https://news.ycombinator.com'));

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  tools: { interact: interactTool, search },
  stopWhen: stepCountIs(25),
  prompt: 'Usa interact en la sesión actual de Hacker News, encuentra la historia principal y luego busca más contexto.',
});

await interactTool.close();
Si necesitas la URL explícita de la vista en vivo tras el inicio, usa interactTool.interactiveLiveViewUrl. Reutiliza el estado del browser entre sesiones con perfiles:
const interactTool = interact({
  profile: { name: 'my-session', saveChanges: true },
});
browser() está obsoleto. Usa interact() en su lugar.

Herramientas asíncronas

rastreo, extracción por lotes y agent devuelven un ID de trabajo. Combínalos con poll.

Rastreo

import { generateText } from 'ai';
import { crawl, poll } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Rastreo https://docs.firecrawl.dev (limit 3 pages) and summarize.',
  tools: { crawl, poll },
});

Extracción por lotes

import { generateText } from 'ai';
import { batchScrape, poll } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Scraping https://firecrawl.dev and https://docs.firecrawl.dev, then compare them.',
  tools: { batchScrape, poll },
});

Agente

Recopilación autónoma de datos web que busca, navega y extrae por sí sola.
import { generateText, stepCountIs } from 'ai';
import { agent, poll } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Encuentra los fundadores de Firecrawl, sus roles y sus trayectorias.',
  tools: { agent, poll },
  stopWhen: stepCountIs(10),
});

Registro

import { generateText } from 'ai';
import { logStep, scrape, stepLogger } from 'firecrawl-aisdk';

const logger = stepLogger();

const { text, usage } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Scraping https://firecrawl.dev and summarize it.',
  tools: { scrape },
  onStepFinish: logger.onStep,
  experimental_onToolCallFinish: logger.onToolCallFinish,
});

logger.close();
logger.summary(usage);

await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Scraping https://firecrawl.dev and summarize it again.',
  tools: { scrape },
  onStepFinish: logStep,
});

Todas las exportaciones

import {
  // Herramientas principales
  search,             // Buscar en la web
  scrape,             // Scraping de una sola URL
  map,                // Descubrir URLs en un sitio
  crawl,              // rastreo de múltiples páginas (async, usar poll)
  batchScrape,        // Scraping de múltiples URLs (async, usar poll)
  agent,              // Investigación web autónoma (async, usar poll)

  // Gestión de trabajos
  poll,               // Consultar trabajos async para obtener resultados
  status,             // Comprobar el status del trabajo
  cancel,             // Cancelar trabajos en ejecución

  // Herramientas de browser/sesión
  interact,           // interact({ profile: { name: '...' } })
  browser,            // exportación de compatibilidad obsoleta

  // Paquete todo en uno
  FirecrawlTools,     // FirecrawlTools({ search, scrape, interact, crawl, agent })

  // Utilidades
  stepLogger,         // Estadísticas de tokens por llamada a herramienta
  logStep,            // Registro simple en una línea
} from 'firecrawl-aisdk';