llmage/llmage/stats.py
yumoqing fd6d17e3c2 feat: add llmage module stat cards - model count, today's usage, amount, catalog count
- Create stats.py with get_llmage_stats() helper function
- Add 4 stat widgets: stat_total_models, stat_today_calls, stat_today_amount, stat_catelog_count
- Update index.ui to display stat cards row above navigation cards
- Register get_llmage_stats in load_llmage()
2026-05-25 18:48:09 +08:00

70 lines
2.2 KiB
Python

from sqlor.dbpools import get_sor_context
from appPublic.timeUtils import curDateString, timestampstr
from datetime import datetime, timedelta
from appPublic.log import debug, exception
async def get_llmage_stats(request):
"""Get llmage module statistics"""
env = request._run_ns
userorgid = await env.get_userorgid()
today = curDateString()
tomorrow = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d')
stats = {
'total_models': 0,
'today_usage_count': 0,
'today_amount': 0,
'catelog_count': 0
}
async with get_sor_context(env, 'llmage') as sor:
# Total enabled models
sql_models = """
SELECT COUNT(DISTINCT id) as cnt FROM llm
WHERE enabled_date <= ${today}$
AND expired_date > ${today}$
"""
recs = await sor.sqlExe(sql_models, {'today': today})
if recs:
stats['total_models'] = int(recs[0].cnt or 0)
# Today's usage count
sql_usage = """
SELECT COUNT(*) as cnt FROM llmusage
WHERE userorgid = ${userorgid}$
AND use_date >= ${today}$
AND use_date < ${tomorrow}$
"""
recs = await sor.sqlExe(sql_usage, {
'userorgid': userorgid,
'today': today,
'tomorrow': tomorrow
})
if recs:
stats['today_usage_count'] = int(recs[0].cnt or 0)
# Today's total amount
sql_amount = """
SELECT COALESCE(SUM(amount), 0) as total FROM llmusage
WHERE userorgid = ${userorgid}$
AND use_date >= ${today}$
AND use_date < ${tomorrow}$
"""
recs = await sor.sqlExe(sql_amount, {
'userorgid': userorgid,
'today': today,
'tomorrow': tomorrow
})
if recs:
stats['today_amount'] = float(recs[0].total or 0)
# Catalog count
sql_catelog = """
SELECT COUNT(*) as cnt FROM llmcatelog
"""
recs = await sor.sqlExe(sql_catelog, {})
if recs:
stats['catelog_count'] = int(recs[0].cnt or 0)
return stats