import gradio as gr import pandas as pd import plotly.express as px import requests def get_financial_summary(): try: response = requests.get("http://localhost:8000/api/financial_summary") response.raise_for_status() data = response.json() except Exception: data = {"revenue": 1000, "expenses": 500, "profit": 500} return data def display_financial_charts(): df = pd.DataFrame( { "Month": ["Jan", "Feb", "Mar", "Apr", "May", "Jun"], "Revenue": [1000, 1200, 900, 1300, 1500, 1700], "Expenses": [400, 600, 500, 700, 800, 900], } ) df["Profit"] = df["Revenue"] - df["Expenses"] fig1 = px.line(df, x="Month", y="Revenue", title="Monthly Revenue") fig2 = px.bar(df, x="Month", y="Expenses", title="Monthly Expenses") fig3 = px.area(df, x="Month", y="Profit", title="Monthly Profit") latest = df.iloc[-1] fig4 = px.pie( names=["Revenue", "Expenses", "Profit"], values=[latest["Revenue"], latest["Expenses"], latest["Profit"]], title="Latest Financial Distribution", ) return fig1, fig2, fig3, fig4 def chatbot_respond(user_message, history): history = history or [] history.append({"role": "user", "content": user_message}) try: response = requests.post( "https://green-smoke-labs-dev--green-smoke-labs-expensynth-api-server.modal.run/bot/query", json={"messages": history}, ) response.raise_for_status() bot_reply = ( response.json().get("data", {}).get("raw", "Sorry, I didn't understand.") ) except Exception as e: import traceback traceback.print_exc() bot_reply = "Server unavailable. This is a mocked reply." history.append({"role": "assistant", "content": bot_reply}) return "", history, history def reset_chat(): """Reset chat history and clear the chatbot text box.""" return "", [], [] def minimize_chat(): return gr.update(visible=False), gr.update(visible=True) def restore_chat(): return gr.update(visible=True), gr.update(visible=False) # Frontend with gr.Blocks( css=""" #profile-pic-wrapper { width: 100px; height: 100px; border-radius: 50%; overflow: hidden; display: flex; align-items: center; justify-content: center; margin: 0 auto 10px auto; background: #fff; } #profile-icon { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; display: block; margin: 0; } .header h1 { margin: 0; font-family: 'Arial', sans-serif; color: #333; } .left-navbar { background-color: #fff; padding: 20px; border-right: 1px solid #ddd; min-height: 80vh; } .chat-panel { position: fixed; bottom: 20px; right: 20px; width: 350px; background: #fff; border: 1px solid #ddd; box-shadow: 2px 2px 10px rgba(0,0,0,0.1); border-radius: 8px; padding: 10px; } #open-chat-btn { position: fixed; bottom: 20px; right: 20px; z-index: 1000; } """ ) as demo: with gr.Row(): # gr.HTML( # '