WNTR_GPT / app.py
razaali10's picture
Upload app.py
f59d646 verified
import streamlit as st
# Must be the first Streamlit command
st.set_page_config(page_title="EPANET Simulation with WNTR + GPT Assistant", layout="wide")
import wntr
import tempfile
import os
import pandas as pd
import matplotlib.pyplot as plt
import openai
# Set OpenAI API Key
openai.api_key = st.secrets.get("OPENAI_API_KEY") or st.text_input("Enter your OpenAI API key", type="password")
st.title("💧 EPANET Simulation with WNTR + GPT Assistant")
# Upload EPANET .inp file
uploaded_file = st.file_uploader("Upload your EPANET .inp file", type=["inp"])
if uploaded_file:
with tempfile.NamedTemporaryFile(delete=False, suffix=".inp") as temp:
temp.write(uploaded_file.read())
inp_path = temp.name
st.success("File uploaded. Starting simulation...")
wn = wntr.network.WaterNetworkModel(inp_path)
sim = wntr.sim.EpanetSimulator(wn)
results = sim.run_sim()
pressure = results.node["pressure"]
st.session_state['pressure_df'] = pressure
st.subheader("Simulation Complete")
st.line_chart(pressure)
st.download_button("Download Pressure Data (CSV)", data=pressure.to_csv().encode('utf-8'),
file_name="pressure_results.csv", mime="text/csv")
# GPT-4 Assistant Section
if 'pressure_df' in st.session_state:
st.subheader("🧠 Ask the GPT-4 Assistant About Simulation Results")
user_question = st.text_area("Ask a question about the simulation:")
if st.button("Ask GPT"):
df = st.session_state['pressure_df']
prompt = f"""You are a hydraulic engineering assistant. The user has run a water network simulation.
Here is a summary of node pressures (mean, min, max, std):
{df.describe().to_string()}
Now answer the user's question: "{user_question}"
"""
with st.spinner("Thinking..."):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a civil engineering assistant who specializes in hydraulic analysis using EPANET and WNTR."},
{"role": "user", "content": prompt}
]
)
st.success("Answer:")
st.markdown(response.choices[0].message['content'])