main
Backend Deploy 🚀 / build-and-deploy (push) Has been cancelled

This commit is contained in:
Harun CAN
2026-04-25 14:37:46 +02:00
parent ad5a97a4fd
commit 9d8c34b39d
34 changed files with 5853 additions and 164 deletions
+23 -10
View File
@@ -279,11 +279,19 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
try {
this.logger.log(`🔄 Katman 1 (deneme ${attempt}/2): ${primaryModel}`);
const result = await this.tryGenerateContentImage(primaryModel, enhancedPrompt);
if (result) {
if (result && result.buffer.length > 0) {
this.logger.log(`✅ Görsel üretildi (${primaryModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`);
return result;
return { buffer: result.buffer, mimeType: result.mimeType };
}
this.logger.warn(`⚠️ ${primaryModel} deneme ${attempt}: görsel döndürmedi (null response)`);
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)) {
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)}`);
@@ -295,11 +303,15 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
try {
this.logger.log(`🔄 Katman 2: ${fallbackModel}`);
const result = await this.tryGenerateContentImage(fallbackModel, enhancedPrompt);
if (result) {
if (result && result.buffer.length > 0) {
this.logger.log(`✅ Görsel üretildi (${fallbackModel}): ${(result.buffer.length / 1024).toFixed(1)} KB`);
return result;
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 || '')) {
this.logger.warn(`🚫 Katman 2 Güvenlik/Politika filtresi tetiklendi. Katman 3'e geçiliyor.`);
}
this.logger.warn(`⚠️ ${fallbackModel}: görsel döndürmedi (null response)`);
} catch (err2: any) {
this.logger.warn(`⚠️ ${fallbackModel} hata: ${err2.message?.substring(0, 200)}`);
}
@@ -323,7 +335,7 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
this.logger.log(`✅ Görsel üretildi (Imagen 4): ${(buffer.length / 1024).toFixed(1)} KB`);
return { buffer, mimeType };
}
this.logger.warn('⚠️ Imagen 4: görsel döndürmedi');
this.logger.warn(`⚠️ Imagen 4: görsel döndürmedi. Üretilen görsel sayısı: ${response.generatedImages?.length || 0}`);
} catch (err3: any) {
this.logger.warn(`⚠️ Imagen 4 hata: ${err3.message?.substring(0, 200)}`);
}
@@ -343,7 +355,7 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
private async tryGenerateContentImage(
model: string,
prompt: string,
): Promise<{ buffer: Buffer; mimeType: string } | null> {
): Promise<{ buffer: Buffer; mimeType: string; errorReason?: string } | null> {
const response = await this.client!.models.generateContent({
model,
contents: prompt,
@@ -358,7 +370,7 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
if (!candidate?.content?.parts || candidate.content.parts.length === 0) {
const finishReason = candidate?.finishReason || 'UNKNOWN';
this.logger.warn(`⚠️ ${model}: boş yanıt (finishReason: ${finishReason})`);
return null;
return { buffer: Buffer.from([]), mimeType: '', errorReason: finishReason };
}
const imagePart = candidate.content.parts.find(
@@ -375,9 +387,10 @@ IMPORTANT: Only output valid JSON, no markdown code blocks or other text.`;
const textParts = candidate.content.parts.filter((p: any) => p.text);
if (textParts.length > 0) {
this.logger.warn(`⚠️ ${model}: sadece text döndü, görsel yok. Text: "${textParts[0].text?.substring(0, 100)}"`);
return { buffer: Buffer.from([]), mimeType: '', errorReason: 'TEXT_ONLY' };
}
return null;
return { buffer: Buffer.from([]), mimeType: '', errorReason: 'NO_IMAGE_DATA' };
}
/** Basit uyku fonksiyonu — retry aralarında kullanılır */