import streamlit as st import requests import pandas as pd from gtts import gTTS import base64 from io import BytesIO import os import plotly.express as px st.set_page_config(page_title="NeuroPulse AI", page_icon="๐ง ", layout="wide") if os.path.exists("logo.png"): st.image("logo.png", width=180) # Session state setup defaults = { "review": "", "dark_mode": False, "intelligence_mode": True, "trigger_example_analysis": False, "last_response": None, "followup_answer": None } for k, v in defaults.items(): if k not in st.session_state: st.session_state[k] = v # Dark mode styling if st.session_state.dark_mode: st.markdown(""" """, unsafe_allow_html=True) # Sidebar settings with st.sidebar: st.header("โ๏ธ Global Settings") st.session_state.dark_mode = st.toggle("๐ Dark Mode", value=st.session_state.dark_mode) st.session_state.intelligence_mode = st.toggle("๐ง Intelligence Mode", value=st.session_state.intelligence_mode) api_token = st.text_input("๐ API Token", value="my-secret-key", type="password") if not api_token or api_token.strip() == "my-secret-key": st.warning("๐งช Running in demo mode โ for full access, enter a valid API key.") backend_url = st.text_input("๐ Backend URL", value="http://localhost:8000") sentiment_model = st.selectbox("๐ Sentiment Model", [ "Auto-detect", "distilbert-base-uncased-finetuned-sst-2-english", "nlptown/bert-base-multilingual-uncased-sentiment" ]) industry = st.selectbox("๐ญ Industry", ["Auto-detect", "Generic", "E-commerce", "Healthcare", "Education"]) product_category = st.selectbox("๐งฉ Product Category", ["Auto-detect", "General", "Mobile Devices", "Laptops"]) use_aspects = st.checkbox("๐ฌ Enable Aspect Analysis") use_explain_bulk = st.checkbox("๐ง Generate Explanations (Bulk)") verbosity = st.radio("๐ฃ๏ธ Response Style", ["Brief", "Detailed"]) voice_lang = st.selectbox("๐ Voice Language", ["en", "fr", "es", "de", "hi", "zh"]) # TTS def speak(text, lang='en'): tts = gTTS(text, lang=lang) mp3 = BytesIO() tts.write_to_fp(mp3) b64 = base64.b64encode(mp3.getvalue()).decode() st.markdown(f'', unsafe_allow_html=True) mp3.seek(0) return mp3 tab1, tab2 = st.tabs(["๐ง Single Review", "๐ Bulk CSV"]) # ==== SINGLE REVIEW ==== with tab1: st.title("๐ง NeuroPulse AI โ Multimodal Review Analyzer") st.markdown("
review
, industry
, product_category
, device
, follow_up
(optional)
""", unsafe_allow_html=True)
with st.expander("๐ Sample CSV"):
with open("sample_reviews.csv", "rb") as f:
st.download_button("โฌ๏ธ Download sample CSV", f, file_name="sample_reviews.csv")
uploaded_file = st.file_uploader("๐ Upload your CSV", type="csv")
if uploaded_file:
if not api_token:
st.error("๐ Please enter your API token in the sidebar.")
else:
try:
df = pd.read_csv(uploaded_file)
if "review" not in df.columns:
st.error("CSV must contain a `review` column.")
else:
for col in ["industry", "product_category", "device", "follow_up"]:
if col not in df.columns:
df[col] = ["Auto-detect"] * len(df)
df[col] = df[col].fillna("Auto-detect").astype(str)
df["industry"] = df["industry"].apply(lambda x: "Generic" if x.lower() == "auto-detect" else x)
df["product_category"] = df["product_category"].apply(lambda x: "General" if x.lower() == "auto-detect" else x)
df["device"] = df["device"].apply(lambda x: "Web" if x.lower() == "auto-detect" else x)
if st.button("๐ Analyze Bulk Reviews", use_container_width=True):
with st.spinner("Processing..."):
try:
payload = {
"reviews": df["review"].tolist(),
"model": None if sentiment_model == "Auto-detect" else sentiment_model,
"industry": df["industry"].tolist(),
"product_category": df["product_category"].tolist(),
"device": df["device"].tolist(),
"follow_up": df["follow_up"].tolist(),
"explain": use_explain_bulk,
"aspects": use_aspects,
"intelligence": st.session_state.intelligence_mode
}
res = requests.post(f"{backend_url}/bulk/?token={api_token}", json=payload)
if res.status_code == 200:
results = pd.DataFrame(res.json()["results"])
st.dataframe(results)
if "sentiment" in results.columns:
fig = px.pie(results, names="sentiment", title="Sentiment Distribution")
st.plotly_chart(fig)
st.download_button("โฌ๏ธ Download Results CSV", results.to_csv(index=False), "results.csv", mime="text/csv")
else:
st.error(f"โ Bulk Error {res.status_code}: {res.json().get('detail')}")
except Exception as e:
st.error(f"๐จ Bulk Processing Error: {e}")
except Exception as e:
st.error(f"โ File Read Error: {e}")