马一丁

Add automatic refresh functionality to GraphRAG

... ... @@ -1858,6 +1858,9 @@
let graphPanelTaskId = null;
let graphPanelState = 'idle';
let graphPanelLoading = false;
let graphPanelPollingTimer = null;
let graphPanelPollingTaskId = null;
const GRAPH_PANEL_POLL_INTERVAL = 4000;
let configAutoRefreshTimer = null;
let systemStarted = false;
let systemStarting = false;
... ... @@ -5156,6 +5159,8 @@ function getConsoleContainer() {
const target = graphPanelTaskId || (lastCompletedReportTask ? lastCompletedReportTask.task_id : null);
const url = target ? `/graph-viewer/${target}` : '/graph-viewer';
window.open(url, '_blank');
// 用户手动查看时也可尝试拉取最新数据
refreshGraphPanel(target || graphPanelTaskId, true);
});
}
... ... @@ -5224,6 +5229,9 @@ function getConsoleContainer() {
if (message) {
setGraphPanelPlaceholder(message, state === 'error' ? 'error' : '');
}
if (state === 'ready' || state === 'error') {
stopGraphPanelPolling();
}
}
function setGraphPanelPlaceholder(message, type = '') {
... ... @@ -5421,6 +5429,25 @@ function getConsoleContainer() {
hideGraphDetail();
}
function startGraphPanelPolling(taskId) {
stopGraphPanelPolling();
graphPanelPollingTaskId = taskId || graphPanelTaskId || (lastCompletedReportTask ? lastCompletedReportTask.task_id : null);
if (!graphPanelPollingTaskId) {
return;
}
const poll = () => refreshGraphPanel(graphPanelPollingTaskId, true);
poll();
graphPanelPollingTimer = setInterval(poll, GRAPH_PANEL_POLL_INTERVAL);
}
function stopGraphPanelPolling() {
if (graphPanelPollingTimer) {
clearInterval(graphPanelPollingTimer);
graphPanelPollingTimer = null;
}
graphPanelPollingTaskId = null;
}
async function fetchGraphData(taskId = null) {
const url = taskId ? `/api/graph/${taskId}` : '/api/graph/latest';
try {
... ... @@ -5493,6 +5520,7 @@ function getConsoleContainer() {
updateGraphStats({ nodes: [], edges: [] });
setGraphPanelState('loading', '报告生成中,知识图谱生成后自动刷新');
setGraphPanelPlaceholder('正在生成知识图谱...');
startGraphPanelPolling(graphPanelTaskId);
});
}
... ... @@ -5927,6 +5955,7 @@ function getConsoleContainer() {
updateTaskProgressStatus(null, 'error', '启动失败: ' + data.error);
// 重置标志允许重新尝试
autoGenerateTriggered = false;
stopGraphPanelPolling();
reportTaskId = null;
setGenerateButtonState(false);
appendReportStreamLine('任务启动失败: ' + (data.error || '未知错误'), 'error');
... ... @@ -5939,6 +5968,7 @@ function getConsoleContainer() {
updateTaskProgressStatus(null, 'error', '生成报告失败: ' + error.message);
// 重置标志允许重新尝试
autoGenerateTriggered = false;
stopGraphPanelPolling();
reportTaskId = null;
setGenerateButtonState(false);
appendReportStreamLine('任务启动阶段异常: ' + error.message, 'error');
... ... @@ -5985,6 +6015,7 @@ function getConsoleContainer() {
showMessage('报告生成完成!', 'success');
graphPanelTaskId = data.task.task_id;
refreshGraphPanel(data.task.task_id, true);
stopGraphPanelPolling();
// 自动显示报告
viewReport(taskId);
... ... @@ -5997,6 +6028,7 @@ function getConsoleContainer() {
} else if (data.task.status === 'error') {
stopProgressPolling();
showMessage('报告生成失败: ' + data.task.error_message, 'error');
stopGraphPanelPolling();
// 重置自动生成标志,允许重新尝试
autoGenerateTriggered = false;
... ... @@ -6356,6 +6388,7 @@ function getConsoleContainer() {
case 'completed':
appendReportStreamLine(payload.message || '任务完成', 'success');
stopProgressPolling();
stopGraphPanelPolling();
// 【修复】任务完成前强制刷新最后一次日志,确保所有日志都被读取
if (reportLogManager && reportLogManager.isRunning) {
... ... @@ -6383,6 +6416,7 @@ function getConsoleContainer() {
case 'cancelled':
appendReportStreamLine(payload.message || '任务已取消', 'warn');
stopProgressPolling();
stopGraphPanelPolling();
safeCloseReportStream();
updateReportStreamStatus('idle');
reportTaskId = null;
... ... @@ -6391,6 +6425,7 @@ function getConsoleContainer() {
case 'error':
appendReportStreamLine(payload.message || '任务失败', 'error', { badge: 'ERROR' });
stopProgressPolling();
stopGraphPanelPolling();
safeCloseReportStream();
updateReportStreamStatus('error');
reportTaskId = null;
... ...