mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-13 12:32:28 +08:00
show fancier stats
This commit is contained in:
parent
1ca98e2fc2
commit
51c83bbbc8
@ -201,7 +201,10 @@ export default class AiSettingsWidget extends OptionsWidget {
|
|||||||
<div><strong>${t("ai_llm.queued_notes")}:</strong> <span class="embedding-queued-notes">-</span></div>
|
<div><strong>${t("ai_llm.queued_notes")}:</strong> <span class="embedding-queued-notes">-</span></div>
|
||||||
<div><strong>${t("ai_llm.failed_notes")}:</strong> <span class="embedding-failed-notes">-</span></div>
|
<div><strong>${t("ai_llm.failed_notes")}:</strong> <span class="embedding-failed-notes">-</span></div>
|
||||||
<div><strong>${t("ai_llm.last_processed")}:</strong> <span class="embedding-last-processed">-</span></div>
|
<div><strong>${t("ai_llm.last_processed")}:</strong> <span class="embedding-last-processed">-</span></div>
|
||||||
<div class="progress mt-2" style="height: 10px;">
|
<div class="mt-2">
|
||||||
|
<strong>${t("ai_llm.progress")}:</strong> <span class="embedding-status-text">-</span>
|
||||||
|
</div>
|
||||||
|
<div class="progress mt-1" style="height: 10px;">
|
||||||
<div class="progress-bar embedding-progress" role="progressbar" style="width: 0%;"
|
<div class="progress-bar embedding-progress" role="progressbar" style="width: 0%;"
|
||||||
aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>
|
aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">0%</div>
|
||||||
</div>
|
</div>
|
||||||
@ -456,6 +459,30 @@ export default class AiSettingsWidget extends OptionsWidget {
|
|||||||
$progressBar.css('width', `${stats.percentComplete}%`);
|
$progressBar.css('width', `${stats.percentComplete}%`);
|
||||||
$progressBar.attr('aria-valuenow', stats.percentComplete.toString());
|
$progressBar.attr('aria-valuenow', stats.percentComplete.toString());
|
||||||
$progressBar.text(`${stats.percentComplete}%`);
|
$progressBar.text(`${stats.percentComplete}%`);
|
||||||
|
|
||||||
|
// Update status text based on state
|
||||||
|
const $statusText = this.$widget.find('.embedding-status-text');
|
||||||
|
if (stats.queuedNotesCount > 0) {
|
||||||
|
$statusText.text(t("ai_llm.processing", { percentage: stats.percentComplete }));
|
||||||
|
} else if (stats.percentComplete < 100) {
|
||||||
|
$statusText.text(t("ai_llm.incomplete", { percentage: stats.percentComplete }));
|
||||||
|
} else {
|
||||||
|
$statusText.text(t("ai_llm.complete"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change progress bar color based on state
|
||||||
|
if (stats.queuedNotesCount > 0) {
|
||||||
|
// Processing in progress - use animated progress bar
|
||||||
|
$progressBar.addClass('progress-bar-striped progress-bar-animated bg-info');
|
||||||
|
$progressBar.removeClass('bg-success');
|
||||||
|
} else if (stats.percentComplete < 100) {
|
||||||
|
// Incomplete - use standard progress bar
|
||||||
|
$progressBar.removeClass('progress-bar-striped progress-bar-animated bg-info bg-success');
|
||||||
|
} else {
|
||||||
|
// Complete - show success color
|
||||||
|
$progressBar.removeClass('progress-bar-striped progress-bar-animated bg-info');
|
||||||
|
$progressBar.addClass('bg-success');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error fetching embedding stats:", error);
|
console.error("Error fetching embedding stats:", error);
|
||||||
|
@ -1174,6 +1174,10 @@
|
|||||||
"failed_notes": "Failed Notes",
|
"failed_notes": "Failed Notes",
|
||||||
"last_processed": "Last Processed",
|
"last_processed": "Last Processed",
|
||||||
"never": "Never",
|
"never": "Never",
|
||||||
|
"progress": "Progress",
|
||||||
|
"processing": "Processing ({{percentage}}%)",
|
||||||
|
"incomplete": "Incomplete ({{percentage}}%)",
|
||||||
|
"complete": "Complete (100%)",
|
||||||
"refresh_stats": "Refresh Stats",
|
"refresh_stats": "Refresh Stats",
|
||||||
"refreshing": "Refreshing...",
|
"refreshing": "Refreshing...",
|
||||||
"stats_error": "Error fetching embedding statistics",
|
"stats_error": "Error fetching embedding statistics",
|
||||||
|
@ -496,13 +496,32 @@ export async function getEmbeddingStats() {
|
|||||||
"SELECT utcDateCreated FROM note_embeddings ORDER BY utcDateCreated DESC LIMIT 1"
|
"SELECT utcDateCreated FROM note_embeddings ORDER BY utcDateCreated DESC LIMIT 1"
|
||||||
) as string | null || null;
|
) as string | null || null;
|
||||||
|
|
||||||
|
// Calculate the actual completion percentage
|
||||||
|
// When reprocessing, we need to consider notes in the queue as not completed yet
|
||||||
|
// We calculate the percentage of notes that are embedded and NOT in the queue
|
||||||
|
|
||||||
|
// First, get the count of notes that are both in the embeddings table and queue
|
||||||
|
const notesInQueueWithEmbeddings = await sql.getValue(`
|
||||||
|
SELECT COUNT(DISTINCT eq.noteId)
|
||||||
|
FROM embedding_queue eq
|
||||||
|
JOIN note_embeddings ne ON eq.noteId = ne.noteId
|
||||||
|
`) as number;
|
||||||
|
|
||||||
|
// The number of notes with valid, up-to-date embeddings
|
||||||
|
const upToDateEmbeddings = embeddedNotesCount - notesInQueueWithEmbeddings;
|
||||||
|
|
||||||
|
// Calculate the percentage of notes that are properly embedded
|
||||||
|
const percentComplete = totalNotesCount > 0
|
||||||
|
? Math.round((upToDateEmbeddings / totalNotesCount) * 100)
|
||||||
|
: 0;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
totalNotesCount,
|
totalNotesCount,
|
||||||
embeddedNotesCount,
|
embeddedNotesCount,
|
||||||
queuedNotesCount,
|
queuedNotesCount,
|
||||||
failedNotesCount,
|
failedNotesCount,
|
||||||
lastProcessedDate,
|
lastProcessedDate,
|
||||||
percentComplete: totalNotesCount > 0 ? Math.round((embeddedNotesCount / totalNotesCount) * 100) : 0
|
percentComplete: Math.max(0, Math.min(100, percentComplete)) // Ensure between 0-100
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user