import os import tempfile import pandas as pd import streamlit as st import google.generativeai as genai import plotly.graph_objects as go from tools.csv_parser import parse_csv_tool from tools.plot_generator import plot_sales_tool from tools.forecaster import forecast_tool from tools.visuals import ( histogram_tool, scatter_matrix_tool, corr_heatmap_tool, ) # ── Gemini 1.5‑Pro configuration ───────────────────────────── genai.configure(api_key=os.getenv("GEMINI_APIKEY")) gemini = genai.GenerativeModel( "gemini-1.5-pro-latest", generation_config={ "temperature": 0.7, "top_p": 0.9, "response_mime_type": "text/plain", }, ) # ── Streamlit page setup ───────────────────────────────────── st.set_page_config(page_title="BizIntel AI Ultra – Gemini 1.5 Pro", layout="wide") st.title("📊 BizIntel AI Ultra – Advanced Analytics") TEMP_DIR = tempfile.gettempdir() # ── CSV upload ─────────────────────────────────────────────── csv_file = st.file_uploader("Upload CSV (≤ 200 MB)", type=["csv"]) if csv_file is None: st.info("⬆️ Upload a CSV to begin.") st.stop() csv_path = os.path.join(TEMP_DIR, csv_file.name) with open(csv_path, "wb") as f: f.write(csv_file.read()) st.success("CSV saved ✅") # Preview + date column selection df_preview = pd.read_csv(csv_path, nrows=5) st.dataframe(df_preview) date_col = st.selectbox("Select date/time column for forecasting", df_preview.columns) # ── Local tools: summary, sales trend, forecast ────────────── with st.spinner("Parsing CSV…"): summary_text = parse_csv_tool(csv_path) with st.spinner("Generating sales trend chart…"): sales_fig = plot_sales_tool(csv_path, date_col=date_col) st.plotly_chart(sales_fig, use_container_width=True) with st.spinner("Forecasting future metrics…"): forecast_text = forecast_tool(csv_path, date_col=date_col) if os.path.exists("forecast_plot.png"): forecast_img = "forecast_plot.png" else: forecast_img = None # ── Gemini strategy insights ───────────────────────────────── prompt = ( f"You are **BizIntel Strategist AI**.\n\n" f"### CSV Summary\n```\n{summary_text}\n```\n\n" f"### Forecast Output\n```\n{forecast_text}\n```\n\n" "Return Markdown with:\n" "1. **Five key insights** (bullet list)\n" "2. **Three actionable strategies** (with expected impact)\n" "3. **Risk factors or anomalies**\n" "4. **Suggested additional visuals**\n" ) st.subheader("🚀 Strategy Recommendations (Gemini 1.5 Pro)") with st.spinner("Gemini 1.5 Pro is generating insights…"): strategy_md = gemini.generate_content(prompt).text st.markdown(strategy_md) # Display forecast image if exists if forecast_img: st.image(forecast_img, caption="Sales Forecast", use_column_width=True) # ── Optional exploratory visuals ───────────────────────────── st.markdown("---") st.subheader("🔍 Optional Exploratory Visuals") num_cols = df_preview.select_dtypes("number").columns # Histogram if st.checkbox("Show histogram"): hist_col = st.selectbox("Histogram variable", num_cols, key="hist") fig_hist = histogram_tool(csv_path, hist_col) st.plotly_chart(fig_hist, use_container_width=True) # Scatter‑matrix if st.checkbox("Show scatter‑matrix"): multi_cols = st.multiselect("Choose up to 5 columns", num_cols, default=num_cols[:3]) if multi_cols: fig_scatter = scatter_matrix_tool(csv_path, multi_cols) st.plotly_chart(fig_scatter, use_container_width=True) # Correlation heat‑map if st.checkbox("Show correlation heat‑map"): fig_corr = corr_heatmap_tool(csv_path) st.plotly_chart(fig_corr, use_container_width=True) # ── CSV summary text at bottom ─────────────────────────────── st.markdown("---") st.subheader("📑 CSV Summary (full Stats)") st.text(summary_text)