feat(ai): forcefully randomize meme templates and expand B2B YouTube channels
All checks were successful
Monorepo Pipeline / ⚡ Prioritize Release (push) Successful in 2s
Monorepo Pipeline / 🧪 Test (push) Successful in 1m3s
Monorepo Pipeline / 🧹 Lint (push) Successful in 2m38s
Monorepo Pipeline / 🏗️ Build (push) Successful in 6m23s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Directus (Base) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped
All checks were successful
Monorepo Pipeline / ⚡ Prioritize Release (push) Successful in 2s
Monorepo Pipeline / 🧪 Test (push) Successful in 1m3s
Monorepo Pipeline / 🧹 Lint (push) Successful in 2m38s
Monorepo Pipeline / 🏗️ Build (push) Successful in 6m23s
Monorepo Pipeline / 🚀 Release (push) Has been skipped
Monorepo Pipeline / 🐳 Build Directus (Base) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Gatekeeper (Product) (push) Has been skipped
Monorepo Pipeline / 🐳 Build Build-Base (push) Has been skipped
Monorepo Pipeline / 🐳 Build Production Runtime (push) Has been skipped
This commit is contained in:
@@ -145,7 +145,9 @@ export class AiBlogPostOrchestrator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (newFmMatch && newFmMatch[1]) {
|
} else if (newFmMatch && newFmMatch[1]) {
|
||||||
console.log(`ℹ️ Rename skipped (permalink stability active). If you want to rename, use --rename.`);
|
console.log(
|
||||||
|
`ℹ️ Rename skipped (permalink stability active). If you want to rename, use --rename.`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Idea 5: Automatic Thumbnails
|
// Idea 5: Automatic Thumbnails
|
||||||
@@ -177,7 +179,9 @@ export class AiBlogPostOrchestrator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (physicalFileExists) {
|
if (physicalFileExists) {
|
||||||
console.log(`⏭️ Thumbnail already exists on disk, skipping generation: ${thumbnailAbsPath}`);
|
console.log(
|
||||||
|
`⏭️ Thumbnail already exists on disk, skipping generation: ${thumbnailAbsPath}`,
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
const visualPrompt = await this.generateVisualPrompt(finalContent);
|
const visualPrompt = await this.generateVisualPrompt(finalContent);
|
||||||
await this.thumbnailGenerator.generateImage(
|
await this.thumbnailGenerator.generateImage(
|
||||||
@@ -400,6 +404,29 @@ Return ONLY the JSON.`,
|
|||||||
})
|
})
|
||||||
.join("\n\n");
|
.join("\n\n");
|
||||||
|
|
||||||
|
const memeTemplates = [
|
||||||
|
"distracted",
|
||||||
|
"gb",
|
||||||
|
"fine",
|
||||||
|
"ds",
|
||||||
|
"gru",
|
||||||
|
"cmm",
|
||||||
|
"ahb",
|
||||||
|
"uno",
|
||||||
|
"disastergirl",
|
||||||
|
"pigeon",
|
||||||
|
"rollsafe",
|
||||||
|
"pikachu",
|
||||||
|
"slap",
|
||||||
|
"exit",
|
||||||
|
"mordor",
|
||||||
|
"panik-kalm-panik",
|
||||||
|
"womanyellingcat",
|
||||||
|
"grumpycat",
|
||||||
|
];
|
||||||
|
const forcedMeme =
|
||||||
|
memeTemplates[Math.floor(Math.random() * memeTemplates.length)];
|
||||||
|
|
||||||
const response = await this.openai.chat.completions.create({
|
const response = await this.openai.chat.completions.create({
|
||||||
model: this.model,
|
model: this.model,
|
||||||
messages: [
|
messages: [
|
||||||
@@ -438,7 +465,7 @@ BLOG POST BEST PRACTICES (MANDATORY):
|
|||||||
- DEVIL'S ADVOCATE: Füge zwingend eine kurze kritische Sektion ein (z.B. mit \`<ComparisonRow>\` oder \`<IconList>\`), in der du offen die Nachteile/Kosten/Haken deiner eigenen Lösung ansprichst ("Der Haken an der Sache..."). Das baut Vertrauen bei B2B Entscheidenden auf.
|
- DEVIL'S ADVOCATE: Füge zwingend eine kurze kritische Sektion ein (z.B. mit \`<ComparisonRow>\` oder \`<IconList>\`), in der du offen die Nachteile/Kosten/Haken deiner eigenen Lösung ansprichst ("Der Haken an der Sache..."). Das baut Vertrauen bei B2B Entscheidenden auf.
|
||||||
- FAQ GENERATOR: Am absoluten Ende des Artikels erstellst du zwingend eine Markdown-Liste mit den 3 wichtigsten Fragen (FAQ) und Antworten (jeweils 2 Sätze) für Google Rich Snippets. Nutze dazu das FAQSection Component oder normales Markdown.
|
- FAQ GENERATOR: Am absoluten Ende des Artikels erstellst du zwingend eine Markdown-Liste mit den 3 wichtigsten Fragen (FAQ) und Antworten (jeweils 2 Sätze) für Google Rich Snippets. Nutze dazu das FAQSection Component oder normales Markdown.
|
||||||
- SUBTLE CTAs: Webe 1-2 subtile CTAs für High-End Website Entwicklung ein. Nutze ZWINGEND die Komponente [LeadMagnet] für diese Zwecke anstelle von einfachen Buttons. [LeadMagnet] bietet mehr Kontext und Vertrauen. Beispiel: <LeadMagnet title="Performance-Check anfragen" description="Wir analysieren Ihre Core Web Vitals und decken Umsatzpotenziale auf." buttonText="Jetzt analysieren lassen" href="/contact" variant="performance" />. Die Texte im LeadMagnet müssen absolut überzeugend, hochprofessionell und B2B-fokussiert sein (KEIN Robotik-Marketing-Sprech).
|
- SUBTLE CTAs: Webe 1-2 subtile CTAs für High-End Website Entwicklung ein. Nutze ZWINGEND die Komponente [LeadMagnet] für diese Zwecke anstelle von einfachen Buttons. [LeadMagnet] bietet mehr Kontext und Vertrauen. Beispiel: <LeadMagnet title="Performance-Check anfragen" description="Wir analysieren Ihre Core Web Vitals und decken Umsatzpotenziale auf." buttonText="Jetzt analysieren lassen" href="/contact" variant="performance" />. Die Texte im LeadMagnet müssen absolut überzeugend, hochprofessionell und B2B-fokussiert sein (KEIN Robotik-Marketing-Sprech).
|
||||||
- MEME DIVERSITY: Nutze abwechslungsreiche Templates für Memes (distracted, gb, fine, ds, gru, cmm, ahb, uno, disastergirl, pigeon, rollsafe, pikachu, slap, exit, mordor, panik-kalm-panik). Wiederhole NIEMALS das gleiche Template in verschiedenen Artikeln, wenn du kannst. Wähle basierend auf dem Kontext des Artikels das passendste und sarkastischste Template.
|
- MEME DIVERSITY: Du MUSST ZWINGEND für jedes Meme (sofern passend) abwechslungsreiche Templates nutzen. Um dies zu garantieren, wurde für diesen Artikel das folgende Template ausgewählt: '${forcedMeme}'. Du MUSST EXAKT DIESES TEMPLATE NUTZEN. Versuche nicht, es durch ein Standard-Template wie 'drake' zu ersetzen!
|
||||||
- Zitat-Varianten: Wenn du Organisationen oder Studien zitierst, nutze ArticleQuote (mit isCompany=true für Firmen). Für Personen lass isCompany weg.
|
- Zitat-Varianten: Wenn du Organisationen oder Studien zitierst, nutze ArticleQuote (mit isCompany=true für Firmen). Für Personen lass isCompany weg.
|
||||||
- Füge zwingend ein prägnantes 'TL;DR' ganz am Anfang ein.
|
- Füge zwingend ein prägnantes 'TL;DR' ganz am Anfang ein.
|
||||||
- Füge ein sauberes TableOfContents ein.
|
- Füge ein sauberes TableOfContents ein.
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ ${ytVideos.map((v, i) => `[ID: ${i}] Title: "${v.title}" | Channel: "${v.channel
|
|||||||
|
|
||||||
RULES:
|
RULES:
|
||||||
1. The video MUST be highly relevant to the context.
|
1. The video MUST be highly relevant to the context.
|
||||||
2. The channel SHOULD be a tech, development, or professional business channel (avoid gaming, vlogs, unrelated topics).
|
2. The channel SHOULD be a high-quality tech, development, or professional B2B channel (e.g., Google Developers, Vercel, Theo - t3.gg, Fireship, Syntax, ByteByteGo, IBM Technology, McKinsey, Gartner, Deloitte). AVOID gaming, generic vlogs, clickbait, or unrelated topics.
|
||||||
3. If none are truly relevant, return -1.
|
3. If none are truly relevant, return -1.
|
||||||
4. If one is highly relevant, return its ID number.
|
4. If one is highly relevant, return its ID number.
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export class ThumbnailGenerator {
|
|||||||
|
|
||||||
console.log(`🎨 Generating thumbnail for topic: "${topic}"...`);
|
console.log(`🎨 Generating thumbnail for topic: "${topic}"...`);
|
||||||
|
|
||||||
let inputPayload: any = {
|
const inputPayload: any = {
|
||||||
prompt,
|
prompt,
|
||||||
aspect_ratio: "16:9",
|
aspect_ratio: "16:9",
|
||||||
output_format: "png",
|
output_format: "png",
|
||||||
|
|||||||
Reference in New Issue
Block a user