learndb/netlify/functions/handleMetadata.js

124 wiersze
4.9 KiB
JavaScript
Czysty Zwykły widok Historia

2023-11-24 21:03:43 +00:00
const fetch = require('node-fetch'); // Import for webscraping in fetchContentFromURL()
2023-11-24 21:10:29 +00:00
import { OpenAIApi, Configuration } from 'openai';
// const { Configuration, OpenAIApi } = require('openai');
2023-11-23 16:32:58 +00:00
// Function to fetch content from URL using a web scraping service
async function fetchContentFromURL(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.text();
} catch (error) {
console.error(`Could not fetch content from URL: ${error}`);
throw error;
}
2023-11-22 12:33:41 +00:00
}
function simplifyContent(content) {
// Denote headings with a marker (like '###') and add a line break
content = content.replace(/<h[1-6].*?>(.*?)<\/h[1-6]>/g, '\n### $1\n');
// Remove script and style elements and their content
let simplifiedContent = content.replace(/<script.*?>.*?<\/script>/gms, '');
simplifiedContent = simplifiedContent.replace(/<style.*?>.*?<\/style>/gms, '');
// Remove all remaining HTML tags, leaving the inner text
simplifiedContent = simplifiedContent.replace(/<[^>]+>/g, '');
2023-11-24 22:01:18 +00:00
// Manually replace common HTML entities
2023-11-24 21:59:25 +00:00
simplifiedContent = simplifiedContent
.replace(/&amp;/g, '&')
.replace(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&quot;/g, '"')
.replace(/&#39;/g, "'");
// Remove inline CSS and JavaScript event handlers
simplifiedContent = simplifiedContent.replace(/style\s*=\s*'.*?'/gi, '');
simplifiedContent = simplifiedContent.replace(/on\w+\s*=\s*".*?"/gi, '');
// Normalize whitespace without removing sentence punctuation
simplifiedContent = simplifiedContent.replace(/\s+/g, ' ').trim();
// Condense multiple line breaks into a single one
simplifiedContent = simplifiedContent.replace(/(\r\n|\r|\n){2,}/g, '\n');
return simplifiedContent;
2023-11-22 12:33:41 +00:00
}
2023-11-22 12:33:41 +00:00
// Placeholder function to perform GPT analysis for media type and topics using Mistral-7b via OpenRouter
async function performGPTAnalysis(simplifiedContent, apiKey) {
// Implement logic to send content to Mistral-7b via OpenRouter for GPT analysis
// Send content and receive GPT analysis response
// Placeholder code
const inferredMediaType = "article";
// const extractedTopics = ["topic1", "topic2"];
const configuration = new Configuration({
apiKey: apiKey, // Use the provided API key
baseURL: "https://openrouter.ai/api/v1" // Your custom API endpoint
});
const openai = new OpenAIApi(configuration);
return inferredMediaType;
2023-11-22 12:33:41 +00:00
}
// Placeholder function to map inferred values to predefined formats and topics
function mapInferredValues(mediaType, topics) {
// Implement logic to map inferred media type and topics to predefined formats and topics
// Match inferred values with predefined taxonomy
// Placeholder code
const predefinedMediaType = "Article";
const predefinedTopics = ["Topic 1", "Topic 2"];
return { predefinedMediaType, predefinedTopics };
2023-11-22 12:33:41 +00:00
}
// Placeholder function to format the response
function formatResponse(predefinedMediaType, predefinedTopics) {
// Implement logic to format the extracted metadata into the desired response structure
// Construct the response object
// Placeholder code
const response = {
2023-11-22 20:44:21 +00:00
format: predefinedMediaType,
2023-11-23 15:42:06 +00:00
topics: predefinedTopics,
};
return response;
2023-11-22 12:33:41 +00:00
}
export async function handler(event) {
try {
2023-11-22 12:33:41 +00:00
// Extract URL and API Key from the request body
const { url, apiKey } = JSON.parse(event.body);
// Validate if URL and API Key are present
if (!url || !apiKey) {
return {
statusCode: 400,
body: JSON.stringify({ error: 'URL and API Key are required' }),
};
}
// Step 1: Fetch content from the URL using a web scraping service
const fetchedContent = await fetchContentFromURL(url);
// Step 2: Simplify the fetched content for GPT analysis
const simplifiedContent = simplifyContent(fetchedContent);
// Step 3: Perform GPT analysis for media type and topics
const responseText = await performGPTAnalysis(simplifiedContent, apiKey);
2023-11-22 12:33:41 +00:00
// Step 4: Map inferred values to predefined formats and topics
// const { predefinedMediaType, predefinedTopics } = mapInferredValues(inferredMediaType, extractedTopics);
2023-11-22 12:33:41 +00:00
// Step 5: Format the response
// const formattedResponse = formatResponse(predefinedMediaType, predefinedTopics);
2023-11-22 12:33:41 +00:00
// Return the formatted response
return {
statusCode: 200,
body: JSON.stringify(responseText),
2023-11-22 12:33:41 +00:00
};
} catch (error) {
console.error('Error occurred:', error.message);
2023-11-22 12:33:41 +00:00
return {
statusCode: 500,
body: JSON.stringify({ error: 'Something went wrong', details: error.message }),
2023-11-22 12:33:41 +00:00
};
}
2023-11-23 16:26:25 +00:00
}