1. load_dashboard.py: get_today_usage/amount and trend functions now
filter out accounting_status='failed' records so failed transactions
are not counted as successful.
2. stat_errors.ui: added click bind to navigate to llmage failed
accounting records page (app.sage_main_content target).
- Add 5 virtual human API endpoints (rl_virtual_create_group, rl_virtual_groups, rl_virtual_upload, rl_virtual_status, rl_virtual_assets)
- Include complete request/response examples with curl test cases
- Add virtual human error documentation
- Restore real person asset error documentation
- Add get_usage_trend() and get_amount_trend() functions for day-over-day comparison
- Display trend arrows (up/down/flat) with percentage change in stat_today_usage and stat_today_amount
- Add colored left borders to all stat cards for visual distinction:
- Blue: usage, total users
- Purple: amount, total orgs
- Green: active users, new users this month
- Cyan: concurrent users
- Red: errors
- Enhance visual hierarchy with accent colors matching SVG icons
- Change top models from Top 3 to Top 5
- Simplify titles: remove 'Top X' and parenthetical details
- Replace separate user tables (by amount/by count) with single ChartBar
- Replace separate provider tables with single ChartBar
- Add get_top_users_combined and get_top_providers_combined functions
Remove duplicate unprotected card that was always rendered regardless
of role, causing 403 for non-customer users. Keep only the customer-
only version wrapped in {% if 'customer.*' in roles %}.
Added sageOnLogin(dashboardUrl) function that checks if the SPA Router
has a route (via Router.current() or URL ?page= param) before loading
the dashboard. This prevents user_logined event from overwriting
Router-restored content on page refresh with deep links.
- Add get_user_today_models() function to load_dashboard.py
Shows current user's today model call counts and amounts
- Create api/user_today_models.dspy endpoint
- Create user_today_models_chart.ui ChartBar widget (30s auto-refresh)
- Add '我的今日模型使用' card section to index.ui with refresh button
- Register new paths in load_path.py (logined permission)