| 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}") | |