From 98a28d9770d7a716e2222f038944ecc323ffca28 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sun, 31 May 2026 10:01:28 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E4=BB=8A=E6=97=A5=E6=A8=A1=E5=9E=8B=E4=BD=BF=E7=94=A8=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E6=9B=BF=E6=8D=A2=E7=94=A8=E6=88=B7=E7=BA=A7?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E4=B8=BA=E5=85=A8=E9=87=8F=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 get_all_today_models() 函数查询所有用户今日模型使用 - 新增 all_today_models_chart.ui 和 api/all_today_models.dspy - index.ui 标题改为「今日模型使用(全部)」,数据源改为全量 - load_path.py 注册新路径权限 - 保留原有 user_today_models 供后续个性化需求使用 --- dashboard_for_sage/load_dashboard.py | 28 ++++++++++++++++++++++++++++ scripts/load_path.py | 2 ++ wwwroot/all_today_models_chart.ui | 11 +++++++++++ wwwroot/api/all_today_models.dspy | 6 ++++++ wwwroot/index.ui | 4 ++-- 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 wwwroot/all_today_models_chart.ui create mode 100644 wwwroot/api/all_today_models.dspy diff --git a/dashboard_for_sage/load_dashboard.py b/dashboard_for_sage/load_dashboard.py index 942a106..790b905 100644 --- a/dashboard_for_sage/load_dashboard.py +++ b/dashboard_for_sage/load_dashboard.py @@ -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 diff --git a/scripts/load_path.py b/scripts/load_path.py index 48ff141..7cfea7d 100644 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -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"), diff --git a/wwwroot/all_today_models_chart.ui b/wwwroot/all_today_models_chart.ui new file mode 100644 index 0000000..ae76135 --- /dev/null +++ b/wwwroot/all_today_models_chart.ui @@ -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 + } +} diff --git a/wwwroot/api/all_today_models.dspy b/wwwroot/api/all_today_models.dspy new file mode 100644 index 0000000..075abcb --- /dev/null +++ b/wwwroot/api/all_today_models.dspy @@ -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) diff --git a/wwwroot/index.ui b/wwwroot/index.ui index a5e2971..6a6aba3 100644 --- a/wwwroot/index.ui +++ b/wwwroot/index.ui @@ -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')}}" } } ]