From ddc864a25d8fc7138f34706b2cf69d1fbde7b0b0 Mon Sep 17 00:00:00 2001 From: Kar Date: Wed, 27 Nov 2024 21:03:08 +0530 Subject: [PATCH] aiEvaluateImageToScore --- src/routes/api/aiEvaluateImageToScore.js | 104 +++++++++++++++++++++-- 1 file changed, 96 insertions(+), 8 deletions(-) diff --git a/src/routes/api/aiEvaluateImageToScore.js b/src/routes/api/aiEvaluateImageToScore.js index 445d16e..bd373e0 100644 --- a/src/routes/api/aiEvaluateImageToScore.js +++ b/src/routes/api/aiEvaluateImageToScore.js @@ -1,15 +1,103 @@ const AWS = require('aws-sdk'); -const FormData = require('form-data'); +const axios = require('axios'); +const mongoose = require('mongoose'); +const Game = require('./Game'); // Ensure this path matches your project structure const aiEvaluateImageToScore = async (req, res) => { - AWS.config.update({ - region: 'ap-south-1', - accessKeyId: process.env.AWS_ACCESS_KEY_ID, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, - }); + try { + // Destructure data from req.body + const { userId, gameName, gameID, gameTime, gameStar, screenShot } = req.body; - - + if (!screenShot) { + return res.status(400).json({ error: 'Screenshot is required' }); + } + + // Decode the base64 image + const buffer = Buffer.from(screenShot, 'base64'); + const fileName = `${Date.now()}-${gameID}.png`; // Unique filename + const bucketName = process.env.S3_BUCKET_NAME; + + // Initialize S3 + AWS.config.update({ + region: 'ap-south-1', + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + }); + const s3 = new AWS.S3(); + + // Upload the image to S3 + const s3Params = { + Bucket: bucketName, + Key: `screenshots/${fileName}`, + Body: buffer, + ContentType: 'image/png', + ACL: 'public-read', // Make the file publicly accessible + }; + + const s3UploadResponse = await s3.upload(s3Params).promise(); + const screenshotUrl = s3UploadResponse.Location; + + // Prepare the OpenAI API request + const openAiPayload = { + model: 'gpt-4o-mini', + messages: [ + { + role: 'user', + content: [ + { + type: 'text', + text: 'The coloring was done by a 5-year-old kid. Give a score between 1 to 10 in JSON format.', + }, + { + type: 'image_url', + image_url: { + url: screenshotUrl, + }, + }, + ], + }, + ], + max_tokens: 300, + }; + + // Call the OpenAI API + const openAiResponse = await axios.post( + 'https://api.openai.com/v1/chat/completions', + openAiPayload, + { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, + }, + } + ); + + // Extract the score from OpenAI's response + const scoreResponse = openAiResponse.data.choices[0].message.content; + const parsedScore = JSON.parse(scoreResponse); + + // Save to MongoDB + const gameData = new Game({ + gameName, + userId, + gameID, + gameTime, + score: parsedScore.score || 'N/A', // Adjust key to match OpenAI response + gameStar, + screenshotUrl, + }); + + await gameData.save(); + + // Respond with the saved data + return res.status(201).json({ + message: 'Game data saved successfully', + data: gameData, + }); + } catch (error) { + console.error('Error:', error.message); + return res.status(500).json({ error: 'Something went wrong' }); + } }; module.exports = aiEvaluateImageToScore;