backend
This commit is contained in:
parent
e3d416ff0e
commit
797fec3135
32 changed files with 3770 additions and 0 deletions
148
backend/index_vertexai.js
Executable file
148
backend/index_vertexai.js
Executable file
|
@ -0,0 +1,148 @@
|
|||
import 'dotenv/config'; // Load environment variables from .env file
|
||||
import {GoogleAuth} from 'google-auth-library';
|
||||
import {GoogleGenAI} from '@google/genai';
|
||||
import * as fs from 'fs'; // Import the file system module
|
||||
|
||||
const inputImagePath = 'strawberry.jpg';
|
||||
const msg1Text1 = {text: `Do you remember a pineapple image? show the pineapple image`};
|
||||
|
||||
const outputImagePath = 'strawberry_output.png';
|
||||
const project = 'gen-lang-client-0531051429';
|
||||
const location = 'global'; // It's best practice to use a specific region
|
||||
const model = 'gemini-2.0-flash-preview-image-generation';
|
||||
|
||||
// --- Authentication using Service Account Key ---
|
||||
const auth = new GoogleAuth({
|
||||
keyFilename: './gen-lang-client-0531051429-7455e402c041.json', // <-- Path to your downloaded key file
|
||||
scopes: ['https://www.googleapis.com/auth/cloud-platform'],
|
||||
});
|
||||
|
||||
// Initialize Vertex with your Cloud project and location
|
||||
const ai = new GoogleGenAI({
|
||||
vertexai: true,
|
||||
project: project,
|
||||
location: location,
|
||||
googleAuth: auth,
|
||||
});
|
||||
// Define the log file path
|
||||
const logFile = 'app.log';
|
||||
|
||||
// Set up generation config
|
||||
const generationConfig = {
|
||||
maxOutputTokens: 8192,
|
||||
temperature: 1,
|
||||
topP: 0.95,
|
||||
responseModalities: ["TEXT", "IMAGE"],
|
||||
safetySettings: [
|
||||
{
|
||||
category: 'HARM_CATEGORY_HATE_SPEECH',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_DANGEROUS_CONTENT',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_SEXUALLY_EXPLICIT',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_HARASSMENT',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_IMAGE_HATE',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_IMAGE_DANGEROUS_CONTENT',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_IMAGE_HARASSMENT',
|
||||
threshold: 'OFF',
|
||||
},
|
||||
{
|
||||
category: 'HARM_CATEGORY_IMAGE_SEXUALLY_EXPLICIT',
|
||||
threshold: 'OFF',
|
||||
}
|
||||
],
|
||||
};
|
||||
|
||||
const imageBuffer = fs.readFileSync(inputImagePath);
|
||||
const imageBase64 = imageBuffer.toString('base64');
|
||||
|
||||
const msg1Image1 = {
|
||||
inlineData: {
|
||||
mimeType: 'image/jpeg',
|
||||
data: imageBase64
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const chat = ai.chats.create({
|
||||
model: model,
|
||||
config: generationConfig
|
||||
});
|
||||
|
||||
/**
|
||||
* Appends a message to the log file.
|
||||
* @param {string} message The message to log.
|
||||
*/
|
||||
function writeToLog(message) {
|
||||
fs.appendFile(logFile, message + '\n', (err) => {
|
||||
if (err) {
|
||||
console.error('Error writing to log file:', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function sendMessage(message) {
|
||||
const response = await chat.sendMessageStream({
|
||||
message: message
|
||||
});
|
||||
console.log(JSON.stringify(response).substring(0, 1000));
|
||||
process.stdout.write('stream result: ');
|
||||
for await (const chunk of response) {
|
||||
const part = chunk.candidates?.[0]?.content?.parts?.[0];
|
||||
|
||||
console.log(JSON.stringify(chunk).substring(0, 200));
|
||||
if (chunk.text) {
|
||||
process.stdout.write(chunk.text);
|
||||
} else if (part && part.inlineData.data !== undefined && JSON.stringify(part).length > 100000) {
|
||||
// The image data is in base64 format.
|
||||
// Define the file path and name.
|
||||
// Write the base64 data to a file. [2, 4, 10]
|
||||
|
||||
return part.inlineData.data
|
||||
} else {
|
||||
writeToLog(JSON.stringify(chunk));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default async function generateContent(inputImageBase64, textDescription) {
|
||||
return await sendMessage([
|
||||
{
|
||||
inlineData: {
|
||||
mimeType: 'image/jpeg',
|
||||
data: inputImageBase64.split(',', 2)[1]
|
||||
}
|
||||
},
|
||||
{
|
||||
text: textDescription
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
||||
/*
|
||||
export default async function generateContent() {
|
||||
await sendMessage([
|
||||
msg1Image1,
|
||||
msg1Text1
|
||||
]);
|
||||
}
|
||||
|
||||
generateContent()
|
||||
*/
|
Loading…
Add table
Add a link
Reference in a new issue