- dashboards.py: 新增实时指标(直查llmusage,无ETL延迟) + 分销商专用API + scope过滤版 - init.py: 角色检测(_resolve_view),实时卡片J2函数,分销商API端点 - index.ui: 7个实时卡片(15s刷新)替换旧stat_*卡片 - 新增rt_card_*.ui(7个)+api端点(2个) - load_path.py: 注册新UI路径
203 lines
13 KiB
XML
203 lines
13 KiB
XML
{% set roles = get_user_roles(get_user()) %}
|
|
{
|
|
"widgettype": "VBox",
|
|
"id": "datamart_root",
|
|
"options": {"width": "100%", "height": "100%", "bgcolor": "var(--sage-bg-primary, transparent)"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "VScrollPanel",
|
|
"options": {"css": "filler"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "HBox",
|
|
"options": {"width": "100%", "alignItems": "center", "marginBottom": "12px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title2", "options": {"fontWeight": "700", "otext": "实时数据概览", "i18n": true}},
|
|
{"widgettype": "Filler"}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "HBox",
|
|
"options": {"width": "100%", "gap": "12px", "marginBottom": "16px", "flexWrap": "wrap"},
|
|
"subwidgets": [
|
|
{"widgettype": "RefreshWidget", "id": "rt_calls", "options": {"period_seconds": 15, "url": "{{entire_url('rt_card_calls.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_amount", "options": {"period_seconds": 15, "url": "{{entire_url('rt_card_amount.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_users", "options": {"period_seconds": 30, "url": "{{entire_url('rt_card_users.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_active", "options": {"period_seconds": 30, "url": "{{entire_url('rt_card_active.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_online", "options": {"period_seconds": 30, "url": "{{entire_url('rt_card_online.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_success", "options": {"period_seconds": 30, "url": "{{entire_url('rt_card_success.ui')}}", "width": "13%"}},
|
|
{"widgettype": "RefreshWidget", "id": "rt_fail", "options": {"period_seconds": 30, "url": "{{entire_url('rt_card_fail.ui')}}", "width": "13%"}}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "HBox",
|
|
"options": {"width": "100%", "gap": "16px", "marginBottom": "16px"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "60%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "模型性能排行", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 24,
|
|
"data_url": "{{entire_url('api/model_perf.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${model}", "width": "35%"}},
|
|
{"widgettype": "Text", "options": {"text": "${avg_ttft_ms}ms", "width": "15%"}},
|
|
{"widgettype": "Text", "options": {"text": "${success_rate}%", "width": "15%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_calls}", "width": "15%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_amount_cny}", "width": "20%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "40%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "币种分布", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 24,
|
|
"data_url": "{{entire_url('api/currency_stats.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${currency}", "width": "20%"}},
|
|
{"widgettype": "Text", "options": {"text": "${call_count}次", "width": "25%"}},
|
|
{"widgettype": "Text", "options": {"text": "${amount}", "width": "25%"}},
|
|
{"widgettype": "Text", "options": {"text": "${amount_cny}", "width": "30%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "HBox",
|
|
"options": {"width": "100%", "gap": "16px", "marginBottom": "16px"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "50%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "供应商性价比", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 24,
|
|
"data_url": "{{entire_url('api/provider_roi.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${model}", "width": "35%"}},
|
|
{"widgettype": "Text", "options": {"text": "${unit_price}/t", "width": "20%"}},
|
|
{"widgettype": "Text", "options": {"text": "${avg_ttft_ms}ms", "width": "15%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_calls}次", "width": "15%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_amount_cny}", "width": "15%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "HBox",
|
|
"options": {"width": "100%", "gap": "16px"},
|
|
"subwidgets": [
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "33%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "热门模型", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 20,
|
|
"data_url": "{{entire_url('api/top_models.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${model_name}", "width": "50%"}},
|
|
{"widgettype": "Text", "options": {"text": "${cnt}次", "width": "25%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_amount}", "width": "25%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "33%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "用户排行", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 20,
|
|
"data_url": "{{entire_url('api/top_users.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${user_name}", "width": "50%"}},
|
|
{"widgettype": "Text", "options": {"text": "${cnt}次", "width": "25%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_amount}", "width": "25%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"widgettype": "VBox",
|
|
"options": {"css": "card", "width": "33%", "padding": "16px"},
|
|
"subwidgets": [
|
|
{"widgettype": "Title4", "options": {"fontWeight": "600", "otext": "供应商排行", "i18n": true, "marginBottom": "8px"}},
|
|
{
|
|
"widgettype": "Cols",
|
|
"options": {
|
|
"col_cwidth": 20,
|
|
"data_url": "{{entire_url('api/top_providers.dspy')}}",
|
|
"data_params": {},
|
|
"record_view": {
|
|
"widgettype": "HBox",
|
|
"options": {"cheight": 3, "width": "100%"},
|
|
"subwidgets": [
|
|
{"widgettype": "Text", "options": {"text": "${provider_name}", "width": "50%"}},
|
|
{"widgettype": "Text", "options": {"text": "${cnt}次", "width": "25%"}},
|
|
{"widgettype": "Text", "options": {"text": "${total_amount}", "width": "25%"}}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|