pbl_agent_runtime/sql/m4a_contract_addon.sql
2026-09-18 14:59:02 +08:00

168 lines
11 KiB
SQL
Raw 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.

-- =============================================================================
-- pbl_agent_runtime M4a 契约层 DDLMySQL 方言)
-- 对应 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 DDLpbl_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=forbiddenstatus=disabled
-- pbl.publish / blueprint.publish_auto / compiler.autorun / kdb.write / tenant.switch
-- rbac.grant / approval.auto_decide / trace.delete / llm.raw_exec
-- =============================================================================