|
import { GoogleGenerativeAI } from "@google/generative-ai"; |
|
|
|
|
|
const apiKey = process.env.GEMINI_API_KEY; |
|
const genAI = new GoogleGenerativeAI(apiKey); |
|
|
|
|
|
const MAX_RETRIES = 3; |
|
|
|
const RETRY_DELAY = 1000; |
|
|
|
|
|
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); |
|
|
|
export default async function handler(req, res) { |
|
if (req.method !== 'POST') { |
|
return res.status(405).json({ error: 'Method not allowed' }); |
|
} |
|
|
|
try { |
|
const { image, prompt } = req.body; |
|
|
|
if (!image) { |
|
return res.status(400).json({ error: 'Image data is required' }); |
|
} |
|
|
|
|
|
const base64Image = image.replace(/^data:image\/(png|jpeg|jpg);base64,/, ''); |
|
|
|
|
|
const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash" }); |
|
|
|
|
|
const promptText = prompt || "μ΄ μ΄λ―Έμ§λ₯Ό λ³΄κ³ (λ³΄μΌ μλ μλ μμ΄λ μκ°λ½μ 무μν μ±) μ€λ‘μ§ playing cardsλ§ μλ³νμΈμ. μλ³λ μΉ΄λμ μ νν μ λ³΄λ§ μΆλ ₯νμΈμ(μ, A μ€νμ΄λ, 10 ννΈ, J λ€μ΄μλͺ¬λ"; |
|
|
|
|
|
const imagePart = { |
|
inlineData: { |
|
data: base64Image, |
|
mimeType: "image/jpeg", |
|
}, |
|
}; |
|
|
|
|
|
let lastError = null; |
|
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { |
|
try { |
|
|
|
const result = await model.generateContent([promptText, imagePart]); |
|
const response = await result.response; |
|
const text = response.text(); |
|
|
|
return res.status(200).json({ thought: text }); |
|
} catch (error) { |
|
console.error(`Attempt ${attempt + 1} failed:`, error.message); |
|
lastError = error; |
|
|
|
|
|
if (error.message.includes('503 Service Unavailable') || |
|
error.message.includes('THROTTLED') || |
|
error.message.includes('overloaded')) { |
|
|
|
await sleep(RETRY_DELAY * Math.pow(2, attempt)); |
|
continue; |
|
} else { |
|
|
|
break; |
|
} |
|
} |
|
} |
|
|
|
|
|
console.error('All attempts failed or non-retryable error:', lastError); |
|
|
|
|
|
if (lastError.message.includes('THROTTLED') || lastError.message.includes('overloaded')) { |
|
return res.status(503).json({ |
|
error: 'The AI service is currently busy. Please try again in a moment.', |
|
fallbackThought: "π€" |
|
}); |
|
} else if (lastError.message.includes('quota')) { |
|
return res.status(429).json({ |
|
error: 'API quota exceeded. Please try again later.', |
|
fallbackThought: "π€" |
|
}); |
|
} else { |
|
return res.status(500).json({ |
|
error: 'Something went wrong while analyzing your image.', |
|
fallbackThought: "π€" |
|
}); |
|
} |
|
} catch (error) { |
|
console.error('Unexpected error:', error); |
|
return res.status(500).json({ |
|
error: 'An unexpected error occurred', |
|
fallbackThought: "π€" |
|
}); |
|
} |
|
} |