File size: 5,883 Bytes
d922512 1e1ad73 33933ea 1e1ad73 33933ea 1e1ad73 33933ea 1e1ad73 33933ea 1e1ad73 ee04be4 1e1ad73 33933ea 1e1ad73 d922512 1e1ad73 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
import gradio as gr
import json
from flask import Flask, render_template
# Initialize Flask app
app = Flask(__name__)
# Food database (same as you provided)
FOOD_DATABASE = {
"veg": {
"paneer": {
"lowCalorie": [
{"name": "Grilled Paneer Tikka", "description": "Marinated and grilled paneer cubes with spices", "calories": 180, "protein": 14},
{"name": "Paneer Bhurji", "description": "Scrambled paneer with vegetables", "calories": 200, "protein": 16}
],
"highProtein": [
{"name": "Protein Paneer Bowl", "description": "High protein paneer with quinoa", "calories": 320, "protein": 24},
{"name": "Paneer Steak", "description": "Thick cut paneer steak with herbs", "calories": 280, "protein": 22}
]
},
"mushroom": {
"lowCalorie": [
{"name": "Grilled Mushroom Caps", "description": "Herb-stuffed mushroom caps", "calories": 120, "protein": 8},
{"name": "Mushroom Soup", "description": "Creamy mushroom soup", "calories": 150, "protein": 6}
]
},
"aloo": {
"lowCalorie": [
{"name": "Baked Potato Wedges", "description": "Spiced and baked potato wedges", "calories": 160, "protein": 4},
{"name": "Aloo Tikki", "description": "Spiced potato patties", "calories": 180, "protein": 3}
]
}
},
"nonveg": {
"chicken": {
"highProtein": [
{"name": "Grilled Chicken Breast", "description": "Herb-marinated grilled chicken", "calories": 250, "protein": 30},
{"name": "Chicken Tikka", "description": "Tandoori spiced chicken pieces", "calories": 280, "protein": 32}
]
},
"fish": {
"lowCalorie": [
{"name": "Grilled Salmon", "description": "Lemon herb grilled salmon", "calories": 220, "protein": 25},
{"name": "Steamed Fish", "description": "Ginger-garlic steamed fish", "calories": 180, "protein": 22}
]
},
"mutton": {
"balanced": [
{"name": "Mutton Curry", "description": "Traditional spiced mutton curry", "calories": 350, "protein": 28},
{"name": "Grilled Lamb Chops", "description": "Herb-crusted lamb chops", "calories": 380, "protein": 32}
]
}
}
}
VEG_INGREDIENTS = ["Paneer", "Mushroom", "Aloo", "Brinjal", "Palak"]
NONVEG_TYPES = ["Chicken", "Fish", "Mutton", "Pork"]
NUTRITION_OPTIONS = ["Low Calorie", "High Protein", "Low Carb", "Balanced", "Gluten Free"]
class ChatState:
def __init__(self):
self.step = "initial"
self.category = ""
self.ingredient = ""
chat_state = ChatState()
def process_message(message, history):
if chat_state.step == "initial":
if "yes" in message.lower() or "yeah" in message.lower():
chat_state.step = "category"
return "Great! Please select your preferred category: Vegetarian, Non-Vegetarian, or Vegan"
return "I'm here to help you customize your food. Would you like to proceed? (Yes/No)"
elif chat_state.step == "category":
chat_state.category = message.lower()
chat_state.step = "ingredient"
if "vegetarian" in message.lower():
return f"Excellent! What main ingredient would you like? Available options: {', '.join(VEG_INGREDIENTS)}"
elif "non-vegetarian" in message.lower():
return f"Great choice! What type of meat would you prefer? Available options: {', '.join(NONVEG_TYPES)}"
return "Please select either Vegetarian, Non-Vegetarian, or Vegan"
elif chat_state.step == "ingredient":
chat_state.ingredient = message.lower()
chat_state.step = "nutrition"
return f"Perfect! Now, select your nutrition preference: {', '.join(NUTRITION_OPTIONS)}"
elif chat_state.step == "nutrition":
nutrition = message.lower().replace(" ", "")
category = "nonveg" if "non" in chat_state.category else "veg"
ingredient = chat_state.ingredient
try:
food_items = FOOD_DATABASE[category][ingredient][nutrition]
response = f"Here are some {message} {ingredient} dishes for you:\n"
for item in food_items:
response += f"\n• {item['name']} ({item['calories']} cal, {item['protein']}g protein)\n {item['description']}"
chat_state.step = "initial" # Reset for new conversation
return response
except:
chat_state.step = "initial" # Reset for new conversation
return f"I'll help our chef prepare a special {message} {ingredient} dish for you!"
return "I'm not sure how to help with that. Would you like to start over? (Yes/No)"
# Gradio interface for the chatbot
def gradio_interface():
with gr.Blocks() as demo:
chatbot = gr.Chatbot([])
msg = gr.Textbox(show_label=False, placeholder="Enter text and press enter")
clear = gr.Button("Clear")
def user(user_message, history):
return "", history + [[user_message, None]]
def bot(history):
user_message = history[-1][0]
bot_message = process_message(user_message, history)
history[-1][1] = bot_message
return history
msg.submit(user, [msg, chatbot], [msg, chatbot]).then(
bot, chatbot, chatbot
)
clear.click(lambda: None, None, chatbot)
return demo
@app.route("/")
def index():
return render_template("index.html")
@app.route("/chat")
def chat():
demo = gradio_interface()
demo.launch(inline=True)
return "Chatbot launched!"
if __name__ == "__main__":
app.run(debug=True)
|