File size: 5,934 Bytes
d922512
1e1ad73
fc0daf6
1e1ad73
b532979
1e1ad73
 
d3a0074
 
1e1ad73
 
d3a0074
 
1e1ad73
 
 
 
d3a0074
 
1e1ad73
 
 
 
d3a0074
 
1e1ad73
 
 
b532979
1e1ad73
 
d3a0074
 
1e1ad73
 
 
 
d3a0074
 
1e1ad73
 
 
 
d3a0074
 
1e1ad73
 
 
 
 
d3a0074
 
 
33933ea
1e1ad73
 
 
 
 
b532979
33933ea
1e1ad73
33933ea
1e1ad73
 
 
 
b532979
 
3c16630
1e1ad73
 
 
 
 
 
b532979
1e1ad73
b532979
d3a0074
1e1ad73
 
 
 
d3a0074
1e1ad73
 
 
b532979
1e1ad73
 
 
 
d3a0074
1e1ad73
 
 
 
fc0daf6
1e1ad73
3c16630
33933ea
d3a0074
fc0daf6
 
1e1ad73
 
 
d3a0074
1e1ad73
 
 
 
 
 
 
 
 
fc0daf6
 
1e1ad73
 
 
 
fc0daf6
d922512
fc0daf6
 
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
import gradio as gr

# Food database (same as your provided code)
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 = ""
        self.nutrition = ""

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 "Welcome to Chef Bot! πŸ‘¨β€πŸ³ Let's create your perfect meal! Select your food type: Vegeterian 🌱 or Non-Vegetarian πŸ–."
        
        return "Let's get started! Do you want to proceed with meal customization? (Yes/No)"
    
    elif chat_state.step == "category":
        chat_state.category = message.lower()
        chat_state.step = "ingredient"
        
        if "vegetarian" in message.lower():
            return f"Great choice! 🌱 Vegetarian food is healthy and environmentally friendly. What main ingredient would you like? Available options: {', '.join(VEG_INGREDIENTS)}"
        elif "non-vegetarian" in message.lower():
            return f"Great choice! πŸ– Non-vegetarian food is delicious! What type of meat would you prefer? Available options: {', '.join(NONVEG_TYPES)}"
        return "Please choose either Vegetarian 🌱 or Non-Vegetarian πŸ–"
    
    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 KeyError:
            chat_state.step = "initial"  # Reset for new conversation
            return f"Oops! No dishes found for this combination πŸ˜…. Let's try again!"

    return "I'm not sure how to help with that. Would you like to start over? πŸ€”"

def create_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

# Launch the Gradio app
if __name__ == "__main__":
    demo = create_gradio_interface()
    demo.launch(share=True)