- 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/生成目录不入库
157 lines
9.8 KiB
SQL
157 lines
9.8 KiB
SQL
-- pipeline-llm 模块数据表(9 张,全部 llm_ 前缀,pipeline 库)
|
||
-- 手写幂等 DDL(IF NOT EXISTS + 内联索引),由宿主 scripts/create_tables.py 执行
|
||
-- (宿主实际建表走 models/*.json → json2ddl,本文件为对齐参考,改表两侧同步)
|
||
-- 金额用 DECIMAL(对账精度),时间用 datetime
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_vendor (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`name` varchar(100) NOT NULL comment '供应商名称',
|
||
`endpoints` text comment '端点目录(JSON): [{region,base_url,proxy,timeout,note}]',
|
||
`description` text comment '描述',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`org_id` varchar(32) NOT NULL DEFAULT '0' comment '所属机构',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_llm_vendor_status` (`status`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='模型供应商';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_account (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`vendor_id` varchar(32) NOT NULL comment '供应商ID',
|
||
`name` varchar(100) NOT NULL comment '账号名称',
|
||
`api_key` varchar(500) comment 'API密钥(AES加密)',
|
||
`endpoint_ids` text comment '选用端点索引列表(JSON)',
|
||
`balance` decimal(14,4) NOT NULL DEFAULT 0 comment '余额',
|
||
`total_recharge` decimal(14,4) NOT NULL DEFAULT 0 comment '累计充值',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`org_id` varchar(32) NOT NULL DEFAULT '0' comment '所属机构',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_llm_account_vendor` (`vendor_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='供应商账号(钱包)';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_model (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`vendor_id` varchar(32) NOT NULL comment '供应商ID',
|
||
`account_id` varchar(32) comment '默认账号ID',
|
||
`name` varchar(100) NOT NULL comment '模型注册名(平台唯一)',
|
||
`vendor_model_id` varchar(100) comment '供应商侧模型名',
|
||
`capability` varchar(20) NOT NULL DEFAULT 't2t' comment '能力类型',
|
||
`sync_mode` varchar(10) NOT NULL DEFAULT 'sync' comment '同步性',
|
||
`profile_id` varchar(32) comment '适配模板ID',
|
||
`query_profile_ids` text comment '后续步骤模板链(JSON数组,异步模型提交后顺序执行:查询/下载)',
|
||
`ppid` varchar(32) comment '定价项目ID(pricing_program)',
|
||
`default_params` text comment '默认参数(JSON)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`description` text comment '描述',
|
||
`org_id` varchar(32) NOT NULL DEFAULT '0' comment '所属机构',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_llm_model_name` (`name`),
|
||
KEY `idx_llm_model_vendor` (`vendor_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='模型注册';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_api_profile (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`name` varchar(100) NOT NULL comment '模板名称',
|
||
`protocol` varchar(20) NOT NULL comment '协议类型',
|
||
`capability` varchar(20) NOT NULL DEFAULT 't2t' comment '能力类型',
|
||
`path` varchar(200) comment '请求路径(相对端点base_url,如/chat/completions)',
|
||
`method` varchar(10) NOT NULL DEFAULT 'POST' comment 'HTTP方法(GET/POST,独立列不再塞request_template)',
|
||
`headers` text comment '请求头(JSON,含认证头模板)',
|
||
`request_template` text comment '请求模板(Jinja2)',
|
||
`response_template` text comment '响应模板(Jinja2)',
|
||
`param_schema` text comment '参数Schema(bricks input_fields)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='适配模板(协议x能力形态去重)';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_org_policy (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`org_id` varchar(32) NOT NULL comment '机构ID',
|
||
`primary_model_id` varchar(32) comment '主模型ID',
|
||
`utility_model_id` varchar(32) comment '辅助模型ID(轻量任务:分类/选择/摘要)',
|
||
`backup_model_ids` text comment '备模型ID列表(JSON)',
|
||
`endpoint_pref` varchar(20) NOT NULL DEFAULT 'any' comment '端点偏好',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_llm_org_policy_org` (`org_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='组织模型容错策略';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_org_quota (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`org_id` varchar(32) NOT NULL comment '机构ID',
|
||
`balance` decimal(14,4) NOT NULL DEFAULT 0 comment '组织池余额',
|
||
`total_recharge` decimal(14,4) NOT NULL DEFAULT 0 comment '累计充值',
|
||
`rate_limit` int NOT NULL DEFAULT 0 comment '组织QPM上限(0=不限)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_llm_org_quota_org` (`org_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='组织限额限流';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_user_quota (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`user_id` varchar(32) NOT NULL comment '用户ID',
|
||
`org_id` varchar(32) NOT NULL comment '所属机构',
|
||
`quota_limit` decimal(14,4) NOT NULL DEFAULT 0 comment '个人额度上限(0=不限)',
|
||
`quota_used` decimal(14,4) NOT NULL DEFAULT 0 comment '个人已用',
|
||
`rate_limit` int NOT NULL DEFAULT 0 comment '个人QPM上限(0=不限)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'active' comment '状态',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
`updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() comment '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_llm_user_quota_user` (`user_id`,`org_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='个人限额限流';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_usage (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`org_id` varchar(32) comment '机构ID',
|
||
`user_id` varchar(32) comment '用户ID',
|
||
`model_id` varchar(32) comment '模型ID',
|
||
`account_id` varchar(32) comment '账号ID',
|
||
`endpoint_region` varchar(20) comment '端点区域',
|
||
`cost` decimal(12,6) NOT NULL DEFAULT 0 comment '成本金额(账号侧)',
|
||
`charge` decimal(12,6) NOT NULL DEFAULT 0 comment '客户应付(异步三方账计算,本机构模型恒0)',
|
||
`accounting_status` varchar(20) comment '记账状态(三态:created待记账/accounted记账成功/failed记账失败;仅status=SUCCEEDED的行有意义,其余NULL)',
|
||
`ppid` varchar(32) comment '定价项目ID',
|
||
`project_id` varchar(32) NOT NULL DEFAULT '0' comment '项目ID(sd_projects.id;''0''=非项目调用,查询不传=不区分项目)',
|
||
`task_ref` varchar(100) comment '调用来源',
|
||
`call_id` varchar(32) comment '调用批次ID(关联llm_call_trace原文追踪,一次调用=N个往返)',
|
||
`status` varchar(20) NOT NULL DEFAULT 'SUCCEEDED' comment '调用状态(统一枚举:SUCCEEDED成功/FAILED失败/PENDING等待/RUNNING运行;其他如recharge)',
|
||
`usages` text comment '用量原文JSON(计费唯一事实源:token计数+按量因子,全量不截断,异步出账读入定价引擎)',
|
||
`note` varchar(200) comment '备注/原因',
|
||
`created_at` datetime NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_llm_usage_org` (`org_id`,`created_at`),
|
||
KEY `idx_llm_usage_model` (`model_id`),
|
||
KEY `idx_llm_usage_project` (`project_id`,`created_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='用量流水(双维度记账)';
|
||
|
||
CREATE TABLE IF NOT EXISTS llm_call_trace (
|
||
`id` varchar(32) NOT NULL comment '主键ID',
|
||
`call_id` varchar(32) comment '调用批次ID(与llm_usage.call_id同值,一次chat_inference=N个往返)',
|
||
`seq` int DEFAULT 0 comment '往返序号(同步重试0..2;异步提交0,轮询1..N)',
|
||
`kind` varchar(20) comment '往返类型(chat对话/gen同步生成/submit异步提交/query任务查询)',
|
||
`url` varchar(500) comment '上游URL(去query防签名泄露)',
|
||
`method` varchar(10) comment 'HTTP方法',
|
||
`status_code` int DEFAULT 0 comment '响应状态码',
|
||
`elapsed_ms` int DEFAULT 0 comment '耗时(毫秒)',
|
||
`req_path` varchar(300) comment '请求原文文件路径(filesroot相对;headers已脱敏)',
|
||
`resp_path` varchar(300) comment '响应原文文件路径(filesroot相对)',
|
||
`org_id` varchar(32) comment '机构ID(下载端点机构隔离用)',
|
||
`note` varchar(200) comment '错误摘要',
|
||
`created_at` timestamp NOT NULL DEFAULT current_timestamp() comment '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_llm_call_trace_call` (`call_id`),
|
||
KEY `idx_llm_call_trace_org` (`org_id`,`created_at`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci comment='模型调用原文追踪(上行下行)';
|