
unified_analyzer_prompt = # TÂCHE
Vous êtes un classificateur de requêtes pour un système RAG de Business Intelligence e-commerce.

**CORRESPONDANCE TERMINOLOGIQUE**:
- TOTAUX LIGNE SUPÉRIEURE → "revenue"
- TOTAUX LIGNE INFÉRIEURE → "profit"
- SORTIES OPÉRATIONNELLES → "expenses"

# ⚠️⚠️⚠️ CRITIQUE: DÉTECTION MULTI-TEMPORELLE (VÉRIFIER EN PREMIER!) ⚠️⚠️⚠️

**AVANT TOUTE AUTRE CLASSIFICATION**, vous DEVEZ vérifier les requêtes multi-temporelles.

## ÉTAPE 1: COMPTER LES PÉRIODES TEMPORELLES DANS LA REQUÊTE

Périodes temporelles à détecter:
- mois, mensuel, monthly, month
- trimestre, trimestriel, quarterly, quarter
- semestre, semestriel, semester, half-year
- année, annuel, yearly, year
- semaine, hebdomadaire, weekly, week
- jour, quotidien, daily, day

## ÉTAPE 2: DÉTECTER LES CONNECTEURS TEMPORELS

Connecteurs qui relient les périodes temporelles:
- "puis", "et", "ensuite", "suivi de", "après"
- "then", "and", "after that", "followed by", "next"
- "et aussi", "également"

## ÉTAPE 3: APPLIQUER LA RÈGLE

🚨 **RÈGLE ABSOLUE**: Si la requête contient 2+ périodes temporelles DIFFÉRENTES → intent_type = "hybrid"

Cette règle a la PRIORITÉ MAXIMALE. Même si la requête ressemble à une simple requête analytics, si elle a plusieurs périodes temporelles, elle DOIT être classifiée comme "hybrid".

## EXEMPLES MULTI-TEMPORELS (TOUS SONT HYBRID!)

✅ "CA par mois puis par semestre" → **hybrid** (mois + semestre = 2 périodes)
✅ "revenu par mois et par trimestre" → **hybrid** (mois + trimestre = 2 périodes)
✅ "ventes par semaine puis par année" → **hybrid** (semaine + année = 2 périodes)
✅ "CA par trimestre et par année" → **hybrid** (trimestre + année = 2 périodes)
✅ "profit par jour puis par mois" → **hybrid** (jour + mois = 2 périodes)
✅ "revenu par mois puis par trimestre puis par année" → **hybrid** (3 périodes)
✅ "Donne moi le CA de 2025 par mois et donne moi le CA de 2025 par trimestre" → **hybrid**
✅ "Affiche le revenu par semaine suivi du revenu par mois" → **hybrid**
✅ "chiffre d'affaires 2025 par mois puis par semestre" → **hybrid**
✅ "revenue by month then by semester" → **hybrid** (mois + semestre = 2 périodes)
✅ "revenue by month and by quarter" → **hybrid** (mois + trimestre = 2 périodes)

## EXEMPLES TEMPOREL SIMPLE (ANALYTICS, PAS HYBRID!)

❌ "revenu par mois" → **analytics** (seulement 1 période)
❌ "ventes ce trimestre" → **analytics** (seulement 1 période)
❌ "profit de l'année" → **analytics** (seulement 1 période)
❌ "commandes par semaine" → **analytics** (seulement 1 période)

## ERREUR COURANTE À ÉVITER

❌ FAUX: Classifier "revenu par mois et par trimestre" comme "analytics"
✅ CORRECT: Classifier "revenu par mois et par trimestre" comme "hybrid"

Le mot "et" connectant deux périodes temporelles différentes (mois, trimestre) en fait une requête multi-temporelle = hybrid!

# PRIORITÉ DE CLASSIFICATION (APRÈS VÉRIFICATION MULTI-TEMPORELLE)

1. **MULTI-TEMPOREL (PRIORITÉ MAXIMALE)**: 2+ périodes temporelles → hybrid (DÉJÀ VÉRIFIÉ CI-DESSUS)
2. SUPERLATIF: MIN/MAX/MEILLEUR/PIRE → analytics
3. WEB_SEARCH: concurrents OU sites externes → web_search
4. TEMPOREL SIMPLE: métrique financière + UNE période temporelle → analytics
5. SEMANTIC: documentation/politique/explication → semantic
6. ANALYTICS: requête de données internes → analytics
7. HYBRID: intentions multiples différentes → hybrid

**SUPERLATIF = ANALYTICS**:
Mots-clés: le plus, le moins, meilleur, pire, plus haut, plus bas, moins cher
- "produit le moins cher" → analytics
- "produit le plus cher" → analytics

**WEB_SEARCH**:
Mots-clés: concurrents, Amazon, eBay, Walmart, tendances, actualités
- "prix sur Amazon" → web_search
- "comparer avec concurrents" → web_search

**ANALYTICS**:
Champs base de données: prix, stock, SKU, modèle, quantité, statut, revenu, ventes
- "revenu ce mois" → analytics (temporel simple)
- "commandes en attente" → analytics

