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:
parent
929ee0e319
commit
98a28d9770
@ -269,6 +269,33 @@ async def get_user_today_models(request):
|
||||
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 ──
|
||||
|
||||
|
||||
@ -458,6 +485,7 @@ def load_dashboard():
|
||||
g.get_new_users_month = get_new_users_month
|
||||
g.get_total_orgs = get_total_orgs
|
||||
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_monthly_models = get_customer_monthly_models
|
||||
g.get_customer_daily_summary = get_customer_daily_summary
|
||||
|
||||
@ -68,6 +68,7 @@ paths = [
|
||||
("/dashboard_for_sage/chart_top_models.ui", "logined"),
|
||||
("/dashboard_for_sage/top_models_chart.ui", "logined"),
|
||||
("/dashboard_for_sage/user_today_models_chart.ui", "logined"),
|
||||
("/dashboard_for_sage/all_today_models_chart.ui", "logined"),
|
||||
|
||||
# Customer monitoring
|
||||
("/dashboard_for_sage/customer_usage.ui", "logined"),
|
||||
@ -78,6 +79,7 @@ paths = [
|
||||
# API endpoints
|
||||
("/dashboard_for_sage/api/top_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_monthly_models.dspy", "logined"),
|
||||
("/dashboard_for_sage/api/customer_daily_trend.dspy", "logined"),
|
||||
|
||||
11
wwwroot/all_today_models_chart.ui
Normal file
11
wwwroot/all_today_models_chart.ui
Normal 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
|
||||
}
|
||||
}
|
||||
6
wwwroot/api/all_today_models.dspy
Normal file
6
wwwroot/api/all_today_models.dspy
Normal 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)
|
||||
@ -434,7 +434,7 @@
|
||||
"widgettype": "Title4",
|
||||
"options": {
|
||||
"fontWeight": "600",
|
||||
"otext": "我的今日模型使用",
|
||||
"otext": "今日模型使用(全部)",
|
||||
"i18n": true
|
||||
}
|
||||
},
|
||||
@ -466,7 +466,7 @@
|
||||
{
|
||||
"widgettype": "urlwidget",
|
||||
"options": {
|
||||
"url": "{{entire_url('user_today_models_chart.ui')}}"
|
||||
"url": "{{entire_url('all_today_models_chart.ui')}}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user