import os import streamlit as st import requests import time import folium from folium import plugins import pandas as pd from streamlit.components.v1 import html from groq import Groq # Use environment variables to store sensitive data GROQ_API_KEY = os.getenv("GROQ_API_KEY", "default_value_if_key_missing") ORS_API_KEY = os.getenv("ORS_API_KEY", "default_value_if_key_missing") # Initialize Groq client with the API key from the environment variable client = Groq(api_key=GROQ_API_KEY) # Set up the title and description for the Streamlit app st.set_page_config(page_title="Gaia: Women Safety App", page_icon="🤖", layout="centered") # Function to get AI response (Groq model) def get_response(user_input): """Get response from Groq AI model.""" if 'messages' not in st.session_state: st.session_state['messages'] = [] st.session_state['messages'].append({"role": "user", "content": user_input}) try: # Call Groq API to get the AI's response chat_completion = client.chat.completions.create( messages=st.session_state['messages'], model="llama3-8b-8192" # Specify model you want to use from Groq ) ai_message = chat_completion.choices[0].message.content st.session_state['messages'].append({"role": "assistant", "content": ai_message}) return ai_message except Exception as e: st.error(f"Failed to get AI response: {e}") return None # Sidebar for navigation st.sidebar.title('Features') page = st.sidebar.radio("Choose a feature", ["Personal Information", "AI-Powered Support", "Emergency Call", "Dangerous Area Map", "ORS Route"]) # Personal Information Page (First Page) if page == "Personal Information": st.title("Personal Information Page") st.write("Please fill in the following details:") with st.form(key='personal_info_form'): full_name = st.text_input("Full Name") country = st.text_input("Country") age = st.number_input("Age", min_value=0, max_value=120, value=25) gender = st.radio("Gender", ('Male', 'Female', 'Other')) email = st.text_input("Email Address") phone_number = st.text_input("Phone Number") address = st.text_area("Address") submit_button = st.form_submit_button(label='Submit') if submit_button: st.subheader("Your Personal Information:") st.write(f"**Full Name:** {full_name}") st.write(f"**Country:** {country}") st.write(f"**Age:** {age}") st.write(f"**Gender:** {gender}") st.write(f"**Email:** {email}") st.write(f"**Phone Number:** {phone_number}") st.write(f"**Address:** {address}") st.write("Thank you for sharing your details! You can now access the app's features.") # AI-Powered Support Page elif page == "AI-Powered Support": st.header("Simulate a Call with Gaia AI") user_input = st.text_input("Tell Gaia how you're feeling:", "") if user_input: ai_response = get_response(user_input) if ai_response: st.markdown(f"**Gaia (AI):** {ai_response}") # Emergency Call Page elif page == "Emergency Call": st.header("Emergency Call Simulation") emergency_button = st.button("Call Emergency Services") if emergency_button: with st.spinner('Connecting to emergency services...'): time.sleep(2) # Simulating a short delay st.success("Emergency services have been contacted. Help is on the way!") st.write("You will receive assistance shortly. Stay safe!") # Dangerous Area Map Page elif page == "Dangerous Area Map": st.header("Dangerous Area Map (Prototype)") data = { 'latitude': [40.7128, 34.0522, 51.5074, 48.8566, 35.6762], 'longitude': [-74.0060, -118.2437, -0.1278, 2.3522, 139.6503], 'area': ['New York', 'Los Angeles', 'London', 'Paris', 'Tokyo'], 'danger_level': ['High', 'Medium', 'Low', 'High', 'Medium'] } df = pd.DataFrame(data) map_center = [df['latitude'].mean(), df['longitude'].mean()] m = folium.Map(location=map_center, zoom_start=2) def get_color(danger_level): if danger_level == 'High': return 'red' elif danger_level == 'Medium': return 'orange' else: return 'green' for index, row in df.iterrows(): danger_color = get_color(row['danger_level']) folium.CircleMarker( location=[row['latitude'], row['longitude']], radius=10, color=danger_color, fill=True, fill_color=danger_color, fill_opacity=0.7, popup=f"Area: {row['area']}
Danger Level: {row['danger_level']}" ).add_to(m) heat_data = [[row['latitude'], row['longitude']] for index, row in df.iterrows()] plugins.HeatMap(heat_data).add_to(m) st.subheader("Dangerous Areas Map") st.write("This map visualizes areas with different danger levels.") st.markdown("Use the color code to interpret the danger level:") st.markdown("🟥 High | 🟧 Medium | 🟩 Low") map_html = m._repr_html_() html(map_html, height=500) # ORS Route Page (New Page) elif page == "ORS Route": st.title("OpenRouteService: Route Calculator") st.write("Enter your current location and destination to calculate the route:") # User inputs for current location and destination start_lat = st.number_input("Enter the latitude of the start point:", value=40.7128) start_lon = st.number_input("Enter the longitude of the start point:", value=-74.0060) end_lat = st.number_input("Enter the latitude of the destination:", value=34.0522) end_lon = st.number_input("Enter the longitude of the destination:", value=-118.2437) if st.button("Calculate Route"): if start_lat and start_lon and end_lat and end_lon: # OpenRouteService API key from environment variable api_key = ORS_API_KEY start_point = f'{start_lon},{start_lat}' # ORS expects lon, lat end_point = f'{end_lon},{end_lat}' try: # API request to OpenRouteService url = f'https://api.openrouteservice.org/v2/directions/driving-car?api_key={api_key}&start={start_point}&end={end_point}' response = requests.get(url) response.raise_for_status() # Check for HTTP errors # Check if response is successful if response.status_code == 200: data = response.json() # Extract the route information route = data['features'][0]['geometry']['coordinates'] route_map = folium.Map(location=[start_lat, start_lon], zoom_start=12) # Plot the route on the map folium.PolyLine(locations=[(lat, lon) for lon, lat in route], color='blue', weight=5).add_to(route_map) # Display the route map in the app st.subheader("Calculated Route") route_html = route_map._repr_html_() html(route_html, height=500) else: st.error(f"Error: {response.status_code}") except requests.exceptions.HTTPError as err: st.error(f"HTTP error occurred: {err}") except Exception as err: st.error(f"An error occurred: {err}") else: st.error("Please enter valid coordinates for both start and end locations.") # Styling the chat window (Optional) st.markdown(""" """, unsafe_allow_html=True)