import gradio as gr import pandas as pd df = pd.read_csv("filtered_openfoodfacts(Sheet1).csv", sep=";", encoding="utf-8") df.columns = [col.lower().replace(" ", "_") for col in df.columns] df = df[df['warning'].str.lower() != 'warning'] def search_product(query, filters): query = query.strip().lower() filtered_df = df.copy() for f in filters: filtered_df = filtered_df[filtered_df['labels_tags'].str.lower().str.contains(f.lower(), na=False)] matched = filtered_df[ filtered_df['product_reference'].str.lower().str.contains(query, na=False) | filtered_df['product_brand'].str.lower().str.contains(query, na=False) | filtered_df['product_name'].str.lower().str.contains(query, na=False) ] if matched.empty: return "โŒ Product not found." result = "" for _, row in matched.head(3).iterrows(): result += f"๐Ÿ”Ž Reference: {row.get('product_reference', '-') }\n" result += f"๐Ÿท๏ธ Brand: {row.get('product_brand', '-') }\n" result += f"๐Ÿงพ Product: {row.get('product_name', '-') }\n" result += f"- Ingredients: {row.get('ingredients_text', '-') }\n" result += f"- Additives: {row.get('additives', '-') }\n" result += f"- Allergens: {row.get('allergens', '-') }\n" result += f"- Tags: {row.get('labels_tags', '-') }\n" warning = str(row.get('warning', '')).strip() if warning and warning.lower() != "none": cleaned = warning.lower().replace("โš ๏ธ", "").replace("โœ…", "").replace("warning:", "").strip().capitalize() if "safe for general consumption" in cleaned.lower(): result += f"โœ… {cleaned}\n" else: result += f"โš ๏ธ {cleaned}\n" result += "\n" return result.strip() demo = gr.Interface( fn=search_product, inputs=[ gr.Textbox(label="Search by product name, brand or REF code"), gr.CheckboxGroup( choices=["vegan", "organic", "gluten-free", "lactose-free", "halal", "kosher"], label="Filter by tags" ) ], outputs=gr.Textbox(label="Product Details"), title="NutriCheck Bot", description="Search by name, brand, or reference. Warnings styled cleanly with one emoji max." ) demo.launch()