import requests import json from config.settings import MISTRAL_API_KEY, MISTRAL_URL class MistralService: def __init__(self): self.api_key = MISTRAL_API_KEY self.api_url = MISTRAL_URL def analyze_query(self, query): """ Analyse la requête utilisateur pour distinguer la marque et le produit :param query: :return: JSON """ if not self.api_key: return {"product": query, "brand": "", "quality_filter": "none", "explanation": "Pas de clé Mistral"} prompt = f"""Analyse cette requête de recherche alimentaire, tu es capable de différencier la marque et le produit, et réponds en JSON : Requête: "{query}" RÈGLES IMPORTANTES : - Si c'est un nom de produit avec parfum/goût (ex: "danette chocolat", "yaourt fraise", "pizza 4 fromages"), alors TOUT est le PRODUIT - Séparer produit/marque SEULEMENT si ton analyse en conclue que c'est une marque. - Les parfums/goûts/saveurs ne sont PAS des marques : chocolat, vanille, fraise, pistache, caramel, etc. Réponds uniquement avec ce format JSON : {{ "product": "nom du produit recherché", "brand": "marque si explicitement une VRAIE marque connue ou vide", "explanation": "explication courte" }} Exemples : - "danette pistache" → {{"product": "danette pistache", "brand": "", "quality_filter": "none", "explanation": "Recherche produit Danette parfum pistache"}} - "yaourt fraise" → {{"product": "yaourt fraise", "brand": "", "quality_filter": "none", "explanation": "Recherche yaourt parfum fraise"}} - "pizza 4 fromages" → {{"product": "pizza 4 fromages", "brand": "", "quality_filter": "none", "explanation": "Recherche pizza 4 fromages"}} - "yaourt danone fraise" → {{"product": "yaourt fraise", "brand": "danone", "quality_filter": "none", "explanation": "Yaourt fraise de la marque Danone"}} - "pizza picard" → {{"product": "pizza", "brand": "picard", "quality_filter": "none", "explanation": "Pizzas de la marque Picard"}} - "nutella" → {{"product": "nutella", "brand": "", "quality_filter": "none", "explanation": "Recherche produit Nutella"}} - "coca cola" → {{"product": "coca cola", "brand": "", "quality_filter": "none", "explanation": "Recherche produit Coca Cola"}} """ try: headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" } data = { "model": "mistral-small", "messages": [{"role": "user", "content": prompt}], "temperature": 0.1, "max_tokens": 200 } response = requests.post(self.api_url, headers=headers, json=data, timeout=10) if response.status_code == 200: result = response.json() content = result["choices"][0]["message"]["content"] content = content.strip() if content.startswith("```json"): content = content[7:] if content.startswith("```"): content = content[3:] if content.endswith("```"): content = content[:-3] start_idx = content.find('{') end_idx = content.rfind('}') if start_idx != -1 and end_idx != -1: content = content[start_idx:end_idx + 1] analysis = json.loads(content) print(f"🤖 Mistral understand : {analysis.get('explanation', '')}") return analysis else: print(f"❌ Mistral API error: {response.status_code}") except Exception as e: print(f"❌ Mistral error: {e}")