bitebot_app / app.py
aashnaj's picture
system message lines
359e971 verified
import gradio as gr
from huggingface_hub import InferenceClient
from sentence_transformers import SentenceTransformer
import torch
# Load knowledge
with open("recipesplease.txt", "r", encoding="utf-8") as file:
knowledge = file.read()
cleaned_chunks = [chunk.strip() for chunk in knowledge.strip().split("\n") if chunk.strip()]
model = SentenceTransformer('all-MiniLM-L6-v2')
chunk_embeddings = model.encode(cleaned_chunks, convert_to_tensor=True)
def get_top_chunks(query):
query_embedding = model.encode(query, convert_to_tensor=True)
query_embedding_normalized = query_embedding / query_embedding.norm()
similarities = torch.matmul(chunk_embeddings, query_embedding_normalized)
top_indices = torch.topk(similarities, k=5).indices.tolist()
return [cleaned_chunks[i] for i in top_indices]
client = InferenceClient("Qwen/Qwen2.5-72B-Instruct")
def respond(message, history, cuisine, dietary_restrictions, allergies, preferred_ingredient):
response = ""
top_chunks = get_top_chunks(message)
context = "\n".join(top_chunks)
print (top_chunks)
messages = [
{
"role": "system",
"content": f"""You are a friendly recipe chatbot named BiteBot. Your job is to help users find the perfect recipe based only on the recipes provided in this file: {context}. The user is looking for a recipe that fits the following criteria:
Make sure the recipe is of the cuisine, {cuisine}
They have the dietary restrictions {dietary_restrictions} and the allergies {allergies}
Make sure to include their preferred ingredient, {preferred_ingredient}
If any of this information is missing, that’s okay! Gently guide the user by suggesting popular, easy-to-make recipes that avoid common allergens. Ask follow-up questions like:
'Are you in the mood for something sweet or savory?'
'Would you prefer something quick or hearty?'
'Would you like a vegetarian option or something with meat?'
Based on the user's preferences, find a matching recipe from the provided context. Respond with the title of the recipe and ask:
'Does this recipe sound good to you?'
If the user says yes, share the ingredients and then ask if they’d like the instructions.
If they say yes again, provide the full cooking instructions.
If they say no at any step, kindly offer another recipe suggestion.
Never generate recipes on your own—only use the ones found in the file provided."""
}
]
if history:
messages.extend(history)
messages.append({"role": "user", "content": message})
stream = client.chat_completion(
messages,
max_tokens=700,
temperature=1.7,top_p=0.7,
stream=True,
)
for message in stream:
token = message.choices[0].delta.content
if token is not None:
response += token
yield response
logo="banner.png"
theme = gr.themes.Monochrome(
primary_hue="orange",
secondary_hue="zinc",
neutral_hue=gr.themes.Color(c100="rgba(255, 227.4411088400613, 206.9078947368421, 1)", c200="rgba(255, 229.53334184977007, 218.0921052631579, 1)", c300="rgba(255, 234.91658150229947, 213.6184210526316, 1)", c400="rgba(189.603125, 154.41663986650488, 133.88641721491229, 1)", c50="#f3d1bbff", c500="rgba(170.2125, 139.18781968574348, 118.70082236842106, 1)", c600="rgba(193.32187499999998, 129.35648241888094, 111.07528782894737, 1)", c700="rgba(184.13125000000002, 141.9707339039346, 106.60230263157897, 1)", c800="rgba(156.06796875, 104.12209005333418, 69.81988075657894, 1)", c900="rgba(156.39999999999998, 117.22008175779253, 80.2578947368421, 1)", c950="rgba(158.43203125, 125.1788770279765, 97.28282620614036, 1)"),
text_size="sm",
spacing_size="md",
radius_size="sm",
).set(
body_background_fill='*primary_50',
body_background_fill_dark='*primary_50'
)
with gr.Blocks(theme=theme) as chatbot:
gr.Image(
value="Henrietta.png",
show_label=False,
show_share_button = False,
show_download_button = False)
gr.Markdown("### 👋 Welcome to BiteBot!\nTell me your preferred **cuisine**, any **dietary restrictions**, and **allergies**, and I’ll help you figure out what to cook. You can ask questions like:\n- _“What should I make tonight?”_\n- _“Give me something vegan and Indian.”_\n- _“I’m allergic to nuts—what can I eat?”_")
cuisine=gr.Textbox(label="cuisine")
dietary_restrictions=gr.Dropdown(["Gluten-Free","Dairy-Free","Vegan","Vegetarian","Keto","Kosher","No Soy","No Seafood","No Pork","No Beef"], label="dietary restrictions", multiselect=True,info="you can select multiple!")
allergies=gr.Textbox(label="allergies")
preferred_ingredient=gr.Textbox(label="preferred ingredient")
gr.ChatInterface(
fn=respond,
type="messages", additional_inputs=[cuisine,dietary_restrictions,allergies]
)
chatbot.launch()