Créer un assistant de recherche IA avec Firecrawl et l’AI SDK
Créez un assistant de recherche complet alimenté par l’IA, avec des fonctions de scraping et de recherche web
Créez un assistant de recherche complet alimenté par l’IA, capable d’extraire des informations depuis des sites web et d’effectuer des recherches en ligne pour répondre aux questions. L’assistant décide automatiquement quand utiliser des outils de scraping ou de recherche pour rassembler des informations, puis fournit des réponses complètes basées sur les données collectées.
Une interface de chat IA où les utilisateurs peuvent poser des questions sur n’importe quel sujet. L’assistant IA décide automatiquement quand utiliser le scraping web ou la recherche pour rassembler des informations, puis fournit des réponses complètes basées sur les données collectées.
- Node.js 18 ou version ultérieure installé
- Une clé API OpenAI depuis platform.openai.com
- Une clé API Firecrawl depuis firecrawl.dev
- Des notions de base de React et de Next.js
Créer un nouveau projet Next.js
Commencez par créer une nouvelle application Next.js, puis accédez au répertoire du projet :
npx create-next-app@latest ai-sdk-firecrawl && cd ai-sdk-firecrawlLorsque vous y êtes invité, sélectionnez les options suivantes :
- TypeScript : Oui
- ESLint : Oui
- Tailwind CSS : Oui
- App Router : Oui
- Utiliser le répertoire
src/: Non - Alias d’importation : Oui (@/*)
Installer les dépendances
Installer les packages de l’AI SDK
L’AI SDK est une boîte à outils TypeScript qui fournit une API unifiée pour interagir avec différents fournisseurs de LLM :
npm i ai @ai-sdk/react zodCes packages fournissent :
ai: SDK principal avec diffusion (streaming), appel d’outils et gestion des réponses@ai-sdk/react: hooks React commeuseChatpour créer des interfaces de conversationzod: validation de schémas pour les paramètres d’outils
En savoir plus sur ai-sdk.dev/docs.
Installer AI Elements
AI Elements propose des composants d’interface prêts à l’emploi pour les applications d’IA. Exécutez la commande suivante pour générer tous les composants nécessaires :
npx ai-elements@latestCela met en place AI Elements dans votre projet, notamment les composants de conversation, l’affichage des messages, les champs de saisie de invites et les visualisations d’appels d’outils.
Documentation : ai-sdk.dev/elements/overview.
Installer le fournisseur OpenAI
Installez le fournisseur OpenAI pour vous connecter aux modèles d’OpenAI :
npm install @ai-sdk/openaiCréer l’interface de chat front-end
Créez la page principale dans app/page.tsx et copiez le code depuis l’onglet Code ci-dessous. Il s’agira de l’interface de chat permettant aux utilisateurs d’interagir avec l’assistant IA.
Comprendre le Frontend
Le frontend utilise les composants AI Elements pour fournir une interface de chat complète :
Fonctionnalités principales :
- Affichage de la conversation : Le composant
Conversationgère automatiquement le défilement et l’affichage des messages - Rendu des messages : Chaque partie d’un message est affichée selon son type (texte, raisonnement, appels d’outils)
- Visualisation des outils : Les appels d’outils s’affichent dans des sections repliables présentant les entrées et les sorties
- Contrôles interactifs : les utilisateurs peuvent activer/désactiver la recherche sur le web, choisir des modèles et joindre des fichiers
- Actions sur les messages : Copier et réessayer les actions pour les messages de l’assistant
Ajouter la prise en charge du rendu de Markdown
Pour garantir que le Markdown renvoyé par le LLM s’affiche correctement, ajoutez l’import suivant à votre fichier app/globals.css :
@source "../node_modules/streamdown/dist/index.js";Cela importe les styles nécessaires pour afficher le contenu Markdown dans les réponses de messages.
Créer la route d’API de base
Créez l’endpoint de l’API de chat dans app/api/chat/route.ts. Cette route gérera les messages entrants et diffusera les réponses de l’IA.
import { streamText, UIMessage, convertToModelMessages } from "ai";
import { createOpenAI } from "@ai-sdk/openai";
const openai = createOpenAI({
apiKey: process.env.OPENAI_API_KEY!,
});
// Autorise les réponses en streaming jusqu'à 5 minutes
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.",
});
// renvoie les sources et le raisonnement au client
return result.toUIMessageStreamResponse({
sendSources: true,
sendReasoning: true,
});
}Cette route basique :
- Reçoit des messages depuis le frontend
- Utilise le modèle OpenAI choisi par l’utilisateur
- Diffuse les réponses en continu au client
- N’inclut pas encore d’outils — nous les ajouterons ensuite
Configurer les variables d’environnement
Créez un fichier .env.local à la racine de votre projet :
touch .env.localAjoutez votre clé API OpenAI :
OPENAI_API_KEY=sk-your-openai-api-keyLa variable OPENAI_API_KEY est nécessaire au fonctionnement du modèle d’IA.
Tester le chat de base
Vous pouvez maintenant tester le chatbot de l’AI SDK sans intégrer Firecrawl. Lancez le serveur de développement :
npm run devOuvrez localhost:3000 dans votre navigateur et testez les fonctionnalités de chat de base. L’assistant devrait répondre aux messages, mais il n’aura pas encore de capacités d’exploration web ni de recherche.
Ajouter des outils Firecrawl
Passons maintenant à l’amélioration de l’assistant en lui ajoutant des fonctionnalités de scraping et de recherche sur le web grâce à Firecrawl.
Installer le SDK Firecrawl
Firecrawl convertit les sites web en formats prêts pour les LLM, avec des fonctions de scraping et de recherche :
npm i firecrawlCréer le fichier des outils
Créez un dossier lib et ajoutez-y un fichier tools.ts :
mkdir lib && touch lib/tools.tsAjoutez le code suivant pour définir les outils d’extraction web et de recherche :
import { Firecrawl } from "firecrawl";
import { tool } from "ai";
import { z } from "zod";
const firecrawl = new Firecrawl({ apiKey: process.env.FIRECRAWL_API_KEY });
export const scrapeWebsiteTool = tool({
description: 'Scrape content from any website URL',
inputSchema: z.object({
url: z.string().url().describe('The URL to scrape')
}),
execute: async ({ url }) => {
console.log('Scraping :', url);
const result = await firecrawl.scrape(url, {
formats: ['markdown'],
onlyMainContent: true,
timeout: 30000
});
console.log('Aperçu du contenu scrapé :', result.markdown?.slice(0, 200) + '...');
return { content: result.markdown };
}
});
export const searchWebTool = tool({
description: 'Search the web using Firecrawl',
inputSchema: z.object({
query: z.string().describe('The search query'),
limit: z.number().optional().describe('Number of results'),
location: z.string().optional().describe('Location for localized results'),
tbs: z.string().optional().describe('Time filter (qdr:h, qdr:d, qdr:w, qdr:m, qdr:y)'),
sources: z.array(z.enum(['web', 'news', 'images'])).optional().describe('Result types'),
categories: z.array(z.enum(['github', 'research', 'pdf'])).optional().describe('Filter categories'),
}),
execute: async ({ query, limit, location, tbs, sources, categories }) => {
console.log('Recherche :', 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 || 'Untitled',
url: item.url || '',
description: item.description || '',
}));
console.log('Résultats de recherche :', results.length);
return { results };
},
});Comprendre les outils
Outil d’extraction de site web :
- Accepte une URL en entrée (validée par un schéma Zod)
- Utilise la méthode
scrapede Firecrawl pour récupérer la page en Markdown - N’extrait que le contenu principal afin de réduire la consommation de jetons
- Renvoie le contenu extrait pour que l’IA l’analyse
Outil de recherche web :
- Accepte une requête de recherche avec des filtres optionnels
- Utilise la méthode
searchde Firecrawl pour trouver des pages web pertinentes - Prend en charge des filtres avancés comme l’emplacement, la plage temporelle et les catégories de contenu
- Renvoie des résultats structurés avec des titres, des URL et des descriptions
En savoir plus sur les outils : ai-sdk.dev/docs/foundations/tools.
Mettre à jour la route d’API avec les outils Firecrawl
Mettez maintenant à jour votre app/api/chat/route.ts pour inclure les outils Firecrawl que nous venons de créer.
Principales modifications par rapport à la route de base :
- Importer
stepCountIsdepuis l’AI SDK - Importer les outils Firecrawl depuis
@/lib/tools - Ajouter l’objet
toolsavec les outilsscrapeWebsiteetsearchWeb - Ajouter
stopWhen: stepCountIs(5)pour limiter le nombre d’étapes d’exécution - Définir
toolChoicesur “auto” lorsque la recherche web est activée, “none” sinon
En savoir plus sur streamText : ai-sdk.dev/docs/reference/ai-sdk-core/stream-text.
Ajoutez votre clé API Firecrawl
Mettez à jour votre fichier .env.local pour y inclure votre clé d’API Firecrawl :
OPENAI_API_KEY=sk-your-openai-api-key
FIRECRAWL_API_KEY=fc-your-firecrawl-api-keyRécupérez votre clé API Firecrawl sur firecrawl.dev.
Tester l’application entière
Redémarrez votre serveur de développement :
npm run devOuvrez localhost:3000 et testez l’assistant amélioré :
- Activez le bouton “Search” pour activer la recherche web
- Demandez : “What are the latest features from firecrawl.dev?”
- Observez l’IA appeler l’outil
searchWebouscrapeWebsite - Suivez l’exécution de l’outil dans l’UI avec les entrées et sorties
- Lisez l’analyse de l’IA basée sur les données collectées
- L’utilisateur envoie un message : l’utilisateur saisit une question et clique sur Envoyer
- Le frontend envoie la requête :
useChatenvoie le message à/api/chatavec le modèle sélectionné et le paramètre de recherche web - Le backend traite le message : la route d’API reçoit le message et appelle
streamText - L’IA choisit des outils : le modèle analyse la question et décide d’utiliser
scrapeWebsiteousearchWeb(uniquement si la recherche web est activée) - Exécution des outils : si des outils sont appelés, Firecrawl effectue un scraping ou une recherche sur le web
- L’IA génère une réponse : le modèle analyse les résultats des outils et génère une réponse en langage naturel
- Le frontend affiche les résultats : l’interface affiche les appels d’outils et la réponse finale en temps réel
Le système d’appel d’outils de l’AI SDK (ai-sdk.dev/docs/foundations/tools) fonctionne comme suit :
- Le modèle reçoit le message de l’utilisateur ainsi que les descriptions des outils disponibles
- Si le modèle détermine qu’un outil est nécessaire, il génère un appel d’outil avec des paramètres
- Le SDK exécute la fonction d’outil avec ces paramètres
- Le résultat de l’outil est renvoyé au modèle
- Le modèle utilise ce résultat pour générer sa réponse finale
Tout cela se fait automatiquement dans un seul appel à streamText, avec des résultats diffusés vers le frontend en temps réel.
L’application prend en charge plusieurs modèles OpenAI :
- GPT-5 Mini (Thinking) : modèle OpenAI récent avec des capacités de raisonnement avancées
- GPT-4o Mini : modèle rapide et économique
Les utilisateurs peuvent passer d’un modèle à l’autre via le menu déroulant.
Le bouton Search détermine si l’IA peut utiliser les outils Firecrawl :
- Activé : l’IA peut appeler les outils
scrapeWebsiteetsearchWebselon les besoins - Désactivé : l’IA répond uniquement à partir de ses données d’entraînement
Cela permet aux utilisateurs de décider quand utiliser des données web plutôt que les connaissances intégrées du modèle.
Étendez l’assistant avec des outils supplémentaires :
- Requêtes dans la base de données pour les données internes de l’entreprise
- Intégration au CRM pour récupérer les informations client
- Envoi d’e-mails
- Génération de documents
Chaque outil suit le même modèle : définir un schéma avec Zod, implémenter la fonction execute, puis l’enregistrer dans l’objet tools.
Remplacez OpenAI par un autre prestataire :
import { anthropic } from "@ai-sdk/anthropic";
const result = streamText({
model: anthropic("claude-4.5-sonnet"),
// ... reste de la config
});Le SDK d’IA prend en charge plus de 20 fournisseurs via la même API. En savoir plus : ai-sdk.dev/docs/foundations/providers-and-models.
Les composants AI Elements reposent sur shadcn/ui, vous pouvez donc :
- Modifier le style des composants dans leurs fichiers
- Ajouter de nouvelles variantes aux composants existants
- Créer des composants personnalisés conformes au système de design
-
Utilisez les outils appropriés : Choisissez
searchWebpour trouver d’abord des pages pertinentes,scrapeWebsitepour des pages individuelles, ou laissez l’IA décider. -
Surveillez l’utilisation de l’API : Suivez votre consommation des API Firecrawl et OpenAI pour éviter des coûts inattendus.
-
Gérez les erreurs avec souplesse : Les outils intègrent une gestion des erreurs, mais envisagez d’ajouter des messages d’erreur visibles par l’utilisateur.
-
Optimisez les performances : Utilisez le streaming pour fournir un retour immédiat et envisagez de mettre en cache le contenu fréquemment consulté.
-
Définissez des limites raisonnables :
stopWhen: stepCountIs(5)empêche les appels d’outil excessifs et les coûts incontrôlés.