Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -209,29 +209,22 @@ def _run_inference(image: Image.Image, max_new_tokens: int) -> str:
|
|
| 209 |
|
| 210 |
|
| 211 |
def _parse_response(raw: str) -> dict:
|
| 212 |
-
"""
|
| 213 |
-
Parse the CaLoRAify reasoning loop output:
|
| 214 |
-
"Ingredients detected: X. Portion Analysis: Y. JSON Summary: {...}"
|
| 215 |
-
"""
|
| 216 |
result = {"ingredients": "", "portion_notes": "", "raw_text": raw}
|
| 217 |
|
| 218 |
-
#
|
| 219 |
if "Ingredients detected:" in raw:
|
| 220 |
ing_start = raw.index("Ingredients detected:") + len("Ingredients detected:")
|
| 221 |
ing_end = raw.index(".", ing_start) if "." in raw[ing_start:] else len(raw)
|
| 222 |
result["ingredients"] = raw[ing_start:ing_end].strip()
|
| 223 |
|
| 224 |
-
# Extract portion notes
|
| 225 |
if "Portion Analysis:" in raw:
|
| 226 |
pa_start = raw.index("Portion Analysis:") + len("Portion Analysis:")
|
| 227 |
pa_end = raw.index(".", pa_start) if "." in raw[pa_start:] else len(raw)
|
| 228 |
result["portion_notes"] = raw[pa_start:pa_end].strip()
|
| 229 |
|
| 230 |
-
# Extract JSON
|
| 231 |
if "JSON Summary:" in raw:
|
| 232 |
json_start = raw.index("JSON Summary:") + len("JSON Summary:")
|
| 233 |
json_str = raw[json_start:].strip()
|
| 234 |
-
# Find the JSON object boundaries
|
| 235 |
brace_start = json_str.find("{")
|
| 236 |
brace_end = json_str.rfind("}") + 1
|
| 237 |
if brace_start != -1 and brace_end > brace_start:
|
|
@@ -245,7 +238,11 @@ def _parse_response(raw: str) -> dict:
|
|
| 245 |
"fibre_g": nutrition.get("fibre_g"),
|
| 246 |
})
|
| 247 |
except json.JSONDecodeError:
|
| 248 |
-
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
| 249 |
|
| 250 |
return result
|
| 251 |
|
|
@@ -273,3 +270,9 @@ def analyze(req: AnalyzeRequest, _=Depends(verify_api_key)):
|
|
| 273 |
|
| 274 |
parsed = _parse_response(raw)
|
| 275 |
return NutritionResponse(**parsed, latency_ms=ms)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 209 |
|
| 210 |
|
| 211 |
def _parse_response(raw: str) -> dict:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 212 |
result = {"ingredients": "", "portion_notes": "", "raw_text": raw}
|
| 213 |
|
| 214 |
+
# Try the CaLoRAify reasoning loop format first
|
| 215 |
if "Ingredients detected:" in raw:
|
| 216 |
ing_start = raw.index("Ingredients detected:") + len("Ingredients detected:")
|
| 217 |
ing_end = raw.index(".", ing_start) if "." in raw[ing_start:] else len(raw)
|
| 218 |
result["ingredients"] = raw[ing_start:ing_end].strip()
|
| 219 |
|
|
|
|
| 220 |
if "Portion Analysis:" in raw:
|
| 221 |
pa_start = raw.index("Portion Analysis:") + len("Portion Analysis:")
|
| 222 |
pa_end = raw.index(".", pa_start) if "." in raw[pa_start:] else len(raw)
|
| 223 |
result["portion_notes"] = raw[pa_start:pa_end].strip()
|
| 224 |
|
|
|
|
| 225 |
if "JSON Summary:" in raw:
|
| 226 |
json_start = raw.index("JSON Summary:") + len("JSON Summary:")
|
| 227 |
json_str = raw[json_start:].strip()
|
|
|
|
| 228 |
brace_start = json_str.find("{")
|
| 229 |
brace_end = json_str.rfind("}") + 1
|
| 230 |
if brace_start != -1 and brace_end > brace_start:
|
|
|
|
| 238 |
"fibre_g": nutrition.get("fibre_g"),
|
| 239 |
})
|
| 240 |
except json.JSONDecodeError:
|
| 241 |
+
pass
|
| 242 |
+
|
| 243 |
+
# ── FALLBACK: if model didn't follow format, use raw text as ingredients
|
| 244 |
+
if not result["ingredients"] and raw.strip():
|
| 245 |
+
result["ingredients"] = raw.strip()[:300] # show raw output so you can see what model said
|
| 246 |
|
| 247 |
return result
|
| 248 |
|
|
|
|
| 270 |
|
| 271 |
parsed = _parse_response(raw)
|
| 272 |
return NutritionResponse(**parsed, latency_ms=ms)
|
| 273 |
+
|
| 274 |
+
@app.post("/debug")
|
| 275 |
+
def debug(req: AnalyzeRequest, _=Depends(verify_api_key)):
|
| 276 |
+
image = _decode_image(req.image_b64)
|
| 277 |
+
raw = _run_inference(image, req.max_new_tokens)
|
| 278 |
+
return {"raw_text": raw}
|