{{ ui_lang.evalanalytics_title|default('Trace analytics') }}

{{ ui_lang.evalanalytics_lede_before|default('Operational metrics aggregated across') }} {{ trace_count }} {{ ui_lang.evalanalytics_lede_after|default('ingested trace(s): token usage, latency, error rate, and (when pricing is configured) cost. Append') }} ?recent=N {{ ui_lang.evalanalytics_lede_tail|default('to flag regressions of the latest N traces against the rest.') }}

{% if trace_count == 0 %}

{{ ui_lang.evalanalytics_empty|default('No ingested traces yet. Send traces via the webhook or the tracing SDK.') }}

{% else %}
{{ ui_lang.evalanalytics_stat_traces|default('Traces') }}
{{ analytics.count }}
{{ ui_lang.evalanalytics_stat_total_tokens|default('Total tokens') }}
{{ '{:,}'.format(analytics.total_tokens) }}
{{ ui_lang.evalanalytics_stat_total_cost|default('Total cost') }}
{{ '${:.4f}'.format(analytics.total_cost) if analytics.total_cost is not none else '—' }}
{{ ui_lang.evalanalytics_stat_error_rate|default('Error rate') }}
{{ '{:.1f}%'.format(analytics.error_rate*100) }}
{{ ui_lang.evalanalytics_stat_avg_latency|default('Avg latency') }}
{{ '{:.0f} ms'.format(analytics.avg_latency_ms) if analytics.avg_latency_ms is not none else '—' }}
{{ ui_lang.evalanalytics_stat_p95_latency|default('p95 latency') }}
{{ '{:.0f} ms'.format(analytics.p95_latency_ms) if analytics.p95_latency_ms is not none else '—' }}
{% if alerts %}

{{ ui_lang.evalanalytics_alerts_heading|default('Regression alerts') }}

{% for a in alerts %}
{{ a.severity }} {{ a.message }} — {{ a.metric }}: {{ a.baseline }} → {{ a.recent }}
{% endfor %}
{% endif %}

{{ ui_lang.evalanalytics_permodel_heading|default('By model') }}

{% for model, d in analytics.per_model.items() %} {% endfor %}
{{ ui_lang.evalanalytics_col_model|default('Model') }}{{ ui_lang.evalanalytics_col_traces|default('Traces') }}{{ ui_lang.evalanalytics_col_tokens|default('Tokens') }} {{ ui_lang.evalanalytics_col_cost|default('Cost') }}{{ ui_lang.evalanalytics_col_errors|default('Errors') }}{{ ui_lang.evalanalytics_col_avg_latency|default('Avg latency') }}
{{ model }} {{ d.count }} {{ '{:,}'.format(d.total_tokens) }} {{ '${:.4f}'.format(d.cost) if d.cost else '—' }} {{ d.errors }} {{ '{:.0f} ms'.format(d.avg_latency_ms) if d.avg_latency_ms is not none else '—' }}
{% endif %}