-- ============================================================================= -- pbl_agent_runtime M4a 契约层 DDL(MySQL 方言) -- 对应 QC 退回 #3/#7:恢复 pbl_tool_registry(工具注册表)+ 新增 pbl_llm_call_log -- (LLM 调用留痕:超时/重试/限流/兜底),使数据表回到技能声明的 6 张。 -- -- 6 张表: -- 1. pbl_agent_def Agent 定义(designer 可写 / critic 零写) -- 2. pbl_tool_registry 工具注册表(13 启用 / 9 禁用,含 pbl.publish 禁用) -- 3. pbl_agent_trace Agent 执行轨迹(第28章 7 要素,append-only) -- 4. pbl_agent_tool_call 工具调用明细(服务端裁决留痕,append-only) -- 5. pbl_approval 人工审批单(14.2 四类,无绕过路径) -- 6. pbl_llm_call_log LLM 调用日志(append-only) -- -- 库名由 ServerEnv().get_module_dbname('pbl_agent_runtime') 决定,脚本内不硬编码库名。 -- 离线契约层使用同构 sqlite DDL(pbl_agent_runtime/m4a_store.py:DDL_SQLITE)。 -- ============================================================================= -- 1) Agent 定义 ---------------------------------------------------------------- CREATE TABLE IF NOT EXISTS pbl_agent_def ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID(所有读写强制打头)', agent_code VARCHAR(64) NOT NULL COMMENT 'Agent 编码:designer / critic', agent_name VARCHAR(128) COMMENT 'Agent 名称', role VARCHAR(32) COMMENT '角色:designer / critic', write_scope VARCHAR(255) DEFAULT 'none' COMMENT '可写域;critic 固定 none', can_write TINYINT(1) DEFAULT 0 COMMENT '是否可写:critic=0(零写权限)', perms TEXT COMMENT '持有权限码 JSON 数组', model VARCHAR(64) COMMENT '绑定模型', system_prompt TEXT COMMENT '系统提示词', status VARCHAR(16) DEFAULT 'active' COMMENT 'active / disabled', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY ux_agent_def_tenant_code (tenant_id, agent_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a Agent 定义(Designer/Critic)'; -- 2) 工具注册表 ---------------------------------------------------------------- CREATE TABLE IF NOT EXISTS pbl_tool_registry ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID', tool_key VARCHAR(128) NOT NULL COMMENT '工具键:如 pbl.publish / blueprint.write', tool_name VARCHAR(128) COMMENT '工具名称', category VARCHAR(32) COMMENT '分类:blueprint/compiler/evidence/...', write_class TINYINT(1) DEFAULT 0 COMMENT '1=写类工具(critic 一律 DENY)', audit_append TINYINT(1) DEFAULT 0 COMMENT '1=只追加留痕类', status VARCHAR(16) DEFAULT 'disabled' COMMENT 'enabled / disabled(默认 disabled=fail-closed)', required_perm VARCHAR(128) COMMENT '调用所需权限码', approval_type VARCHAR(32) COMMENT '强制审批类型(四类之一),NULL=无需审批', params_schema TEXT COMMENT '入参 JSON Schema', risk_level VARCHAR(16) DEFAULT 'medium' COMMENT 'low/medium/high/forbidden', reason VARCHAR(512) COMMENT '禁用原因(审计可读)', sort_no INT DEFAULT 0 COMMENT '排序', version INT DEFAULT 1 COMMENT '版本号(每次变更 +1)', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', created_by VARCHAR(64) COMMENT '创建人', updated_by VARCHAR(64) COMMENT '最后变更人', PRIMARY KEY (id), UNIQUE KEY ux_tool_registry_tenant_key (tenant_id, tool_key), KEY ix_tool_registry_status (tenant_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a 工具注册表(13 启用 / 9 禁用)'; -- 3) Agent 执行轨迹(append-only)--------------------------------------------- CREATE TABLE IF NOT EXISTS pbl_agent_trace ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID', trace_id VARCHAR(40) NOT NULL COMMENT '轨迹ID', run_id VARCHAR(40) COMMENT '运行ID', step_no INT DEFAULT 0 COMMENT '步序', stage VARCHAR(32) COMMENT '阶段:designer_run/critic_run/adjudicate/...', who VARCHAR(64) COMMENT '7要素-谁', occurred_at DATETIME COMMENT '7要素-何时', what TEXT COMMENT '7要素-做了什么', why TEXT COMMENT '7要素-为什么', how TEXT COMMENT '7要素-怎么做', result TEXT COMMENT '7要素-结果', evidence_ref VARCHAR(255) COMMENT '7要素-证据引用', tool_key VARCHAR(128) COMMENT '关联工具', decision VARCHAR(16) COMMENT 'ALLOW / DENY / READ_ONLY', created_at DATETIME COMMENT '创建时间', PRIMARY KEY (id), KEY ix_trace_tenant_trace (tenant_id, trace_id), KEY ix_trace_run (tenant_id, run_id, step_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a Agent 执行轨迹(append-only,禁 UPDATE/DELETE)'; -- 4) 工具调用明细(append-only)------------------------------------------------ CREATE TABLE IF NOT EXISTS pbl_agent_tool_call ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID', trace_id VARCHAR(40) COMMENT '轨迹ID', call_no INT DEFAULT 0 COMMENT '同轨迹内调用序号', agent_code VARCHAR(64) COMMENT '发起 Agent', tool_key VARCHAR(128) COMMENT '被裁决工具', params_json TEXT COMMENT '入参快照', decision VARCHAR(16) COMMENT 'ALLOW / DENY', denied_at_step VARCHAR(32) COMMENT 'DENY 命中步(S1~S8 键名)', reason_code VARCHAR(64) COMMENT '机器可读拒绝码', approval_id VARCHAR(40) COMMENT '关联审批单', latency_ms INT DEFAULT 0 COMMENT '裁决耗时', created_at DATETIME COMMENT '创建时间', PRIMARY KEY (id), KEY ix_tool_call_trace (tenant_id, trace_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a 服务端裁决留痕(append-only)'; -- 5) 人工审批单 ---------------------------------------------------------------- CREATE TABLE IF NOT EXISTS pbl_approval ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID', approval_id VARCHAR(40) NOT NULL COMMENT '审批单号', approval_type VARCHAR(32) NOT NULL COMMENT 'publish/compile_execute/blueprint_approve/tool_registry_change', title VARCHAR(255) COMMENT '标题', payload_json TEXT COMMENT '审批载荷', status VARCHAR(16) DEFAULT 'pending' COMMENT 'pending/approved/rejected/expired', requested_by VARCHAR(64) COMMENT '发起人', agent_code VARCHAR(64) COMMENT '关联 Agent', tool_key VARCHAR(128) COMMENT '关联工具', decided_by VARCHAR(64) COMMENT '裁决人(必须真人,禁 agent)', decided_at DATETIME COMMENT '裁决时间', decision_comment VARCHAR(512) COMMENT '裁决意见', expires_at DATETIME COMMENT '过期时间', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY ux_approval_tenant_id (tenant_id, approval_id), KEY ix_approval_status (tenant_id, status, approval_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a 四类强制人工审批(无绕过路径)'; -- 6) LLM 调用日志(append-only)------------------------------------------------ CREATE TABLE IF NOT EXISTS pbl_llm_call_log ( id VARCHAR(40) NOT NULL COMMENT '主键', tenant_id VARCHAR(40) NOT NULL COMMENT '租户ID', agent_code VARCHAR(64) COMMENT 'designer / critic', run_id VARCHAR(40) COMMENT '运行ID', purpose VARCHAR(32) COMMENT 'designer_run / critic_run', model VARCHAR(64) COMMENT '模型名', attempt_no INT DEFAULT 1 COMMENT '第几次尝试', status VARCHAR(16) DEFAULT 'ok' COMMENT 'ok/timeout/error/rate_limited/fallback', latency_ms INT DEFAULT 0 COMMENT '耗时', timeout_ms INT DEFAULT 0 COMMENT '超时阈值', retry_count INT DEFAULT 0 COMMENT '重试次数', rate_limited TINYINT(1) DEFAULT 0 COMMENT '是否被限流', fallback_used TINYINT(1) DEFAULT 0 COMMENT '是否走兜底', prompt_chars INT DEFAULT 0 COMMENT '提示词长度', prompt_hash CHAR(64) COMMENT '提示词 SHA256(不落原文,防泄漏)', response_chars INT DEFAULT 0 COMMENT '响应长度', tokens_in INT DEFAULT 0 COMMENT '输入 token', tokens_out INT DEFAULT 0 COMMENT '输出 token', error_code VARCHAR(64) COMMENT '错误码', error_msg VARCHAR(512) COMMENT '错误摘要', created_at DATETIME COMMENT '创建时间', PRIMARY KEY (id), KEY ix_llm_log_tenant_agent (tenant_id, agent_code, created_at), KEY ix_llm_log_status (tenant_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='M4a LLM 调用留痕(超时/重试/限流/兜底,append-only)'; -- ============================================================================= -- 种子数据(幂等;实际由 seed_registry() 写入,此处仅作 DBA 参考与灾备重建) -- 13 启用工具 -- ============================================================================= -- blueprint.read / blueprint.write / blueprint.validate / blueprint.approve(审批) -- compiler.compile / compiler.execute(审批) / evidence.collect / assessment.score -- kdb.query / runtime.event / agent.trace_write / approval.create / tool_registry.read -- -- 9 禁用工具(risk_level=forbidden,status=disabled) -- pbl.publish / blueprint.publish_auto / compiler.autorun / kdb.write / tenant.switch -- rbac.grant / approval.auto_decide / trace.delete / llm.raw_exec -- =============================================================================