216 lines
12 KiB
SQL
216 lines
12 KiB
SQL
-- =============================================================================
|
||
-- 多 Agent 共用底座 MySQL(11 张)
|
||
-- 执行时机:四个 Agent 并行开发之前,平台统一建好
|
||
-- 不含单 Agent 专用表 → 见 02-mysql-agent专用.sql
|
||
-- =============================================================================
|
||
|
||
CREATE DATABASE IF NOT EXISTS jinrong_agent DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
USE jinrong_agent;
|
||
|
||
-- =============================================================================
|
||
-- 🔴 第一批:全员共用(6 张)
|
||
-- =============================================================================
|
||
|
||
CREATE TABLE agent_session (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
session_id VARCHAR(64) NOT NULL COMMENT '对外会话 UUID',
|
||
trace_id VARCHAR(64) NOT NULL COMMENT '全链路追踪 ID',
|
||
agent_type ENUM('customer','advisor','analyst','risk') NOT NULL,
|
||
actor_id VARCHAR(64) NOT NULL COMMENT '操作者:customer_id / staff_id / SYSTEM',
|
||
actor_role VARCHAR(32) NOT NULL COMMENT 'customer/advisor/analyst/risk_officer/compliance',
|
||
customer_id VARCHAR(64) NULL COMMENT '会话关联客户',
|
||
advisor_id VARCHAR(64) NULL COMMENT '代理人归属校验用',
|
||
title VARCHAR(256) NULL,
|
||
status ENUM('active','closed','blocked') NOT NULL DEFAULT 'active',
|
||
metadata JSON NULL,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||
closed_at DATETIME(3) NULL,
|
||
UNIQUE KEY uk_session_id (session_id),
|
||
KEY idx_trace (trace_id),
|
||
KEY idx_actor (agent_type, actor_id, created_at),
|
||
KEY idx_customer (customer_id, created_at),
|
||
KEY idx_advisor_customer (advisor_id, customer_id)
|
||
) ENGINE=InnoDB COMMENT='【共用】Agent 会话主表';
|
||
|
||
CREATE TABLE agent_message (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
session_id VARCHAR(64) NOT NULL,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
seq_no INT UNSIGNED NOT NULL,
|
||
role ENUM('user','assistant','system','tool') NOT NULL,
|
||
content MEDIUMTEXT NOT NULL,
|
||
content_hash CHAR(64) NULL,
|
||
token_est INT UNSIGNED NULL,
|
||
has_disclaimer TINYINT(1) NOT NULL DEFAULT 0,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
KEY idx_session_seq (session_id, seq_no),
|
||
KEY idx_trace (trace_id),
|
||
KEY idx_created (created_at),
|
||
UNIQUE KEY uk_agent_message_session_seq (session_id, seq_no)
|
||
) ENGINE=InnoDB COMMENT='【共用】消息明细';
|
||
|
||
CREATE TABLE agent_tool_call (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
session_id VARCHAR(64) NOT NULL,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
message_id BIGINT UNSIGNED NULL,
|
||
tool_name VARCHAR(128) NOT NULL,
|
||
tool_input JSON NOT NULL,
|
||
tool_output JSON NULL,
|
||
status ENUM('success','error','blocked','timeout') NOT NULL,
|
||
error_code VARCHAR(64) NULL,
|
||
latency_ms INT UNSIGNED NULL,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
KEY idx_session (session_id, created_at),
|
||
KEY idx_trace (trace_id),
|
||
KEY idx_tool (tool_name, created_at)
|
||
) ENGINE=InnoDB COMMENT='【共用】Tool 调用审计';
|
||
|
||
CREATE TABLE audit_log (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
event_type VARCHAR(64) NOT NULL,
|
||
agent_type ENUM('customer','advisor','analyst','risk','platform') NOT NULL,
|
||
actor_id VARCHAR(64) NOT NULL,
|
||
customer_id VARCHAR(64) NULL,
|
||
rule_id VARCHAR(64) NULL,
|
||
input_summary JSON NULL,
|
||
decision VARCHAR(64) NULL,
|
||
risk_score SMALLINT UNSIGNED NULL,
|
||
handler_id VARCHAR(64) NULL,
|
||
handler_result VARCHAR(64) NULL,
|
||
handler_comment VARCHAR(512) NULL,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
KEY idx_trace (trace_id),
|
||
KEY idx_event_time (event_type, created_at),
|
||
KEY idx_customer (customer_id, created_at),
|
||
KEY idx_actor (actor_id, created_at)
|
||
) ENGINE=InnoDB COMMENT='【共用】审计总账(只 INSERT)';
|
||
|
||
CREATE TABLE input_guard_log (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
session_id VARCHAR(64) NULL,
|
||
agent_type ENUM('customer','advisor','analyst','risk') NOT NULL,
|
||
actor_id VARCHAR(64) NOT NULL,
|
||
guard_type ENUM('prompt_injection','oversize','illegal_param','rate_limit') NOT NULL,
|
||
raw_excerpt VARCHAR(1024) NULL,
|
||
action ENUM('blocked','sanitized','passed') NOT NULL,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
KEY idx_session (session_id),
|
||
KEY idx_time (created_at)
|
||
) ENGINE=InnoDB COMMENT='【共用】输入安全防护';
|
||
|
||
CREATE TABLE customer_advisor_rel (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
customer_id VARCHAR(64) NOT NULL,
|
||
advisor_id VARCHAR(64) NOT NULL,
|
||
rel_status ENUM('active','transferred','closed') NOT NULL DEFAULT 'active',
|
||
effective_from DATE NOT NULL,
|
||
effective_to DATE NULL,
|
||
synced_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
UNIQUE KEY uk_customer_advisor (customer_id, advisor_id, effective_from),
|
||
KEY idx_advisor (advisor_id, rel_status)
|
||
) ENGINE=InnoDB COMMENT='【共用】客户-代理人归属(Core 同步)';
|
||
|
||
-- =============================================================================
|
||
-- 🟡 第二批:跨 Agent 交换(5 张)
|
||
-- =============================================================================
|
||
|
||
CREATE TABLE customer_profile_l1 (
|
||
customer_id VARCHAR(64) NOT NULL PRIMARY KEY,
|
||
style_tags JSON NULL,
|
||
style_questionnaire JSON NULL,
|
||
allocation_plan JSON NULL,
|
||
behavior_tags JSON NULL,
|
||
attribution_pref VARCHAR(32) NULL,
|
||
version INT UNSIGNED NOT NULL DEFAULT 1,
|
||
updated_by ENUM('customer_agent','system') NOT NULL DEFAULT 'customer_agent',
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
|
||
) ENGINE=InnoDB COMMENT='【交换】L1 客户画像 · 客户 Agent 写';
|
||
|
||
CREATE TABLE customer_profile_l2 (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
customer_id VARCHAR(64) NOT NULL,
|
||
advisor_id VARCHAR(64) NOT NULL,
|
||
asset_snapshot JSON NULL,
|
||
demands JSON NULL,
|
||
follow_up_todos JSON NULL,
|
||
service_tags JSON NULL,
|
||
source_session_id VARCHAR(64) NULL,
|
||
version INT UNSIGNED NOT NULL DEFAULT 1,
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||
UNIQUE KEY uk_customer_advisor (customer_id, advisor_id),
|
||
KEY idx_advisor (advisor_id)
|
||
) ENGINE=InnoDB COMMENT='【交换】L2 服务画像 · 代理人 Agent 写';
|
||
|
||
CREATE TABLE customer_profile_l3 (
|
||
customer_id VARCHAR(64) NOT NULL PRIMARY KEY,
|
||
monitor_tier ENUM('normal','watch','high') NOT NULL DEFAULT 'normal',
|
||
risk_score SMALLINT UNSIGNED NULL,
|
||
score_dimensions JSON NULL,
|
||
monitor_tags JSON NULL,
|
||
last_alert_id VARCHAR(64) NULL,
|
||
computed_at DATETIME(3) NOT NULL,
|
||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
|
||
) ENGINE=InnoDB COMMENT='【交换】L3 监测画像 · 风控 Agent 写';
|
||
|
||
CREATE TABLE risk_alert (
|
||
alert_id VARCHAR(64) NOT NULL PRIMARY KEY,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
customer_id VARCHAR(64) NOT NULL,
|
||
trade_id VARCHAR(64) NULL,
|
||
alert_type ENUM('large_amount','freq_trade','suitability','aml','pattern') NOT NULL,
|
||
triggered_rules JSON NOT NULL,
|
||
risk_score SMALLINT UNSIGNED NULL,
|
||
status ENUM('pending_review','confirmed_normal','confirmed_suspicious','reported') NOT NULL DEFAULT 'pending_review',
|
||
payload JSON NOT NULL,
|
||
handler_id VARCHAR(64) NULL,
|
||
handler_result VARCHAR(64) NULL,
|
||
handler_comment VARCHAR(512) NULL,
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
handled_at DATETIME(3) NULL,
|
||
KEY idx_status_time (status, created_at),
|
||
KEY idx_customer (customer_id, created_at),
|
||
KEY idx_type (alert_type, created_at)
|
||
) ENGINE=InnoDB COMMENT='【交换】预警单 · 风控写 / 分析读';
|
||
|
||
CREATE TABLE risk_suitability_log (
|
||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||
trace_id VARCHAR(64) NOT NULL,
|
||
customer_id VARCHAR(64) NOT NULL,
|
||
product_id VARCHAR(64) NOT NULL,
|
||
product_name VARCHAR(128) NULL COMMENT '判定时产品名快照',
|
||
customer_risk_level CHAR(2) NOT NULL COMMENT 'L0 C1~C5',
|
||
product_risk_level CHAR(2) NOT NULL COMMENT '产品最低 R1~R5',
|
||
investor_category ENUM('ordinary','professional','professional_pending') NOT NULL DEFAULT 'ordinary',
|
||
match_result ENUM(
|
||
'allowed','allowed_with_disclosure','forbidden',
|
||
'risk_expired','professional_exempt'
|
||
) NOT NULL COMMENT '与 Core check_suitability 输出一致',
|
||
mismatch_type ENUM(
|
||
'none','risk_level','risk_expired','age_branch_confirm',
|
||
'min_subscribe','not_found','professional_exempt'
|
||
) NOT NULL DEFAULT 'none' COMMENT '阻断/特殊处理原因分类',
|
||
is_matched TINYINT(1) NOT NULL,
|
||
is_blocked TINYINT(1) NOT NULL DEFAULT 0,
|
||
requires_disclosure TINYINT(1) NOT NULL DEFAULT 0,
|
||
needs_branch_confirm TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'FM-01 年龄≥70 买 R3+',
|
||
risk_was_expired TINYINT(1) NOT NULL DEFAULT 0 COMMENT '判定时风评是否已过期',
|
||
block_reason VARCHAR(512) NULL COMMENT '对人可读原因',
|
||
block_response_code VARCHAR(32) NULL COMMENT 'API 机器码,如 SUIT_RISK_MISMATCH',
|
||
check_source ENUM('r02_trade','r02_chat','c11_inquiry','manual','platform') NOT NULL DEFAULT 'r02_trade',
|
||
actor_id VARCHAR(64) NOT NULL COMMENT '发起者 customer_id / staff_id / svc-trade-suitability',
|
||
request_ref VARCHAR(64) NULL COMMENT '交易单号 / session_id',
|
||
profile_l1_version INT UNSIGNED NULL,
|
||
rule_refs JSON NULL COMMENT '依据规则,如 ["JR-AST-012","FM-03"]',
|
||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||
KEY idx_trace (trace_id),
|
||
KEY idx_customer (customer_id, created_at),
|
||
KEY idx_product (product_id, created_at),
|
||
KEY idx_blocked (is_blocked, created_at),
|
||
KEY idx_match (match_result, created_at),
|
||
KEY idx_mismatch (mismatch_type, created_at)
|
||
) ENGINE=InnoDB COMMENT='【交换】适当性记录 · 风控写 / 客户+代理人读 · 字段契约见 07-risk_suitability_log说明.md';
|