Spaces:
Sleeping
Sleeping
File size: 18,697 Bytes
87ccbe3 f6e0ffc 87ccbe3 f6e0ffc 87ccbe3 f6e0ffc 111d795 87ccbe3 f6e0ffc 8d262ea 87ccbe3 8d262ea 87ccbe3 f6e0ffc 87ccbe3 f6e0ffc 87ccbe3 f6e0ffc 8d262ea f6e0ffc 111d795 87ccbe3 111d795 87ccbe3 f6e0ffc 87ccbe3 f6e0ffc 111d795 f6e0ffc 111d795 f6e0ffc 87ccbe3 f6e0ffc 111d795 f6e0ffc 87ccbe3 |
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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
import os
import requests
import random
import json
import gradio as gr
import openai as ai
class Kokiku:
def __init__(self):
self.include_facts = True
self.cooking_skill = ["Beginner", "Intermediate", "Advanced", "Expert"]
self.cooking_time = ["< 30 minutes", "30 - 60 minutes", "> 60 minutes"]
self.cuisine = ["Worldwide", "Korean", "Japanese", "Chinese", "Indonesian", "Indian", "Italian", "Mexican", "French", "American", "Thai", "Mediterranean", "Vietnamese", "Middle Eastern", "Spanish", "Greek", "German", "Nordic", "Caribbean", "British", "Irish", "Moroccan", "Russian", "Jewish", "Cajun", "Portuguese", "Hawaiian", "Hungarian", "Filipino", "Brazilian"]
self.health_condition = ["None", "Weight Loss", "Diabetes", "High Cholesterol", "High Blood Pressure", "Kidney Disease", "Gout", "Anemia", "Celiac Disease", "GERD", "Crohn's Disease", "IBS", "Diverticulitis", "Pregnancy", "Lactation", "Gallstones", "Hepatitis", "HIV/AIDS", "Cancer", "PCOS"]
self.intolerances = ["None", "Dairy", "Egg", "Gluten", "Grain", "Peanut", "Seafood", "Sesame", "Shellfish", "Soy", "Sulfite", "Tree Nut", "Wheat", "Mustard", "Celery", "Lupin", "Mollusk", "Alcohol", "Red Meat", "White Meat", "FODMAP"]
self.eating_time = ["Breakfast", "Lunch", "Dinner", "Brunch"]
self.plan_duration = ["1 day", "2 days", "3 days", "4 days", "5 days", "6 days", "1 week"]
self.meals_per_day = ["1 meal", "2 meals", "3 meals"]
self.servings = ["1 person", "2 people", "3 people", "4 people", "5 people", "6 people", "7 people", "8 people", "9 people", "10 people"]
self.cooking_tools = ["Pan", "Oven", "Air Fryer", "Microwave", "Griller", "Steamer", "Rice Cooker", "Blender"]
self.countries = ["South Korea", "United States", "Indonesia", "United Kingdom", "Singapore", "Japan", "Australia"]
self.merchant = ["McDonalds", "Subway", "Starbucks", "KFC", "Pizza Hut", "Burger King", "Dunkin Donuts", "Domino's Pizza", "Pizza Hut", "KFC", "Krispy Kreme", "Papa's John", "Domino Pizza", "Taco Bell"]
self.activity_level = ["Sedentary", "Lightly Active", "Moderately Active", "Very Active", "Extra Active"]
self.age = 1
self.ingredients = []
self.include_shopping_list = True
# Main Prompt
self._main_prompt = ""
self._health_condition_prompt = ""
self._intolerances_prompt = ""
self._include_facts_prompt = ""
self._final_prompt = ""
# Meal Planner Prompt
self._meal_planner_prompt = ""
self._meal_planner_intolerances_prompt = ""
self._meal_planner_include_facts_prompt = ""
self._meal_planner_shopping_list_prompt = ""
self._meal_planner_final_prompt = ""
# Order Recommendation Prompt
self._order_recommendation_prompt = ""
self._order_recommendation_health_condition_prompt = ""
self._order_recommendation_intolerances_prompt = ""
self._order_recommendation_include_facts_prompt = ""
self._order_recommendation_shopping_list_prompt = ""
self._order_recommendation_final_prompt = ""
self._openai_key = os.getenv("OPENAI_KEY")
# ai.api_key = self._openai_key
def prompt_additional(self, ingredients, cuisine, cooking_skill, cooking_time, eating_time, servings, health_condition, intolerances, include_facts):
# Check if the input is complete
try:
assert ingredients != None
assert cuisine != None
assert cooking_skill != None
assert cooking_time != None
assert eating_time != None
assert servings != None
assert health_condition != None
assert intolerances != None
# Preprocess the input
cuisine = cuisine.lower()
cooking_skill = cooking_skill.lower()
cooking_time = cooking_time.lower()
eating_time = eating_time.lower()
servings = servings.lower()
health_condition = health_condition.lower()
intolerances = intolerances.lower()
self._health_condition_prompt = f"Consider the {health_condition} health condition. "
self._intolerances_prompt = f"Exclude {intolerances}. "
self._include_facts_prompt = "Provide the nutritions fact for recipe's one portion. "
if ingredients != "":
punct = "," + ";"
self.ingredients = "".join(ch for ch in ingredients if ch not in punct)
assert self.ingredients != [], "Please input your ingredients first"
self.ingredients = self.ingredients.lower()
self._main_prompt = f"Give me 3 ideas on what to cook for {cuisine} dish {eating_time} using {self.ingredients} only with instructions and ingredients, for {servings} with {cooking_skill} cooking skill during {cooking_time} of cooking time. "
else:
return "","**Please input your available ingredients first!**"
# Initialize the final prompt
self._final_prompt = self._main_prompt
if health_condition != "none":
self._final_prompt += self._health_condition_prompt
if intolerances != "none":
self._final_prompt += self._intolerances_prompt
if include_facts:
self._final_prompt += self._include_facts_prompt
self._final_prompt += " Give the condensed yet detailed answer"
# response = ai.ChatCompletion.create(
# model="gpt-3.5-turbo-0613",
# temperature=0.9,
# messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
# )
# print(response.json())
return "", self._final_prompt
except AssertionError:
return "","**Please complete the information first!**"
def prompt_meal_plan(self, ingredients, plan_duration, meals_per_day, cuisine, cooking_skill, cooking_time, intolerances, include_facts, shopping_list, servings):
# Check if the input is complete
try:
assert ingredients != None
assert cuisine != None
assert cooking_skill != None
assert cooking_time != None
assert servings != None
assert intolerances != None
# Preprocess the input
plan_duration = plan_duration.lower()
meals_per_day = meals_per_day.lower()
cuisine = cuisine.lower()
cooking_skill = cooking_skill.lower()
cooking_time = cooking_time.lower()
intolerances = intolerances.lower()
self._meal_planner_intolerances_prompt = f"Exclude {intolerances}. "
self._meal_planner_include_facts_prompt = "Provide the nutritions fact for recipe's one portion. "
self._meal_planner_shopping_list_prompt = f"Make a shopping list for {servings} according to it. "
if ingredients != "":
punct = "," + ";"
self.ingredients = "".join(ch for ch in ingredients if ch not in punct)
assert self.ingredients != [], "Please input your ingredients first"
self.ingredients = self.ingredients.lower()
self._meal_planner_prompt = f"Make {plan_duration} meal plan ({meals_per_day}/day) consist of {cuisine} food using {self.ingredients}, which can be cooked with {cooking_skill} skill during {cooking_time} of cooking time. "
else:
return "","**Please input the ingredients first!**"
# Initialize the final prompt
self._final_prompt = self._meal_planner_prompt
if intolerances != "none":
self._meal_planner_final_prompt += self._meal_planner_intolerances_prompt
if include_facts:
self._meal_planner_final_prompt += self._meal_planner_shopping_list_prompt
if shopping_list:
self._meal_planner_final_prompt += self._meal_planner_shopping_list_prompt
self._final_prompt += " Give the condensed yet detailed answer"
# response = ai.ChatCompletion.create(
# model="gpt-3.5-turbo-0613",
# temperature=0.9,
# messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
# )
# print(response.json())
return "", self._final_prompt
except AssertionError:
return "","**Please complete the information first!**"
def prompt_order_recommendation(self, eating_time, merchant, countries, activity_level, ingredients, age, intolerances):
# Check if the input is complete
try:
assert ingredients != None
assert merchant != None
assert countries != None
assert activity_level != None
assert intolerances != None
assert age != None
assert eating_time != None
# Preprocess the input
eating_time = eating_time.lower()
merchant = merchant.lower()
countries = countries.lower()
activity_level = activity_level.lower()
intolerances = intolerances.lower()
self._order_recommendation_intolerances_prompt = f"Exclude {intolerances}. "
if ingredients != "":
punct = "," + ";"
self.ingredients = "".join(ch for ch in ingredients if ch not in punct)
assert self.ingredients != [], "Please input your ingredients first"
self.ingredients = self.ingredients.lower()
self._order_recommendation_prompt = f"Suggest me what to order for {eating_time} at {merchant} {countries}, which contain {ingredients} "
else:
return "","**Please input the ingredients first!**"
if age.isnumeric():
age = int(age)
if self.is_integer(age) and age > 0 and age < 105:
self._order_recommendation_prompt += f"and enough nutrient for age {age} with {activity_level} activity level. "
else:
return "","**Please input the age first within the range (1 <= age <= 105 years)!**"
else:
return "","**Please input the age first with the correct value!**"
# Initialize the final prompt
self._final_prompt = self._order_recommendation_prompt
if intolerances != "none":
self._meal_planner_final_prompt += self._meal_planner_intolerances_prompt
self._final_prompt += " Give the condensed yet detailed answer"
# response = ai.ChatCompletion.create(
# model="gpt-3.5-turbo-0613",
# temperature=0.9,
# messages = [{"role": "user", "content": "What's the weather like in Boston?"}]
# )
# print(response.json())
return "", self._final_prompt
except AssertionError:
return "","**Please complete the information first!**"
def generate_recipe(self, cuisine, cooking_skill, cooking_time, eating_time, servings, health_condition, intolerances, include_facts):
interface = gr.Interface(self.prompt_additional, css="footer{display:none !important}", show_label=True, theme=gr.themes.Soft(primary_hue="orange", secondary_hue="orange"), inputs=[gr.Textbox(input="text", label="Ingredients", info="What's inside your fridge?", placeholder="Chicken, Goguma, Chili etc"), gr.Dropdown(cuisine, value=cuisine[0], label="Cuisine", info="What Cuisine that you crave now?"), gr.Radio(cooking_skill, value=cooking_skill[0], label="Cooking Skill", info="What is your cooking skill?"),
gr.Radio(cooking_time, value=cooking_time[0], label="Cooking Time", info="How much time do you have to cook?"), gr.Radio(eating_time, value=eating_time[0], label="Eating Time", info="When do you want to eat?"), gr.Dropdown(servings, value=servings[0], label="Servings", info="How many people will eat?"),
gr.Dropdown(health_condition, value=health_condition[0], label="Health Condition", info="Is there any special health condition?"), gr.Dropdown(intolerances, value=intolerances[0], label="Intolerances", info="Is there any intolerances?"),
gr.Checkbox(include_facts, label="Include Nutrition Facts?")], outputs=[gr.Radio(label="Kokiku's Recipe", placeholder="Complete the information to see our brilliant and tasty recipe recommendations", default="Complete the information to see our brilliant and tasty recipe recommendations", readonly=True, info="Our recipe recommendation will be shown here!"), gr.Markdown()])
return interface
def generate_meal_plan(self, plan_duration, meals_per_day, cuisine, cooking_skill, cooking_time, intolerances, servings, include_shopping_list, include_facts):
interface = gr.Interface(self.prompt_meal_plan, css="footer{display:none !important}", show_label=True, theme=gr.themes.Soft(primary_hue="orange", secondary_hue="orange"), inputs=[gr.Textbox(input="text", label="Ingredients", info="What ingredients you want to use?", placeholder="Chicken, Goguma, Chili etc"), gr.Dropdown(plan_duration, value=plan_duration[0], label="Plan Duration", info="How long is the plan?"), gr.Dropdown(meals_per_day, value=meals_per_day[0], label="Meals per Day", info="How many times a day do you eat?"),
gr.Dropdown(cuisine, value=cuisine[0], label="Cuisine", info="What Cuisine that you crave now?"), gr.Radio(cooking_skill, value=cooking_skill[0], label="Cooking Skill", info="What is your cooking skill?"), gr.Radio(cooking_time, value=cooking_time[0], label="Cooking Time", info="How much time do you have to cook?"),
gr.Dropdown(intolerances, value=intolerances[0], label="Intolerances", info="Is there any intolerances?"), gr.Dropdown(servings, value=servings[0], label="Servings", info="How many people will eat?"), gr.Checkbox(include_shopping_list, label="Include the shopping lists for your plan?"),
gr.Checkbox(include_facts, label="Include Nutrition Facts?")], outputs=[gr.Radio(label="Kokiku's Meal Plan", placeholder="Complete the information to see our meal plans recommendations", default="Complete the information to see our meal plans recommendations", readonly=True, info="Our meal plans recommendation will be shown here!"), gr.Markdown()])
return interface
def generate_order_recommendaton(self, eating_time, merchant, countries, activity_level, intolerances):
interface = gr.Interface(self.prompt_order_recommendation, css="footer{display:none !important}", show_label=True, theme=gr.themes.Soft(primary_hue="orange", secondary_hue="orange"), inputs=[gr.Radio(eating_time, value=eating_time[0], label="Eating Time", info="When do you want to eat?"), gr.Dropdown(merchant, value=merchant[0], label="Merchant", info="Where are you going to eat?"), gr.Dropdown(countries, value=countries[0], label="Country", info="Which country?"),
gr.Dropdown(activity_level, value=activity_level[0], label="Activty Level", info="How active are you?"), gr.Textbox(input="text", label="Ingredients", info="What ingredients to include in your food?", placeholder="Beef, Celery, Meatballs"), gr.Textbox(input="text", label="Age", info="How old are you?", placeholder="20 (numbers only)"), gr.Dropdown(intolerances, value=intolerances[0], label="Intolerances", info="Is there any intolerances?")],
outputs=[gr.Radio(label="Kokiku's order suggestion", placeholder="Complete the information to see our order suggestions", default="Complete the information to see our order suggestions", readonly=True, info="Our food order recommendations will be shown here!"), gr.Markdown()])
return interface
@staticmethod
def is_integer(n):
try:
float(n)
except ValueError:
return False
else:
return float(n).is_integer()
def main():
kokiku = Kokiku()
app_recipe = kokiku.generate_recipe(kokiku.cuisine, kokiku.cooking_skill, kokiku.cooking_time, kokiku.eating_time, kokiku.servings, kokiku.health_condition, kokiku.intolerances, kokiku.include_facts)
app_plan = kokiku.generate_meal_plan(kokiku.plan_duration, kokiku.meals_per_day, kokiku.cuisine, kokiku.cooking_skill, kokiku.cooking_time, kokiku.intolerances, kokiku.servings, kokiku.include_shopping_list, kokiku.include_facts)
app_order = kokiku.generate_order_recommendaton(kokiku.eating_time, kokiku.merchant, kokiku.countries, kokiku.activity_level, kokiku.intolerances)
app_entire = gr.TabbedInterface([app_recipe, app_plan, app_order], tab_names=["Recipe Maker", "Meal Planner", "What to Order"], title="Kokiku", theme=gr.themes.Soft(primary_hue="orange", secondary_hue="orange"), css="footer{display:none !important}")
app_entire.launch(favicon_path="/assets/chef.ico", debug=False)
if __name__ == "__main__":
main()
|