From 23f460d997fc7961ebad7750e30dfb2a4e9e5ace Mon Sep 17 00:00:00 2001 From: zhaojie <17108846169@qq.com> Date: Thu, 11 Sep 2025 00:01:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DAgent=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=8E=86=E5=8F=B2=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在Agent初始化时添加示例执行历史 - 添加触发示例动作和清空历史的功能 - 完善Agent执行历史的显示界面 - 添加执行历史的操作按钮(触发示例、刷新、清空) - 优化执行历史的显示格式,包括优先级、置信度、执行时间等 - 修复前端Agent数据加载逻辑 --- logs/dashboard.log | 129 +++++++++++++++++ .../agent_assistant.cpython-311.pyc | Bin 41409 -> 49604 bytes .../action_executor.cpython-311.pyc | Bin 0 -> 15910 bytes .../intelligent_agent.cpython-311.pyc | Bin 0 -> 16793 bytes .../__pycache__/llm_client.cpython-311.pyc | Bin 0 -> 15465 bytes src/agent_assistant.py | 119 ++++++++++++++++ src/web/app.py | 45 ++++++ src/web/static/js/dashboard.js | 132 +++++++++++++++++- src/web/templates/dashboard.html | 13 +- 9 files changed, 436 insertions(+), 2 deletions(-) create mode 100644 src/agent/__pycache__/action_executor.cpython-311.pyc create mode 100644 src/agent/__pycache__/intelligent_agent.cpython-311.pyc create mode 100644 src/agent/__pycache__/llm_client.cpython-311.pyc diff --git a/logs/dashboard.log b/logs/dashboard.log index a3ff5ab..4ee8fed 100644 --- a/logs/dashboard.log +++ b/logs/dashboard.log @@ -3545,3 +3545,132 @@ WHERE knowledge_entries.is_active = true AND knowledge_entries.is_verified = tru 2025-09-10 23:24:00,660 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:24:00] "GET /api/health HTTP/1.1" 200 - 2025-09-10 23:24:00,746 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:24:00] "GET /api/alerts HTTP/1.1" 200 - 2025-09-10 23:24:00,767 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:24:00] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:56:59,913 - __main__ - INFO - TSPۺϹƽ̨... +2025-09-10 23:57:01,660 - src.core.database - INFO - ݿʼɹ +2025-09-10 23:57:02,839 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:02,847 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:02,848 - src.main - INFO - TSPֳʼ +2025-09-10 23:57:02,857 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:02,866 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:02,868 - src.main - INFO - TSPֳʼ +2025-09-10 23:57:02,868 - src.agent.tool_manager - INFO - עṤ: search_knowledge +2025-09-10 23:57:02,868 - src.agent.tool_manager - INFO - עṤ: create_work_order +2025-09-10 23:57:02,868 - src.agent.tool_manager - INFO - עṤ: update_work_order +2025-09-10 23:57:02,869 - src.agent.tool_manager - INFO - עṤ: generate_response +2025-09-10 23:57:02,869 - src.agent.tool_manager - INFO - עṤ: analyze_data +2025-09-10 23:57:02,869 - src.agent.tool_manager - INFO - עṤ: send_notification +2025-09-10 23:57:02,869 - src.agent.tool_manager - INFO - עṤ: schedule_task +2025-09-10 23:57:02,869 - src.agent.tool_manager - INFO - עṤ: web_search +2025-09-10 23:57:02,870 - src.agent.tool_manager - INFO - עṤ: file_operation +2025-09-10 23:57:02,870 - src.agent.tool_manager - INFO - עṤ: database_query +2025-09-10 23:57:02,870 - src.agent.tool_manager - INFO - ע 10 ĬϹ +2025-09-10 23:57:02,870 - src.agent.agent_core - INFO - Agentijʼ +2025-09-10 23:57:03,803 - src.agent_assistant - INFO - TSP Agentֳʼ +2025-09-10 23:57:03,815 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:03,899 - werkzeug - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://192.168.26.238:5000 +2025-09-10 23:57:03,902 - werkzeug - INFO - Press CTRL+C to quit +2025-09-10 23:57:03,941 - src.knowledge_base.knowledge_manager - INFO - سɹ 48 Ŀ +2025-09-10 23:57:03,944 - src.web.websocket_server - INFO - WebSocket: ws://localhost:8765 +2025-09-10 23:57:03,949 - websockets.server - INFO - server listening on [::1]:8765 +2025-09-10 23:57:03,952 - websockets.server - INFO - server listening on 127.0.0.1:8765 +2025-09-10 23:57:04,054 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:04] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:04,311 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:04] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:09,019 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:09] "GET / HTTP/1.1" 200 - +2025-09-10 23:57:09,316 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:09] "GET /static/js/dashboard.js HTTP/1.1" 200 - +2025-09-10 23:57:10,100 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/chat/sessions HTTP/1.1" 200 - +2025-09-10 23:57:10,111 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/workorders HTTP/1.1" 200 - +2025-09-10 23:57:10,122 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/system/info HTTP/1.1" 200 - +2025-09-10 23:57:10,161 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:10,167 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/knowledge/stats HTTP/1.1" 200 - +2025-09-10 23:57:10,179 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:10,525 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:10] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:11,894 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:11] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:11,912 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:11] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:12,148 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:12] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:12,348 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:12] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:12,358 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:12] "GET /api/monitor/status HTTP/1.1" 200 - +2025-09-10 23:57:12,890 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:12] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:14,605 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:14] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:15,098 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:15] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:17,178 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:17] "GET /api/chat/sessions HTTP/1.1" 200 - +2025-09-10 23:57:17,296 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:17] "GET /api/workorders HTTP/1.1" 200 - +2025-09-10 23:57:17,311 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:17] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:17,321 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:17] "GET /api/knowledge/stats HTTP/1.1" 200 - +2025-09-10 23:57:17,984 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:17] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:57:19,622 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:19] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:57:19,887 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:19] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:20,098 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:20] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:57:24,800 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:24] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:26,267 - src.analytics.monitor_service - INFO - ط +2025-09-10 23:57:26,267 - src.main - INFO - ط +2025-09-10 23:57:26,272 - src.agent.auto_monitor - INFO - Զѭ +2025-09-10 23:57:26,273 - src.agent.auto_monitor - INFO - Զط +2025-09-10 23:57:26,273 - src.agent.auto_monitor - INFO - ִе 1 Զؼ +2025-09-10 23:57:26,273 - src.agent_assistant - INFO - +2025-09-10 23:57:26,282 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:26] "POST /api/agent/monitoring/start HTTP/1.1" 200 - +2025-09-10 23:57:26,349 - src.agent.auto_monitor - INFO - ж: alert_overflow - ԾԤ: 34 +2025-09-10 23:57:26,350 - src.agent.auto_monitor - INFO - ж¼: {"timestamp": "2025-09-10T23:57:26.350917", "action_type": "alert_overflow", "priority": "high", "description": "ԾԤ: 34", "action": "Ԥ", "data": {"alert_count": 34}} +2025-09-10 23:57:26,351 - src.agent.auto_monitor - INFO - Ԥ +2025-09-10 23:57:26,355 - src.agent.auto_monitor - ERROR - 鹤ѹʧ: 'TSPAgentAssistant' object has no attribute 'get_workorders' +2025-09-10 23:57:26,405 - src.analytics.monitor_service - INFO - 4 Ԥ +2025-09-10 23:57:26,406 - src.analytics.monitor_service - WARNING - Ԥ: ûȽϵ: 0.00 (ֵ: 0.6) +2025-09-10 23:57:26,407 - src.analytics.monitor_service - INFO - ֪ͨ: {'level': '', 'message': 'ûȽϵ: 0.00 (ֵ: 0.6)', 'timestamp': '2025-09-10T23:57:26.283431', 'rule_name': 'Ԥ'} +2025-09-10 23:57:26,408 - src.analytics.monitor_service - WARNING - Ԥ: ûȽϵ: 0.00 (ֵ: 0.6) +2025-09-10 23:57:26,408 - src.analytics.monitor_service - WARNING - Ԥ: ֪ʶʽϵ: 0.00 (ֵ: 0.5) +2025-09-10 23:57:26,409 - src.analytics.monitor_service - INFO - ֪ͨ: {'level': '', 'message': '֪ʶʽϵ: 0.00 (ֵ: 0.5)', 'timestamp': '2025-09-10T23:57:26.329923', 'rule_name': '֪ʶԤ'} +2025-09-10 23:57:26,410 - src.analytics.monitor_service - WARNING - Ԥ: ֪ʶʽϵ: 0.00 (ֵ: 0.5) +2025-09-10 23:57:26,410 - src.analytics.monitor_service - WARNING - Ԥ: ϵͳڴʹʹ: 117.4% (ֵ: 80.0%) +2025-09-10 23:57:26,411 - src.analytics.monitor_service - INFO - ֪ͨ: {'level': '', 'message': 'ϵͳڴʹʹ: 117.4% (ֵ: 80.0%)', 'timestamp': '2025-09-10T23:57:26.388919', 'rule_name': 'ڴʹԤ'} +2025-09-10 23:57:26,411 - src.analytics.monitor_service - WARNING - Ԥ: ϵͳڴʹʹ: 117.4% (ֵ: 80.0%) +2025-09-10 23:57:26,411 - src.analytics.monitor_service - WARNING - Ԥ: ûԻжʹ: 0.50 (ֵ: 0.3) +2025-09-10 23:57:26,411 - src.analytics.monitor_service - INFO - ֪ͨ: {'level': '', 'message': 'ûԻжʹ: 0.50 (ֵ: 0.3)', 'timestamp': '2025-09-10T23:57:26.402919', 'rule_name': 'ԻжԤ'} +2025-09-10 23:57:26,412 - src.analytics.monitor_service - WARNING - Ԥ: ûԻжʹ: 0.50 (ֵ: 0.3) +2025-09-10 23:57:27,966 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:27] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:30,102 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:30] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:30,120 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:30] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:31,610 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:31] "GET /api/knowledge?page=1&per_page=10 HTTP/1.1" 200 - +2025-09-10 23:57:32,949 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:32] "GET /api/workorders HTTP/1.1" 200 - +2025-09-10 23:57:33,609 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:33] "GET /api/analytics HTTP/1.1" 200 - +2025-09-10 23:57:33,932 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:33] "GET /api/analytics?timeRange=30&dimension=workorders HTTP/1.1" 200 - +2025-09-10 23:57:34,811 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:34] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:40,111 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:40] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:43,207 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:43] "GET /api/settings HTTP/1.1" 200 - +2025-09-10 23:57:45,104 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:45] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:49,794 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:49] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:57:51,290 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:51] "GET /api/chat/sessions HTTP/1.1" 200 - +2025-09-10 23:57:51,293 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:51] "GET /api/workorders HTTP/1.1" 200 - +2025-09-10 23:57:51,302 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:51] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:51,309 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:51] "GET /api/knowledge/stats HTTP/1.1" 200 - +2025-09-10 23:57:53,387 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:53] "GET /api/alerts HTTP/1.1" 200 - +2025-09-10 23:57:54,653 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:54] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:57:54,931 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:57:54] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:00,088 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:00] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:00,383 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:00] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:00,412 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:00] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:05,394 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:05] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:10,093 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:10] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:10,395 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:10] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:15,410 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:15] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:20,083 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:20] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:20,388 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:20] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:25,387 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:25] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:30,087 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:30] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:30,388 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:30] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:35,407 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:35] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:40,090 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:40] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:40,391 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:40] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:45,402 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:45] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:49,799 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:49] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:58:50,097 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:50] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:58:50,332 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:50] "POST /api/agent/proactive-monitoring HTTP/1.1" 200 - +2025-09-10 23:58:55,106 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:58:55] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:59:00,118 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:00] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:59:00,394 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:00] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:59:00,435 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:00] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:59:05,396 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:05] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:59:10,098 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:10] "GET /api/health HTTP/1.1" 200 - +2025-09-10 23:59:10,392 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:10] "GET /api/agent/status HTTP/1.1" 200 - +2025-09-10 23:59:15,406 - werkzeug - INFO - 127.0.0.1 - - [10/Sep/2025 23:59:15] "GET /api/health HTTP/1.1" 200 - diff --git a/src/__pycache__/agent_assistant.cpython-311.pyc b/src/__pycache__/agent_assistant.cpython-311.pyc index 2c497373d24cfe9dd5a11669ed79fca3729b9e83..d67c1764cef143ee1591769976dbdcd92b7d4acb 100644 GIT binary patch delta 12805 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 atPY<|{}OAm%D-NYu-8H+&$r2N-2WH%wHOQl delta 6343 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 diff --git a/src/agent/__pycache__/action_executor.cpython-311.pyc b/src/agent/__pycache__/action_executor.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5d36184a45e4a69238b54d9ee9ebe992c91a593 GIT binary patch literal 15910 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 literal 0 HcmV?d00001 diff --git a/src/agent/__pycache__/intelligent_agent.cpython-311.pyc b/src/agent/__pycache__/intelligent_agent.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9171594d759a7fda7287c0032e87692587986c0a GIT binary patch literal 16793 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 literal 0 HcmV?d00001 diff --git a/src/agent/__pycache__/llm_client.cpython-311.pyc b/src/agent/__pycache__/llm_client.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d441f10b72e50da148fbe98e3fedd6ce84edb62c GIT binary patch literal 15465 zcmeHOYj6`+mhM(}>)EowBF0ZJ#xWxd24i3dj|AJ0A^4F@k)$RX60MLLFvynEEf3%^ zS%;8}H;{zdVG}kXgR(=2*)WMym8r1F%p}17t(L2+P<1V}RBdd?pIx&iRaE}$o^!9% z>ehomUYo7mtEvb~_K7I4TZlRuG{ta(3K}aWNHn9xz8WUjx zOoWZtqHKUAS6jeFu3UhFD;MSagn-az57_%00Y{%R;AF8rA9eM)1MWUgz(ekZsMzNX zcv;5ANbH`H%#TT>XW&=fg)a?(S(4Yr{EUg%4>J+R85@+rmxeQNc{g*z1ZIipPc&q{K&P}4|jESPrdy1 zgcnRr(eJJ&Pzs{saKAD{+Bl<|Lz6%7x<1neqQG{^@ig**VcbPcRoB2 z?~V0`qB`HztHk{_$Zqe@OF}!8xEu<{`=t2pSj5lju1F{z3P(eV5~f2%X=dbRqHzBj zBQY@7Ou+US%w&L*cu9!Z)A zJK&K-xbx6HU~EL)1#jLF>)+YCYtRM#z}*+mzjW=-@9E9~IrgjGh$QQd&_Hi+uXLbC zckT!&QgBd?4taMC#Fw@HG@70~bV1KAj3I=s|FbHi2qnH+h!KVj9(R7I;7>vZikj=p;>ZQS8sJ}lJ z58+5F!Jv#xEaPgCOOeb1q6<5tu~1x|jcKm8KYo^(fh6DIBnZ<1vli-)Z&&2-_RuZ~QqgE%FdXfLWb?oQ*#n&rf;}sJKt@cT ztGsXI;Z(`&k?xW1XS-A0StDH|UC(x<=GBjE8QpzMIohZ4^$?SMeQI{y$mY>jm9K-C z4?2wCLrXNU_Z79=3Y%tNB zB<$oP{9!(4@!BOmA^-z9B>`&KvTT%1rQ6!`+PWeRU>v9JZ3kXJ<{_grSO(7kcgEtH zJoWLl4?fZDz(sunaosLUzzh9hL!3Z$6gx-YJA=}&6K+A=vCy~eOA#`z9X~ZSdTi>| z-%Oo6*CSU!&RI_96)Cz?o)0&=eeb@Iyh~AV@zmAT$u*eigvmp;lZMJIkJp^Zp9i&O zyg;tQXM~xyGcNBaPX<_b_DPBY)34mcQ%=7BPuJgnlRhhbNzYjklYKz`h!$TZr`+A;H=1@w;UlQrU-O4w8G2IFXbiX+(l7Ama$gO-OK*D6`;b$oR5^ zV2{ePK(cI`A}n`R@J-unf;X{knt{u>LM~ZygJbM-4nIZeOgkY>Yp)#R$F_|x9Q(z& z5^dp6N%had*;XWFX^NebT>5nQU=~(3cD<8OVr6AuWPYbD!X4%V0h)1 zJ0RB?aY`uV9FS9(m1$iU)b*I!y5U~D!?qr%>y3!OoL*ggctGlJdnnEKD12y!!TP#A zOa!WhjgawiqGq;|Hymb%nINQSh%j(x?83uL!n{l}l^E+HhJBsc#++q)&T?`y)PY|m zD-onk_U-HTtBwk}&RFPp0vcqh`Tn|cV7-seuFTMv`l3>Zj zK1n#oSvPwazzh>Hxa}`w;wVMZp#hd6%fxZdNQVTjq`VN}tqKtgvd!G{6Qu8b%zo|( zW*_SpzQi>;Ir`@0J4YsuzG`rQjIYt-x5+4J$WAr56jEtE`S`a}C;xHsy}!Bs`{)1T zPe&)mU-Fb{YHnGGD-#AMX8Ok~v@*DG z4+>`zBEazx+ezClcG#8xWhg&HI7>@|H*ksmA+;h?)fwPtuBF;#~N$VCD+3b>ii(+d1q}pFUO*i?f^*~2PKZE zheR(t%Ts+3MO!wvhpgDa3dp4Ep|0(bhpvx52g`Eu^as~Je0y!3e->S9WkIF4Z!iiv zMo^ZN0Z>LIvia(sFlahaiRh;wjAaR`(AA2Ap>w+=(__Gs?T+<^B}I3nwGO!*Yq>V> z4@(41$m{W5kZ?_(73dO1#fRt=x-;|JIx8v2a-agGMLW?9a-@1j{lPw!`LGD6`g66^ zcl6iO4C`u5`Q~2sEuQc#9$TICtL?}mcf1t)*0)h^X)@4H;PaiVr3Yy-#l zYUPVk3;p9e)v65`EALO$)Sue=`qsq3@yLgJwbk9pnjWpDCsn=R)Y{kACZgk;KJ3(1 zZcSEqYSo?7E@oaEdxH_?ft&y`%?K66$>^48k(pDY`4%SHG+(3UYu0?LRdMyLE2R}E zPFk}BWlGnJU25e|$J>BFOp0qXag8djDfE8uislHy<`znwR+KuZp(NT%+LtjGm$^Gu zaTo7v=~&KPTFgTF(sBVPQSb`OpX)y|`2)&EG06dHh)H7It=xgV(bT$_+~M-%4qrs> z2;Y<3v4010hfm8Lay7{vhrAe9CE`yaVB`)+rR7O2B-8Sw162ItLZu`tR1gbLZGJO$ z`5+S1-l*968K$zowFPeurLJq4|~x&azx)FL?@EAyyn=u9mJ$tR8C^YaMGiy<63WL0g0$wnc=9J?GsWpg%bHOB-Cb*MdP{%mbZ8?gYt1Mj6L%axEZQ0GCsHzc0dJXB@h^!6>HVG z?Z@^fY{!Qa4{39o)w#`|*+#`w=?2*8R*rX!uhbgXsHGdy(Yb*PTF=>%f{-2+EO`|Y zRLF~idz?ZUpEDQcBeal_;6hiXfQ%TQ6knxZMJ%EYNF#oC=AL2Fh~L00pw1OWUWF0A(Q_{1m)F2=r13pVaQGmOnK3MrcZlwt zx+|2Kd%c7Je4`H&#z%NBuS0^WySxEN2G0|TgnW?E`w5<}F?z{NkO|VqptiCf2ts-X zLi!pt6H`?SFITOYs9KRh_0t?v-FkzuA({u0f#$cqwBH8JcPGUjP3%#{p4*^#|5D}; zO>H&Yg=!XP5j2mw=n?qN{LA;IO($>#%}cDtz4s=F_^u8YF$F`y1WV7VzYv(bhhVqsG{?6X@5LNjh4Hh zBv)Z>guHxVn1R_t*rFm|Z~j`C-Ez5h%|z`Q17jD&&qefT3m!*|ecv~R*iEX~bUS># zcKm6zaxKK9xK0z-sp7hChOhbddzp*(x;vVE&Jr$?S430;kh!{t>8qr)yr`iIuk^ zAzLgWXZhzqa+f^8$a9QGNN=x*4RD)Mz_}vVs`j-o`P(e_$_3xu8ZU&8A2<&-vEz zDA1S|0~zN4LHTiAl@CW`Kh#9n^JH%~4s|!J^LCU`e(7KL-)^!xL0wT2u zW&)tKjV*v$+gJ))+gQY{#VG}^H~@vg>t8|1_j(ZS1~ZdKFX@VfLs6?62RK|zo*Xwj zbNqPl=UnUa8t`)rhN}qtM0)^{D`&`%x|ldzGokRoQzYj=5RQStDhEf(D5KH=ROg=@ zWG#IagcERp%oaNI0$|AflcOl(V42Q{VGbBX)i-~ZjOv36Z(p7{ z(gHU&ddkH2_V0|*Ja{3#;Ne8&t|LDn;<5|&6>DbEfk3{mczzqjhzF(dZ=n1^E-Fj zEN-l}&BI;r2#_oSFL5RbysU>r#`)-W7Flw`uvOUgS;j8$Ao#S#U)`SKxZy{dzs zDQpE?1Bxv!QxLxkOnk_e8$;+a>0yJ5y^6Wn(9{o0Iv4cpCk(l2N9 zYap>g{l-1?{gA?XG>uCBrf~>7j>w=-j=nMZ$;Xx*`aWnc?*O6;QQXo8k%2!y{}Od) zPJ1|KyqLk8!7ig|6f5ro7Xvh+6K#wzy6%1)I*^Dvk)I{=slcQ$X(vlB^=(Ldm<`R# z<%?!Z`9)}`{4EgTZ7G%=ec-aEZo*TS^wevf`o!)DPqXT2zT%souqSnFVRNpFMZZ5Z=Rcw1F(>lI&p0vr?;Yre&*xH!L>W5T;k^)9>OTaai>`uv*D zuZsT3vKqCv^L*or%xos-F6tg#?8zf=h6`H%xuEsRu9u6L}w!9O)oq z9+FSttKhboD;=&1v!`t?p_@I?i+XD}JJwCFW{NJ8Wrw%Zisk~krtt>~ujyYwiFHj| zy(T5}nZ(r%?z{m<1RZ}}k{xnPCv&FrI$GBWb=}YoYkJHz!5b5ODa8m?A>Aj0f5}c__M+4v`>F1~s!O!U>aquCJg6q!HgOU6rJXyY8D_@V^ zl~?D@Pu0|>s%xele2sgW0W!*K&I*-8$_MkI7r73I1wPv$;|P3bR>M-I3XRo^EyC`% z?Ke$$#5M%B-Y|f0d@LJEPF&<9WIf)7*_~`JGi*D}zRZHh7-#a_Fv+S2Z|ys7mZdr8 zHs)U)rfM}>_R;~=>NN)~axfxT`?fxJ+^}c?%itK~g-8*L)ge^7!I#XWb~}iYCl5m( zU*K5u$OnPS&j2BsAF?)aOV4P~euwI8@~=SB z${@I2mZij58l2PAE>*>5h?>|uz91>K(z~SCoT_a(@hG}!wTw5awH*-8KS;0Y+>V?$ zx`p<3;we>J0#Or}{E-{q@`3k5FL*-Gyrj4!<*Ocjm@4UV_G)Xsp5-h|JHL+>z z=_L9{;9XK|GTbYckNsS&Tn;fQwrFCDDz>D=*+gS^Kv$5M!9$0`ZL{0TnG5Ca_6qJo zU2D6KyXX@jov-5lKYM={?7bNI6xmyT7Dxg1rvGOs$lguZ>=2SWHI|l|_4$B+Emg1$ETIf zzg*fdQQD9!ZPZE|RcB*bU-A~xm#BtB+*t5@vEbiRaPOCYgCs|P8p1pz{|sN{ED*E) zRIc*na9l08(Srppxunc3lp&Ua3t}m_WlM|YtAJ^0g?C&xD2z}%bJqG#CkELv|1(_?)%NXboe`7m3-0xr)d$DX`_xi_;#E4^$tbY7U= YAo(}VrSlqDV8MKH1M_YcC?IV4-+*CtPyhe` literal 0 HcmV?d00001 diff --git a/src/agent_assistant.py b/src/agent_assistant.py index 51d4894..a63216c 100644 --- a/src/agent_assistant.py +++ b/src/agent_assistant.py @@ -56,6 +56,9 @@ class TSPAgentAssistant(TSPAssistant): self.proactive_tasks = [] self.agent_memory = {} + # 添加一些示例执行历史(用于演示) + self._add_sample_execution_history() + logger.info("TSP Agent助手初始化完成") async def process_message_agent( @@ -931,6 +934,122 @@ class TSPAgentAssistant(TSPAssistant): logger.error(f"Agent增强知识库失败: {e}") return {"success": False, "error": str(e)} + def _add_sample_execution_history(self): + """添加示例执行历史""" + try: + from src.agent.intelligent_agent import AgentAction, ActionType + + # 添加一些示例执行记录 + sample_actions = [ + AgentAction( + action_type=ActionType.ALERT_RESPONSE, + description="处理CPU使用率过高预警", + priority=5, + confidence=0.9, + parameters={"service": "main_service", "cpu_usage": "95%"}, + estimated_time=30 + ), + AgentAction( + action_type=ActionType.KNOWLEDGE_UPDATE, + description="更新低置信度知识条目", + priority=3, + confidence=0.7, + parameters={"question": "如何重启服务", "enhanced_answer": "使用systemctl restart命令重启服务"}, + estimated_time=60 + ), + AgentAction( + action_type=ActionType.WORKORDER_CREATE, + description="自动创建系统维护工单", + priority=4, + confidence=0.8, + parameters={"title": "系统性能优化", "category": "系统维护"}, + estimated_time=120 + ), + AgentAction( + action_type=ActionType.SYSTEM_OPTIMIZE, + description="执行内存优化", + priority=3, + confidence=0.6, + parameters={"type": "memory", "target": "cache_cleanup"}, + estimated_time=300 + ), + AgentAction( + action_type=ActionType.USER_NOTIFY, + description="通知管理员系统状态", + priority=2, + confidence=0.5, + parameters={"user_id": "admin", "message": "系统运行正常"}, + estimated_time=10 + ) + ] + + # 模拟执行这些动作并记录历史 + for i, action in enumerate(sample_actions): + execution_record = { + "action_id": f"{action.action_type.value}_{i+1}", + "action_type": action.action_type.value, + "description": action.description, + "priority": action.priority, + "confidence": action.confidence, + "start_time": (datetime.now().timestamp() - (len(sample_actions) - i) * 3600), # 模拟过去的时间 + "end_time": (datetime.now().timestamp() - (len(sample_actions) - i) * 3600) + action.estimated_time, + "success": True, + "result": { + "success": True, + "message": f"{action.description}执行成功", + "execution_time": action.estimated_time + } + } + self.action_executor.execution_history.append(execution_record) + + logger.info(f"已添加 {len(sample_actions)} 条示例执行历史") + + except Exception as e: + logger.error(f"添加示例执行历史失败: {e}") + + async def trigger_sample_actions(self) -> Dict[str, Any]: + """触发示例动作,用于演示Agent功能""" + try: + from src.agent.intelligent_agent import AgentAction, ActionType + + # 创建示例动作 + sample_action = AgentAction( + action_type=ActionType.ALERT_RESPONSE, + description="演示:处理系统预警", + priority=4, + confidence=0.8, + parameters={"alert_type": "demo", "severity": "medium"}, + estimated_time=15 + ) + + # 执行动作 + result = await self.action_executor.execute_action(sample_action) + + return { + "success": True, + "message": "示例动作已执行", + "action": sample_action.description, + "result": result, + "execution_history_count": len(self.action_executor.execution_history) + } + + except Exception as e: + logger.error(f"触发示例动作失败: {e}") + return {"success": False, "error": str(e)} + + def clear_execution_history(self) -> Dict[str, Any]: + """清空执行历史""" + try: + count = len(self.action_executor.execution_history) + self.action_executor.execution_history.clear() + return { + "success": True, + "message": f"已清空 {count} 条执行历史" + } + except Exception as e: + logger.error(f"清空执行历史失败: {e}") + return {"success": False, "error": str(e)} + def _parse_knowledge_manually(self, content: str) -> List[Dict[str, Any]]: """手动解析知识内容""" try: diff --git a/src/web/app.py b/src/web/app.py index 3552e98..43297ca 100644 --- a/src/web/app.py +++ b/src/web/app.py @@ -344,6 +344,51 @@ def get_agent_status(): except Exception as e: return jsonify({"error": str(e)}), 500 +@app.route('/api/agent/action-history') +def get_agent_action_history(): + """获取Agent动作执行历史""" + try: + limit = request.args.get('limit', 50, type=int) + history = agent_assistant.get_action_history(limit) + return jsonify({ + "success": True, + "history": history, + "count": len(history) + }) + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agent/trigger-sample', methods=['POST']) +def trigger_sample_action(): + """触发示例动作""" + try: + import asyncio + result = asyncio.run(agent_assistant.trigger_sample_actions()) + return jsonify(result) + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agent/clear-history', methods=['POST']) +def clear_agent_history(): + """清空Agent执行历史""" + try: + result = agent_assistant.clear_execution_history() + return jsonify(result) + except Exception as e: + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agent/llm-stats') +def get_llm_stats(): + """获取LLM使用统计""" + try: + stats = agent_assistant.get_llm_usage_stats() + return jsonify({ + "success": True, + "stats": stats + }) + except Exception as e: + return jsonify({"error": str(e)}), 500 + @app.route('/api/agent/toggle', methods=['POST']) def toggle_agent_mode(): """切换Agent模式""" diff --git a/src/web/static/js/dashboard.js b/src/web/static/js/dashboard.js index 8818208..460b726 100644 --- a/src/web/static/js/dashboard.js +++ b/src/web/static/js/dashboard.js @@ -615,7 +615,7 @@ class TSPDashboard { this.updateToolsList(data.tools || []); // 更新执行历史 - this.updateExecutionHistory(data.execution_history || []); + this.updateAgentExecutionHistory(data.execution_history || []); } } catch (error) { console.error('加载Agent数据失败:', error); @@ -2009,6 +2009,136 @@ class TSPDashboard { window.print(); } + // Agent执行历史相关功能 + async refreshAgentHistory() { + try { + const response = await fetch('/api/agent/action-history?limit=20'); + const data = await response.json(); + + if (data.success) { + this.updateAgentExecutionHistory(data.history); + this.showNotification(`已加载 ${data.count} 条执行历史`, 'success'); + } else { + throw new Error(data.error || '获取执行历史失败'); + } + } catch (error) { + console.error('刷新Agent历史失败:', error); + this.showNotification('刷新Agent历史失败: ' + error.message, 'error'); + } + } + + async triggerSampleAction() { + try { + const response = await fetch('/api/agent/trigger-sample', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + } + }); + const data = await response.json(); + + if (data.success) { + this.showNotification(data.message, 'success'); + // 刷新执行历史 + await this.refreshAgentHistory(); + } else { + throw new Error(data.error || '触发示例动作失败'); + } + } catch (error) { + console.error('触发示例动作失败:', error); + this.showNotification('触发示例动作失败: ' + error.message, 'error'); + } + } + + async clearAgentHistory() { + if (!confirm('确定要清空Agent执行历史吗?此操作不可恢复。')) { + return; + } + + try { + const response = await fetch('/api/agent/clear-history', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + } + }); + const data = await response.json(); + + if (data.success) { + this.showNotification(data.message, 'success'); + // 清空显示 + this.updateAgentExecutionHistory([]); + } else { + throw new Error(data.error || '清空历史失败'); + } + } catch (error) { + console.error('清空Agent历史失败:', error); + this.showNotification('清空Agent历史失败: ' + error.message, 'error'); + } + } + + updateAgentExecutionHistory(history) { + const container = document.getElementById('agent-execution-history'); + + if (!history || history.length === 0) { + container.innerHTML = ` +
+ +

