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