Update app.py
Browse files
app.py
CHANGED
|
@@ -64,6 +64,7 @@ def build_macro_card(macros):
|
|
| 64 |
"""
|
| 65 |
|
| 66 |
# ---------- Lógica principal ----------
|
|
|
|
| 67 |
def analyze_food(image, text_prompt=""):
|
| 68 |
if image is None:
|
| 69 |
return "<div class='card'>Subí una imagen del plato 🍽️</div>"
|
|
@@ -79,17 +80,46 @@ def analyze_food(image, text_prompt=""):
|
|
| 79 |
buffered = BytesIO()
|
| 80 |
image.save(buffered, format="JPEG")
|
| 81 |
img_b64 = base64.b64encode(buffered.getvalue()).decode("utf-8")
|
| 82 |
-
headers = {
|
| 83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
r = requests.post(HF_API_URL, headers=headers, json=data)
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
|
| 87 |
macros = extract_macros(answer)
|
| 88 |
card = build_macro_card(macros)
|
| 89 |
return f"<div class='desc'>{answer}</div>{card}"
|
| 90 |
|
| 91 |
except Exception as e:
|
| 92 |
-
return f"<div class='card error'>⚠️ Error: {e}</div>"
|
|
|
|
| 93 |
|
| 94 |
# ---------- Interfaz ----------
|
| 95 |
def build_interface():
|
|
|
|
| 64 |
"""
|
| 65 |
|
| 66 |
# ---------- Lógica principal ----------
|
| 67 |
+
|
| 68 |
def analyze_food(image, text_prompt=""):
|
| 69 |
if image is None:
|
| 70 |
return "<div class='card'>Subí una imagen del plato 🍽️</div>"
|
|
|
|
| 80 |
buffered = BytesIO()
|
| 81 |
image.save(buffered, format="JPEG")
|
| 82 |
img_b64 = base64.b64encode(buffered.getvalue()).decode("utf-8")
|
| 83 |
+
headers = {
|
| 84 |
+
"Authorization": f"Bearer {HF_API_KEY}",
|
| 85 |
+
"Content-Type": "application/json"
|
| 86 |
+
}
|
| 87 |
+
data = {
|
| 88 |
+
"inputs": {
|
| 89 |
+
"text": text_prompt,
|
| 90 |
+
"image": f"data:image/jpeg;base64,{img_b64}"
|
| 91 |
+
}
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
print("📡 Enviando request a:", HF_API_URL)
|
| 95 |
r = requests.post(HF_API_URL, headers=headers, json=data)
|
| 96 |
+
|
| 97 |
+
print("📩 Status code:", r.status_code)
|
| 98 |
+
print("🧾 Respuesta cruda:", r.text[:500])
|
| 99 |
+
|
| 100 |
+
# si la respuesta viene vacía
|
| 101 |
+
if not r.text.strip():
|
| 102 |
+
return "<div class='card error'>⚠️ El modelo no devolvió respuesta. Espera unos segundos y reintenta.</div>"
|
| 103 |
+
|
| 104 |
+
# si no es JSON válido
|
| 105 |
+
try:
|
| 106 |
+
resp = r.json()
|
| 107 |
+
except Exception as e:
|
| 108 |
+
return f"<div class='card error'>⚠️ Error al decodificar respuesta: {e}<br><pre>{r.text[:300]}</pre></div>"
|
| 109 |
+
|
| 110 |
+
# Hugging Face a veces devuelve dict con 'error' o 'generated_text'
|
| 111 |
+
if isinstance(resp, dict) and "error" in resp:
|
| 112 |
+
return f"<div class='card error'>⚠️ Error del modelo: {resp['error']}</div>"
|
| 113 |
+
|
| 114 |
+
answer = str(resp)
|
| 115 |
|
| 116 |
macros = extract_macros(answer)
|
| 117 |
card = build_macro_card(macros)
|
| 118 |
return f"<div class='desc'>{answer}</div>{card}"
|
| 119 |
|
| 120 |
except Exception as e:
|
| 121 |
+
return f"<div class='card error'>⚠️ Error general: {e}</div>"
|
| 122 |
+
|
| 123 |
|
| 124 |
# ---------- Interfaz ----------
|
| 125 |
def build_interface():
|