"""Performance dashboard tab.""" from __future__ import annotations from typing import Any import pandas as pd import plotly.express as px import streamlit as st def _fmt_currency(value: float) -> str: return f"${value:,.2f}" def _build_comparison_table() -> pd.DataFrame: return pd.DataFrame( [ {"System": "WarehouseEye MI300X", "Cost/min video": "$0.04", "Privacy": "Local", "Open Source": "Yes"}, {"System": "GPT-4V API est.", "Cost/min video": "$1.20", "Privacy": "Cloud", "Open Source": "No"}, {"System": "BriefCam", "Cost/min video": "~$50K/year", "Privacy": "Either", "Open Source": "No"}, ] ) def render_performance_dashboard( benchmark_payload: dict[str, Any], throughput_rows: list[dict[str, float]], ) -> None: wall_time_sec = float(benchmark_payload.get("wall_time_sec", 0.0)) total_cost_usd = float(benchmark_payload.get("total_cost_usd", 0.0)) cost_per_min = (total_cost_usd / wall_time_sec * 60.0) if wall_time_sec > 0 else 0.0 row1 = st.columns(5) row1[0].metric("Frames analyzed", f"{int(benchmark_payload.get('frames_analyzed', 0))}") row1[1].metric("Tokens/sec sustained", f"{float(benchmark_payload.get('tokens_per_second_avg', 0.0)):.2f}") row1[2].metric("Latency per crop (ms)", f"{float(benchmark_payload.get('latency_per_crop_ms', 0.0)):.2f}") row1[3].metric("Total cost USD", _fmt_currency(total_cost_usd)) row1[4].metric("Cost per minute video", _fmt_currency(cost_per_min)) st.markdown("#### WarehouseEye on AMD MI300X vs alternatives") st.dataframe(_build_comparison_table(), hide_index=True, use_container_width=True) st.markdown("#### Throughput over processing time") if throughput_rows: df = pd.DataFrame(throughput_rows) fig = px.line(df, x="elapsed_sec", y="tokens_per_sec", markers=True) fig.update_layout( paper_bgcolor="#0F141A", plot_bgcolor="#0F141A", font={"family": "JetBrains Mono, Fira Code, monospace", "color": "#E8EEF2"}, xaxis_title="Time (sec)", yaxis_title="Tokens/sec", margin={"l": 10, "r": 10, "t": 20, "b": 10}, ) st.plotly_chart(fig, use_container_width=True, theme=None) else: st.info("Throughput data will appear after analyze/query actions.")