Spaces:
Sleeping
Sleeping
| from openai import OpenAI | |
| import streamlit as st | |
| import os | |
| from dotenv import load_dotenv, find_dotenv | |
| st.set_page_config( | |
| page_title="Chatbot", | |
| layout='wide' | |
| ) | |
| if 'total_groceries' not in st.session_state: | |
| st.session_state.total_groceries = {} | |
| with open("total_groceries.txt", "r") as file: | |
| st.session_state.total_groceries = eval(file.read()) | |
| # Load environment variables | |
| _ = load_dotenv(find_dotenv()) | |
| # Get OpenAI API key | |
| openai_api_key = os.getenv('OPENAI_API_KEY') | |
| # Google Drive file ID for the video | |
| video_file_id = '1miZ6Zz4lt0wxTGbrtR8IltVr_fOPX6Vr' | |
| video_url = f'https://drive.google.com/uc?export=view&id={video_file_id}' | |
| # Create columns for layout | |
| col1, col2 = st.columns([0.20, 0.80]) | |
| # Column 1: Display the embedded video without controls | |
| with col1: | |
| video_html = f""" | |
| <video width="100%" height="auto" autoplay muted style="margin-top: -30px;"> | |
| <source src="{video_url}" type="video/mp4"> | |
| Your browser does not support the video tag. | |
| </video> | |
| """ | |
| st.markdown(video_html, unsafe_allow_html=True) | |
| with col2: | |
| st.title("NomNom Bot") | |
| st.markdown('<style>div.Widget.row-widget.stRadio > div{flex-direction:row;}</style>', unsafe_allow_html=True) | |
| st.caption("π³ Your personal recipe generator!") | |
| st.caption("Enter a cuisine and your dietary restrictions to get started :)") | |
| with st.sidebar: | |
| cuisine = st.text_input("Cuisine you're craving", key="cuisine") | |
| diet_res = st.text_input("Dietary Restrictions", key="diet_res") | |
| ingredients = { | |
| 'Tomatoes': 3, | |
| 'Rice': 1 | |
| } | |
| ingredients = st.session_state.total_groceries | |
| content_template = """ | |
| I have scanned/entered my grocery store receipts. Here are the items and their quantity (in the form of a dictionary) I have purchased: | |
| {ingredients}. | |
| My dietary restrictions include {diet_res}. I am in the mood for {cuisine} recipes. Give me a detailed recipe using ONLY | |
| the ingredients I have. I also have common pantry items like salt, pepper, olive oil, and basic spices. | |
| Make sure to take the cuisine and dietary restrictions into consideration definitively. | |
| Provide a recipe that aligns with the preferred cuisine given by the user. A cuisine is a style or method of cooking, especially of a particular country | |
| or region. Use ingredients, foods, and techniques from the cuisine from that specific region. | |
| If the user says their dietary restriction is an X allergy or allergic to X where X is any ingredient, make sure to exclude X from the recipe | |
| since the user could die of an allergic reaction and you will be responsible. | |
| Start your response with "Howdy, I'm the NomNom Bot!" and end by asking if the user has any follow-up questions or needs any additional resources. | |
| """ | |
| print("Content Template:", content_template.format(ingredients=ingredients, diet_res=diet_res, cuisine=cuisine)) | |
| # Initialize the chat with an initial user message | |
| if cuisine and diet_res: | |
| if "messages" not in st.session_state: | |
| print("Content Template:", content_template.format(ingredients=ingredients, diet_res=diet_res, cuisine=cuisine)) | |
| st.session_state["messages"] = [ | |
| {"role": "user", "content": content_template.format(ingredients=ingredients, diet_res=diet_res, cuisine=cuisine)}] | |
| # Display the chat messages | |
| for msg in st.session_state.messages[1:]: | |
| st.chat_message(msg["role"]).write(msg["content"]) | |
| # Generate a response for the initial user message | |
| if len(st.session_state.messages) == 1: | |
| client = OpenAI(api_key=openai_api_key) | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=st.session_state.messages, | |
| max_tokens=2048, | |
| n=1, | |
| stop=None, | |
| temperature=0.5 | |
| ) | |
| msg = response.choices[0].message.content | |
| st.session_state.messages.append({"role": "assistant", "content": msg}) | |
| st.chat_message("assistant").write(msg) | |
| # User can ask follow-up questions | |
| if prompt := st.chat_input(): | |
| if not openai_api_key: | |
| st.info("API key is not valid.") | |
| st.stop() | |
| client = OpenAI(api_key=openai_api_key) | |
| st.session_state.messages.append({"role": "user", "content": prompt}) | |
| st.chat_message("user").write(prompt) | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=st.session_state.messages, | |
| max_tokens=2048, | |
| n=1, | |
| stop=None, | |
| temperature=0.5 | |
| ) | |
| msg = response.choices[0].message.content | |
| st.session_state.messages.append({"role": "assistant", "content": msg}) | |
| st.chat_message("assistant").write(msg) |