Spaces:
Running
Running
#import streamlit as st | |
#import os | |
#import numpy as np | |
#import pandas as pd | |
#import matplotlib.pyplot as plt | |
#from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration | |
import streamlit as st | |
import os | |
import Groq | |
import requests | |
# Dependency imports with error handling | |
try: | |
import numpy as np | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration | |
#from groq.api import Client | |
except ImportError as e: | |
st.error(f"Error importing dependencies: {e}") | |
st.stop() | |
# Ensure compatible versions of numpy and pandas | |
try: | |
np_version = np.__version__ | |
pd_version = pd.__version__ | |
if tuple(map(int, np_version.split(".")[:2])) < (1, 24): | |
raise ImportError(f"Numpy version is {np_version}. Please upgrade to 1.24.0 or newer.") | |
if tuple(map(int, pd_version.split(".")[:2])) < (1, 5): | |
raise ImportError(f"Pandas version is {pd_version}. Please upgrade to 1.5.0 or newer.") | |
except Exception as e: | |
st.error(f"Version compatibility error: {e}") | |
st.stop() | |
# Initialize the RAG components | |
GROQ_API_KEY = "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" | |
client = Groq(api_key = GROQ_API_KEY) | |
# Initialize the RAG components | |
try: | |
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq") | |
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq", use_dummy_dataset=True) | |
model = RagSequenceForGeneration.from_pretrained("facebook/rag-token-nq") | |
except Exception as e: | |
st.error(f"Error loading RAG components: {e}") | |
st.stop() | |
# Helper function for energy demand calculation | |
def calculate_energy(appliances): | |
total_energy = 0 | |
total_power = 0 | |
for app, details in appliances.items(): | |
total_energy += details['quantity'] * details['wattage'] * details['hours'] / 1000 # Energy in kWh | |
total_power += details['quantity'] * details['wattage'] # Power in Watts | |
return total_energy, total_power | |
# Predefined appliances with their default wattage | |
predefined_appliances = { | |
"Select Appliance": 0, # Default placeholder | |
"LED Light": 10, | |
"Air Conditioner": 2000, | |
"Refrigerator": 150, | |
"Washing Machine": 500, | |
"Fan": 75, | |
"Laptop": 50, | |
"Television": 100, | |
"Microwave Oven": 1000, | |
"Electric Water Heater": 1500, | |
"Dishwasher": 1200, | |
"Coffee Maker": 800, | |
"Toaster": 1200, | |
"Hair Dryer": 1500, | |
"Electric Kettle": 1500, | |
"Oven": 2000, | |
"Vacuum Cleaner": 1000, | |
"Iron": 1200, | |
"Blender": 300, | |
"Clothes Dryer": 1800, | |
"Space Heater": 1500, | |
"Dehumidifier": 700, | |
"Freezer": 400, | |
"Electric Grill": 1200, | |
"Sewing Machine": 100, | |
"Projector": 300, | |
"Gaming Console": 200, | |
"Electric Fan Heater": 1500 | |
} | |
# Streamlit App | |
st.title("SustainaBot: Solar Energy Advisor") | |
st.sidebar.header("User Input") | |
# Option for Groq API Key | |
#groq_api_key = st.sidebar.text_input("Enter your Groq API Key", type="password") | |
# Inputs | |
st.sidebar.subheader("Enter Appliance Details") | |
if "appliances" not in st.session_state: | |
st.session_state.appliances = {} | |
# Function to reset appliance state | |
def reset_appliances(): | |
st.session_state.appliances = {} | |
# Add appliance inputs dynamically | |
appliance_count = len(st.session_state.appliances) | |
for i in range(appliance_count): | |
with st.sidebar.expander(f"Appliance {i+1} Details"): | |
app_name = st.selectbox(f"Appliance {i+1} Name", options=list(predefined_appliances.keys()), key=f"app{i}_name") | |
quantity = st.number_input(f"Quantity of {app_name}", min_value=1, step=1, key=f"app{i}_quantity", value=1) | |
wattage = predefined_appliances.get(app_name, 0) # Default wattage | |
hours = st.number_input(f"Hours used per day", min_value=1, step=1, key=f"app{i}_hours", value=1) | |
power = quantity * wattage | |
st.write(f"**Total Power (Watts):** {power} W") | |
if app_name and app_name != "Select Appliance": | |
st.session_state.appliances[app_name] = {"quantity": quantity, "wattage": wattage, "hours": hours} | |
# Button to add more appliances | |
if st.sidebar.button("Add Appliance"): | |
st.session_state.appliances[f"Appliance {len(st.session_state.appliances) + 1}"] = {"quantity": 1, "wattage": 0, "hours": 0} | |
# Button to reset appliances | |
if st.sidebar.button("Reset Appliances"): | |
reset_appliances() | |
# Input for location and budget | |
location = st.sidebar.text_input("Enter your Location (City, Country)") | |
budget = st.sidebar.number_input("Enter your Budget for Solar System (in USD)", min_value=100, step=10) | |
if st.sidebar.button("Submit"): | |
# Calculate energy demand | |
daily_energy, total_power = calculate_energy(st.session_state.appliances) | |
st.write(f"### Total Daily Energy Demand: {daily_energy:.2f} kWh") | |
st.write(f"### Total Power Demand: {total_power:.2f} W") | |
# RAG model interaction | |
try: | |
if not groq_api_key: | |
st.warning("No Groq API Key provided. RAG model will be used locally.") | |
else: | |
st.write("Using Groq API Key for enhanced recommendations.") | |
prompt = f"Provide solar recommendations for a location: {location}, daily energy: {daily_energy:.2f} kWh, budget: {budget} USD." | |
# Tokenizing and retrieval process | |
inputs = tokenizer(prompt, return_tensors="pt") | |
question_input = inputs['input_ids'] | |
doc_scores, docs = retriever(question_input) | |
# Generating the response | |
generated_output = model.generate(input_ids=question_input, context_input_ids=docs[0]['text']) | |
answer = tokenizer.decode(generated_output[0], skip_special_tokens=True) | |
st.write("### Solar Recommendations") | |
st.write(answer) | |
except Exception as e: | |
st.error(f"Error during RAG model processing: {e}") | |
# Display potential savings and pricing | |
savings = daily_energy * 30 * 0.2 # Assuming $0.2/kWh savings | |
st.write(f"By switching to solar, you could save approximately **${savings:.2f} per month!**") | |