healthify-me-mcp / services /mistral_service.py
joedac-netvigie
Initial commit
5370228
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}")