- Replace boilerplate with complete Design Buddy application - Add AI-powered room design generation using Google Gemini SDK - Implement user authentication with Google OAuth via Better Auth - Create credit system with 30 free credits for new users - Build image upload interface with drag-and-drop functionality - Add room type and design style selection (Living Room, Kitchen, etc.) - Implement AI generation with geographical restriction handling - Add credit refund system for API failures - Create responsive landing page with feature sections - Replace all branding and navigation with Design Buddy theme - Add complete user dashboard with real-time credit balance - Implement download functionality for generated designs 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
67 lines
1.6 KiB
Markdown
67 lines
1.6 KiB
Markdown
// To run this code you need to install the following dependencies:
|
|
// npm install @google/genai mime
|
|
// npm install -D @types/node
|
|
|
|
import {
|
|
GoogleGenAI,
|
|
} from '@google/genai';
|
|
import mime from 'mime';
|
|
import { writeFile } from 'fs';
|
|
|
|
function saveBinaryFile(fileName: string, content: Buffer) {
|
|
writeFile(fileName, content, 'utf8', (err) => {
|
|
if (err) {
|
|
console.error(`Error writing file ${fileName}:`, err);
|
|
return;
|
|
}
|
|
console.log(`File ${fileName} saved to file system.`);
|
|
});
|
|
}
|
|
|
|
async function main() {
|
|
const ai = new GoogleGenAI({
|
|
apiKey: process.env.GEMINI_API_KEY,
|
|
});
|
|
const config = {
|
|
responseModalities: [
|
|
'IMAGE',
|
|
'TEXT',
|
|
],
|
|
};
|
|
const model = 'gemini-2.5-flash-image-preview';
|
|
const contents = [
|
|
{
|
|
role: 'user',
|
|
parts: [
|
|
{
|
|
text: `INSERT_INPUT_HERE`,
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
const response = await ai.models.generateContentStream({
|
|
model,
|
|
config,
|
|
contents,
|
|
});
|
|
let fileIndex = 0;
|
|
for await (const chunk of response) {
|
|
if (!chunk.candidates || !chunk.candidates[0].content || !chunk.candidates[0].content.parts) {
|
|
continue;
|
|
}
|
|
if (chunk.candidates?.[0]?.content?.parts?.[0]?.inlineData) {
|
|
const fileName = `ENTER_FILE_NAME_${fileIndex++}`;
|
|
const inlineData = chunk.candidates[0].content.parts[0].inlineData;
|
|
const fileExtension = mime.getExtension(inlineData.mimeType || '');
|
|
const buffer = Buffer.from(inlineData.data || '', 'base64');
|
|
saveBinaryFile(`${fileName}.${fileExtension}`, buffer);
|
|
}
|
|
else {
|
|
console.log(chunk.text);
|
|
}
|
|
}
|
|
}
|
|
|
|
main();
|