Commit b0dfd636 authored by Your Name's avatar Your Name

Add analytics filtering by provider, model, rotation and autoselect

- Added filter parameters to analytics route in main.py
- Updated get_model_performance() to support filtering by provider, model, rotation, and autoselect
- Added get_rotations_stats() and get_autoselects_stats() methods
- Added filter UI to analytics.html with dropdowns for filtering
- Updated Model Performance table to show type (Provider/Rotation/Autoselect)
parent e9a2c8b9
This diff is collapsed.
...@@ -22,7 +22,8 @@ Why did the programmer quit his job? Because he didn't get arrays! ...@@ -22,7 +22,8 @@ Why did the programmer quit his job? Because he didn't get arrays!
Main application for AISBF. Main application for AISBF.
""" """
from fastapi import FastAPI, HTTPException, Request, status, Form from typing import Optional
from fastapi import FastAPI, HTTPException, Request, status, Form, Query
from fastapi.responses import JSONResponse, StreamingResponse, HTMLResponse, RedirectResponse from fastapi.responses import JSONResponse, StreamingResponse, HTMLResponse, RedirectResponse
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.exceptions import RequestValidationError from fastapi.exceptions import RequestValidationError
...@@ -1102,7 +1103,16 @@ app.add_middleware( ...@@ -1102,7 +1103,16 @@ app.add_middleware(
# Dashboard routes # Dashboard routes
@app.get("/dashboard/analytics", response_class=HTMLResponse) @app.get("/dashboard/analytics", response_class=HTMLResponse)
async def dashboard_analytics(request: Request): async def dashboard_analytics(
request: Request,
time_range: str = Query("24h"),
from_date: Optional[str] = Query(None),
to_date: Optional[str] = Query(None),
provider_filter: Optional[str] = Query(None),
model_filter: Optional[str] = Query(None),
rotation_filter: Optional[str] = Query(None),
autoselect_filter: Optional[str] = Query(None)
):
"""Token usage analytics dashboard""" """Token usage analytics dashboard"""
auth_check = require_dashboard_auth(request) auth_check = require_dashboard_auth(request)
if auth_check: if auth_check:
...@@ -1115,21 +1125,74 @@ async def dashboard_analytics(request: Request): ...@@ -1115,21 +1125,74 @@ async def dashboard_analytics(request: Request):
db = get_database() db = get_database()
analytics = get_analytics(db) analytics = get_analytics(db)
# Get provider statistics # Parse date range
provider_stats = analytics.get_all_providers_stats() from_datetime = None
to_datetime = None
if from_date:
try:
from_datetime = datetime.fromisoformat(from_date.replace('Z', '+00:00'))
except ValueError:
pass
if to_date:
try:
to_datetime = datetime.fromisoformat(to_date.replace('Z', '+00:00'))
except ValueError:
pass
# Get token usage over time # If custom date range is provided, use custom mode
token_over_time = analytics.get_token_usage_over_time(time_range='24h') if from_datetime and to_datetime:
time_range = 'custom'
# Get model performance # Get available providers, models, rotations, and autoselects for filter dropdowns
model_performance = analytics.get_model_performance() available_providers = list(config.providers.keys()) if config else []
available_rotations = list(config.rotations.keys()) if config else []
available_autoselects = list(config.autoselect.keys()) if config else []
# Get models from providers
available_models = []
if config and hasattr(config, 'providers'):
for provider_id, provider_config in config.providers.items():
if hasattr(provider_config, 'models') and provider_config.models:
for model in provider_config.models:
available_models.append(f"{provider_id}/{model.name}")
# Get provider statistics (with optional filter)
if provider_filter:
provider_stats = [analytics.get_provider_stats(provider_filter, from_datetime, to_datetime)]
else:
provider_stats = analytics.get_all_providers_stats(from_datetime, to_datetime)
# Get token usage over time (with optional filters)
token_over_time = analytics.get_token_usage_over_time(
provider_id=provider_filter,
time_range=time_range,
from_datetime=from_datetime,
to_datetime=to_datetime
)
# Get model performance (with optional filters)
model_performance = analytics.get_model_performance(
provider_filter=provider_filter,
model_filter=model_filter,
rotation_filter=rotation_filter,
autoselect_filter=autoselect_filter
)
# Get cost overview # Get cost overview
cost_overview = analytics.get_cost_overview() cost_overview = analytics.get_cost_overview(from_datetime, to_datetime)
# Get optimization recommendations # Get optimization recommendations
recommendations = analytics.get_optimization_recommendations() recommendations = analytics.get_optimization_recommendations()
# Get date range usage summary
date_range_usage = None
if from_datetime or to_datetime:
start = from_datetime or (datetime.now() - timedelta(days=1))
end = to_datetime or datetime.now()
date_range_usage = analytics.get_token_usage_by_date_range(provider_filter, start, end)
return templates.TemplateResponse("dashboard/analytics.html", { return templates.TemplateResponse("dashboard/analytics.html", {
"request": request, "request": request,
"session": request.session, "session": request.session,
...@@ -1137,7 +1200,19 @@ async def dashboard_analytics(request: Request): ...@@ -1137,7 +1200,19 @@ async def dashboard_analytics(request: Request):
"token_over_time": json.dumps(token_over_time), "token_over_time": json.dumps(token_over_time),
"model_performance": model_performance, "model_performance": model_performance,
"cost_overview": cost_overview, "cost_overview": cost_overview,
"recommendations": recommendations "recommendations": recommendations,
"selected_time_range": time_range,
"from_date": from_date,
"to_date": to_date,
"date_range_usage": date_range_usage,
"available_providers": available_providers,
"available_models": available_models,
"available_rotations": available_rotations,
"available_autoselects": available_autoselects,
"selected_provider": provider_filter,
"selected_model": model_filter,
"selected_rotation": rotation_filter,
"selected_autoselect": autoselect_filter
}) })
@app.get("/dashboard/login", response_class=HTMLResponse) @app.get("/dashboard/login", response_class=HTMLResponse)
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment