Spaces:
Running
Running
| import { GoogleGenerativeAI } from '@google/generative-ai'; | |
| export default async function handler(req, res) { | |
| if (req.method !== 'POST') { | |
| return res.status(405).json({ error: 'Method not allowed' }); | |
| } | |
| try { | |
| // Extract material description from request body | |
| const { materialDescription } = req.body; | |
| if (!materialDescription) { | |
| return res.status(200).json({ | |
| name: 'Unknown Material', | |
| details: 'Add standard material properties with accurate surface texturing.' | |
| }); | |
| } | |
| // Initialize the Google Generative AI with API key | |
| const apiKey = process.env.GEMINI_API_KEY; | |
| if (!apiKey) { | |
| console.error("Missing GEMINI_API_KEY"); | |
| // Return a 200 with fallback data instead of error | |
| return res.status(200).json({ | |
| name: materialDescription, | |
| details: `Emphasize the characteristic properties of ${materialDescription.toLowerCase()} with accurate surface texturing.` | |
| }); | |
| } | |
| try { | |
| const genAI = new GoogleGenerativeAI(apiKey); | |
| const model = genAI.getGenerativeModel({ | |
| model: "gemini-pro", | |
| generationConfig: { | |
| temperature: 0.7, | |
| topP: 0.8, | |
| topK: 40 | |
| } | |
| }); | |
| // Create prompt for material enhancement | |
| const prompt = `Given the material description "${materialDescription}", provide: | |
| 1. A concise material name (2-3 words maximum, keep original name if simple enough) | |
| 2. Please provide contextual, specific material properties to enhance the existing prompt: | |
| "Transform this sketch into a [material] material. Render it in a high-end 3D visualization style with professional studio lighting against a pure black background. Make it look like an elegant Cinema 4D and Octane rendering with detailed material properties and characteristics. The final result should be a premium product visualization with perfect studio lighting, crisp shadows, and high-end material definition." | |
| Format response STRICTLY as JSON: | |
| { | |
| "name": "Material Name", | |
| "details": "Only additional material properties," | |
| } | |
| Requirements: | |
| - Keep name simple if input is already concise (e.g., "rusted iron" stays as "Rusted Iron") | |
| - Simplify complex descriptions (e.g., "glass beads made of fire" becomes "Molten Glass") | |
| - Details should focus on physical properties, visual characteristics, and rendering techniques. Feel free to be creative! :) | |
| - Do not repeat what's already in the base prompt (black background, lighting, etc) | |
| - Keep details concise and technical`; | |
| // Generate content with the model | |
| const result = await model.generateContent(prompt); | |
| const response = result.response; | |
| const responseText = response.text(); | |
| try { | |
| // Try to parse the response as JSON | |
| const jsonResponse = JSON.parse(responseText); | |
| // Validate the response format | |
| if (!jsonResponse.name || !jsonResponse.details) { | |
| throw new Error('Invalid response format from AI'); | |
| } | |
| return res.status(200).json(jsonResponse); | |
| } catch (error) { | |
| console.error('Error parsing AI response or invalid format:', error.message); | |
| // Fallback: Use the original description, capitalized, and provide empty details. | |
| // This keeps the JSON structure consistent for the frontend. | |
| const capitalizedName = materialDescription | |
| .split(' ') | |
| .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) | |
| .join(' '); | |
| return res.status(200).json({ | |
| name: capitalizedName, | |
| details: "" | |
| }); | |
| } | |
| } catch (aiError) { | |
| console.error('Error calling Generative AI Model:', aiError); | |
| // Fallback if the AI call itself fails | |
| const capitalizedName = materialDescription | |
| .split(' ') | |
| .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) | |
| .join(' '); | |
| return res.status(500).json({ | |
| name: capitalizedName, | |
| details: "" | |
| }); | |
| } | |
| } catch (error) { | |
| // Catch errors before AI initialization (e.g., API key issue) | |
| console.error('API handler setup error:', error); | |
| return res.status(500).json({ error: 'Internal server error' }); | |
| } | |
| } |