Ürünereklam
HazırBir ürün linki yapıştır, Türkçe ve İngilizce hazır video ve görsel reklamlar al; her biri para harcanmadan önce bir tahmin modeli tarafından puanlanıyor. 2026'da BTK Akademi Hackathon'unda başladı.
- Rolüm
- Tasarım ve geliştirme, tek başıma
- Yıl
- 2026
- Teknolojiler
- Next.js · Inngest · Supabase · Gemini · Veo · ElevenLabs · Remotion · PyTorch on Modal · Polar
Diyagramın tamamını görmek için yana kaydırın.
Problem
Online mağazaların ihtiyaç duyduğu hacimde iki dilli reklam genelde aylık sabit ücretli bir ajans demek. O zaman bile hangi versiyonun işe yarayacağını bütçe harcanmadan kimse bilmiyor.
Nasıl yapıldı
Bir Next.js uygulaması dayanıklı Inngest job'larını yönetiyor. Python bir scraper ürün sayfasını okuyor; zorlu mağazalar için sağlamlaştırılmış bir fetch yolu var. Gemini stratejiyi, metni ve kareleri yazıyor, Veo ya da Seedance videoyu render ediyor, ElevenLabs sesi ekliyor, Remotion da kelimeye zamanlanmış altyazıları, filigranı ve call to action'ı ekliyor. Ayrı bir stüdyo statik görsel reklamlar ve reklam metinleri üretiyor. Sonra her varyant, insanların ona nasıl tepki vereceğini tahmin eden ve kendi host ettiğimiz bir modelden (TRIBE v2) Modal GPU'larında geçiyor; job başlatılıp sonra yoklanıyor, çünkü bir render bir edge function'ın timeout süresinden uzun sürüyor. Supabase, durumu row-level security arkasında, kısa ömürlü imzalı medya URL'leriyle tutuyor. Krediler atomik harcama ve iadelerle append-only bir defterde duruyor; ödeme Polar üzerinden, TL ve dolar fiyatlarıyla.
Önemli kararlar
Hata veren adım kendi iadesini yapıyor
Pipeline, her adım için bir failure handler'ı olan dayanıklı job'lardan oluşuyor. Çöken bir adım kredilerini tam bir kez iade ediyor ve çalışmayı askıda bırakmak yerine serbest bırakıyor.
Medya varsayılan olarak gizli
Ham render'lar private bir bucket'ta duruyor, sütun düzeyinde SELECT yetkisi kaldırılmış ve medya linkleri kısa ömürlü imzalı URL'ler. Hiçbir medya adresi tahmin edilemiyor, ücretsiz katman da dahil.
Her reklam, kimse parasını ödemeden önce puanlanıyor
Hiçbir reklam puanı olmadan stüdyodan çıkmıyor. Model, kimse birine bütçe ayırmadan önce varyantları sıralıyor.
Repodan kod
async function safeRefund(
opts: Parameters<typeof refundCredits>[0],
): Promise<void> {
try {
await refundCredits(opts);
} catch (err) {
console.error(
`[billing][RECONCILE-NEEDED] refund failed user=${opts.userId} ` +1
`amount=${opts.amount} ref=${opts.refType}:${opts.refId} ` +
`key=${opts.idempotencyKey ?? "-"}`,
err,
);
}
}
// …
await safeRefund({
supa,
userId: campaign.user_id,
amount: campaignCreditCost({
videoCount: brief.videoCount ?? 1,
videoModel: brief.videoModel ?? "seedance",
durationSec: brief.durationSec,
}),
refType: "campaign",
refId: campaignId,
idempotencyKey: `refund:campaign-all:${campaignId}`,2
description: "Kampanya başlatılamadı — otomatik kredi iadesi",3
});
8. satır. Başarısız bir iade hata fırlatmak yerine RECONCILE-NEEDED işaretiyle log'a düşüyor; böylece hiçbir kredi sessizce kaybolmuyor ve pipeline çalışmayı yine de serbest bırakıyor.
27. satır. Her olay için tek bir idempotency key: failure handler yeniden çalışabilir ama defter iadeyi yalnızca bir kez kaydediyor.
28. satır. İade nedeni Türkçe, çünkü ürün baştan sona iki dilli.
Şu an ne durumda
Bir hackathon demosundan GPU puanlamalı, iki dilli bir ürüne dönüştü. Artık kapalı kaynak ve ücretli lansmanı hazırlanıyor.