Files
musicland/functions/src/lyrics.js
T
2025-09-03 15:43:22 +02:00

90 lines
2.7 KiB
JavaScript

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);
}
});