generated from fahricansecer/boilerplate-be
@@ -257,6 +257,7 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
|
||||
prompt: string,
|
||||
aspectRatio: '16:9' | '9:16' | '1:1' = '16:9',
|
||||
isIllustration: boolean = false,
|
||||
forceImagen: boolean = false,
|
||||
): Promise<{ buffer: Buffer; mimeType: string } | null> {
|
||||
if (!this.isAvailable()) {
|
||||
throw new Error('Gemini AI is not available. Check your configuration.');
|
||||
@@ -287,73 +288,77 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
|
||||
: `SUBJECT: ${prompt}\n\nINSTRUCTIONS: Generate a high-quality photorealistic cinematic image of the EXACT SUBJECT described above. Use professional lighting and make it highly detailed. Aspect ratio: ${aspectRatio} ${orientation}. DO NOT deviate from the SUBJECT.`;
|
||||
|
||||
// ── Katman 1: gemini-2.5-flash-image (Nano Banana) — 2 deneme ──
|
||||
for (let attempt = 1; attempt <= 2; attempt++) {
|
||||
try {
|
||||
this.logger.log(`🔄 Katman 1 (deneme ${attempt}/2): ${primaryModel}`);
|
||||
const result = await this.tryGenerateContentImage(
|
||||
primaryModel,
|
||||
enhancedPrompt,
|
||||
);
|
||||
if (result && result.buffer.length > 0) {
|
||||
this.logger.log(
|
||||
`✅ Görsel üretildi (${primaryModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`,
|
||||
if (!forceImagen) {
|
||||
for (let attempt = 1; attempt <= 2; attempt++) {
|
||||
try {
|
||||
this.logger.log(`🔄 Katman 1 (deneme ${attempt}/2): ${primaryModel}`);
|
||||
const result = await this.tryGenerateContentImage(
|
||||
primaryModel,
|
||||
enhancedPrompt,
|
||||
);
|
||||
return { buffer: result.buffer, mimeType: result.mimeType };
|
||||
}
|
||||
if (result && result.buffer.length > 0) {
|
||||
this.logger.log(
|
||||
`✅ Görsel üretildi (${primaryModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`,
|
||||
);
|
||||
return { buffer: result.buffer, mimeType: result.mimeType };
|
||||
}
|
||||
|
||||
const reason = result?.errorReason || 'null response';
|
||||
this.logger.warn(
|
||||
`⚠️ ${primaryModel} deneme ${attempt}: görsel döndürmedi (${reason})`,
|
||||
);
|
||||
|
||||
if (
|
||||
['IMAGE_OTHER', 'SAFETY', 'PROHIBITED_CONTENT'].includes(reason)
|
||||
) {
|
||||
const reason = result?.errorReason || 'null response';
|
||||
this.logger.warn(
|
||||
`🚫 Güvenlik/Politika filtresi tetiklendi (${reason}). Denemeler iptal ediliyor.`,
|
||||
`⚠️ ${primaryModel} deneme ${attempt}: görsel döndürmedi (${reason})`,
|
||||
);
|
||||
break; // Fail fast for safety blocks
|
||||
}
|
||||
|
||||
if (attempt < 2) await this.sleep(2000);
|
||||
} catch (err1: any) {
|
||||
this.logger.warn(
|
||||
`⚠️ ${primaryModel} deneme ${attempt} hata: ${err1.message?.substring(0, 200)}`,
|
||||
);
|
||||
if (attempt < 2) await this.sleep(2000);
|
||||
if (
|
||||
['IMAGE_OTHER', 'SAFETY', 'PROHIBITED_CONTENT'].includes(reason)
|
||||
) {
|
||||
this.logger.warn(
|
||||
`🚫 Güvenlik/Politika filtresi tetiklendi (${reason}). Denemeler iptal ediliyor.`,
|
||||
);
|
||||
break; // Fail fast for safety blocks
|
||||
}
|
||||
|
||||
if (attempt < 2) await this.sleep(2000);
|
||||
} catch (err1: any) {
|
||||
this.logger.warn(
|
||||
`⚠️ ${primaryModel} deneme ${attempt} hata: ${err1.message?.substring(0, 200)}`,
|
||||
);
|
||||
if (attempt < 2) await this.sleep(2000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Katman 2: gemini-3.1-flash-image-preview (Nano Banana 2) ──
|
||||
try {
|
||||
this.logger.log(`🔄 Katman 2: ${fallbackModel}`);
|
||||
const result = await this.tryGenerateContentImage(
|
||||
fallbackModel,
|
||||
enhancedPrompt,
|
||||
);
|
||||
if (result && result.buffer.length > 0) {
|
||||
this.logger.log(
|
||||
`✅ Görsel üretildi (${fallbackModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`,
|
||||
if (!forceImagen) {
|
||||
try {
|
||||
this.logger.log(`🔄 Katman 2: ${fallbackModel}`);
|
||||
const result = await this.tryGenerateContentImage(
|
||||
fallbackModel,
|
||||
enhancedPrompt,
|
||||
);
|
||||
return { buffer: result.buffer, mimeType: result.mimeType };
|
||||
}
|
||||
this.logger.warn(
|
||||
`⚠️ ${fallbackModel}: görsel döndürmedi (${result?.errorReason || 'null response'})`,
|
||||
);
|
||||
|
||||
if (
|
||||
['IMAGE_OTHER', 'SAFETY', 'PROHIBITED_CONTENT'].includes(
|
||||
result?.errorReason || '',
|
||||
)
|
||||
) {
|
||||
if (result && result.buffer.length > 0) {
|
||||
this.logger.log(
|
||||
`✅ Görsel üretildi (${fallbackModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`,
|
||||
);
|
||||
return { buffer: result.buffer, mimeType: result.mimeType };
|
||||
}
|
||||
this.logger.warn(
|
||||
`🚫 Katman 2 Güvenlik/Politika filtresi tetiklendi. Katman 3'e geçiliyor.`,
|
||||
`⚠️ ${fallbackModel}: görsel döndürmedi (${result?.errorReason || 'null response'})`,
|
||||
);
|
||||
|
||||
if (
|
||||
['IMAGE_OTHER', 'SAFETY', 'PROHIBITED_CONTENT'].includes(
|
||||
result?.errorReason || '',
|
||||
)
|
||||
) {
|
||||
this.logger.warn(
|
||||
`🚫 Katman 2 Güvenlik/Politika filtresi tetiklendi. Katman 3'e geçiliyor.`,
|
||||
);
|
||||
}
|
||||
} catch (err2: any) {
|
||||
this.logger.warn(
|
||||
`⚠️ ${fallbackModel} hata: ${err2.message?.substring(0, 200)}`,
|
||||
);
|
||||
}
|
||||
} catch (err2: any) {
|
||||
this.logger.warn(
|
||||
`⚠️ ${fallbackModel} hata: ${err2.message?.substring(0, 200)}`,
|
||||
);
|
||||
}
|
||||
|
||||
// ── Katman 3: Imagen 4 Fast (generateImages API) ──
|
||||
|
||||
Reference in New Issue
Block a user