2026-05-27 13:18:45 +02:00
import { NextRequest , NextResponse } from "next/server" ;
import OpenAI from "openai" ;
2026-05-28 22:52:49 +02:00
// Groq — API OpenAI-compatible, niveau gratuit, modèles Llama
const groq = new OpenAI ({
apiKey : process.env.GROQ_API_KEY ?? "" ,
baseURL : "https://api.groq.com/openai/v1" ,
2026-05-27 13:18:45 +02:00
});
const SYSTEM_PROMPT = `Tu es un analyste macro Forex senior. Tu analyses les données macroéconomiques de 8 devises majeures (USD, EUR, GBP, JPY, CHF, CAD, AUD, NZD) et tu fournis des synthèses concises et actionnables pour un trader particulier.
Tes analyses sont :
- Directes et factuelles — pas de conditionnel excessif
- Structurées en 3-4 points maximum
- Focalisées sur les divergences et signaux de trading
- En français
- Sans disclaimers légaux
Format de réponse : texte court, 80-120 mots maximum par devise.` ;
export async function POST ( req : NextRequest ) {
2026-05-28 22:52:49 +02:00
const apiKey = process . env . GROQ_API_KEY ;
2026-05-27 13:18:45 +02:00
if ( ! apiKey ) {
2026-05-29 12:13:05 +02:00
return NextResponse . json ({ error : "GROQ_API_KEY manquant — ajouter dans Vercel → Settings → Environment Variables" }, { status : 503 });
2026-05-27 13:18:45 +02:00
}
let body : {
mode : "cb_analysis" | "expert_opinion" | "summary" | "divergence" ;
currency? : string ;
data? : unknown ;
userInput? : string ;
};
try {
body = await req . json ();
} catch {
return NextResponse . json ({ error : "Invalid JSON body" }, { status : 400 });
}
const { mode , currency , data , userInput } = body ;
let userMessage = "" ;
switch ( mode ) {
case "cb_analysis" :
userMessage = `Analyse le communiqué de la banque centrale pour ${ currency } .
Données contextuelles : ${ JSON . stringify ( data , null , 2 ) }
Fournis une analyse en 4 points :
1. Changement de ton (hawkish/dovish/neutre)
2. Évolution des projections de taux
3. Phrases clés ajoutées ou supprimées vs précédent
4. Impact suggéré sur ${ currency } (+1 haussier / 0 neutre / -1 baissier)` ;
break ;
case "expert_opinion" :
userMessage = `Point de Vérité — Confrontation IA :
Avis expert injecté : " ${ userInput } "
Données actuelles du dashboard pour ${ currency } : ${ JSON . stringify ( data , null , 2 ) }
Analyse :
- Convergences entre l'avis expert et les données quantitatives
- Divergences et points de tension
- Score avant/après ajustement suggéré
- Validation ou rejet de l'avis par devise` ;
break ;
case "divergence" :
userMessage = `Analyse les divergences de positionnement détectées pour ${ currency } :
${ JSON . stringify ( data , null , 2 ) }
Explique en 3 phrases : pourquoi cette configuration est significative et quelle action de trading elle suggère.` ;
break ;
case "summary" :
default :
userMessage = `Génère une synthèse macro hebdomadaire pour ${ currency } basée sur ces données :
${ JSON . stringify ( data , null , 2 ) }
Résumé en 3 points : situation actuelle, signal directionnel, risque principal.` ;
}
try {
2026-05-28 22:52:49 +02:00
const completion = await groq . chat . completions . create ({
model : "llama-3.1-8b-instant" ,
2026-05-27 13:18:45 +02:00
messages : [
{ role : "system" , content : SYSTEM_PROMPT },
{ role : "user" , content : userMessage },
],
max_tokens : 300 ,
temperature : 0.3 ,
});
const text = completion . choices [ 0 ] ? . message ? . content ?? "" ;
return NextResponse . json ({ analysis : text , model : completion.model , mode });
} catch ( err : unknown ) {
const message = err instanceof Error ? err.message : String ( err );
2026-05-28 22:52:49 +02:00
return NextResponse . json ({ error : `Groq error: ${ message } ` }, { status : 502 });
2026-05-27 13:18:45 +02:00
}
}