vikash-nuvai
feat: complete tiffin packing OpenEnv environment with 3 tasks, VLM, grader, and inference
bbc1784 | # Copyright (c) 2026 CtrlAltWin Team | |
| """ | |
| VLM Food Classifier — Simulates Vision-Language Model food classification. | |
| In production, this would call LLaVA / GPT-4V on a rendered PyBullet frame. | |
| For the hackathon, uses pre-computed attributes from food_db.json. | |
| The agent MUST call 'identify' before it knows a food item's properties. | |
| Without identification, items appear as generic "Unknown food item". | |
| """ | |
| import json | |
| import os | |
| from typing import Any, Dict, Optional | |
| class FoodClassifier: | |
| """Cached VLM food classifier. | |
| Loads pre-computed food attributes from food_db.json. | |
| In a production system, replace ``classify()`` with a real | |
| VLM API call (e.g. LLaVA, GPT-4V) on a rendered scene frame. | |
| """ | |
| def __init__(self, db_path: Optional[str] = None): | |
| if db_path is None: | |
| db_path = os.path.join(os.path.dirname(__file__), "food_db.json") | |
| with open(db_path, "r") as f: | |
| self.food_db: Dict[str, Dict[str, Any]] = json.load(f) | |
| def classify(self, food_name: str) -> Dict[str, Any]: | |
| """Classify a food item and return its attributes. | |
| Args: | |
| food_name: Name of the food item (e.g. "sambar", "rice"). | |
| Returns: | |
| Dict with keys: type, fragility, preferred_container, | |
| volume_ml, temperature, color, special_notes. | |
| """ | |
| key = food_name.lower().strip() | |
| if key in self.food_db: | |
| return {**self.food_db[key], "name": key, "classified": True} | |
| return self._unknown_default(food_name) | |
| def _unknown_default(self, food_name: str) -> Dict[str, Any]: | |
| """Fallback for foods not in the database.""" | |
| return { | |
| "name": food_name, | |
| "type": "solid", | |
| "fragility": 0.5, | |
| "preferred_container": "deep", | |
| "volume_ml": 100, | |
| "temperature": "room", | |
| "color": "unknown", | |
| "special_notes": "Unknown food item — classification uncertain", | |
| "classified": False, | |
| } | |
| def get_all_foods(self) -> list: | |
| """Return list of all known food names.""" | |
| return list(self.food_db.keys()) | |