diff --git a/server/aiService.ts b/server/aiService.ts index 267eb72..d02cb55 100644 --- a/server/aiService.ts +++ b/server/aiService.ts @@ -3,6 +3,26 @@ import OpenAI from "openai"; // the newest OpenAI model is "gpt-5" which was released August 7, 2025. do not change this unless explicitly requested by the user const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); +// Memory for generated descriptions to avoid repetition +const generatedDescriptions = new Map>(); + +function getArtistFromTitle(title: string): string { + // Extract artist name from title (everything before the first " - ") + const match = title.match(/^([^-]+)/); + return match ? match[1].trim() : ""; +} + +function addToMemory(artist: string, description: string) { + if (!generatedDescriptions.has(artist)) { + generatedDescriptions.set(artist, new Set()); + } + generatedDescriptions.get(artist)!.add(description); +} + +function getPreviousDescriptions(artist: string): string[] { + return Array.from(generatedDescriptions.get(artist) || []); +} + export interface DescriptionGenerationOptions { maxCharacters?: number; language?: string; @@ -22,27 +42,38 @@ export async function generateVideoDescription( } = options; try { - const prompt = `Analiziraj naslov videoisranja: "${title}" + // Extract artist name for memory checking + const artist = getArtistFromTitle(title); + const previousDescriptions = getPreviousDescriptions(artist); + + const avoidRepetition = previousDescriptions.length > 0 + ? `\n\nWICHTIG: Für diesen Künstler wurden bereits folgende Beschreibungen erstellt:\n${previousDescriptions.map((desc, i) => `${i+1}. ${desc.substring(0, 100)}...`).join('\n')}\n\nErstelle eine VÖLLIG ANDERE Beschreibung mit anderen Worten, Fokus und Stil.` + : ''; -Nalogo izvršit v slovenskem jeziku. + const prompt = `Analysiere diesen Musikvideo-Titel: "${title}" -Iz naslova izvleci: -- Ime izvajalca/umetnika -- Naslov skladbe/komada -- Tip vsebine (pesem, instrumental, live nastop, itd.) +Schreibe auf DEUTSCH eine informative Beschreibung. -Ustvari informativen opis, ki vključuje: -${includeArtistInfo ? '- Informacije o izvajalcu (stil glasbe, kratka zgodovina, znani komadi)' : ''} -${includeLabelInfo ? '- Informacije o založbi ali labelu, če je znan' : ''} -- Opis stila glasbe in žanra -- Kratko ozadje o komadu, če je znan -- Čemu je namenjen (ples, poslušanje, koncert, itd.) +Aus dem Titel extrahieren: +- Name des Interpreten/Künstlers +- Titel des Liedes/Stücks +- Art des Inhalts (Lied, Instrumental, Live-Auftritt, etc.) -Opis naj bo dolg maksimalno ${maxCharacters} znakov. -Opis naj bo napisan v prijaznem, informativnem tonu. -Ne uporabljaj besed "video" ali "posnetek" - piši o glasbi sami. +Erstelle eine informative Beschreibung, die Folgendes beinhaltet: +${includeArtistInfo ? '- Informationen über den Interpreten (Musikstil, kurze Geschichte, bekannte Stücke)' : ''} +- Beschreibung des Musikstils und Genres +- Kurzer Hintergrund zum Stück, falls bekannt +- Wofür es gedacht ist (Tanz, Zuhören, Konzert, etc.) -Odgovori samo z opisom, brez dodatnih pojasnil.`; +NUR wenn du SICHERE Informationen hast, erwähne: +${includeLabelInfo ? '- Label/Plattenfirma (nur wenn du es sicher weißt)' : ''} + +Wenn du keine sicheren Informationen zu einem Punkt hast, lasse ihn WEG. Schreibe NIEMALS "Label unbekannt" oder ähnliches. + +Die Beschreibung soll maximal ${maxCharacters} Zeichen lang sein. +Schreibe in einem freundlichen, informativen Ton. +Verwende nicht die Wörter "Video" oder "Aufnahme" - schreibe über die Musik selbst. +Schreibe nur die Beschreibung, keine zusätzlichen Erklärungen.${avoidRepetition}";` console.log("Sending request to OpenAI with title:", title); // Debug log @@ -51,7 +82,7 @@ Odgovori samo z opisom, brez dodatnih pojasnil.`; messages: [ { role: "system", - content: "Si strokovnjak za glasbo in pomagaš ustvarjati kakovostne opise za glasbene vsebine. Odgovarjaš vedno v slovenskem jeziku." + content: "Du bist ein Musikexperte und hilfst bei der Erstellung hochwertiger Beschreibungen für Musikinhalte. Du antwortest immer auf Deutsch und vermeidest Wiederholungen." }, { role: "user", @@ -66,6 +97,13 @@ Odgovori samo z opisom, brez dodatnih pojasnil.`; const description = response.choices[0].message.content?.trim() || ""; + // Add to memory for this artist + if (artist && description) { + addToMemory(artist, description); + } + + console.log("Generated description:", description); // Debug log + // Ensure we don't exceed character limit if (description.length > maxCharacters) { return description.substring(0, maxCharacters - 3) + "...";