import os from typing import List, Optional import httpx AI_SERVICE_URL = os.environ.get("AI_SERVICE_URL", "http://ai-service:8070") # Mapping complet class_name YOLO → Infos détaillées _DIAGNOSTICS = { "Tomato___healthy": { "label": "Tomate (saine)", "conseil": "Votre plant est en pleine forme. Pensez au paillage pour garder l'humidité.", "actions": ["Pailler le pied", "Vérifier les gourmands"] }, "Tomato___Early_blight": { "label": "Tomate (Alternariose)", "conseil": "Champignon fréquent. Retirez les feuilles basses touchées et évitez de mouiller le feuillage.", "actions": ["Retirer feuilles infectées", "Traitement bouillie bordelaise"] }, "Tomato___Late_blight": { "label": "Tomate (Mildiou)", "conseil": "Urgent : Le mildiou se propage vite avec l'humidité. Coupez les parties atteintes immédiatement.", "actions": ["Couper parties infectées", "Traitement purin de prêle", "Abriter de la pluie"] }, "Pepper__bell___healthy": { "label": "Poivron (sain)", "conseil": "Le poivron aime la chaleur et un sol riche.", "actions": ["Apport de compost", "Arrosage régulier"] }, "Potato___healthy": { "label": "Pomme de terre (saine)", "conseil": "Pensez à butter les pieds pour favoriser la production de tubercules.", "actions": ["Butter les pieds"] }, "Grape___healthy": { "label": "Vigne (saine)", "conseil": "Surveillez l'apparition d'oïdium si le temps est chaud et humide.", "actions": ["Taille en vert", "Vérifier sous les feuilles"] }, } async def identify(image_bytes: bytes) -> List[dict]: """Appelle l'ai-service interne et retourne les détections YOLO avec diagnostics.""" try: async with httpx.AsyncClient(timeout=30.0) as client: resp = await client.post( f"{AI_SERVICE_URL}/detect", files={"file": ("photo.jpg", image_bytes, "image/jpeg")}, ) resp.raise_for_status() data = resp.json() except Exception: return [] results = [] for det in data[:3]: cls = det.get("class_name", "") diag = _DIAGNOSTICS.get(cls, { "label": cls.replace("___", " — ").replace("_", " "), "conseil": "Pas de diagnostic spécifique disponible pour cette espèce.", "actions": [] }) results.append({ "species": cls, "common_name": diag["label"], "confidence": det.get("confidence", 0.0), "conseil": diag["conseil"], "actions": diag["actions"], "image_url": "", }) return results