Notes/apps/server/src/services/llm/utils/ai_exclusion_utils.ts

95 lines
2.9 KiB
TypeScript

import becca from '../../../becca/becca.js';
import type BNote from '../../../becca/entities/bnote.js';
import { LLM_CONSTANTS } from '../constants/provider_constants.js';
import log from '../../log.js';
/**
* Check if a note should be excluded from all AI/LLM features
*
* @param note - The note to check (BNote object)
* @returns true if the note should be excluded from AI features
*/
export function isNoteExcludedFromAI(note: BNote): boolean {
if (!note) {
return false;
}
try {
// Check if the note has the AI exclusion label
const hasExclusionLabel = note.hasLabel(LLM_CONSTANTS.AI_EXCLUSION.LABEL_NAME);
if (hasExclusionLabel) {
log.info(`Note ${note.noteId} (${note.title}) excluded from AI features due to ${LLM_CONSTANTS.AI_EXCLUSION.LABEL_NAME} label`);
return true;
}
return false;
} catch (error) {
log.error(`Error checking AI exclusion for note ${note.noteId}: ${error}`);
return false; // Default to not excluding on error
}
}
/**
* Check if a note should be excluded from AI features by noteId
*
* @param noteId - The ID of the note to check
* @returns true if the note should be excluded from AI features
*/
export function isNoteExcludedFromAIById(noteId: string): boolean {
if (!noteId) {
return false;
}
try {
const note = becca.getNote(noteId);
if (!note) {
return false;
}
return isNoteExcludedFromAI(note);
} catch (error) {
log.error(`Error checking AI exclusion for note ID ${noteId}: ${error}`);
return false; // Default to not excluding on error
}
}
/**
* Filter out notes that are excluded from AI features
*
* @param notes - Array of notes to filter
* @returns Array of notes with AI-excluded notes removed
*/
export function filterAIExcludedNotes(notes: BNote[]): BNote[] {
return notes.filter(note => !isNoteExcludedFromAI(note));
}
/**
* Filter out note IDs that are excluded from AI features
*
* @param noteIds - Array of note IDs to filter
* @returns Array of note IDs with AI-excluded notes removed
*/
export function filterAIExcludedNoteIds(noteIds: string[]): string[] {
return noteIds.filter(noteId => !isNoteExcludedFromAIById(noteId));
}
/**
* Check if any notes in an array are excluded from AI features
*
* @param notes - Array of notes to check
* @returns true if any note should be excluded from AI features
*/
export function hasAIExcludedNotes(notes: BNote[]): boolean {
return notes.some(note => isNoteExcludedFromAI(note));
}
/**
* Get the AI exclusion label name from constants
* This can be used in UI components or other places that need to reference the label
*
* @returns The label name used for AI exclusion
*/
export function getAIExclusionLabelName(): string {
return LLM_CONSTANTS.AI_EXCLUSION.LABEL_NAME;
}