77 lines
2.6 KiB
TypeScript
77 lines
2.6 KiB
TypeScript
// pages/api/getRepoStars.ts
|
|
import { NextApiRequest, NextApiResponse } from 'next';
|
|
import FirecrawlApp from '@mendable/firecrawl-js';
|
|
import { roastPrompt } from '../../lib/LLM/llm';
|
|
|
|
|
|
const mildPrompt = "Give me a light hearted roast for this website:"
|
|
const mediumPrompt = "Give me a roast for this website:"
|
|
const spicyPrompt ="Roast this website. The person who made this website wants to be roasted really hard. I mean REALLY hard, don't hold back, and don't worry about hurting their feelings. Be mean but concisely mean. No more than 2 paragraphs."
|
|
|
|
|
|
async function getScreenShotAndHtml(url: string) {
|
|
const app = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
|
|
const scrapeResult = await app.scrapeUrl(url, {
|
|
pageOptions: {
|
|
includeHtml: true,
|
|
screenshot: true
|
|
}
|
|
});
|
|
return {
|
|
screenshotUrl: scrapeResult.data.metadata.screenshot,
|
|
htmlContent: scrapeResult.data.html
|
|
};
|
|
}
|
|
|
|
|
|
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
const rawUrl = typeof req.query.url === 'string' ? req.query.url : null;
|
|
const spiceLevel = typeof req.query.spiceLevel === 'string' ? parseInt(req.query.spiceLevel, 10) : null;
|
|
|
|
if (!rawUrl || spiceLevel === null || isNaN(spiceLevel)) {
|
|
res.status(400).json({ error: 'Invalid query parameters' });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const { screenshotUrl, htmlContent } = await getScreenShotAndHtml(rawUrl);
|
|
|
|
// Define a roast prompt message
|
|
let roastMessage: string;
|
|
|
|
// Determine the roast message based on the spice level
|
|
switch (spiceLevel) {
|
|
case 1:
|
|
roastMessage = mildPrompt;
|
|
break;
|
|
case 2:
|
|
roastMessage = mediumPrompt;
|
|
break;
|
|
case 3:
|
|
roastMessage = spicyPrompt;
|
|
break;
|
|
default:
|
|
// If an invalid spice level is provided, default to mild roast
|
|
roastMessage = mildPrompt;
|
|
res.status(400).json({ error: 'Invalid spice level' });
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
// Convert HTML content to a markdown-like format for the roast generation
|
|
// This is a simplified conversion, assuming HTML content is already sanitized and suitable for direct usage
|
|
|
|
// Call the roastPrompt function to generate a roast
|
|
const roastResult = await roastPrompt(roastMessage, screenshotUrl, htmlContent);
|
|
|
|
// Log the roast result for debugging
|
|
// console.log("Roast Result:", roastResult);
|
|
|
|
res.status(200).json({ screenshotUrl, htmlContent, roastResult});
|
|
} catch (error: any) {
|
|
res.status(500).json({ error: error.message });
|
|
}
|
|
}
|
|
|