# app.py — BizIntel AI Ultra (Gemini 1.5 Pro, advanced pipeline) import os import tempfile import pandas as pd import streamlit as st import google.generativeai as genai from tools.csv_parser import parse_csv_tool from tools.plot_generator import plot_sales_tool from tools.forecaster import forecast_tool # must accept date_col param # ────────────────────────────────────────────────────────────── # 1. GEMINI CONFIG (1.5‑Pro, temperature 0.7) # ────────────────────────────────────────────────────────────── genai.configure(api_key=os.getenv("GEMINI_APIKEY")) gemini = genai.GenerativeModel( model="gemini-1.5-pro-latest", temperature=0.7, top_p=0.9, response_mime_type="text/markdown", ) # ────────────────────────────────────────────────────────────── # 2. STREAMLIT PAGE CONFIG # ────────────────────────────────────────────────────────────── st.set_page_config(page_title="BizIntel AI Ultra – Gemini 1.5 Pro", layout="wide") st.title("📊 BizIntel AI Ultra – Advanced Analytics Pipeline") TEMP_DIR = tempfile.gettempdir() # ────────────────────────────────────────────────────────────── # 3. 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 to temporary storage ✅") # Preview first rows df_preview = pd.read_csv(csv_path, nrows=5) st.dataframe(df_preview) # ────────────────────────────────────────────────────────────── # 4. DATE COLUMN SELECTION # ────────────────────────────────────────────────────────────── date_col = st.selectbox("Choose the date/time column for forecasting", df_preview.columns) # ────────────────────────────────────────────────────────────── # 5. LOCAL TOOL EXECUTION # ────────────────────────────────────────────────────────────── with st.spinner("🔍 Parsing CSV…"): summary_text = parse_csv_tool(csv_path) with st.spinner("📈 Generating sales trend chart…"): _ = plot_sales_tool(csv_path) # creates sales_plot.png with st.spinner("🔮 Forecasting future metrics…"): forecast_text = forecast_tool(csv_path, date_col=date_col) # pass chosen column # ────────────────────────────────────────────────────────────── # 6. GEMINI 1.5‑PRO STRATEGY (stream) # ────────────────────────────────────────────────────────────── 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" "### Task\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** you see\n" "4. **Suggested additional visuals** to aid stakeholder understanding\n" ) st.subheader("🚀 Strategy Recommendations (Gemini 1.5 Pro)") placeholder = st.empty() strategy_md = "" for chunk in gemini.generate_content_stream(prompt): if chunk.candidate and chunk.candidate.content.parts: strategy_md += chunk.candidate.content.parts[0].text placeholder.markdown(strategy_md) # ────────────────────────────────────────────────────────────── # 7. DISPLAY SUMMARY & CHARTS # ────────────────────────────────────────────────────────────── st.markdown("---") st.subheader("📑 CSV Summary") st.text(summary_text) sales_plot_path = os.path.join("sales_plot.png") forecast_plot_path = os.path.join("forecast_plot.png") if os.path.exists(sales_plot_path): st.image(sales_plot_path, caption="Sales Trend", use_column_width=True) if os.path.exists(forecast_plot_path): st.image(forecast_plot_path, caption="Forecast Chart", use_column_width=True)