import FirecrawlApp from '@mendable/firecrawl-js';
import OpenAI from 'openai';
import { z } from 'zod';
const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const ScrapeArgsSchema = z.object({
url: z.string().describe('L'URL du site web à scraper')
});
const tools = [{
type: 'function' as const,
function: {
name: 'scrape_website',
description: 'Scrape le contenu de n'importe quelle URL de site web',
parameters: z.toJSONSchema(ScrapeArgsSchema)
}
}];
const response = await openai.chat.completions.create({
model: 'gpt-5-nano',
messages: [{
role: 'user',
content: 'Qu'est-ce que Firecrawl ? Visitez firecrawl.dev et dites-moi ce que c'est.'
}],
tools
});
const message = response.choices[0]?.message;
if (message?.tool_calls && message.tool_calls.length > 0) {
for (const toolCall of message.tool_calls) {
if (toolCall.type === 'function') {
console.log('Outil appelé :', toolCall.function.name);
const args = ScrapeArgsSchema.parse(JSON.parse(toolCall.function.arguments));
const result = await firecrawl.scrape(args.url, {
formats: ['markdown'] // Autres formats : html, links, etc.
});
console.log('Contenu scrapé :', result.markdown?.substring(0, 200) + '...');
// Renvoyer le contenu scrapé au modèle pour la réponse finale
const finalResponse = await openai.chat.completions.create({
model: 'gpt-5-nano',
messages: [
{
role: 'user',
content: 'Qu'est-ce que Firecrawl ? Visitez firecrawl.dev et dites-moi ce que c'est.'
},
message,
{
role: 'tool',
tool_call_id: toolCall.id,
content: result.markdown || 'Aucun contenu scrapé'
}
],
tools
});
console.log('Réponse finale :', finalResponse.choices[0]?.message?.content);
}
}
} else {
console.log('Réponse directe :', message?.content);
}