Ürünereklam
बनकर तैयारकिसी प्रोडक्ट का लिंक पेस्ट करें और तुर्की व अंग्रेज़ी में तैयार वीडियो और इमेज विज्ञापन पाएँ, जिनमें से हर एक को पैसा ख़र्च होने से पहले एक prediction मॉडल स्कोर करता है। इसकी शुरुआत 2026 में BTK Akademi Hackathon में हुई।
- मेरी भूमिका
- डिज़ाइन और डेवलपमेंट, अकेले
- साल
- 2026
- टेक्नोलॉजी
- Next.js · Inngest · Supabase · Gemini · Veo · ElevenLabs · Remotion · PyTorch on Modal · Polar
पूरा डायग्राम देखने के लिए साइड में स्क्रॉल करें।
समस्या
दो भाषाओं में विज्ञापन, उतनी तादाद में जितनी ऑनलाइन दुकानों को चाहिए, आम तौर पर हर महीने तय फ़ीस वाली एजेंसी से ही बनते हैं। तब भी बजट ख़र्च होने से पहले कोई नहीं जानता कि कौन सा वर्ज़न चलेगा।
यह कैसे बना है
एक Next.js ऐप durable Inngest jobs को orchestrate करता है। एक Python scraper प्रोडक्ट पेज पढ़ता है, और मुश्किल स्टोरफ़्रंट के लिए उसके पास एक hardened fetch path है। Gemini स्ट्रैटेजी, कॉपी और फ़्रेम लिखता है, Veo या Seedance वीडियो रेंडर करता है, ElevenLabs आवाज़ जोड़ता है, और Remotion शब्दों के साथ टाइम किए गए कैप्शन, वॉटरमार्क और call to action जोड़ता है। एक अलग स्टूडियो स्टैटिक इमेज विज्ञापन और ऐड कॉपी बनाता है। फिर हर वेरिएंट एक self-hosted मॉडल से गुज़रता है जो अंदाज़ा लगाता है कि लोग उस पर कैसी प्रतिक्रिया देंगे (TRIBE v2)। यह Modal GPUs पर चलता है, पहले शुरू किया जाता है और फिर poll किया जाता है, क्योंकि एक रेंडर edge function के timeout से ज़्यादा देर चलता है। Supabase row-level security के पीछे state रखता है, और मीडिया के लिए कम समय तक वैध रहने वाले signed URLs हैं। क्रेडिट एक append-only ledger में रहते हैं, जिसमें चार्ज और रिफ़ंड atomic होते हैं, और checkout Polar पर चलता है, जहाँ दाम लीरा और डॉलर में हैं।
अहम फ़ैसले
फ़ेल हुआ स्टेप ख़ुद ही रिफ़ंड कर देता है
पाइपलाइन durable jobs से बनी है, और हर स्टेप का अपना failure handler है। जो स्टेप बीच में बंद हो जाए, वह अपने क्रेडिट ठीक एक बार रिफ़ंड करता है और रन को अटका छोड़ने के बजाय रिलीज़ कर देता है।
मीडिया डिफ़ॉल्ट रूप से प्राइवेट है
रॉ रेंडर एक प्राइवेट bucket में रहते हैं, column-level SELECT revoke किया गया है, और मीडिया लिंक कम समय तक वैध रहने वाले signed URLs हैं। किसी भी मीडिया का पता अंदाज़े से नहीं निकाला जा सकता, फ़्री टियर में भी नहीं।
हर विज्ञापन को किसी के पैसे देने से पहले स्कोर किया जाता है
कोई भी विज्ञापन बिना स्कोर के स्टूडियो से बाहर नहीं जाता। कोई किसी वेरिएंट पर बजट लगाए, उससे पहले ही मॉडल सारे वेरिएंट रैंक कर देता है।
रिपो से कोड
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. रिफ़ंड फ़ेल होने पर error throw करने के बजाय एक RECONCILE-NEEDED मार्कर लॉग होता है, ताकि कोई क्रेडिट चुपचाप न खोए और पाइपलाइन फिर भी रन को रिलीज़ कर दे।
लाइन 27. हर इवेंट के लिए एक idempotency key: failure handler दोबारा चल सकता है, लेकिन ledger रिफ़ंड सिर्फ़ एक बार दर्ज करता है।
लाइन 28. रिफ़ंड की वजह तुर्की में लिखी है, क्योंकि प्रोडक्ट शुरू से आख़िर तक दो भाषाओं में है।
अभी कहाँ तक पहुँचा
यह एक हैकाथॉन डेमो से बढ़कर GPU स्कोरिंग वाला दो भाषाओं का प्रोडक्ट बन गया। अब यह closed source है, और पेड लॉन्च की तैयारी चल रही है।