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
|
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
|
||||||
|
|||||||
@ -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"),
|
||||||
|
|||||||
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",
|
"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')}}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user