import gradio as gr from generate_results import format_recipes from chroma_utils import get_retriever import os import zipfile import gdown CHROMA_DIR = "./chroma-db-langchain" ZIP_PATH = "chroma_db.zip" # Access the secret key DRIVE_FILE_ID = os.getenv("DRIVE_FILE_ID") def download_and_extract_chroma(): if not os.path.exists(CHROMA_DIR): # avoid re-download print("Downloading Chroma DB...") url = f"https://drive.google.com/uc?id={DRIVE_FILE_ID}" gdown.download(url, ZIP_PATH, quiet=False) print("Extracting...") with zipfile.ZipFile(ZIP_PATH, "r") as zip_ref: zip_ref.extractall(CHROMA_DIR) print("Chroma DB ready.") else: print("Chroma DB already exists, skipping download.") # Call this once at the beginning download_and_extract_chroma() def get_response(query): # Call generate_answer_langchain with the retriever and model setup retriever = get_retriever() docs = retriever.invoke(query) raw_context = "\n\n".join([doc.page_content for doc in docs]) response = "" for chunk in format_recipes(query, raw_context): response += chunk yield response article = "Created with 🀎 (and a mixture of mathematics, statistics, and tons of calculations πŸ‘©πŸ½β€πŸ”¬) by Arpit Vaghela [GitHub](https://github.com/magnifiques)" example_list = [ ["I have tomato and pasta, what should I cook?"], ["I have chicken and potatoes, what can I make?"], ["I have rice and beans, any recipe ideas?"] ] # Gradio Interface # demo = gr.Interface( # fn=get_response, # Function to call # inputs="text", # Input type # outputs=gr.Markdown(label="Suggested Recipes"), # title="WhatToCookToday", # description="""Welcome to WhatToCookToday! 🍳 # Struggling to decide what to cook with the ingredients you already have? # we've got you covered. # Just tell us what’s in your kitchen, and we’ll instantly suggest a delicious recipes you can make with those ingredients. # You don’t need to search endlessly, we turn your pantry into a personalized recipe book! # How to use it: # - Simply type the ingredients you have, like "I have tomatoes and pasta, what can I cook?" # - You can list multiple ingredients in any order or phrasing. # - The assistant will respond with a recipe tailored to what you’ve got. # Example prompts you can try: # 1. "I have tomato and pasta, what should I cook?" # 2. "I have chicken and potatoes, what can I make?" # 3. "I have rice and beans, any recipe ideas?" # ⏱️ Fast. 🍲 Simple. 🧠 Smart. # """, # article=article, # examples=example_list, # cache_examples=False, # live=False # ) # if __name__ == "__main__": # demo.launch( # server_name="0.0.0.0", # server_port=7860, # debug=False, # share=True) # Create a custom Blocks interface for better control with gr.Blocks( title="WhatToCookToday", theme=gr.themes.Soft(), css=""" .recipe-output { max-height: 600px; overflow-y: auto; padding: 20px; border: 1px solid #212121; border-radius: 8px; background-color: #0E2148; } """ ) as demo: gr.HTML("""

🍳 WhatToCookToday

Struggling to decide what to cook with the ingredients you already have? We've got you covered!

""") gr.Markdown(""" **How to use:** - Simply type the ingredients you have, like "I have tomatoes and pasta, what can I cook?" - You can list multiple ingredients in any order or phrasing. - The assistant will respond with a recipe tailored to what you've got. ⏱️ **Fast.** 🍲 **Simple.** 🧠 **Smart.** """) with gr.Row(): with gr.Column(scale=2): input_text = gr.Textbox( placeholder="Enter your ingredients here... (e.g., 'I have tomatoes and pasta')", label="What ingredients do you have?", lines=3 ) submit_btn = gr.Button("πŸ” Find Recipes", variant="primary", size="lg") gr.Examples( examples=example_list, inputs=input_text, label="Try these examples:" ) with gr.Column(scale=3): output_markdown = gr.Markdown( label="Suggested Recipes", elem_classes=["recipe-output"], container=True, value="Your delicious recipes will appear here! πŸ‘¨β€πŸ³" ) # Add loading behavior submit_btn.click( fn=lambda: gr.update(value="πŸ”„ **Searching for recipes...** \n\nPlease wait while we find the perfect recipes for your ingredients!", visible=True), inputs=None, outputs=output_markdown, queue=False ).then( fn=get_response, inputs=input_text, outputs=output_markdown, show_progress=True ) # Also allow Enter key submission input_text.submit( fn=lambda: gr.update(value="πŸ”„ **Searching for recipes...** \n\nPlease wait while we find the perfect recipes for your ingredients!", visible=True), inputs=None, outputs=output_markdown, queue=False ).then( fn=get_response, inputs=input_text, outputs=output_markdown, show_progress=True ) gr.HTML(f"""
{article}
""") if __name__ == "__main__": demo.launch( server_name="0.0.0.0", # Important for HF Spaces server_port=7860, # Default port for HF Spaces debug=False, share=False # Don't use share=True on HF Spaces )