const {onCall} = require("firebase-functions/https"); const {z} = require("genkit"); const {generateAI} = require("../index"); exports.generateLyrics = onCall({}, async ({auth = {}, data = {}}) => { try { const { objective = "Célébrer l'agence Minuit et mettre en avant son " + "expertise digitale, son esprit d'équipe et sa créativité.", context = "L'agence Minuit accompagne les startups et entreprises " + "innovantes dans la création de produits digitaux, du prototype " + "à la version de financement, jusqu'à l'optimisation et la mise " + "à l'échelle. Spécialisée dans le développement sur-mesure " + "d'applications mobiles, elle valorise l'humain, le design et " + "l'accompagnement personnalisé. Esprit nocturne, équipe passionnée.", emotion = "La Joie : expose un bonheur profond, l'émerveillement, " + "la gratitude, satisfaction intense, énergie positive.", style = "Upbeat : Pour une ambiance joyeuse et rythmée.", audience = "L'équipe Minuit et ses clients fidèles, startups " + "ambitieuses et partenaires visionnaires.", structure = ["couplet", "refrain", "couplet", "refrain"], rhymes = "Avec rimes", } = 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); } });