-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandler.js
101 lines (84 loc) · 3.44 KB
/
handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const { Buffer } = require('buffer');
const { fromBuffer } = require('file-type');
const bb = require('busboy');
const { callVertexAI, callOpenAI } = require('./functions/callAI');
const prompts = require('./constants/prompts');
const availableFileExtensionFeatures = {
mp3: {
call: (fileBuffer, prompt) => callVertexAI(fileBuffer, prompt, 'mp3'),
prompts: prompts.mp3,
},
pdf: {
call: callOpenAI,
prompts: {},
},
mp4: {
call: (fileBuffer, prompt) => callVertexAI(fileBuffer, prompt, 'mp4'),
prompts: prompts.mp4,
},
};
function getPrompt(fileExtension, action) {
const fileExtensionFeature = availableFileExtensionFeatures[fileExtension];
const prompt = fileExtensionFeature.prompts[action] || prompts.default;
return prompt;
}
exports.summarizeFile = async (event) => {
if (event.isBase64Encoded && event.headers['Content-Type'].includes('multipart/form-data')) {
const busboy = bb({
headers: { 'content-type': event.headers['Content-Type'] },
});
return new Promise((resolve, reject) => {
busboy.on('file', async (_fieldname, file, _fileinfo, _encoding, _mimetype) => {
let fileBuffer;
file.on('data', (data) => {
fileBuffer = data;
});
file.on('end', async () => {
console.log(`Starting to process file`);
const fileType = await fromBuffer(fileBuffer);
const fileExtension = fileType?.ext;
console.log(`File extension: ${fileExtension}. Looking if we support that extension...`);
const fileExtensionFeature = availableFileExtensionFeatures[fileExtension];
console.log(`File extension: ${fileExtension}. Supported: ${fileExtensionFeature ? 'Yes' : 'No'}`);
if (fileExtensionFeature) {
console.log(`Looking for a prompt for the file extension ${fileExtension} and action ${event.queryStringParameters?.action}`);
const prompt = getPrompt(fileExtension, event.queryStringParameters?.action);
console.log(`Prompt found. Is default? ${prompt === prompts.default ? 'Yes' : 'No'}\nPrompt detail: "${prompt}"`);
const response = fileExtensionFeature.prompt ? await fileExtensionFeature.call(fileBuffer, prompt) : await fileExtensionFeature.call(fileBuffer);
console.log(`File processed successfully, returning response.`);
resolve({
statusCode: 200,
body: JSON.stringify({
message: 'File uploaded and processed successfully',
fileType,
response,
}),
});
} else {
console.log(`We do not support the file extension ${fileExtension}. Returning error.`);
reject({
statusCode: 500,
body: JSON.stringify({
mesage: `File extension ${fileExtension} is not supported. Please upload a file that has one of the following extensions: ${Object.keys(availableFileExtensionFeatures)}`,
}),
});
}
});
});
busboy.on('error', (error) => {
console.error('Error processing file', error);
reject({
statusCode: 500,
body: JSON.stringify({ error: 'Error processing file' }),
});
});
busboy.write(Buffer.from(event.body, 'base64'));
busboy.end();
});
} else {
return {
statusCode: 400,
body: JSON.stringify({ error: 'Invalid request format' }),
};
}
};