mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-19 21:18:16 +02:00
feat: Introduce AI analysis engine with detailed system prompt and user message generation for product recommendations, and add an OpenRouter client.
This commit is contained in:
1 parent
d8a9329075
commit
2b7e7bc1f4
3 files changed
+52
-1
No files matched your search
@@ -0,0 +1,39 @@
|
|||||||
|
export default function GridLoading() {
|
||||||
|
return (
|
||||||
|
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/40 backdrop-blur-sm">
|
||||||
|
<div
|
||||||
|
className="flex flex-col items-center gap-5 px-10 py-8 rounded-2xl shadow-2xl border"
|
||||||
|
style={{
|
||||||
|
background: "var(--bg-elevated)",
|
||||||
|
borderColor: "var(--border)",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Spinner */}
|
||||||
|
<div className="relative w-12 h-12">
|
||||||
|
<div
|
||||||
|
className="absolute inset-0 rounded-full border-[3px] animate-spin"
|
||||||
|
style={{
|
||||||
|
borderColor: "var(--border)",
|
||||||
|
borderTopColor: "var(--accent)",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-col items-center gap-1.5">
|
||||||
|
<span
|
||||||
|
className="text-sm font-semibold tracking-wide"
|
||||||
|
style={{ color: "var(--text-primary)" }}
|
||||||
|
>
|
||||||
|
Chargement des données
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
className="text-xs"
|
||||||
|
style={{ color: "var(--text-muted)" }}
|
||||||
|
>
|
||||||
|
Récupération des articles et calcul des scores...
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -46,8 +46,9 @@ PROMOUVOIR (Z → A) : Le verdict pré-calculé est Z, MAIS :
|
|||||||
DÉGRADER (A → Z) : Le verdict pré-calculé est A, MAIS :
|
DÉGRADER (A → Z) : Le verdict pré-calculé est A, MAIS :
|
||||||
• Tendance en effondrement (H2/H1 < 0.4)
|
• Tendance en effondrement (H2/H1 < 0.4)
|
||||||
• ET aucune réception récente
|
• ET aucune réception récente
|
||||||
• ET score < 55
|
• ET score < 55 ⚠️ SI LE SCORE EST ≥ 55, TU NE PEUX JAMAIS DÉGRADER EN Z
|
||||||
→ Les 3 conditions doivent être remplies SIMULTANÉMENT.
|
→ Les 3 conditions doivent être remplies SIMULTANÉMENT.
|
||||||
|
→ Un score élevé (≥ 55) INTERDIT toute dégradation, quelle que soit la tendance.
|
||||||
|
|
||||||
Si AUCUNE condition d'ajustement n'est remplie → CONFIRME le verdict pré-calculé.
|
Si AUCUNE condition d'ajustement n'est remplie → CONFIRME le verdict pré-calculé.
|
||||||
|
|
||||||
|
|||||||
@@ -86,6 +86,17 @@ export class OpenRouterClient {
|
|||||||
// Ré-appliquer le garde-fou pour la reco extraite du texte.
|
// Ré-appliquer le garde-fou pour la reco extraite du texte.
|
||||||
if (!ruleApplies && (reco === "B" || reco === "C" || reco === "D")) reco = "A";
|
if (!ruleApplies && (reco === "B" || reco === "C" || reco === "D")) reco = "A";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Garde-fou anti-dégradation : l'IA ne peut PAS dégrader A → Z
|
||||||
|
// si le score pré-calculé est ≥ 55 (sauf si règle manager).
|
||||||
|
// Corrige les hallucinations du LLM qui ignore la condition "score < 55".
|
||||||
|
const preScore = p.scoring?.score ?? p.score ?? 0;
|
||||||
|
const preVerdict = p.scoring?.verdict ?? (preScore >= 45 ? "A" : "Z");
|
||||||
|
if (!ruleApplies && preVerdict === "A" && reco === "Z" && preScore >= 55) {
|
||||||
|
console.warn(`[AI Guardrail] Blocked A→Z degradation for ${p.codein} (score ${preScore} ≥ 55)`);
|
||||||
|
reco = "A";
|
||||||
|
cleanInsight += " [Garde-fou : score élevé, dégradation bloquée]";
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Failed to parse AI JSON response:", content, e);
|
console.error("Failed to parse AI JSON response:", content, e);
|
||||||
// Fallback to text parsing
|
// Fallback to text parsing
|
||||||
|
|||||||
Reference in new issue
Block a user