n8n-nodes-query-retriever-rerank
Version:
Advanced n8n community node for intelligent document retrieval with multi-step reasoning, reranking, and comprehensive debugging
95 lines (90 loc) • 3.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DebugManager = void 0;
class DebugManager {
constructor(strategyType, configuration) {
this.startTime = Date.now();
this.debugData = {
strategy: strategyType,
configuration,
timing: {},
documentFlow: {},
queryDetails: {}
};
}
// Set query details
setQueryDetails(details) {
this.debugData.queryDetails = { ...this.debugData.queryDetails, ...details };
}
// Set document flow metrics
setDocumentFlow(flow) {
this.debugData.documentFlow = { ...this.debugData.documentFlow, ...flow };
}
// Add timing information
addTiming(phase, startTime) {
this.debugData.timing[phase] = `${Date.now() - startTime}ms`;
}
// Set reranking data
setRerankingData(rerankingData) {
this.debugData.reranking = rerankingData;
}
// Set answer generation data
setAnswerGenerationData(answerData) {
this.debugData.answerGeneration = answerData;
}
// Finalize debug data with total time
finalize() {
this.debugData.timing.total = `${Date.now() - this.startTime}ms`;
return this.debugData;
}
// Get current debug data
getDebugData() {
return this.debugData;
}
// Store debug data in memory with optional LLM analysis
static async storeInMemory(debugData, model, memory, enableLLMAnalysis, originalQuery) {
var _a, _b, _c;
if (!memory)
return;
try {
let analysis = null;
// Generate LLM analysis only if enabled
if (enableLLMAnalysis) {
const analysisPrompt = `QUERY RETRIEVER DEBUG ANALYSIS
The following debug data is from a document retrieval and reranking execution (strategy: ${debugData.strategy}):
Debug Data:
${JSON.stringify(debugData, null, 2)}
Please analyze this data and provide insights on:
- System performance and timing
- Strategy effectiveness
- Document retrieval effectiveness
- Reranking impact
- Areas for optimization
Provide a structured analysis that could help optimize future queries.`;
const analysisResponse = await model.invoke(analysisPrompt);
analysis = typeof analysisResponse === 'string' ? analysisResponse :
analysisResponse.content || analysisResponse.text || String(analysisResponse);
}
// Create debug entry (with or without LLM analysis)
const debugEntry = {
timestamp: new Date().toISOString(),
query: originalQuery,
strategy: debugData.strategy,
debugData,
...(analysis && { analysis }),
summary: {
totalTime: (_a = debugData.timing) === null || _a === void 0 ? void 0 : _a.total,
documentsRetrieved: (_b = debugData.documentFlow) === null || _b === void 0 ? void 0 : _b.totalRetrieved,
finalDocuments: (_c = debugData.documentFlow) === null || _c === void 0 ? void 0 : _c.finalCount,
strategy: debugData.strategy
}
};
// Store in memory using the saveContext method with single key-value pairs
await memory.saveContext({ input: `Debug data for query: ${originalQuery}` }, { output: JSON.stringify(debugEntry, null, 2) });
}
catch (debugError) {
// Silent failure for debug storage
}
}
}
exports.DebugManager = DebugManager;