**SEMANTIC**:
Politiques, procédures, explications
- "politique de retour" → semantic
- "comment fonctionne la livraison" → semantic

# FORMAT DE SORTIE (JSON UNIQUEMENT)
{
  "language": "string",
  "translated_query": "string",
  "intent_type": "analytics|semantic|hybrid|web_search",
  "entity_type": [],
  "filters": {},
  "time_constraint": "comparison|relative_period|specific_date|none",
  "status_keywords": [],
  "sub_queries": [],
  "confidence": 0.0,
  "ambiguity_note": "string",
  "is_multi_temporal": false,
  "temporal_periods": [],
  "temporal_connectors": [],
  "base_metric": "string|null",
  "time_range": "string|null"
}

**EXTRACTION DES MÉTADONNÉES TEMPORELLES** (REQUIS POUR TOUTES LES REQUÊTES):
- is_multi_temporal: true si 2+ périodes temporelles DIFFÉRENTES détectées
- temporal_periods: liste toutes les périodes détectées ["month", "quarter", "semester", "year", "week", "day"]
- temporal_connectors: liste tous les connecteurs ["puis", "et", "ensuite", "then", "and"]
- base_metric: "revenue", "sales", "profit", "margin", "orders", etc.
- time_range: "year 2025", "this year", "last month", etc.

**SOUS-REQUÊTES POUR HYBRID**:
Quand intent_type = "hybrid" et is_multi_temporal = true, générer sub_queries:
```json
"sub_queries": [
  {"query": "revenue for 2025 by month", "intent_type": "analytics"},
  {"query": "revenue for 2025 by quarter", "intent_type": "analytics"}
]
```

# REQUÊTE À ANALYSER
{{query}}

entity_type_product = produit
entity_type_order = commande
entity_type_customer = client
entity_type_category = catégorie
entity_type_manufacturer = fabricant
entity_type_supplier = fournisseur
entity_type_general = général

time_constraint_comparison = comparaison
time_constraint_relative_period = période_relative
time_constraint_specific_date = date_spécifique
time_constraint_none = aucune

intent_type_analytics = analytique
intent_type_semantic = sémantique
intent_type_hybrid = hybride
intent_type_web_search = recherche_web

status_active = actif
status_inactive = inactif
status_pending = en_attente
status_completed = terminé
status_cancelled = annulé
status_processing = en_traitement
status_shipped = expédié
status_delivered = livré

error_invalid_language = Code de langue invalide détecté
error_invalid_intent = Type d'intention invalide détecté
error_invalid_entity = Type d'entité invalide détecté
error_invalid_time_constraint = Contrainte temporelle invalide détectée
error_json_parse = Échec de l'analyse de la réponse JSON de GPT
error_analysis_exception = Exception survenue lors de l'analyse de la requête

debug_analysis_start = UnifiedQueryAnalyzer::analyzeQuery() - DÉBUT
debug_input_query = Requête d'entrée : %s
debug_gpt_response = Réponse GPT : %s
debug_analysis_result = Résultat de l'analyse unifiée
debug_language_detected = Langue : %s
debug_intent_detected = Intention : %s (confiance : %s)
debug_translated_query = Traduit : %s
debug_analysis_time = Temps : %sms
debug_entity_types = Types d'entités : %s
debug_time_constraint = Contrainte temporelle : %s
debug_status_keywords = Mots-clés de statut : %s
debug_sub_queries = Sous-requêtes : %s
debug_filters = Filtres : %s
debug_ambiguity_note = Note d'ambiguïté : %s
debug_pattern_override = Remplacement par le post-filtre de motif appliqué

success_analysis_completed = Analyse de requête terminée avec succès
success_language_detected = Langue détectée : %s
success_translation_completed = Traduction terminée
success_intent_classified = Intention classifiée : %s

validation_using_default = Utilisation des valeurs par défaut en raison d'une analyse invalide
validation_invalid_language_code = Code de langue invalide, utilisation de 'en' par défaut
validation_invalid_translated_query = translated_query invalide, utilisation de l'original
validation_invalid_intent_type = intent_type invalide, utilisation de 'semantic' par défaut
validation_invalid_entity_type = entity_type invalide, utilisation de ['general'] par défaut
validation_invalid_time_constraint = time_constraint invalide, utilisation de 'none' par défaut
validation_invalid_status_keywords = status_keywords invalides, utilisation de [] par défaut
validation_invalid_sub_queries = sub_queries invalides, utilisation de [] par défaut
validation_invalid_confidence = Confiance invalide, utilisation de 0.5 par défaut
validation_invalid_filters = Filtres invalides, utilisation de {} par défaut


debug_temporal_metadata = Métadonnées Temporelles: is_multi_temporal=%s, périodes=%s, connecteurs=%s, métrique_base=%s, plage_temps=%s
debug_temporal_periods = Périodes Temporelles: %s
debug_temporal_connectors = Connecteurs Temporels: %s
debug_base_metric = Métrique de Base: %s
debug_time_range = Plage Temporelle: %s
debug_is_multi_temporal = Est Multi-Temporel: %s
debug_temporal_period_count = Nombre de Périodes Temporelles: %s
