mirror of
https://github.com/caty21/forex-dashboard.git
synced 2026-08-16 05:58:05 +00:00
Forex Dashboard v8.0
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
import OpenAI from "openai";
|
||||
|
||||
// Bytez uses an OpenAI-compatible API
|
||||
const bytez = new OpenAI({
|
||||
apiKey: process.env.BYTEZ_API_KEY ?? "",
|
||||
baseURL: "https://api.bytez.com/models/openai",
|
||||
});
|
||||
|
||||
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) {
|
||||
const apiKey = process.env.BYTEZ_API_KEY;
|
||||
if (!apiKey) {
|
||||
return NextResponse.json({ error: "BYTEZ_API_KEY not configured" }, { status: 503 });
|
||||
}
|
||||
|
||||
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 {
|
||||
const completion = await bytez.chat.completions.create({
|
||||
model: "meta-llama/Llama-3.1-8B-Instruct",
|
||||
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);
|
||||
return NextResponse.json({ error: `Bytez error: ${message}` }, { status: 502 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user