1 Commits

Author SHA1 Message Date
0c439b7b3b update from production 2026-02-24 06:04:04 +00:00
5 changed files with 199403 additions and 114 deletions

199320
bs_gamedu_backup.sql Normal file

File diff suppressed because one or more lines are too long

1
info.txt Normal file
View File

@@ -0,0 +1 @@
pm2 start --name dev-iimtt-api 'yarn start' --interpreter none

View File

@@ -43,8 +43,8 @@ app.use(mongoSanitize());
app.use(compression()); app.use(compression());
// enable cors // enable cors
app.use(cors()); // app.use(cors());
app.options('*', cors()); // app.options('*', cors());
//# Need to implement //# Need to implement
// const allowedOrigins = process.env.CORS_ALLOWED_ORIGINS.split(','); // const allowedOrigins = process.env.CORS_ALLOWED_ORIGINS.split(',');

View File

@@ -1,29 +1,4 @@
const aiFollowupQuestion = async (req, res) => { const aiFollowupQuestion = async (req, res) => {
// curl -X POST http://localhost:3000/your-endpoint-path \
// -H "Content-Type: application/json" \
// -d '{
// "prompt": "Why is the sky blue?",
// "sessionId": "",
// "model": "gpt-3.5-turbo-16k",
// "max_tokens": 200
// }'
// curl -X POST http://localhost:5174/api/aiFollowupQuestion \
// -H "Content-Type: application/json" \
// -d '{
// "prompt": "Why is the sky blue?",
// "sessionId": "",
// "model": "gpt-3.5-turbo-16k",
// "sessionId" : "8c641aca-582d-4ea7-8e56-4f94318efe74",
// "max_tokens": 200
// }'
// {
// "success": true,
// "data": "The sky looks blue because of how sunlight scatters in the air. Great question! Ask me more!",
// "total_tokens": 45,
// "sessionId": "2a3b3cc4-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
// }
const { MongoClient } = require('mongodb'); const { MongoClient } = require('mongodb');
// const fetch = require('node-fetch'); // const fetch = require('node-fetch');
@@ -36,11 +11,11 @@ const aiFollowupQuestion = async (req, res) => {
const database = client.db(dbName); const database = client.db(dbName);
const conversationsCollection = database.collection('conversations'); const conversationsCollection = database.collection('conversations');
async function fetchOpenAICompletion(prompt, messages, model = 'gpt-3.5-turbo-16k', max_tokens = 200) { async function fetchOpenAICompletion(prompt, messages, model = "gpt-3.5-turbo-16k", max_tokens = 200) {
const response = await fetch('https://api.openai.com/v1/chat/completions', { const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST', method: 'POST',
headers: { headers: {
Authorization: `Bearer ${process.env.OPENAI_KEY}`, 'Authorization': `Bearer ${process.env.OPENAI_KEY}`,
'Content-Type': 'application/json', 'Content-Type': 'application/json',
}, },
body: JSON.stringify({ body: JSON.stringify({
@@ -60,64 +35,63 @@ const aiFollowupQuestion = async (req, res) => {
return data; return data;
} }
try {
const { prompt, sessionId, model = 'gpt-3.5-turbo-16k', max_tokens = 200 } = req.body;
if (!conversationsCollection) {
return res.status(500).json({
success: false,
error: 'MongoDB is not connected yet. Please try again later.',
});
}
let conversation;
if (!sessionId) { try {
const newSessionId = uuidv4(); const { prompt, sessionId, model = "gpt-3.5-turbo-16k", max_tokens = 200 } = req.body;
if (!conversationsCollection) {
conversation = { return res.status(500).json({
sessionId: newSessionId,
conversationHistory: [
{
role: 'system',
content:
'Reply to the questions asked by a kindergarten child, Sound excited to answer and encourage the child to ask more questions in 30 words',
},
{ role: 'user', content: prompt },
],
};
await conversationsCollection.insertOne(conversation);
} else {
conversation = await conversationsCollection.findOne({ sessionId: sessionId });
if (!conversation) {
return res.status(400).json({
success: false, success: false,
error: 'Invalid session ID.', error: 'MongoDB is not connected yet. Please try again later.',
}); });
} }
conversation.conversationHistory.push({ role: 'user', content: prompt }); let conversation;
if (!sessionId) {
const newSessionId = uuidv4();
conversation = {
sessionId: newSessionId,
conversationHistory: [
{ role: 'system', content: 'Reply to the questions asked by a kindergarten child, Sound excited to answer and encourage the child to ask more questions in 30 words' },
{ role: 'user', content: prompt },
],
};
await conversationsCollection.insertOne(conversation);
} else {
conversation = await conversationsCollection.findOne({ sessionId: sessionId });
if (!conversation) {
return res.status(400).json({
success: false,
error: 'Invalid session ID.',
});
}
conversation.conversationHistory.push({ role: 'user', content: prompt });
}
const aiResponse = await fetchOpenAICompletion(prompt, conversation.conversationHistory, model, max_tokens);
conversation.conversationHistory.push({ role: 'assistant', content: aiResponse.choices[0].message.content });
await conversationsCollection.updateOne(
{ sessionId: conversation.sessionId },
{ $set: { conversationHistory: conversation.conversationHistory } }
);
res.json({
success: true,
data: aiResponse.choices[0].message.content,
total_tokens: aiResponse.usage.total_tokens,
sessionId: conversation.sessionId,
});
} catch (error) {
console.error('Error generating response:', error.message);
res.status(500).json({
success: false,
error: 'Something went wrong. Please try again later.',
});
} }
const aiResponse = await fetchOpenAICompletion(prompt, conversation.conversationHistory, model, max_tokens);
conversation.conversationHistory.push({ role: 'assistant', content: aiResponse.choices[0].message.content });
await conversationsCollection.updateOne(
{ sessionId: conversation.sessionId },
{ $set: { conversationHistory: conversation.conversationHistory } }
);
res.json({
success: true,
data: aiResponse.choices[0].message.content,
total_tokens: aiResponse.usage.total_tokens,
sessionId: conversation.sessionId,
});
} catch (error) {
console.error('Error generating response:', error.message);
res.status(500).json({
success: false,
error: 'Something went wrong. Please try again later.',
});
} }
};
module.exports = aiFollowupQuestion; module.exports = aiFollowupQuestion;

View File

@@ -3,15 +3,6 @@ const AWS = require('aws-sdk');
const FormData = require('form-data'); const FormData = require('form-data');
const aiTextToSpeech = async (req, res) => { const aiTextToSpeech = async (req, res) => {
// curl -X POST http://localhost:5174/api/aiTextToSpeech \
// -H "Content-Type: application/json" \
// -d '{
// "text": "Hello, this is a sample speech.",
// "voiceId": "Ava"
// }'
// {"message":"Speech generated and saved successfully","fileUrls":["https://polly-bs.s3.ap-south-1.amazonaws.com/file_MpNpWluxR7R70BA-dzju_U3C94bPmC-n-speech.mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQ35B6OYR6T5MGH7Q%2F20250814%2Fap-south-1%2Fs3%2Faws4_request&X-Amz-Date=20250814T163252Z&X-Amz-Expires=86400&X-Amz-Signature=12dd2feaf73564d6c843b0dc975fdedb35c430d316f4f09fcdf41e247d1ea63c&X-Amz-SignedHeaders=host","https://polly-bs.s3.ap-south-1.amazonaws.com/file_SXmwHWwlcSBlI9LNoZ1PcLEdMD7D1PWO-text.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQ35B6OYR6T5MGH7Q%2F20250814%2Fap-south-1%2Fs3%2Faws4_request&X-Amz-Date=20250814T163252Z&X-Amz-Expires=86400&X-Amz-Signature=d96eb4fe7cabfab93ce0ffe8fc74a8e722a2064d904652d47ad361f2f3667ec7&X-Amz-SignedHeaders=host"],"fileKeys":{"file1":"file_MpNpWluxR7R70BA-dzju_U3C94bPmC-n-speech.mp3","file2":"file_SXmwHWwlcSBlI9LNoZ1PcLEdMD7D1PWO-text.txt"}}
AWS.config.update({ AWS.config.update({
region: 'ap-south-1', region: 'ap-south-1',
accessKeyId: process.env.AWS_polly2_ACCESS_KEY_ID, accessKeyId: process.env.AWS_polly2_ACCESS_KEY_ID,
@@ -20,12 +11,12 @@ const aiTextToSpeech = async (req, res) => {
const polly = new AWS.Polly(); const polly = new AWS.Polly();
const voiceIdMap = { const voiceIdMap = {
Ava: 'Ivy', "Ava": "Ivy",
Monstero: 'Justin', "Monstero": "Justin",
Dax: 'Kevin', "Dax": "Kevin",
Kai: 'Danielle', "Kai": "Danielle",
Arlo: 'Ruth', "Arlo": "Ruth",
Yara: 'Salli', "Yara": "Salli"
}; };
const { text, voiceId: frontendVoiceId } = req.body; const { text, voiceId: frontendVoiceId } = req.body;
@@ -50,9 +41,7 @@ const aiTextToSpeech = async (req, res) => {
function generateTimestampWithRandomDigits() { function generateTimestampWithRandomDigits() {
const now = new Date(); const now = new Date();
const formattedDate = now.toISOString().replace('T', '_').replace(/\..+/, '').replace(/:/g, '-'); const formattedDate = now.toISOString().replace('T', '_').replace(/\..+/, '').replace(/:/g, '-');
const randomDigits = Math.floor(Math.random() * 10000) const randomDigits = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
.toString()
.padStart(4, '0');
return `${formattedDate}_${randomDigits}`; return `${formattedDate}_${randomDigits}`;
} }
@@ -70,18 +59,23 @@ const aiTextToSpeech = async (req, res) => {
// formData.append('folder', folderName); // Send folder name // formData.append('folder', folderName); // Send folder name
formData.append('bucket', 'polly-bs'); // Adjust bucket formData.append('bucket', 'polly-bs'); // Adjust bucket
const response = await axios.post('https://preschool-curriculum.in/api/one/v1/file/upload', formData, { const response = await axios.post(
headers: { 'https://preschool-curriculum.in/api/one/v1/file/upload',
// 'Authorization': `Bearer ${process.env.BEARER_TOKEN}`, formData,
...formData.getHeaders(), // Ensure FormData headers are included {
}, headers: {
}); // 'Authorization': `Bearer ${process.env.BEARER_TOKEN}`,
...formData.getHeaders() // Ensure FormData headers are included
}
}
);
res.json({ res.json({
message: 'Speech generated and saved successfully', message: 'Speech generated and saved successfully',
fileUrls: response.data.urls, fileUrls: response.data.urls,
fileKeys: response.data.data, fileKeys: response.data.data
}); });
} catch (error) { } catch (error) {
console.error('Error generating speech or uploading files:', error); console.error('Error generating speech or uploading files:', error);
res.status(500).json({ error: 'Error generating speech or uploading files' }); res.status(500).json({ error: 'Error generating speech or uploading files' });