SortingHat / app.py
charizdiannefalco's picture
Renewed
7d325a7
import streamlit as st
from openai import OpenAI
import re
import os
# Initialize OpenAI client (REPLACE with your actual key from environment variables or a secure config)
# IMPORTANT: Never hardcode API keys in your code, especially for sharing!
client = OpenAI(
base_url="https://integrate.api.nvidia.com/v1", # Assuming this is your correct base URL
api_key="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" # Replace with your actual key
)
st.title("Sorting Hat")
def get_essay_answer():
"""Gets the essay answer from the user."""
st.subheader("Answer the Question:")
essay = st.text_area("Describe what you would do if you encountered a lost and distressed first-year student who has lost their pet toad and is terrified of being late for Herbology.", height=200) # Increased height for essay
return essay
def get_sorted(essay):
"""Handles the sorting process using the OpenAI API."""
if essay: # Check if essay is not empty
output_area = st.empty()
messages = [{"role": "user", "content": f"""Pretend that you are the sorting hat in Harry Potter. Sort me into a house in Hogwarts based on my answer. Give me the house ONLY (one word: Gryffindor, Hufflepuff, Ravenclaw, Slytherin) on the first line. On the second line explain your reasoning for sorting me there. Here is my answer:
{essay}
"""}]
with st.spinner("Sorting..."):
try:
completion = client.chat.completions.create(
model="meta/llama-3.1-405b-instruct", # Your model
messages=messages,
temperature=0.7,
max_tokens=200,
stream=True,
)
full_response = ""
message_placeholder = st.empty()
for chunk in completion:
if chunk.choices[0].delta and chunk.choices[0].delta.content:
full_response += chunk.choices[0].delta.content
message_placeholder.markdown(full_response, unsafe_allow_html=False)
elif chunk.choices[0].finish_reason == "stop":
break
house_match = re.search(r"(Gryffindor|Hufflepuff|Ravenclaw|Slytherin)", full_response, re.IGNORECASE)
if house_match:
house = house_match.group(0).strip()
try:
parts = full_response.split(house + '\n', 1)
if len(parts) > 1:
explanation = parts[1].strip()
else:
explanation = "No explanation provided."
except Exception as e:
explanation = f"Error extracting explanation: {e}"
gif_path = {
"Gryffindor": "https://i.pinimg.com/originals/52/46/eb/5246eba389dfc5722324b484975a012f.gif",
"Hufflepuff": "https://c.tenor.com/ThUF6Bm-GLgAAAAM/always-harry-potter.gif",
"Ravenclaw": "https://media.tenor.com/Sgm7TzrEQzAAAAAC/harry-potter-ravenclaw.gif",
"Slytherin": "https://media.giphy.com/media/A1xhQcogWZAIg/giphy.gif"
}.get(house, "default.gif")
output_area.image(gif_path, width=300)
else:
output_area.error("The Sorting Hat's response was not in the expected format.")
except Exception as e:
output_area.error(f"An error occurred: {e}")
else:
st.warning("Please provide an answer.")
# Main app flow
essay = get_essay_answer() # Get the essay answer
if st.button("Get Sorted!"):
get_sorted(essay) # Pass the essay to get_sorted()