暂无执行历史

+
+ `; + return; + } + + const historyHtml = history.map(record => { + const startTime = new Date(record.start_time * 1000).toLocaleString(); + const endTime = new Date(record.end_time * 1000).toLocaleString(); + const duration = Math.round((record.end_time - record.start_time) * 100) / 100; + + const priorityColor = { + 5: 'danger', + 4: 'warning', + 3: 'info', + 2: 'secondary', + 1: 'light' + }[record.priority] || 'secondary'; + + const confidenceColor = record.confidence >= 0.8 ? 'success' : + record.confidence >= 0.5 ? 'warning' : 'danger'; + + return ` +
+
+
+
+
${record.description}
+
+ 优先级 ${record.priority} + 置信度 ${(record.confidence * 100).toFixed(0)}% + ${record.success ? '成功' : '失败'} +
+ + 开始: ${startTime} | + 耗时: ${duration}秒 + +
+
+ ${record.action_type} +
+
+ ${record.result && record.result.message ? ` +
+ 结果: ${record.result.message} +
+ ` : ''} +
+
+ `; + }).join(''); + + container.innerHTML = historyHtml; + } + // 更新分析报告 updateAnalyticsReport(data) { const reportContainer = document.getElementById('analytics-report'); diff --git a/src/web/templates/dashboard.html b/src/web/templates/dashboard.html index 27d7ab1..6febed6 100644 --- a/src/web/templates/dashboard.html +++ b/src/web/templates/dashboard.html @@ -667,8 +667,19 @@
-
+
Agent执行历史
+
+ + + +