hoololi's picture
Upload app.py
bb4e242 verified
Raw
History Blame Contribute Delete
12.1 kB
import json
from pathlib import Path
import pandas as pd
import plotly.graph_objects as go
import streamlit as st
from datasets import load_dataset
DATASET_ID = "hoololi/llm-calculations"
LOCAL_PARQUET = Path("llm_calculations.parquet")
MODEL_INFO_PATH = Path("model_info_snapshot.json")
MODE_ORDER = ["raw", "prompted", "tool"]
MODE_COLORS = {"raw": "#6EA8FE", "prompted": "#FFB86B", "tool": "#69DB7C"}
st.set_page_config(page_title="LLM Calculations Explorer", page_icon="🧮", layout="wide")
@st.cache_data(show_spinner="Loading dataset...")
def load_data() -> pd.DataFrame:
if LOCAL_PARQUET.exists():
df = pd.read_parquet(LOCAL_PARQUET)
else:
ds = load_dataset(DATASET_ID, split="train")
df = ds.to_pandas()
if "operation" not in df.columns and "question" in df.columns:
df["operation"] = df["question"]
if "cost" in df.columns:
df["cost"] = pd.to_numeric(df["cost"], errors="coerce")
if "mode" in df.columns:
df["mode"] = pd.Categorical(df["mode"], categories=MODE_ORDER, ordered=True)
return df
@st.cache_data(show_spinner=False)
def load_model_info() -> dict:
if not MODEL_INFO_PATH.exists():
return {}
return json.loads(MODEL_INFO_PATH.read_text(encoding="utf-8"))
def selected_models(model_a: str, model_b: str) -> list[str]:
models = [model_a]
if model_b and model_b != model_a:
models.append(model_b)
return models
def summarize(df: pd.DataFrame, model_order: list[str]) -> pd.DataFrame:
if df.empty:
return pd.DataFrame()
summary = (
df.groupby(["model", "mode"], observed=False)
.agg(
rows=("mode", "size"),
accuracy_pct=("final_result_correct", lambda s: s.mean() * 100),
run_success_pct=("run_success", lambda s: s.mean() * 100 if s.notna().any() else None),
avg_total_tokens=("total_tokens", "mean"),
avg_input_tokens=("input_tokens", "mean"),
avg_output_tokens=("output_tokens", "mean"),
avg_cost=("cost", "mean"),
total_cost=("cost", "sum"),
avg_latency_seconds=("latency_seconds", "mean"),
)
.reset_index()
)
summary["mode"] = pd.Categorical(summary["mode"], categories=MODE_ORDER, ordered=True)
summary["model"] = pd.Categorical(summary["model"], categories=model_order, ordered=True)
summary = summary.sort_values(["model", "mode"])
summary["model"] = summary["model"].astype(str)
summary["mode"] = summary["mode"].astype(str)
return summary.round(4)
def metric_chart(summary: pd.DataFrame, metric: str, yaxis_title: str, percent=False) -> go.Figure:
fig = go.Figure()
for mode in MODE_ORDER:
part = summary[summary["mode"] == mode]
fig.add_bar(
x=part["model"],
y=part[metric],
name=mode,
marker_color=MODE_COLORS[mode],
hovertemplate=f"{yaxis_title}: %{{y:.4g}}<extra></extra>",
)
fig.update_layout(
template="plotly_dark",
barmode="group",
height=260,
margin=dict(l=35, r=10, t=10, b=35),
legend=dict(orientation="h", yanchor="top", y=0.99, xanchor="right", x=0.99),
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(255,255,255,0.035)",
yaxis_title=yaxis_title,
xaxis_title=None,
)
fig.update_xaxes(categoryorder="array", categoryarray=summary["model"].drop_duplicates().tolist(), tickangle=0)
fig.update_yaxes(gridcolor="rgba(255,255,255,0.12)")
if percent:
fig.update_yaxes(range=[0, 100], tickvals=[0, 20, 40, 60, 80, 100])
return fig
def price_per_million(value) -> str:
if value in (None, ""):
return "n/a"
try:
return f"${float(value) * 1_000_000:.2f}/1M tokens"
except (TypeError, ValueError):
return str(value)
def model_card(model: str, model_info: dict) -> None:
info = model_info.get(model, {})
if not info:
st.caption(f"No OpenRouter snapshot information available for `{model}`.")
return
pricing = info.get("pricing", {}) if isinstance(info.get("pricing", {}), dict) else {}
architecture = info.get("architecture", {}) if isinstance(info.get("architecture", {}), dict) else {}
provider = info.get("top_provider", {}) if isinstance(info.get("top_provider", {}), dict) else {}
supported = info.get("supported_parameters", []) or []
description = (info.get("description") or "").strip().replace("\n", " ")
if len(description) > 320:
description = description[:320].rstrip() + "…"
st.markdown(f"### {info.get('name') or model}")
st.code(model, language=None)
st.markdown(
f"""
- **Context length:** {info.get('context_length') or provider.get('context_length') or 'n/a'}
- **Max completion tokens:** {provider.get('max_completion_tokens') or 'n/a'}
- **Modality:** {architecture.get('modality') or 'n/a'}
- **Tokenizer:** {architecture.get('tokenizer') or 'n/a'}
- **Input price:** {price_per_million(pricing.get('prompt') or pricing.get('input'))}
- **Output price:** {price_per_million(pricing.get('completion') or pricing.get('output'))}
- **Supported parameters:** {', '.join(supported[:8]) if supported else 'n/a'}{'…' if len(supported) > 8 else ''}
"""
)
if description:
st.caption(description)
df = load_data()
model_info = load_model_info()
models = sorted(df["model"].dropna().unique().tolist())
operation_categories = sorted(df["operation_category"].dropna().unique().tolist()) if "operation_category" in df.columns else []
st.title("🧮 LLM Calculations Explorer")
st.markdown("Simple explorer for the `hoololi/llm-calculations` dataset. Compare raw, prompted, and tool modes.")
with st.container(border=True):
c1, c2, c3, c4 = st.columns([1.2, 1.2, 1.4, 1])
with c1:
model_a = st.selectbox("Model A", models, index=0)
with c2:
model_b = st.selectbox("Model B optional", [""] + models, index=0)
with c3:
selected_categories = st.multiselect(
"Operation categories",
operation_categories,
default=operation_categories,
)
with c4:
run_error_policy = st.selectbox(
"Run errors",
["Count as failures", "Exclude from metrics"],
index=0,
)
chosen = selected_models(model_a, model_b)
view = df[df["model"].isin(chosen)].copy()
if selected_categories and "operation_category" in view.columns:
view = view[view["operation_category"].isin(selected_categories)]
if run_error_policy == "Exclude from metrics" and "run_success" in view.columns:
view = view[view["run_success"] == True]
summary = summarize(view, chosen)
st.subheader("Metrics summary")
st.dataframe(summary, width="stretch", hide_index=True)
r1c1, r1c2 = st.columns(2)
with r1c1:
st.markdown("**Accuracy**")
st.plotly_chart(metric_chart(summary, "accuracy_pct", "Accuracy (%)", True), width="stretch")
with r1c2:
st.markdown("**Tokens**")
st.plotly_chart(metric_chart(summary, "avg_total_tokens", "Average total tokens"), width="stretch")
r2c1, r2c2 = st.columns(2)
with r2c1:
st.markdown("**Cost**")
st.plotly_chart(metric_chart(summary, "avg_cost", "Average cost, USD"), width="stretch")
with r2c2:
st.markdown("**Latency**")
st.plotly_chart(metric_chart(summary, "avg_latency_seconds", "Seconds"), width="stretch")
with st.expander("Selected model details from OpenRouter snapshot", expanded=False):
info_cols = st.columns(len(chosen))
for col, model in zip(info_cols, chosen):
with col:
model_card(model, model_info)
st.divider()
st.subheader("Browse dataset records")
st.caption("Inspect the individual rows behind the aggregate metrics.")
browse_df = view.copy()
b1, b2, b3 = st.columns([1, 1, 1.4])
with b1:
browse_modes = st.multiselect("Modes", MODE_ORDER, default=MODE_ORDER)
with b2:
correctness_filter = st.selectbox(
"Final answer",
["All", "Correct only", "Incorrect only", "Run errors only", "Tool issues only"],
index=0,
)
with b3:
search_text = st.text_input("Search operation or answer", value="")
if browse_modes:
browse_df = browse_df[browse_df["mode"].astype(str).isin(browse_modes)]
if correctness_filter == "Correct only":
browse_df = browse_df[browse_df["final_result_correct"] == True]
elif correctness_filter == "Incorrect only":
browse_df = browse_df[browse_df["final_result_correct"] == False]
elif correctness_filter == "Run errors only":
browse_df = browse_df[browse_df["run_success"] == False]
elif correctness_filter == "Tool issues only":
browse_df = browse_df[
(browse_df["mode"].astype(str) == "tool")
& (
(browse_df.get("tool_error_type") != "none")
| (browse_df.get("tool_result_correct") == False)
| (browse_df.get("tool_expression_scope").isin(["partial_expression", "unrelated_expression", "unknown"]))
)
]
if search_text.strip():
needle = search_text.strip().lower()
browse_df = browse_df[
browse_df["operation"].fillna("").str.lower().str.contains(needle, regex=False)
| browse_df["answer_text"].fillna("").str.lower().str.contains(needle, regex=False)
]
browse_df = browse_df.sort_values(["operation_id", "model", "mode"])
display_cols = [
"operation_id",
"operation_category",
"model",
"mode",
"operation",
"correct_result_str",
"extracted_answer_str",
"final_result_correct",
"run_success",
"tool_expression_scope",
"tool_error_type",
]
display_cols = [col for col in display_cols if col in browse_df.columns]
st.dataframe(browse_df[display_cols], width="stretch", hide_index=True, height=260)
if not browse_df.empty:
browse_df = browse_df.reset_index(drop=True)
row_labels = browse_df.apply(
lambda r: f"{r['operation_id']} | {r['model']} | {r['mode']} | final_correct={r['final_result_correct']}",
axis=1,
).tolist()
selected_label = st.selectbox("Record details", row_labels, index=0)
selected_row = browse_df.iloc[row_labels.index(selected_label)]
d1, d2 = st.columns([1, 1])
with d1:
st.markdown("#### Operation")
st.write(selected_row.get("operation"))
st.caption(f"Category: {selected_row.get('operation_category')}")
st.markdown("#### Expected / extracted")
st.json(
{
"correct_result": selected_row.get("correct_result_str", selected_row.get("correct_result")),
"extracted_answer": selected_row.get("extracted_answer_str", selected_row.get("extracted_answer")),
"final_result_correct": bool(selected_row.get("final_result_correct")),
"extraction_error_type": selected_row.get("extraction_error_type"),
"answer_empty": bool(selected_row.get("answer_empty")),
}
)
with d2:
st.markdown("#### Diagnostics")
st.json(
{
"run_success": bool(selected_row.get("run_success")),
"run_error": selected_row.get("run_error"),
"tool_called": selected_row.get("tool_called"),
"tool_expression_scope": selected_row.get("tool_expression_scope"),
"tool_error_type": selected_row.get("tool_error_type"),
"tool_result_correct": selected_row.get("tool_result_correct"),
}
)
st.markdown("#### Model answer")
st.code(selected_row.get("answer_text") or "", language=None)
if str(selected_row.get("mode")) == "tool":
st.markdown("#### Tool details")
st.json(
{
"tool_expression": selected_row.get("tool_expression"),
"tool_result": selected_row.get("tool_result_str", selected_row.get("tool_result")),
"tool_error": selected_row.get("tool_error"),
"tool_calls": selected_row.get("tool_calls"),
}
)
else:
st.info("No records match the current filters.")