pipeline-llm/mysql.ddl.sql
yumoqing 69fe362dde feat(trace): 调用原文追踪「查看IO」前端闭环+按项目费用页(2026-09-10定夺落地)
- 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/生成目录不入库
2026-09-11 14:58:21 +08:00

157 lines
9.8 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- pipeline-llm 模块数据表9 张,全部 llm_ 前缀pipeline 库)
-- 手写幂等 DDLIF 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='模型调用原文追踪(上行下行)';