{% extends "base.html" %} {% block title %}Analytics - AISBF Dashboard{% endblock %} {% macro format_tokens(value) %} {% if value is none or value == 0 %}0{% else %} {% set val = value | float %} {% if val >= 1000000000 %} {{ "%.2f"|format(val / 1000000000) }}B {% elif val >= 1000000 %} {{ "%.2f"|format(val / 1000000) }}M {% elif val >= 1000 %} {{ "%.2f"|format(val / 1000) }}K {% else %} {{ value }} {% endif %} {% endif %} {% endmacro %} {% block content %}
| Provider | Model | Rotation | Autoselect | Total Requests | Success | Errors | Error Rate | Avg Latency | Input Tokens | Output Tokens | Total Tokens |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ provider.provider_id }} | {{ provider.model_name or '' }} | {{ provider.rotation_id or '' }} | {{ provider.autoselect_id or '' }} | {{ provider.requests.total }} | {{ provider.requests.success }} | {{ provider.requests.error }} | 0.1 %}style="color: #f87171;"{% endif %}>{{ "%.1f"|format(provider.error_rate * 100) }}% | 5000 %}style="color: #fcd34d;"{% endif %}>{% if provider.avg_latency_ms > 1000 %}{{ "%.1f"|format(provider.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(provider.avg_latency_ms) }}ms{% endif %} | {{ format_tokens(provider.tokens.prompt or 0) }} | {{ format_tokens(provider.tokens.completion or 0) }} | {{ format_tokens(provider.tokens.total or 0) }} |
| Total | {{ provider_stats | sum(attribute='requests.total') }} | {{ provider_stats | sum(attribute='requests.success') }} | {{ provider_stats | sum(attribute='requests.error') }} | {% set total_requests = provider_stats | sum(attribute='requests.total') %} {% set total_errors = provider_stats | sum(attribute='requests.error') %} {% if total_requests > 0 %}{{ "%.1f"|format((total_errors / total_requests) * 100) }}%{% else %}0.0%{% endif %} | {% set total_requests = provider_stats | sum(attribute='requests.total') %} {% if total_requests > 0 %} {% set weighted_sum = namespace(value=0) %} {% for provider in provider_stats %} {% set weighted_sum.value = weighted_sum.value + (provider.avg_latency_ms | float * provider.requests.total) %} {% endfor %} {% set avg_latency = weighted_sum.value / total_requests %} {% if avg_latency > 1000 %}{{ "%.1f"|format(avg_latency / 1000) }}s{% else %}{{ "%.0f"|format(avg_latency) }}ms{% endif %} {% else %} N/A {% endif %} | {{ format_tokens(provider_stats | sum(attribute='tokens.prompt') or 0) }} | {{ format_tokens(provider_stats | sum(attribute='tokens.completion') or 0) }} | {{ format_tokens(provider_stats | sum(attribute='tokens.total') or 0) }} |
No provider statistics available yet. Make API requests to see analytics.
{% endif %}{{ currency_symbol }}{{ "%.2f"|format(cost_overview.total_estimated_cost_today) }}
{{ currency_symbol }}{{ "%.2f"|format((optimization_savings.total_cost_saved if optimization_savings else 0) or 0) }}
${{ "%.2f"|format(pc.estimated_cost) }}
{{ format_tokens(pc.tokens_today) }} tokens{{ format_tokens(optimization_savings.total_tokens_saved) }}
${{ "%.2f"|format(optimization_savings.total_cost_saved) }}
${{ "%.2f"|format((optimization_savings.direct_feature_savings.cost_saved if optimization_savings else 0) or 0) }}
${{ "%.2f"|format((optimization_savings.free_tier_equivalent_savings.cost_saved if optimization_savings else 0) or 0) }}
The combined estimate includes direct execution savings from response caching and batching plus free-tier/subscription-equivalent avoided cost estimates.
{% else %}No optimization savings recorded yet. Increase usage on providers with known upstream free tiers, or enable deduplication, condensation, batching, or caching to see savings.
{% endif %}| Provider | Model | Type | Context Size | Condense % | Condense Method | Tokens/Day | Error Rate | Avg Latency |
|---|---|---|---|---|---|---|---|---|
| {{ model.provider_id }} | {{ model.model_name }} | {% if model.is_rotation %}Rotation: {{ model.rotation_id }}{% elif model.is_autoselect %}Autoselect: {{ model.autoselect_id }}{% else %}{{ model.provider_type|title }}{% endif %} | {{ model.context_size|default('N/A') }} | {{ model.condense_context|default('N/A') }}% | {{ model.condense_method|default('None') }} | {{ format_tokens(model.tokens_per_day) }} | 0.1 %}style="color: #f87171;"{% endif %}>{{ "%.1f"|format(model.error_rate * 100) }}% | 5000 %}style="color: #fcd34d;"{% endif %}>{% if model.avg_latency_ms > 1000 %}{{ "%.1f"|format(model.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(model.avg_latency_ms) }}ms{% endif %} |
No model performance data available yet.
{% endif %}No token usage data available for the selected period.
{% endif %} {% if rotation_breakdown %}| Provider | Model | Requests | Hit % | Tokens | Token % | Avg Latency |
|---|---|---|---|---|---|---|
| {{ e.provider_id }} | {{ e.model_name or '' }} | {{ e.requests }} | {{ e.hit_pct }}% | {{ format_tokens(e.tokens) }} | {{ e.token_pct }}% | {% if e.avg_latency_ms > 1000 %}{{ "%.1f"|format(e.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(e.avg_latency_ms) }}ms{% endif %} |
| Selected Model / Rotation | Requests | Hit % | Tokens | Token % | Selection Latency |
|---|---|---|---|---|---|
| {{ e.model_name or '(unknown)' }} | {{ e.requests }} | {{ e.hit_pct }}% | {{ format_tokens(e.tokens) }} | {{ e.token_pct }}% | {% if e.avg_latency_ms > 1000 %}{{ "%.1f"|format(e.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(e.avg_latency_ms) }}ms{% endif %} |
These actions permanently delete analytics data from the database and cannot be undone.