File size: 4,301 Bytes
fbdcaaf
9ff2b7e
fd07ca2
 
 
 
 
 
 
fbdcaaf
 
 
 
 
4a69763
fd07ca2
4a69763
fbdcaaf
fd07ca2
 
 
 
 
 
 
 
 
 
763e0c3
 
 
119e7a1
7d13eb4
763e0c3
 
119e7a1
7d13eb4
763e0c3
 
119e7a1
763e0c3
 
 
 
fd07ca2
763e0c3
4105ba7
 
 
763e0c3
fd07ca2
763e0c3
 
 
 
 
fd07ca2
fbdcaaf
 
 
 
 
fd07ca2
 
fbdcaaf
 
763e0c3
fd07ca2
 
fbdcaaf
 
1481d5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd07ca2
fbdcaaf
8bab72c
fbdcaaf
 
5ff038b
 
 
b2a32bf
 
5ff038b
b7ee1cf
 
 
 
5ff038b
b7ee1cf
 
 
 
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
# imports
import streamlit as st
import numpy as np
import pandas as pd
import re
import json
import openai
openai.api_key = st.secrets["open_ai_key"]

# state management
if 'gpt_response' not in st.session_state:
    st.session_state.gpt_response = None

# app
st.title("Let's get cooking :male-cook:")
user_direction = st.text_area(
    "What do you feel like making?",
    placeholder="quick snack, asian style bowl with either noodles or rice, something italian",
    )

serving_size = st.number_input(
    "How many people are you cooking for?",
    min_value=1,
    max_value=100,
    value=2,
    step=1
)

difficulty_dictionary = {
    "Quick & Easy": {
        "description": "Easy recipes with straightforward instructions. Ideal for beginners or those seeking quick and simple cooking.",
        "gpt_instruction": "Easy: a quick and easy recipe with simple/straightfoward ingredients and instructions."
    },
    "Intermediate": {
        "description": "Recipes with some intricate steps that invite a little challenge. Perfect for regular cooks wanting to expand their repertoire with new ingredients and techniques.",
        "gpt_instruction": "Intermediate: intermediate recipe with some intricate ingredients and instructional steps."
    },
    "Professional": {
        "description": "Complex recipes that demand a high level of skill and precision. Suited for seasoned cooks aspiring to professional-level sophistication and creativity.",
        "gpt_instruction": "Professional: restaurant quality dish that is innovative and even experimental. may use a variety of ingredients and techniques."
    }
}

selected_difficulty = st.radio(
    "Choose a difficulty level for your recipe.",
    [
        list(difficulty_dictionary.keys())[0], 
        list(difficulty_dictionary.keys())[1], 
        list(difficulty_dictionary.keys())[2]
    ],
    captions = [
        difficulty_dictionary["Quick & Easy"]["description"], 
        difficulty_dictionary["Intermediate"]["description"],
        difficulty_dictionary["Professional"]["description"]
    ]
)

exclusions = st.text_area(
    "Any ingredients you want to exclude?",
    placeholder="gluten, dairy, nuts, cilantro",
    )

user_inputs = {
    "user_direction" : user_direction,
    "exclusions": exclusions,
    "serving_size": serving_size,
    "difficulty": difficulty_dictionary['selected_difficulty']['gpt_instruction']
}

    
def generate_recipe(user_inputs):
    with st.spinner('Building the perfect recipe for you...'):
        context = """Provide me a recipe based on the user input.
        Output this in a valid JSON object with the following properties:
        recipe_name (string): the name of the recipe
        recipe_serving_size (string): the serving size of the recipe (example: "4 people")
        recipe_time (string): the amount of time required to make the recipe (example: "60 minutes (Preparation: 20 minutes, Baking: 40 minutes)")
        recipe_ingredients (string): python list of ingredients required to make the recipe
        recipe_instructions (string): python list of instructions to make the recipe
        """
        messages = [
            {"role": "system", "content": context},
            {"role": "user", "content": str(user_inputs)}
            ]
        
        st.session_state.gpt_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            temperature=0.5
        )


st.button(label='Submit', on_click=generate_recipe, kwargs=dict(user_inputs=user_inputs))

if st.session_state.gpt_response is not None:
    st.divider()
    loaded_recipe = json.loads(st.session_state.gpt_response['choices'][0]['message']['content'])
    st.header(loaded_recipe['recipe_name'])
    st.write(f"**Serving Size: {loaded_recipe['recipe_serving_size']}**")
    st.write(f"**Time To Make: {loaded_recipe['recipe_time']}**")
    st.subheader("Ingredients:")
    md_ingredients = ''
    for ingredient in loaded_recipe['recipe_ingredients']:
        md_ingredients += "- " + ingredient + "\n"
    st.markdown(md_ingredients)
    st.subheader("Instructions:")
    md_instructions = ''
    for instruction in loaded_recipe['recipe_instructions']:
        md_instructions += "- " + instruction + "\n"
    st.markdown(md_instructions)