> ## 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

> Ferramentas Firecrawl para o Vercel AI SDK. Web scraping, busca, interagir e rastreamento para aplicações de IA.

Ferramentas Firecrawl para o Vercel AI SDK. Busque, faça scraping, interaja com páginas e rastreie a web em suas aplicações de IA.

<div id="install">
  ## Instalação
</div>

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

Configure as variáveis de ambiente:

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

<Note>
  Estes exemplos usam o formato de modelo de string do [Vercel AI Gateway](https://vercel.com/ai-gateway), mas as ferramentas do Firecrawl funcionam com qualquer provedor de SDK de IA. Você também pode usar importações de provedores, como `anthropic('claude-sonnet-4-5-20250514')`, de `@ai-sdk/anthropic`.
</Note>

<div id="quick-start">
  ## Início rápido
</div>

`FirecrawlTools()` inclui `search`, `scrape` e `interact` por padrão.

```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()` inclui as ferramentas `default` e um `systemPrompt` gerado automaticamente, que você pode passar para `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.',
});
```

Você pode personalizar as configurações padrão, usar ferramentas assíncronas ou desativar ferramentas individuais:

```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}
// Desabilitar interact, manter search + scrape
FirecrawlTools({ interact: false });

// Ativar compatibilidade com navegador descontinuado
FirecrawlTools({ browser: {} });

// Incluir todas as ferramentas disponíveis
FirecrawlTools({ all: true });
```

Ao fazer scraping para responder a uma pergunta sobre uma página, use o formato `question`:

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

Use `formats: ['markdown']` apenas quando precisar do conteúdo completo da página.

<div id="individual-tools">
  ## Ferramentas Individuais
</div>

Cada ferramenta pode ser usada diretamente ou chamada com opções:

```typescript theme={null}
import { generateText } from 'ai';
import { scrape, search } from 'firecrawl-aisdk';

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

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

<div id="search-scrape">
  ### Busca + 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: 'Busque por Firecrawl, faça scrape do primeiro resultado oficial e explique o que ele faz.',
  tools: { search, scrape },
});
```

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

```typescript theme={null}
import { generateText } from 'ai';
import { map } from 'firecrawl-aisdk';

const { text } = await generateText({
  model: 'anthropic/claude-sonnet-4-5',
  prompt: 'Map https://docs.firecrawl.dev and list the main sections.',
  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">
  ## Interagir
</div>

`interact()` cria uma sessão interativa baseada em scraping. Chame `start(url)` para iniciar uma sessão e obter uma URL de visualização em tempo real; depois, permita que o modelo reutilize essa sessão por meio da ferramenta `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: 'Use interact na sessão atual do Hacker News, encontre a principal notícia e faça uma busca por mais contexto.',
});

await interactTool.close();
```

Se você precisar da URL explícita da visualização em tempo real após a inicialização, use `interactTool.interactiveLiveViewUrl`.

Reutilize o estado do navegador entre sessões usando perfis:

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

`browser()` foi descontinuado. Prefira `interact()`.

<div id="async-tools">
  ## Ferramentas assíncronas
</div>

Rastreamento, batch scrape e agent retornam um ID de job. Use-os com `poll`.

<div id="crawl">
  ### Rastreamento
</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: 'Crawl https://docs.firecrawl.dev (limit 3 pages) and summarize.',
  tools: { crawl, poll },
});
```

<div id="batch-scrape">
  ### Batch Scrape
</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: 'Scrape https://firecrawl.dev and https://docs.firecrawl.dev, then compare them.',
  tools: { batchScrape, poll },
});
```

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

Coleta autônoma de dados na web que busca, navega e extrai dados por conta própria.

```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: 'Find the founders of Firecrawl, their roles, and their backgrounds.',
  tools: { agent, poll },
  stopWhen: stepCountIs(10),
});
```

<div id="logging">
  ## Logs
</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: 'Scrape 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: 'Scrape https://firecrawl.dev and summarize it again.',
  tools: { scrape },
  onStepFinish: logStep,
});
```

<div id="all-exports">
  ## Todas as exportações
</div>

```typescript theme={null}
import {
  // Ferramentas principais
  search,             // Fazer uma busca na web
  scrape,             // Scraping de uma única URL
  map,                // Descobrir URLs em um site
  crawl,              // Rastreamento de múltiplas páginas (assíncrono, use poll)
  batchScrape,        // Scraping de múltiplas URLs (assíncrono, use poll)
  agent,              // Pesquisa web autônoma (assíncrono, use poll)

  // Gerenciamento de jobs
  poll,               // Consultar jobs assíncronos para obter resultados
  status,             // Verificar status do job
  cancel,             // Cancelar jobs em execução

  // Ferramentas de navegador/sessão
  interact,           // interact({ profile: { name: '...' } })
  browser,            // exportação de compatibilidade depreciada

  // Pacote completo
  FirecrawlTools,     // FirecrawlTools({ search, scrape, interact, crawl, agent })

  // Utilitários
  stepLogger,         // Estatísticas de tokens por chamada de ferramenta
  logStep,            // Log simples em uma linha
} from 'firecrawl-aisdk';
```
