feat: 添加全局今日模型使用图表,替换用户级监控为全量监控

- 新增 get_all_today_models() 函数查询所有用户今日模型使用
- 新增 all_today_models_chart.ui 和 api/all_today_models.dspy
- index.ui 标题改为「今日模型使用(全部)」,数据源改为全量
- load_path.py 注册新路径权限
- 保留原有 user_today_models 供后续个性化需求使用
This commit is contained in:
yumoqing 2026-05-31 10:01:28 +08:00
parent 929ee0e319
commit 98a28d9770
5 changed files with 49 additions and 2 deletions

View File

@ -269,6 +269,33 @@ async def get_user_today_models(request):
return result return result
async def get_all_today_models(request):
"""获取所有用户当天各模型调用次数和金额(全局监控项)"""
env = request._run_ns
today = env.curDateString()
async with get_sor_context(env, 'sage') as sor:
sql = """
SELECT
COALESCE(b.name, 'Unknown') as model_name,
COUNT(*) as cnt,
COALESCE(SUM(a.amount), 0) as total_amount
FROM llmusage a
LEFT JOIN llm b ON a.llmid = b.id
WHERE a.use_date = ${today}$
GROUP BY a.llmid, b.name
ORDER BY cnt DESC
"""
recs = await sor.sqlExe(sql, {'today': today})
result = []
for r in recs:
result.append({
'model_name': r.get('model_name', 'Unknown'),
'cnt': int(r.get('cnt', 0)),
'total_amount': round(float(r.get('total_amount', 0)), 4)
})
return result
# ── Customer (org-level) monitoring functions ── # ── Customer (org-level) monitoring functions ──
@ -458,6 +485,7 @@ def load_dashboard():
g.get_new_users_month = get_new_users_month g.get_new_users_month = get_new_users_month
g.get_total_orgs = get_total_orgs g.get_total_orgs = get_total_orgs
g.get_user_today_models = get_user_today_models g.get_user_today_models = get_user_today_models
g.get_all_today_models = get_all_today_models
g.get_customer_daily_models = get_customer_daily_models g.get_customer_daily_models = get_customer_daily_models
g.get_customer_monthly_models = get_customer_monthly_models g.get_customer_monthly_models = get_customer_monthly_models
g.get_customer_daily_summary = get_customer_daily_summary g.get_customer_daily_summary = get_customer_daily_summary

View File

@ -68,6 +68,7 @@ paths = [
("/dashboard_for_sage/chart_top_models.ui", "logined"), ("/dashboard_for_sage/chart_top_models.ui", "logined"),
("/dashboard_for_sage/top_models_chart.ui", "logined"), ("/dashboard_for_sage/top_models_chart.ui", "logined"),
("/dashboard_for_sage/user_today_models_chart.ui", "logined"), ("/dashboard_for_sage/user_today_models_chart.ui", "logined"),
("/dashboard_for_sage/all_today_models_chart.ui", "logined"),
# Customer monitoring # Customer monitoring
("/dashboard_for_sage/customer_usage.ui", "logined"), ("/dashboard_for_sage/customer_usage.ui", "logined"),
@ -78,6 +79,7 @@ paths = [
# API endpoints # API endpoints
("/dashboard_for_sage/api/top_models.dspy", "logined"), ("/dashboard_for_sage/api/top_models.dspy", "logined"),
("/dashboard_for_sage/api/user_today_models.dspy", "logined"), ("/dashboard_for_sage/api/user_today_models.dspy", "logined"),
("/dashboard_for_sage/api/all_today_models.dspy", "logined"),
("/dashboard_for_sage/api/customer_daily_models.dspy", "logined"), ("/dashboard_for_sage/api/customer_daily_models.dspy", "logined"),
("/dashboard_for_sage/api/customer_monthly_models.dspy", "logined"), ("/dashboard_for_sage/api/customer_monthly_models.dspy", "logined"),
("/dashboard_for_sage/api/customer_daily_trend.dspy", "logined"), ("/dashboard_for_sage/api/customer_daily_trend.dspy", "logined"),

View File

@ -0,0 +1,11 @@
{
"widgettype": "ChartBar",
"options": {
"height": "280px",
"width": "100%",
"data_url": "{{entire_url('api/all_today_models.dspy')}}",
"nameField": "model_name",
"valueFields": ["cnt", "total_amount"],
"refresh_period": 30
}
}

View File

@ -0,0 +1,6 @@
# coding=utf-8
"""All users' today model usage data API for ChartBar"""
import json
models = await get_all_today_models(request)
return json.dumps(models, ensure_ascii=False, default=str)

View File

@ -434,7 +434,7 @@
"widgettype": "Title4", "widgettype": "Title4",
"options": { "options": {
"fontWeight": "600", "fontWeight": "600",
"otext": "我的今日模型使用", "otext": "今日模型使用(全部)",
"i18n": true "i18n": true
} }
}, },
@ -466,7 +466,7 @@
{ {
"widgettype": "urlwidget", "widgettype": "urlwidget",
"options": { "options": {
"url": "{{entire_url('user_today_models_chart.ui')}}" "url": "{{entire_url('all_today_models_chart.ui')}}"
} }
} }
] ]