- json/llm_call_trace_list.json: noedit只读列表;exclouded隐藏id/req_path/resp_path/org_id;
url/note加宽;kind/method内联枚举(含gen同步生成,此前草稿引用的get_llm_kind_options.dspy不存在);
删color_mapping(bricks全库0消费的死配置);toolbar查看IO+binds urlwidget→PopupWindow(85%)
url不带?id=${id}$——生成期ArgsConvert会eval成<built-in function id>垃圾串,
行数据id经_add_event_data自动并入params(dapi/llmage生产同款)
- api/llm_call_trace_io.dspy: 薄代理(get_user门禁+get_userorgid机构隔离)→env.llm_call_trace_io;
修草稿4处实锤bug:get_user未await/user.get当dict/sor块外使用/返回PopupWindow套娃
- init.py: llm_call_trace_io读表+同批次+llm_usage上下文(块内读全拷dict)→读文件
(trace.trace_root realpath前缀校验防穿越)→TabPanel三tab(摘要Html+pre escape防注入/
请求/响应CodeEditor readonly mode=null);单侧150K截断提示盘上路径;env注册
- api/llm_project_cost_query.dspy: 改{total,rows}契约接Tabular data_url(PageDataLoader);
wwwroot/llm_project_cost/index.ui: InlineForm(date_from/date_to/status)+Tabular;
script内getWidgetById起点bricks.app(弹窗DOM挂body下,app.root搜不到)
- card_popup.dspy: titles加llm_call_trace;新增page_targets白名单挂按项目费用页;
index.ui挂两张卡片(调用原文追踪/按项目费用)
- accounting.py: _maybe_cleanup_traces每日一次接cleanup_expired(trace.py铁律3
文档承诺worker每日调但循环没接,补齐);放抢锁前(清理幂等多进程同日无害)
- scripts/load_path.py: 注释说明/**通配已覆盖新页面(rbac check_roles_path前缀匹配)
- models/mysql.ddl/README/design-spec: 9张表同步(kind补gen枚举;3.9节;F19/F20)
- scripts/test_llm_call_trace_io.py: stub harness 22断言全过(隔离/穿越/转义/截断/每日门控)
- .gitignore: wwwroot/llm_call_trace/生成目录不入库
53 lines
2.6 KiB
XML
53 lines
2.6 KiB
XML
{
|
||
"widgettype": "VBox",
|
||
"options": {"width": "100%", "height": "100%", "padding": "8px", "gap": "8px"},
|
||
"subwidgets": [
|
||
{
|
||
"widgettype": "InlineForm",
|
||
"id": "project_cost_filter",
|
||
"options": {
|
||
"css": "card", "padding": "8px", "submit_label": "查询",
|
||
"fields": [
|
||
{"name": "date_from", "label": "开始日期", "uitype": "date", "cwidth": 12},
|
||
{"name": "date_to", "label": "结束日期", "uitype": "date", "cwidth": 12},
|
||
{"name": "status", "label": "状态", "uitype": "code", "cwidth": 10,
|
||
"data": [
|
||
{"value": "", "text": "全部"},
|
||
{"value": "SUCCEEDED", "text": "成功"},
|
||
{"value": "FAILED", "text": "失败"}
|
||
]}
|
||
]
|
||
},
|
||
"binds": [{
|
||
"wid": "self", "event": "submit",
|
||
"actiontype": "script", "target": "project_cost_table",
|
||
"script": "var tbl = bricks.getWidgetById('project_cost_table', bricks.app); if(tbl) await tbl.render(params);"
|
||
}]
|
||
},
|
||
{
|
||
"widgettype": "Tabular",
|
||
"id": "project_cost_table",
|
||
"options": {
|
||
"title": "按项目费用统计",
|
||
"description": "按 llm_usage.project_id 分组汇总(成本=账号侧,应付=客户侧);project_id='0' 为非项目调用;缺省显示全部状态",
|
||
"width": "100%", "css": "card",
|
||
"data_url": "{{entire_url('../api/llm_project_cost_query.dspy')}}",
|
||
"data_method": "GET", "page_rows": 50,
|
||
"row_options": {
|
||
"browserfields": {
|
||
"exclouded": ["project_id"]
|
||
},
|
||
"fields": [
|
||
{"name": "project_name", "title": "项目", "type": "str", "length": 100, "cwidth": 30},
|
||
{"name": "calls", "title": "调用次数", "type": "int", "cwidth": 10},
|
||
{"name": "cost", "title": "成本合计(元)", "type": "float", "cwidth": 12},
|
||
{"name": "charge", "title": "客户应付合计(元)", "type": "float", "cwidth": 14},
|
||
{"name": "req_tokens", "title": "输入token", "type": "int", "cwidth": 12},
|
||
{"name": "resp_tokens", "title": "输出token", "type": "int", "cwidth": 12}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
]
|
||
}
|