"""HTML views for the Model Usage & Performance Analytics console (#651).""" from __future__ import annotations from webui.analytics_loader import AnalyticsSnapshot, GroupMetrics, UsageEvent from webui.layout import render_page def _render_badge(text: str, badge_type: str = "muted") -> str: return f'{text}' def _render_group_table(title: str, groups: dict[str, GroupMetrics], key_header: str = "Group") -> str: if not groups: return ( f"

{title}

" '

No telemetry events recorded for this dimension.

' ) rows = [] for key, g in sorted(groups.items(), key=lambda x: x[1].total_events, reverse=True): cost_cell = ( f'{g.display_cost}' if g.events_with_cost > 0 else _render_badge("Unknown") ) tokens_cell = ( g.display_tokens if g.events_with_tokens > 0 else _render_badge("Unknown") ) lat_p50 = ( g.display_latency_p50 if g.events_with_latency > 0 else _render_badge("Unknown") ) lat_p90 = ( g.display_latency_p90 if g.events_with_latency > 0 else _render_badge("Unknown") ) dur_avg = ( g.display_duration_avg if g.events_with_duration > 0 else _render_badge("Unknown") ) rows.append( "" f"{key}" f"{g.total_events}" f"{tokens_cell}" f"{cost_cell}" f"{lat_p50}" f"{lat_p90}" f"{dur_avg}" "" ) rows_html = "".join(rows) return f"""

{title}

{rows_html}
{key_header} Events Total Tokens Est. Cost Latency (p50) Latency (p90) Avg Stage Duration
""" def _render_events_table(events: tuple[UsageEvent, ...]) -> str: if not events: return ( "

Recent Usage & Instrumentation Events

" '

No individual telemetry events recorded yet. Opt-in instrumentation via session logging or POST /api/v1/analytics/usage.

' ) rows = [] for e in list(events)[-50:]: # Display latest 50 work_item = f"issue #{e.issue_number}" if e.issue_number else (f"pr #{e.pr_number}" if e.pr_number else "unlinked") tokens = f"{e.total_tokens:,}" if e.total_tokens is not None else _render_badge("Unknown") cost = f"${e.estimated_cost_usd:.4f}" if e.estimated_cost_usd is not None else _render_badge("Unknown") latency = f"{e.latency_ms} ms" if e.latency_ms is not None else _render_badge("Unknown") duration = f"{e.duration_ms} ms" if e.duration_ms is not None else _render_badge("Unknown") status_badge = _render_badge(e.status, "success" if e.status == "success" else "danger") rows.append( "" f"#{e.usage_id}" f"{e.created_at}" f"{e.role}" f"{e.model}" f"{e.stage}" f"{work_item}" f"{tokens}" f"{cost}" f"{latency}" f"{duration}" f"{status_badge}" "" ) rows_html = "".join(rows) return f"""

Recent Telemetry Events

{rows_html}
ID Timestamp Role Model Stage Work Item Tokens Cost Latency Duration Status
""" def render_analytics_page(snapshot: AnalyticsSnapshot) -> str: """Render the main Model Usage & Performance Analytics console page.""" summary = snapshot.overall_summary kpi_tokens = summary.display_tokens if summary.events_with_tokens > 0 else _render_badge("Unknown") kpi_cost = summary.display_cost if summary.events_with_cost > 0 else _render_badge("Unknown") kpi_lat_p50 = summary.display_latency_p50 if summary.events_with_latency > 0 else _render_badge("Unknown") kpi_dur_avg = summary.display_duration_avg if summary.events_with_duration > 0 else _render_badge("Unknown") status_notice = "" if not snapshot.ok: status_notice = ( f'
Degraded Data Source: {snapshot.reason}
' ) body_html = f"""

Model Usage & Performance Analytics (Phase 4)

Durable console analytics for model usage, token cost, latency percentiles, and workflow-stage performance correlated to issues, PRs, and worker roles.

{status_notice}
Note on telemetry fidelity: Missing data or untracked metrics are explicitly labeled as Unknown. No token costs or latency metrics are zero-fabricated.
Total Events

{summary.total_events}

Total Tokens

{kpi_tokens}

Est. Token Cost

{kpi_cost}

Latency (p50)

{kpi_lat_p50}

Avg Stage Duration

{kpi_dur_avg}

{_render_group_table("Usage & Cost by Model", snapshot.by_model, "Model")} {_render_group_table("Performance by Workflow Stage", snapshot.by_stage, "Stage")} {_render_group_table("Usage & Cost by Role", snapshot.by_role, "Role")} {_render_group_table("Work Item Analytics", snapshot.by_work_item, "Work Item")} {_render_events_table(snapshot.events)} """ return render_page(title="Model Usage & Performance Analytics", body_html=body_html)