const { onCall } = require("firebase-functions/v2/https"); const { z } = require("genkit"); const { generateAI } = require("../index"); exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => { try { const { objective = "", context = "", style = "", audience = "", emotion = "", structure = ["couplet", "refrain", "couplet", "refrain"], rhymes = "", } = data; console.log("Function generate lyrics start with data", data); const system = ` Tu es un parolier expert en chanson française moderne et populaire. Tu écris des chansons marquantes, accessibles, sur des thématiques ` + `d'innovation, d'esprit d'équipe et de créativité digitale. Ton ` + `écriture doit toucher à la fois l'humain, le collectif et la ` + `passion d'entreprendre. Tu dois générer un titre accrocheur et ` + `mémorable pour la chanson en plus des paroles. Respecte ` + `précisément la structure demandée et fournis le résultat dans un ` + `format JSON clair, respectant strictement le schéma demandé. `.trim(); // Construction du prompt utilisateur const prompt = ` Objectif : ${objective} Contexte : ${context} Émotion : ${emotion} Style musical : ${style} Audience cible : ${audience} Structure de la chanson : ${structure.join(" => ")} Schéma de rimes : ${rhymes} Génère un titre accrocheur et les paroles de la chanson en suivant ` + `strictement cette structure. Le titre doit être court, ` + `mémorable et refléter l'esprit de l'agence Minuit. Pour chaque ` + `partie ("couplet" ou "refrain"), écris 4 à 16 lignes adaptées, ` + `expressives et cohérentes avec le style et l'émotion souhaitée. `.trim(); // Définition du schéma zod/genkit pour la validation du retour const lyricsSchema = z.object({ title: z.string().describe("Titre de la chanson, court et accrocheur"), lyrics: z .array( z.object({ type: z .string() .describe( 'Type de section : "couplet" ou "refrain" ' + "selon la structure", ), lyrics: z .string() .describe( "Paroles de la section, chaque ligne séparée " + "par un retour à la ligne", ), }), ) .describe( "Paroles de la chanson sous forme de tableau de sections " + "structurées.", ), success: z.boolean().describe("Indique si la génération a réussi"), }); return await generateAI({ system, prompt, schema: lyricsSchema, }); } catch (e) { console.log(e); } });