-- ============================================================================= -- 多 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) ) 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';