feat: implement AI Copilot for product analysis and recommendation, including a new analysis engine, OpenRouter client, and parser verification.

This commit is contained in:
Michael committed 2026-03-05 11:43:58 +01:00
1 parent a008b40a59
commit 2edf6202ab
5 files changed
+134 -14

No files matched your search

@@ -61,7 +61,7 @@ export class OpenRouterClient {
const data = await response.json();
const content = data.choices?.[0]?.message?.content ?? "";
let reco: "A" | "C" | "Z" | null = null;
let reco: "A" | "B" | "C" | "D" | "Z" | null = null;
let cleanInsight = "Erreur de génération.";
try {
@@ -70,16 +70,21 @@ export class OpenRouterClient {
const jsonText = jsonMatch ? jsonMatch[0] : content;
const parsed = JSON.parse(jsonText);
reco = parsed.recommendation as "A" | "C" | "Z";
reco = parsed.recommendation as "A" | "B" | "C" | "D" | "Z";
cleanInsight = parsed.justification || "";
// Garde-fou : C est réservé aux saisonniers (gestion manuelle).
// Si l'IA recommande C malgré l'interdiction dans le prompt → forcer A.
if (reco === "C") reco = "A";
const ruleApplies = parsed.rule_applies === true;
// Garde-fou de sécurité : On n'autorise B, C ou D QUE si une règle manager s'applique.
if (!ruleApplies && (reco === "B" || reco === "C" || reco === "D")) {
reco = "A";
}
// Override recommendation if it doesn't match extracted reco for safety
if (!reco || !["A", "Z"].includes(reco)) {
if (!reco || !["A", "B", "C", "D", "Z"].includes(reco)) {
reco = AnalysisEngine.extractRecommendation(cleanInsight) || "A";
// Ré-appliquer le garde-fou pour la reco extraite du texte.
if (!ruleApplies && (reco === "B" || reco === "C" || reco === "D")) reco = "A";
}
} catch (e) {
console.error("Failed to parse AI JSON response:", content, e);