import json import gradio as gr from typing import Tuple, Dict from paddleocr import PaddleOCR from qdrant_client import QdrantClient from fastembed import TextEmbedding from llama_index.llms.openai import OpenAI from utils import extract_food_items, synthesize_food_item from engine import RecommendationEngine ocr = PaddleOCR(use_angle_cls=True, lang="en", use_gpu=False) llm = OpenAI(model="gpt-3.5-turbo") rec_engine = RecommendationEngine("food", QdrantClient(path="qdrant-rec-sys-data"), TextEmbedding()) def run_ocr(img_path) -> str: result = ocr.ocr(img_path, cls=True)[0] return "\n".join([line[1][0] for line in result]) def recommend( likes_str, dislikes_str, img_path ) -> Tuple[str, str, str, Dict[str, float]]: likes = [c.strip() for c in likes_str.split(",")] dislikes = [c.strip() for c in dislikes_str.split(",")] print(likes, dislikes) rec_engine.reset() for food_name in likes: rec_engine.like(synthesize_food_item(food_name, llm)) for food_name in dislikes: rec_engine.dislike(synthesize_food_item(food_name, llm)) ocr_text = run_ocr(img_path) food_names = extract_food_items(ocr_text, llm) food_items = [synthesize_food_item(name, llm) for name in food_names] print("New food items from menu", food_items) recommendations = rec_engine.recommend_from_given(food_items) print(recommendations) return ( ocr_text, json.dumps(food_names, indent=4), json.dumps([item.model_dump() for item in food_items], indent=4), recommendations, ) title = "Food recommender" description = "Food recommender by KShivendu using Qdrant Recommendation API + OpenAI Function calling + FastEmbed embeddings" article = "Github Repo

" examples = [ [ "fanta, waffles, chicken biriyani, most of indian food", "virgin mojito, any pork dishes", "sf-menu3.jpg", ] ] step1_ocr = gr.Text(label="OCR Output") step2_extraction = gr.Code(language="json", label="Extracted food items") step3_enrichment = gr.Code(language="json", label="Enriched food items") step4_recommend = gr.Label(label="Recommendations") app = gr.Interface( fn=recommend, inputs=[ gr.Textbox(label="Likes (comma seperated)"), gr.Textbox(label="Dislikes (comma seperated)"), gr.Image(type="filepath", label="Input", width=20), ], outputs=[step1_ocr, step2_extraction, step3_enrichment, step4_recommend], title=title, description=description, article=article, examples=examples, ) app.queue(max_size=10) app.launch(debug=True)