fix tickets

This commit is contained in:
Thomas Demirdjian
2025-10-03 16:19:48 +02:00
parent a1d00b8cf6
commit f3229be1f0
13 changed files with 273 additions and 77 deletions
+105 -1
View File
@@ -1,4 +1,4 @@
const { onCall } = require("firebase-functions/v2/https");
const { onCall, HttpsError } = require("firebase-functions/v2/https");
const { z } = require("genkit");
const { generateAI, analyseLyrics } = require("../helpers/gemini");
const {
@@ -10,6 +10,64 @@ const axios = require("axios");
const admin = require("firebase-admin");
const { refList } = require("../index");
const TOXIC_KEYWORDS = [
/\bnazis?\b/i,
/\bnazisme\b/i,
/\bnéo[- ]?nazis?\b/i,
/\banti[- ]?s[eé]mites?\b/i,
/\bantis[eé]mitisme\b/i,
/\bracis(tes?|me)\b/i,
/\bwhite\s+supremac(?:y|istes?|ism)\b/i,
/\bku\s*klux\s*klan\b/i,
];
const buildModerationBrief = ({
objective,
context,
style,
audience,
emotion,
structure,
rhymes,
}) => {
const sections = [
`<OBJECTIF>${objective || ""}</OBJECTIF>`,
`<CONTEXTE>${context || ""}</CONTEXTE>`,
`<EMOTION>${emotion || ""}</EMOTION>`,
`<STYLE>${style || ""}</STYLE>`,
`<AUDIENCE>${audience || ""}</AUDIENCE>`,
`<RIMES>${Array.isArray(rhymes) ? rhymes.join(", ") : rhymes || ""}</RIMES>`,
];
if (Array.isArray(structure) && structure.length) {
sections.push(`<STRUCTURE>${structure.join(" | ")}</STRUCTURE>`);
}
return `<BRIEF_UTILISATEUR>\n${sections.join("\n")}\n</BRIEF_UTILISATEUR>`;
};
const moderationIndicatesBlock = (moderation = {}, fallbackText = "") => {
if (!moderation || typeof moderation !== "object") return false;
if (moderation.blocked === true) return true;
const excerpts = Array.isArray(moderation.excerpts)
? moderation.excerpts
: [];
const reasons = Array.isArray(moderation.reasons)
? moderation.reasons
: [];
const keywordDetected = (value) =>
typeof value === "string" && TOXIC_KEYWORDS.some((rx) => rx.test(value));
if (excerpts.some((item) => keywordDetected(item?.quote))) return true;
if (reasons.some((item) => keywordDetected(item))) return true;
if (keywordDetected(fallbackText)) return true;
return false;
};
exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => {
try {
const {
@@ -22,6 +80,52 @@ exports.generateLyrics = onCall({}, async ({ auth = {}, data = {} }) => {
rhymes = "",
} = data;
const moderationPayload = {
objective,
context,
style,
audience,
emotion,
structure,
rhymes,
};
const moderationInput = buildModerationBrief(moderationPayload);
try {
const moderation = await analyseLyrics({
title: "Brief utilisateur",
lyrics: moderationInput,
});
if (moderationIndicatesBlock(moderation, moderationInput)) {
console.warn("generateLyrics blocked by moderation", {
reasons: moderation?.reasons,
excerpts: moderation?.excerpts,
});
const summary = Array.isArray(moderation?.reasons)
? moderation.reasons.slice(0, 3).join(", ")
: "contenu sensible";
throw new HttpsError(
"invalid-argument",
`Certaines informations saisies contiennent des termes interdits (${summary}). Merci de reformuler pour poursuivre la création des paroles.`,
{ moderation },
);
}
} catch (moderationError) {
if (moderationError instanceof HttpsError) {
throw moderationError;
}
console.error("generateLyrics moderation failure", moderationError);
throw new HttpsError(
"internal",
"Impossible de vérifier le brief pour le moment. Merci de réessayer dans quelques instants.",
);
}
console.log("Function generate lyrics start with data", data);
const system = `