{% 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 %}
{{ rec.message }}
{{ rec.action }}| 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) }}
{% if cost_overview.date_range %} {{ cost_overview.date_range.start[:10] }} to {{ cost_overview.date_range.end[:10] }} {% endif %}{{ currency_symbol }}0.00
From cache hits & optimization${{ "%.2f"|format(pc.estimated_cost) }}
{{ format_tokens(pc.tokens_today) }} tokens{{ format_tokens(optimization_savings.total_tokens_saved) }}
{% if optimization_savings.date_range %} {{ optimization_savings.date_range.start[:10] }} to {{ optimization_savings.date_range.end[:10] }} {% endif %}${{ "%.2f"|format(optimization_savings.total_cost_saved) }}
From optimizations| Optimization Type | Count | Tokens Saved | Cost Saved | Avg Tokens/Optimization | Max Tokens Saved |
|---|---|---|---|---|---|
| {{ opt_type.title() }} | {{ stats.count }} | {{ format_tokens(stats.tokens_saved) }} | ${{ "%.4f"|format(stats.cost_saved) }} | {{ format_tokens(stats.avg_tokens_saved) }} | {{ format_tokens(stats.max_tokens_saved) }} |
| Total | {{ optimization_savings.savings_by_type.values() | sum(attribute='count') }} | {{ format_tokens(optimization_savings.total_tokens_saved) }} | ${{ "%.4f"|format(optimization_savings.total_cost_saved) }} | - | - |
No optimization savings recorded yet. 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 }}%
|
5000 %}style="color: #fcd34d;"{% endif %}> {% 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 }}%
|
5000 %}style="color: #fcd34d;"{% endif %}> {% if e.avg_latency_ms > 1000 %}{{ "%.1f"|format(e.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(e.avg_latency_ms) }}ms{% endif %} |
| Provider | Model | Total Requests | Success | Errors | Error Rate | Avg Latency | Input Tokens | Output Tokens | Total Tokens |
|---|---|---|---|---|---|---|---|---|---|
| {{ p.provider_id }} | {{ p.model_name or '' }} | {{ p.requests.total }} | {{ p.requests.success }} | {{ p.requests.error }} | 0.1 %}style="color: #f87171;"{% endif %}>{{ "%.1f"|format(p.error_rate * 100) }}% | 5000 %}style="color: #fcd34d;"{% endif %}> {% if p.avg_latency_ms > 1000 %}{{ "%.1f"|format(p.avg_latency_ms / 1000) }}s{% else %}{{ "%.0f"|format(p.avg_latency_ms) }}ms{% endif %} | {{ format_tokens(p.tokens.prompt or 0) }} | {{ format_tokens(p.tokens.completion or 0) }} | {{ format_tokens(p.tokens.total or 0) }} |
These actions permanently delete analytics data from the database and cannot be undone.