Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
from langchain.chains import LLMChain, SequentialChain | |
from langchain.prompts import PromptTemplate | |
from langchain_community.llms import OpenAI # <-- UPDATED IMPORT | |
# Get OpenAI API key from environment variable | |
openai_api_key = os.getenv("OPENAI_API_KEY") | |
llm = OpenAI(openai_api_key=openai_api_key, temperature=0.9) | |
# Define prompt templates | |
prompt_template_name = PromptTemplate( | |
input_variables=['cuisine'], | |
template="I want to open a restaurant for {cuisine} food. Suggest a fancy name for this" | |
) | |
name_chain = LLMChain(llm=llm, prompt=prompt_template_name, output_key="restaraunt_name") | |
prompt_template_items = PromptTemplate( | |
input_variables=['restaraunt_name', 'cuisine'], | |
template="Suggest a comprehensive menu for {restaraunt_name} which is {cuisine} cuisine. For each item, provide a brief, one-sentence description. Do not use any numbering or bullet points. Only mention items names and descriptions, break down according to category. Format the output as 'Category:\nItem Name - Description\n...'" | |
) | |
food_items_chain = LLMChain(llm=llm, prompt=prompt_template_items, output_key="menu_items") | |
chain = SequentialChain( | |
chains=[name_chain, food_items_chain], | |
input_variables=['cuisine'], | |
output_variables=['restaraunt_name', 'menu_items'] | |
) | |
TOP_CUISINES = [ | |
"Italian", "Chinese", "Japanese", "Mexican", "Indian", | |
"French", "Thai", "Mediterranean", "American", "Spanish" | |
] | |
def generate_restaurant(cuisine): | |
outputs = chain({'cuisine': cuisine}) | |
restaurant_name = outputs['restaraunt_name'] | |
menu_items_str = outputs['menu_items'] | |
lines = menu_items_str.strip().split('\n') | |
menu_html = """ | |
<style> | |
.menu-container { | |
display: grid; | |
grid-template-columns: repeat(3, 1fr); | |
gap: 16px; | |
padding: 16px; | |
background-color: #f0e6d2; | |
border-radius: 12px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
} | |
.menu-tile { | |
background-color: #fffaf0; | |
border-radius: 8px; | |
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); | |
padding: 16px; | |
text-align: center; | |
display: flex; | |
flex-direction: column; | |
justify-content: center; | |
align-items: center; | |
border: 1px solid #d2b48c; | |
} | |
.menu-tile h4 { | |
margin: 0 0 8px 0; | |
font-weight: bold; | |
color: #5c4033; | |
font-family: 'Comic Neue', cursive, sans-serif; | |
} | |
.menu-description { | |
margin: 0; | |
color: #8b4513; | |
font-size: 0.9em; | |
line-height: 1.4; | |
text-align: left; | |
font-family: 'Comic Neue', cursive, sans-serif; | |
} | |
.category-header { | |
grid-column: 1 / -1; | |
font-size: 1.5em; | |
font-weight: bold; | |
color: #a0522d; | |
margin-top: 20px; | |
margin-bottom: 10px; | |
text-align: left; | |
font-family: 'Comic Neue', cursive, sans-serif; | |
} | |
</style> | |
<div class="menu-container"> | |
""" | |
current_category = "" | |
for line in lines: | |
line = line.strip() | |
if not line: | |
continue | |
if ":" in line: | |
current_category = line.replace(":", "") | |
menu_html += f'<div class="category-header">{current_category}</div>' | |
else: | |
parts = line.split(' - ', 1) | |
if len(parts) == 2: | |
item_name, item_description = parts | |
menu_html += f""" | |
<div class="menu-tile"> | |
<h4>{item_name.strip()}</h4> | |
<p class="menu-description">{item_description.strip()}</p> | |
</div> | |
""" | |
menu_html += "</div>" | |
return restaurant_name, menu_html | |
def on_generate(selected, custom): | |
cuisine = custom.strip() if custom and custom.strip() else selected | |
return generate_restaurant(cuisine) | |
with gr.Blocks(title="Restaurant Business Generator", theme="soft", css=""" | |
@import url('https://fonts.googleapis.com/css2?family=Comic+Neue:wght@400;700&display=swap'); | |
body { | |
font-family: 'Comic Neue', 'Comic Sans MS', cursive, sans-serif; | |
} | |
.gradio-container { | |
background-color: #f5f5dc; | |
color: #5c4033; | |
} | |
.gradio-container h1, .gradio-container h2, .gradio-container h3, .gradio-container h4, .gradio-container h5, .gradio-container h6 { | |
color: #5c4033; | |
} | |
.gradio-container label { | |
color: #8b4513 !important; | |
font-family: 'Comic Neue', cursive, sans-serif; | |
} | |
.gradio-container .gr-markdown p { | |
color: #8b4513 !important; | |
} | |
.gradio-container input[type="text"], .gradio-container textarea { | |
border-color: #d2b48c; | |
} | |
.gradio-container .gr-dropdown { | |
border-color: #d2b48c; | |
} | |
.gradio-container .gr-dropdown-selected { | |
background-color: #fffaf0; | |
} | |
#generate-btn { | |
background-color: #a0522d; | |
color: white; | |
font-weight: bold; | |
border: none; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
} | |
#generate-btn:hover { | |
background-color: #8b4513; | |
} | |
.output-class { | |
background-color: #faebd7; | |
border: 1px solid #d2b48c; | |
border-radius: 8px; | |
padding: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.08); | |
} | |
#restaurant-name-output textarea { | |
color: #5c4033; | |
font-weight: bold; | |
font-size: 1.1em; | |
background-color: #fffaf0 !important; | |
border: 1px solid #d2b48c !important; | |
} | |
:root { | |
--primary-50: #fffaf0 !important; | |
--primary-100: #fff5e1 !important; | |
--primary-200: #fff0d2 !important; | |
--primary-300: #ffe9b9 !important; | |
--primary-400: #ffe1a0 !important; | |
--primary-500: #a0522d !important; | |
--primary-600: #8b4513 !important; | |
--primary-700: #5c4033 !important; | |
--primary-800: #4a332a !important; | |
--primary-900: #3b2820 !important; | |
--primary-950: #291a14 !important; | |
} | |
""") as demo: | |
gr.Markdown("<h1 style='text-align:center; color: #5c4033;'>✨ The Magical Restaurant Idea Generator ✨</h1>") | |
with gr.Row(): | |
with gr.Column(scale=1, min_width=200): | |
gr.Markdown("<p style='color:#8b4513; text-align:center;'>Choose a cuisine or type your own, and let the magic happen! We'll give you a cute restaurant name and a delightful menu.</p>") | |
cuisine_dropdown = gr.Dropdown(choices=TOP_CUISINES, label="Popular Cuisines", value=TOP_CUISINES[0]) | |
cuisine_textbox = gr.Textbox(label="Or enter a custom cuisine", placeholder="e.g. Vietnamese, Peruvian") | |
generate_btn = gr.Button("Create My Restaurant! 🪄", variant="primary", elem_id="generate-btn") | |
with gr.Column(scale=2, elem_classes="output-class"): | |
name_output = gr.Textbox(label="Suggested Restaurant Name", interactive=False, elem_id="restaurant-name-output") | |
menu_output = gr.HTML(label="Suggested Menu Items") | |
generate_btn.click(fn=on_generate, inputs=[cuisine_dropdown, cuisine_textbox], outputs=[name_output, menu_output]) | |
if __name__ == "__main__": | |
demo.launch() | |