From 287a666e1b2bb155e86aa88ebace201d1e8a51f6 Mon Sep 17 00:00:00 2001 From: zhou zhou <3272660260@qq.com> Date: 星期四, 19 三月 2026 13:26:02 +0800 Subject: [PATCH] #AI.国际化 --- version/db/ai_feature.sql | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 254 insertions(+), 2 deletions(-) diff --git a/version/db/ai_feature.sql b/version/db/ai_feature.sql index 529ea30..ab0819b 100644 --- a/version/db/ai_feature.sql +++ b/version/db/ai_feature.sql @@ -13,6 +13,10 @@ `max_tokens` int(11) DEFAULT NULL COMMENT '鏈�澶oken', `timeout_ms` int(11) DEFAULT NULL COMMENT '瓒呮椂鏃堕棿', `streaming_enabled` tinyint(1) DEFAULT '1' COMMENT '鏄惁鍚敤娴佸紡鍝嶅簲', + `validate_status` varchar(32) DEFAULT 'NOT_TESTED' COMMENT '鏈�杩戞牎楠岀姸鎬�', + `last_validate_message` varchar(500) DEFAULT NULL COMMENT '鏈�杩戞牎楠屼俊鎭�', + `last_validate_elapsed_ms` bigint(20) DEFAULT NULL COMMENT '鏈�杩戞牎楠岃�楁椂', + `last_validate_time` datetime DEFAULT NULL COMMENT '鏈�杩戞牎楠屾椂闂�', `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛', `status` int(11) DEFAULT '1' COMMENT '鐘舵��', `deleted` int(11) DEFAULT '0' COMMENT '鍒犻櫎鏍囪', @@ -56,6 +60,10 @@ `env_json` text COMMENT '鐜鍙橀噺 JSON', `headers_json` text COMMENT '璇锋眰澶� JSON', `request_timeout_ms` int(11) DEFAULT NULL COMMENT '璇锋眰瓒呮椂鏃堕棿', + `health_status` varchar(32) DEFAULT 'NOT_TESTED' COMMENT '鍋ュ悍鐘舵��', + `last_test_time` datetime DEFAULT NULL COMMENT '鏈�杩戞祴璇曟椂闂�', + `last_test_message` varchar(500) DEFAULT NULL COMMENT '鏈�杩戞祴璇曚俊鎭�', + `last_init_elapsed_ms` bigint(20) DEFAULT NULL COMMENT '鏈�杩戝垵濮嬪寲鑰楁椂', `sort` int(11) DEFAULT '0' COMMENT '鎺掑簭', `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛', `status` int(11) DEFAULT '1' COMMENT '鐘舵��', @@ -76,6 +84,8 @@ `user_id` bigint(20) NOT NULL COMMENT '鐢ㄦ埛 ID', `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛', `last_message_time` datetime DEFAULT NULL COMMENT '鏈�鍚庢秷鎭椂闂�', + `memory_summary` longtext COMMENT '璁板繂鎽樿', + `memory_facts` text COMMENT '鍏抽敭浜嬪疄', `pinned` tinyint(1) DEFAULT '0' COMMENT '鏄惁缃《', `status` int(11) DEFAULT '1' COMMENT '鐘舵��', `deleted` int(11) DEFAULT '0' COMMENT '鍒犻櫎鏍囪', @@ -93,6 +103,7 @@ `seq_no` int(11) NOT NULL COMMENT '娑堟伅搴忓彿', `role` varchar(32) NOT NULL COMMENT '娑堟伅瑙掕壊', `content` longtext COMMENT '娑堟伅鍐呭', + `content_length` int(11) DEFAULT NULL COMMENT '鍐呭闀垮害', `user_id` bigint(20) NOT NULL COMMENT '鐢ㄦ埛 ID', `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛', `deleted` int(11) DEFAULT '0' COMMENT '鍒犻櫎鏍囪', @@ -101,6 +112,127 @@ PRIMARY KEY (`id`), KEY `idx_sys_ai_chat_message_session_seq` (`session_id`,`seq_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 瀵硅瘽娑堟伅'; + +CREATE TABLE IF NOT EXISTS `sys_ai_call_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', + `request_id` varchar(128) NOT NULL COMMENT '璇锋眰ID', + `session_id` bigint(20) DEFAULT NULL COMMENT '浼氳瘽ID', + `prompt_code` varchar(128) DEFAULT NULL COMMENT 'Prompt缂栫爜', + `prompt_name` varchar(255) DEFAULT NULL COMMENT 'Prompt鍚嶇О', + `model` varchar(255) DEFAULT NULL COMMENT '妯″瀷', + `user_id` bigint(20) DEFAULT NULL COMMENT '鐢ㄦ埛ID', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛ID', + `status` varchar(32) DEFAULT NULL COMMENT '鐘舵��', + `error_category` varchar(64) DEFAULT NULL COMMENT '閿欒鍒嗙被', + `error_stage` varchar(64) DEFAULT NULL COMMENT '閿欒闃舵', + `error_message` varchar(1000) DEFAULT NULL COMMENT '閿欒淇℃伅', + `configured_mcp_count` int(11) DEFAULT NULL COMMENT '閰嶇疆MCP鏁伴噺', + `mounted_mcp_count` int(11) DEFAULT NULL COMMENT '鎸傝浇MCP鏁伴噺', + `mounted_mcp_names` varchar(1000) DEFAULT NULL COMMENT '鎸傝浇MCP鍚嶇О', + `tool_call_count` int(11) DEFAULT NULL COMMENT '宸ュ叿璋冪敤鎬绘暟', + `tool_success_count` int(11) DEFAULT NULL COMMENT '宸ュ叿鎴愬姛鏁�', + `tool_failure_count` int(11) DEFAULT NULL COMMENT '宸ュ叿澶辫触鏁�', + `elapsed_ms` bigint(20) DEFAULT NULL COMMENT '鎬昏�楁椂', + `first_token_latency_ms` bigint(20) DEFAULT NULL COMMENT '棣栧寘鑰楁椂', + `prompt_tokens` int(11) DEFAULT NULL COMMENT 'Prompt Tokens', + `completion_tokens` int(11) DEFAULT NULL COMMENT 'Completion Tokens', + `total_tokens` int(11) DEFAULT NULL COMMENT 'Total Tokens', + `deleted` int(11) DEFAULT '0' COMMENT '鍒犻櫎鏍囪', + `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `update_time` datetime DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_sys_ai_call_log_tenant_create` (`tenant_id`,`create_time`), + KEY `idx_sys_ai_call_log_request` (`request_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 璋冪敤鏃ュ織'; + +CREATE TABLE IF NOT EXISTS `sys_ai_mcp_call_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', + `call_log_id` bigint(20) NOT NULL COMMENT 'AI璋冪敤鏃ュ織ID', + `request_id` varchar(128) DEFAULT NULL COMMENT '璇锋眰ID', + `session_id` bigint(20) DEFAULT NULL COMMENT '浼氳瘽ID', + `tool_call_id` varchar(128) DEFAULT NULL COMMENT '宸ュ叿璋冪敤ID', + `mount_name` varchar(255) DEFAULT NULL COMMENT '鎸傝浇鍚嶇О', + `tool_name` varchar(255) DEFAULT NULL COMMENT '宸ュ叿鍚嶇О', + `status` varchar(32) DEFAULT NULL COMMENT '鐘舵��', + `input_summary` text COMMENT '杈撳叆鎽樿', + `output_summary` text COMMENT '杈撳嚭鎽樿', + `error_message` varchar(1000) DEFAULT NULL COMMENT '閿欒淇℃伅', + `duration_ms` bigint(20) DEFAULT NULL COMMENT '鑰楁椂', + `user_id` bigint(20) DEFAULT NULL COMMENT '鐢ㄦ埛ID', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '绉熸埛ID', + `create_time` datetime DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_sys_ai_mcp_call_log_call` (`call_log_id`,`create_time`), + KEY `idx_sys_ai_mcp_call_log_tenant` (`tenant_id`,`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI MCP 璋冪敤鏃ュ織'; + +SET @ai_param_validate_status_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_param' + AND `COLUMN_NAME` = 'validate_status' +); +SET @ai_param_validate_status_sql := IF( + @ai_param_validate_status_exists = 0, + 'ALTER TABLE `sys_ai_param` ADD COLUMN `validate_status` varchar(32) DEFAULT ''NOT_TESTED'' COMMENT ''鏈�杩戞牎楠岀姸鎬�'' AFTER `streaming_enabled`', + 'SELECT 1' +); +PREPARE ai_param_validate_status_stmt FROM @ai_param_validate_status_sql; +EXECUTE ai_param_validate_status_stmt; +DEALLOCATE PREPARE ai_param_validate_status_stmt; + +SET @ai_param_last_validate_message_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_param' + AND `COLUMN_NAME` = 'last_validate_message' +); +SET @ai_param_last_validate_message_sql := IF( + @ai_param_last_validate_message_exists = 0, + 'ALTER TABLE `sys_ai_param` ADD COLUMN `last_validate_message` varchar(500) DEFAULT NULL COMMENT ''鏈�杩戞牎楠屼俊鎭�'' AFTER `validate_status`', + 'SELECT 1' +); +PREPARE ai_param_last_validate_message_stmt FROM @ai_param_last_validate_message_sql; +EXECUTE ai_param_last_validate_message_stmt; +DEALLOCATE PREPARE ai_param_last_validate_message_stmt; + +SET @ai_param_last_validate_elapsed_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_param' + AND `COLUMN_NAME` = 'last_validate_elapsed_ms' +); +SET @ai_param_last_validate_elapsed_sql := IF( + @ai_param_last_validate_elapsed_exists = 0, + 'ALTER TABLE `sys_ai_param` ADD COLUMN `last_validate_elapsed_ms` bigint(20) DEFAULT NULL COMMENT ''鏈�杩戞牎楠岃�楁椂'' AFTER `last_validate_message`', + 'SELECT 1' +); +PREPARE ai_param_last_validate_elapsed_stmt FROM @ai_param_last_validate_elapsed_sql; +EXECUTE ai_param_last_validate_elapsed_stmt; +DEALLOCATE PREPARE ai_param_last_validate_elapsed_stmt; + +SET @ai_param_last_validate_time_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_param' + AND `COLUMN_NAME` = 'last_validate_time' +); +SET @ai_param_last_validate_time_sql := IF( + @ai_param_last_validate_time_exists = 0, + 'ALTER TABLE `sys_ai_param` ADD COLUMN `last_validate_time` datetime DEFAULT NULL COMMENT ''鏈�杩戞牎楠屾椂闂�'' AFTER `last_validate_elapsed_ms`', + 'SELECT 1' +); +PREPARE ai_param_last_validate_time_stmt FROM @ai_param_last_validate_time_sql; +EXECUTE ai_param_last_validate_time_stmt; +DEALLOCATE PREPARE ai_param_last_validate_time_stmt; + +UPDATE `sys_ai_param` +SET `validate_status` = 'NOT_TESTED' +WHERE `validate_status` IS NULL OR `validate_status` = ''; SET @builtin_code_exists := ( SELECT COUNT(1) @@ -118,6 +250,74 @@ EXECUTE builtin_code_stmt; DEALLOCATE PREPARE builtin_code_stmt; +SET @mcp_health_status_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_mcp_mount' + AND `COLUMN_NAME` = 'health_status' +); +SET @mcp_health_status_sql := IF( + @mcp_health_status_exists = 0, + 'ALTER TABLE `sys_ai_mcp_mount` ADD COLUMN `health_status` varchar(32) DEFAULT ''NOT_TESTED'' COMMENT ''鍋ュ悍鐘舵��'' AFTER `request_timeout_ms`', + 'SELECT 1' +); +PREPARE mcp_health_status_stmt FROM @mcp_health_status_sql; +EXECUTE mcp_health_status_stmt; +DEALLOCATE PREPARE mcp_health_status_stmt; + +SET @mcp_last_test_time_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_mcp_mount' + AND `COLUMN_NAME` = 'last_test_time' +); +SET @mcp_last_test_time_sql := IF( + @mcp_last_test_time_exists = 0, + 'ALTER TABLE `sys_ai_mcp_mount` ADD COLUMN `last_test_time` datetime DEFAULT NULL COMMENT ''鏈�杩戞祴璇曟椂闂�'' AFTER `health_status`', + 'SELECT 1' +); +PREPARE mcp_last_test_time_stmt FROM @mcp_last_test_time_sql; +EXECUTE mcp_last_test_time_stmt; +DEALLOCATE PREPARE mcp_last_test_time_stmt; + +SET @mcp_last_test_message_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_mcp_mount' + AND `COLUMN_NAME` = 'last_test_message' +); +SET @mcp_last_test_message_sql := IF( + @mcp_last_test_message_exists = 0, + 'ALTER TABLE `sys_ai_mcp_mount` ADD COLUMN `last_test_message` varchar(500) DEFAULT NULL COMMENT ''鏈�杩戞祴璇曚俊鎭�'' AFTER `last_test_time`', + 'SELECT 1' +); +PREPARE mcp_last_test_message_stmt FROM @mcp_last_test_message_sql; +EXECUTE mcp_last_test_message_stmt; +DEALLOCATE PREPARE mcp_last_test_message_stmt; + +SET @mcp_last_init_elapsed_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_mcp_mount' + AND `COLUMN_NAME` = 'last_init_elapsed_ms' +); +SET @mcp_last_init_elapsed_sql := IF( + @mcp_last_init_elapsed_exists = 0, + 'ALTER TABLE `sys_ai_mcp_mount` ADD COLUMN `last_init_elapsed_ms` bigint(20) DEFAULT NULL COMMENT ''鏈�杩戝垵濮嬪寲鑰楁椂'' AFTER `last_test_message`', + 'SELECT 1' +); +PREPARE mcp_last_init_elapsed_stmt FROM @mcp_last_init_elapsed_sql; +EXECUTE mcp_last_init_elapsed_stmt; +DEALLOCATE PREPARE mcp_last_init_elapsed_stmt; + +UPDATE `sys_ai_mcp_mount` +SET `health_status` = 'NOT_TESTED' +WHERE `health_status` IS NULL OR `health_status` = ''; + SET @chat_session_pinned_exists := ( SELECT COUNT(1) FROM `information_schema`.`COLUMNS` @@ -133,6 +333,54 @@ PREPARE chat_session_pinned_stmt FROM @chat_session_pinned_sql; EXECUTE chat_session_pinned_stmt; DEALLOCATE PREPARE chat_session_pinned_stmt; + +SET @chat_session_summary_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_chat_session' + AND `COLUMN_NAME` = 'memory_summary' +); +SET @chat_session_summary_sql := IF( + @chat_session_summary_exists = 0, + 'ALTER TABLE `sys_ai_chat_session` ADD COLUMN `memory_summary` longtext COMMENT ''璁板繂鎽樿'' AFTER `last_message_time`', + 'SELECT 1' +); +PREPARE chat_session_summary_stmt FROM @chat_session_summary_sql; +EXECUTE chat_session_summary_stmt; +DEALLOCATE PREPARE chat_session_summary_stmt; + +SET @chat_session_facts_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_chat_session' + AND `COLUMN_NAME` = 'memory_facts' +); +SET @chat_session_facts_sql := IF( + @chat_session_facts_exists = 0, + 'ALTER TABLE `sys_ai_chat_session` ADD COLUMN `memory_facts` text COMMENT ''鍏抽敭浜嬪疄'' AFTER `memory_summary`', + 'SELECT 1' +); +PREPARE chat_session_facts_stmt FROM @chat_session_facts_sql; +EXECUTE chat_session_facts_stmt; +DEALLOCATE PREPARE chat_session_facts_stmt; + +SET @chat_message_length_exists := ( + SELECT COUNT(1) + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = DATABASE() + AND `TABLE_NAME` = 'sys_ai_chat_message' + AND `COLUMN_NAME` = 'content_length' +); +SET @chat_message_length_sql := IF( + @chat_message_length_exists = 0, + 'ALTER TABLE `sys_ai_chat_message` ADD COLUMN `content_length` int(11) DEFAULT NULL COMMENT ''鍐呭闀垮害'' AFTER `content`', + 'SELECT 1' +); +PREPARE chat_message_length_stmt FROM @chat_message_length_sql; +EXECUTE chat_message_length_stmt; +DEALLOCATE PREPARE chat_message_length_stmt; BEGIN; INSERT INTO `sys_ai_prompt` @@ -199,7 +447,9 @@ (5312, 'Query AI MCP Mount', 5311, NULL, '1,5311', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiMcpMount:list', NULL, 0, NULL, 1, 1, 0, '2026-03-18 19:00:00', 2, '2026-03-18 19:00:00', 2, NULL), (5313, 'Create AI MCP Mount', 5311, NULL, '1,5311', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiMcpMount:save', NULL, 1, NULL, 1, 1, 0, '2026-03-18 19:00:00', 2, '2026-03-18 19:00:00', 2, NULL), (5314, 'Update AI MCP Mount', 5311, NULL, '1,5311', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiMcpMount:update', NULL, 2, NULL, 1, 1, 0, '2026-03-18 19:00:00', 2, '2026-03-18 19:00:00', 2, NULL), -(5315, 'Delete AI MCP Mount', 5311, NULL, '1,5311', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiMcpMount:remove', NULL, 3, NULL, 1, 1, 0, '2026-03-18 19:00:00', 2, '2026-03-18 19:00:00', 2, NULL) +(5315, 'Delete AI MCP Mount', 5311, NULL, '1,5311', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiMcpMount:remove', NULL, 3, NULL, 1, 1, 0, '2026-03-18 19:00:00', 2, '2026-03-18 19:00:00', 2, NULL), +(5316, 'menu.aiCallLog', 1, 'menu.system', '1', 'menu.system', '/system/aiCallLog', 'aiCallLog', NULL, NULL, 0, NULL, 'QueryStats', 14, NULL, 1, 1, 0, '2026-03-19 13:00:00', 2, '2026-03-19 13:00:00', 2, NULL), +(5317, 'Query AI Call Log', 5316, NULL, '1,5316', NULL, NULL, NULL, NULL, NULL, 1, 'system:aiCallLog:list', NULL, 0, NULL, 1, 1, 0, '2026-03-19 13:00:00', 2, '2026-03-19 13:00:00', 2, NULL) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `parent_id` = VALUES(`parent_id`), @@ -233,7 +483,9 @@ (5312, 1, 5312), (5313, 1, 5313), (5314, 1, 5314), -(5315, 1, 5315) +(5315, 1, 5315), +(5316, 1, 5316), +(5317, 1, 5317) ON DUPLICATE KEY UPDATE `role_id` = VALUES(`role_id`), `menu_id` = VALUES(`menu_id`); -- Gitblit v1.9.1