feat: 新增 llm_metrics 和 user_llm_policy 两张表

llm_metrics: 从 llmusage 抽取的轻量指标表
- userid, llmid, use_date, input/output/total tokens
- amount, responsed_seconds, finish_seconds

user_llm_policy: 用户模型策略(customer.admin 管理)
- 每个用户每个模型可单独设限
- daily/monthly_call_limit, spending_alert/ceiling, max_concurrency
- 缺省空=不限
- orgid+userid+llmid 唯一约束

菜单新增: 用户模型策略、模型使用指标
This commit is contained in:
yumoqing 2026-07-02 13:16:18 +08:00
parent 76673bf251
commit 354f556099
5 changed files with 120 additions and 0 deletions

21
json/llm_metrics.json Normal file
View File

@ -0,0 +1,21 @@
{
"tblname": "llm_metrics",
"title": "模型使用指标",
"params": {
"sortby": "use_time",
"logined_userorgid": "userorgid",
"browserfields": {
"exclouded": ["id", "taskid"],
"cwidth": {}
},
"editexclouded": ["id", "amount", "responsed_seconds", "finish_seconds", "status", "taskid"],
"data_filter": {
"AND": [
{"field": "userorgid", "op": "=", "var": "userorgid"},
{"field": "use_date", "op": "between", "var": "use_date"}
]
},
"filter_labels": {"use_date": "使用日期"},
"filter_title": "查询条件"
}
}

18
json/user_llm_policy.json Normal file
View File

@ -0,0 +1,18 @@
{
"tblname": "user_llm_policy",
"title": "用户模型策略",
"params": {
"sortby": "userid",
"logined_userorgid": "orgid",
"browserfields": {
"exclouded": ["id", "orgid", "created_at", "updated_at"],
"cwidth": {}
},
"editexclouded": ["id", "orgid", "created_at", "updated_at", "created_by"],
"data_filter": {
"AND": [
{"field": "orgid", "op": "=", "var": "orgid"}
]
}
}
}

36
models/llm_metrics.json Normal file
View File

@ -0,0 +1,36 @@
{
"summary": [
{
"name": "llm_metrics",
"title": "模型使用指标",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "id", "type": "str", "length": 32},
{"name": "userid", "title": "用户id", "type": "str", "length": 32},
{"name": "userorgid", "title": "用户机构", "type": "str", "length": 32},
{"name": "llmid", "title": "模型", "type": "str", "length": 32},
{"name": "use_date", "title": "使用日期", "type": "date"},
{"name": "use_time", "title": "使用时间", "type": "timestamp"},
{"name": "input_tokens", "title": "输入tokens", "type": "int", "default": "0"},
{"name": "output_tokens", "title": "输出tokens", "type": "int", "default": "0"},
{"name": "total_tokens", "title": "总tokens", "type": "int", "default": "0"},
{"name": "amount", "title": "金额", "type": "float", "length": 18, "dec": 4, "default": "0"},
{"name": "responsed_seconds", "title": "响应时长(秒)", "type": "float", "length": 18, "dec": 2, "nullable": true},
{"name": "finish_seconds", "title": "完成时长(秒)", "type": "float", "length": 18, "dec": 2, "nullable": true},
{"name": "status", "title": "状态", "type": "str", "length": 32, "nullable": true},
{"name": "taskid", "title": "任务号", "type": "str", "length": 32, "nullable": true}
],
"indexes": [
{"name": "idx1", "idxtype": "index", "idxfields": ["userid", "use_date"]},
{"name": "idx2", "idxtype": "index", "idxfields": ["userorgid", "use_date"]},
{"name": "idx3", "idxtype": "index", "idxfields": ["llmid", "use_date"]},
{"name": "idx4", "idxtype": "index", "idxfields": ["use_time"]}
],
"codes": [
{"field": "userid", "table": "users", "valuefield": "id", "textfield": "username"},
{"field": "llmid", "table": "llm", "valuefield": "id", "textfield": "model"},
{"field": "userorgid", "table": "organization", "valuefield": "id", "textfield": "orgname"}
]
}

View File

@ -0,0 +1,35 @@
{
"summary": [
{
"name": "user_llm_policy",
"title": "用户模型策略",
"primary": ["id"]
}
],
"fields": [
{"name": "id", "title": "id", "type": "str", "length": 32},
{"name": "orgid", "title": "所属机构", "type": "str", "length": 32},
{"name": "userid", "title": "用户", "type": "str", "length": 32},
{"name": "llmid", "title": "模型", "type": "str", "length": 32, "nullable": true},
{"name": "daily_call_limit", "title": "日调用上限", "type": "int", "nullable": true},
{"name": "monthly_call_limit", "title": "月调用上限", "type": "int", "nullable": true},
{"name": "spending_alert", "title": "花费预警", "type": "float", "length": 18, "dec": 2, "nullable": true},
{"name": "spending_ceiling", "title": "费用上限", "type": "float", "length": 18, "dec": 2, "nullable": true},
{"name": "max_concurrency", "title": "并发上限", "type": "int", "nullable": true},
{"name": "status", "title": "状态", "type": "str", "length": 10, "default": "active"},
{"name": "created_at", "title": "创建时间", "type": "timestamp", "nullable": true},
{"name": "updated_at", "title": "更新时间", "type": "timestamp", "nullable": true},
{"name": "created_by", "title": "创建人", "type": "str", "length": 32, "nullable": true},
{"name": "remark", "title": "备注", "type": "str", "length": 500, "nullable": true}
],
"indexes": [
{"name": "idx1", "idxtype": "unique", "idxfields": ["orgid", "userid", "llmid"]},
{"name": "idx2", "idxtype": "index", "idxfields": ["orgid"]},
{"name": "idx3", "idxtype": "index", "idxfields": ["userid"]}
],
"codes": [
{"field": "userid", "table": "users", "valuefield": "id", "textfield": "username"},
{"field": "llmid", "table": "llm", "valuefield": "id", "textfield": "model"},
{"field": "orgid", "table": "organization", "valuefield": "id", "textfield": "orgname"}
]
}

View File

@ -36,6 +36,16 @@
"name":"failed_accounting",
"label":"记账失败记录",
"url":"{{entire_url('/llmage/failed_accounting.ui')}}"
},
{
"name":"user_llm_policy",
"label":"用户模型策略",
"url":"{{entire_url('/llmage/user_llm_policy')}}"
},
{
"name":"llm_metrics",
"label":"模型使用指标",
"url":"{{entire_url('/llmage/llm_metrics')}}"
}
]
}