Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -9,7 +9,11 @@ openai.api_key = os.environ["OPENAI_API_KEY"]
|
|
| 9 |
initial_messages = [{
|
| 10 |
"role": "system",
|
| 11 |
"content": """
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
"""
|
| 14 |
}]
|
| 15 |
|
|
@@ -20,8 +24,50 @@ def call_openai_api(messages):
|
|
| 20 |
max_tokens=300 # Limit tokens to keep responses concise
|
| 21 |
)
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
def CustomChatGPT(city, preferences, messages):
|
| 24 |
-
query = f"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
messages.append({"role": "user", "content": query})
|
| 26 |
response = call_openai_api(messages)
|
| 27 |
ChatGPT_reply = response["choices"][0]["message"]["content"]
|
|
@@ -31,7 +77,7 @@ def CustomChatGPT(city, preferences, messages):
|
|
| 31 |
# Streamlit setup
|
| 32 |
st.set_page_config(layout="wide")
|
| 33 |
|
| 34 |
-
# Initialize session state
|
| 35 |
if "reply" not in st.session_state:
|
| 36 |
st.session_state["reply"] = None
|
| 37 |
|
|
@@ -40,7 +86,6 @@ st.markdown("<h1 style='text-align: center; color: black;'>Ideal Neighborhood Fi
|
|
| 40 |
|
| 41 |
# User inputs
|
| 42 |
col1, col2 = st.columns(2)
|
| 43 |
-
|
| 44 |
with col1:
|
| 45 |
st.markdown("<h2 style='text-align: center; color: black;'>Your Preferences</h2>", unsafe_allow_html=True)
|
| 46 |
city = st.text_input("City", placeholder="Enter the city you want to search in")
|
|
@@ -50,7 +95,7 @@ with col1:
|
|
| 50 |
# Process results on button click
|
| 51 |
if generate_button and city and preferences:
|
| 52 |
messages = initial_messages.copy()
|
| 53 |
-
st.session_state["reply"], _ = CustomChatGPT(city, preferences, messages)
|
| 54 |
|
| 55 |
# Display results if there is a reply in session state
|
| 56 |
if st.session_state["reply"]:
|
|
@@ -58,21 +103,13 @@ if st.session_state["reply"]:
|
|
| 58 |
st.markdown("<h2 style='text-align: center; color: black;'>Recommended Neighborhoods ⬇️</h2>", unsafe_allow_html=True)
|
| 59 |
st.write(st.session_state["reply"])
|
| 60 |
|
| 61 |
-
# Extract
|
| 62 |
-
neighborhoods = []
|
| 63 |
-
for line in st.session_state["reply"].splitlines():
|
| 64 |
-
if line and "," in line and ":" in line: # Ensure it matches "Neighborhood, City, State:"
|
| 65 |
-
location = line.split(":")[0].strip() # Capture up to the first colon
|
| 66 |
-
# Remove any numbering
|
| 67 |
-
if location[0].isdigit():
|
| 68 |
-
location = location.split(" ", 1)[1].strip()
|
| 69 |
-
neighborhoods.append(location)
|
| 70 |
|
| 71 |
-
#
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
st.markdown(f"- [Search for homes in {location} on Zillow]({zillow_url})")
|
|
|
|
| 9 |
initial_messages = [{
|
| 10 |
"role": "system",
|
| 11 |
"content": """
|
| 12 |
+
You are a neighborhood matchmaker. Given a person's preferences in terms of amenities,
|
| 13 |
+
lifestyle, and priorities, suggest exactly three neighborhoods that best match their needs
|
| 14 |
+
in a specified city. For each neighborhood, start with a numbered line (1., 2., or 3.)
|
| 15 |
+
followed by the full location in the format: 'Neighborhood, City, State:' then provide
|
| 16 |
+
a brief description on the next line.
|
| 17 |
"""
|
| 18 |
}]
|
| 19 |
|
|
|
|
| 24 |
max_tokens=300 # Limit tokens to keep responses concise
|
| 25 |
)
|
| 26 |
|
| 27 |
+
def parse_neighborhoods(response_text):
|
| 28 |
+
"""
|
| 29 |
+
Parse the response text to extract neighborhood information more reliably.
|
| 30 |
+
Returns a list of tuples containing (neighborhood name, full location string)
|
| 31 |
+
"""
|
| 32 |
+
neighborhoods = []
|
| 33 |
+
current_location = ""
|
| 34 |
+
|
| 35 |
+
# Split the response into lines and process each line
|
| 36 |
+
lines = response_text.strip().split('\n')
|
| 37 |
+
for line in lines:
|
| 38 |
+
line = line.strip()
|
| 39 |
+
# Look for lines that start with a number and contain location info
|
| 40 |
+
if line and (line.startswith('1.') or line.startswith('2.') or line.startswith('3.')):
|
| 41 |
+
if ':' in line:
|
| 42 |
+
# Remove the number and leading space
|
| 43 |
+
location = line.split('.', 1)[1].strip()
|
| 44 |
+
# Split at the colon to get just the location part
|
| 45 |
+
location = location.split(':', 1)[0].strip()
|
| 46 |
+
if ',' in location:
|
| 47 |
+
neighborhoods.append(location)
|
| 48 |
+
|
| 49 |
+
return neighborhoods
|
| 50 |
+
|
| 51 |
+
def format_zillow_search(location):
|
| 52 |
+
"""
|
| 53 |
+
Format the location string for Zillow search, handling special characters and spaces.
|
| 54 |
+
"""
|
| 55 |
+
# Remove any special characters and extra spaces
|
| 56 |
+
clean_location = ' '.join(location.split())
|
| 57 |
+
# Encode the location for URL
|
| 58 |
+
encoded_location = urllib.parse.quote(clean_location)
|
| 59 |
+
# Create the Zillow search URL
|
| 60 |
+
return f"https://www.zillow.com/homes/{encoded_location}_rb/"
|
| 61 |
+
|
| 62 |
def CustomChatGPT(city, preferences, messages):
|
| 63 |
+
query = f"""
|
| 64 |
+
User is looking for neighborhoods in {city} with these preferences: {preferences}.
|
| 65 |
+
Please suggest exactly 3 suitable neighborhoods. For each one:
|
| 66 |
+
1. Start with a number (1., 2., or 3.)
|
| 67 |
+
2. Provide the full location as 'Neighborhood, City, State:'
|
| 68 |
+
3. Add a brief description on the next line
|
| 69 |
+
"""
|
| 70 |
+
|
| 71 |
messages.append({"role": "user", "content": query})
|
| 72 |
response = call_openai_api(messages)
|
| 73 |
ChatGPT_reply = response["choices"][0]["message"]["content"]
|
|
|
|
| 77 |
# Streamlit setup
|
| 78 |
st.set_page_config(layout="wide")
|
| 79 |
|
| 80 |
+
# Initialize session state
|
| 81 |
if "reply" not in st.session_state:
|
| 82 |
st.session_state["reply"] = None
|
| 83 |
|
|
|
|
| 86 |
|
| 87 |
# User inputs
|
| 88 |
col1, col2 = st.columns(2)
|
|
|
|
| 89 |
with col1:
|
| 90 |
st.markdown("<h2 style='text-align: center; color: black;'>Your Preferences</h2>", unsafe_allow_html=True)
|
| 91 |
city = st.text_input("City", placeholder="Enter the city you want to search in")
|
|
|
|
| 95 |
# Process results on button click
|
| 96 |
if generate_button and city and preferences:
|
| 97 |
messages = initial_messages.copy()
|
| 98 |
+
st.session_state["reply"], _ = CustomChatGPT(city, preferences, messages)
|
| 99 |
|
| 100 |
# Display results if there is a reply in session state
|
| 101 |
if st.session_state["reply"]:
|
|
|
|
| 103 |
st.markdown("<h2 style='text-align: center; color: black;'>Recommended Neighborhoods ⬇️</h2>", unsafe_allow_html=True)
|
| 104 |
st.write(st.session_state["reply"])
|
| 105 |
|
| 106 |
+
# Extract and display Zillow links
|
| 107 |
+
neighborhoods = parse_neighborhoods(st.session_state["reply"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
+
if neighborhoods: # Only show the section if we successfully parsed neighborhoods
|
| 110 |
+
st.markdown("### 🏠 Zillow Search Links")
|
| 111 |
+
for location in neighborhoods:
|
| 112 |
+
zillow_url = format_zillow_search(location)
|
| 113 |
+
st.markdown(f"- [Search homes in {location}]({zillow_url})")
|
| 114 |
+
else:
|
| 115 |
+
st.warning("Unable to generate Zillow links. Please try again.")
|
|
|