Files
musicland/functions/src/lyrics.js
T
2025-08-08 17:30:03 +02:00

96 lines
3.6 KiB
JavaScript

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