> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Vercel AI SDK

> Herramientas de Firecrawl para Vercel AI SDK. Web scraping, búsqueda, interacción y rastreo para aplicaciones de IA.

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

<div id="install">
  ## Instalación
</div>

```bash theme={null}
npm install firecrawl-aisdk ai
```

Configura las variables de entorno:

```bash theme={null}
FIRECRAWL_API_KEY=fc-your-key       # https://firecrawl.dev
AI_GATEWAY_API_KEY=your-key         # https://vercel.com/ai-gateway
```

<Note>
  Estos ejemplos usan el formato de modelo *string* de [Vercel AI Gateway](https://vercel.com/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`.
</Note>

<div id="quick-start">
  ## Inicio rápido
</div>

`FirecrawlTools()` incluye `search`, `scrape` e `interact` de forma predeterminada.

```typescript theme={null}
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
  `,
});
```

<div id="firecrawltools">
  ## FirecrawlTools
</div>

`FirecrawlTools()` incluye las herramientas predeterminadas y un `systemPrompt` generado automáticamente que puedes pasar a `generateText`.

```typescript theme={null}
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:

```typescript theme={null}
const tools = FirecrawlTools({
  search: { limit: 5 },
  scrape: { formats: ['markdown'], onlyMainContent: true },
  interact: { profile: { name: 'my-session', saveChanges: true } },
  crawl: true,
  agent: true,
});
```

```typescript theme={null}
// 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, usa el formato `question`:

```typescript theme={null}
formats: [{ type: 'question', question: 'What does this page say about pricing and rate limits?' }]
```

Usa `formats: ['markdown']` solo cuando necesites el contenido completo de la página.

<div id="individual-tools">
  ## Herramientas individuales
</div>

Cada herramienta se puede usar directamente o invocar con opciones:

```typescript theme={null}
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' });
```

<div id="search-scrape">
  ### Búsqueda + Scraping
</div>

```typescript theme={null}
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 },
});
```

<div id="map">
  ### Mapeo
</div>

```typescript theme={null}
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 },
});
```

<div id="stream">
  ### Streaming
</div>

```typescript theme={null}
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;
```

<div id="interact">
  ## Interact
</div>

`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`.

```typescript theme={null}
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:

```typescript theme={null}
const interactTool = interact({
  profile: { name: 'my-session', saveChanges: true },
});
```

`browser()` está obsoleto. Usa `interact()` en su lugar.

<div id="async-tools">
  ## Herramientas asíncronas
</div>

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

<div id="crawl">
  ### Rastreo
</div>

```typescript theme={null}
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 },
});
```

<div id="batch-scrape">
  ### Extracción por lotes
</div>

```typescript theme={null}
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 },
});
```

<div id="agent">
  ### Agente
</div>

Recopilación autónoma de datos web que busca, navega y extrae por sí sola.

```typescript theme={null}
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),
});
```

<div id="logging">
  ## Registro
</div>

```typescript theme={null}
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,
});
```

<div id="all-exports">
  ## Todas las exportaciones
</div>

```typescript theme={null}
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';
```
