90 lines
2.7 KiB
JavaScript
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);
|
|
}
|
|
});
|