Files
n8n-mcp/src/scripts/debug-http-search.ts
czlonkowski 627c0144a4 fix: improve node type suggestions for all test cases
- Enhanced substring matching for short search terms (http, sheet)
- Boosted pattern match scores for short searches (45 points)
- Added name similarity boost for substring matches
- Fixed cross-package suggestions (nodes-base.openai → nodes-langchain.openAi)
- Increased confidence for deprecated package prefixes to 95%
- Added debug and test summary scripts

All 16 test cases now pass with 100% accuracy:
 Case variations (HttpRequest, Webhook, etc.) - 95% confidence
 Missing prefixes (slack, googleSheets, etc.) - 90% confidence
 Common typos (htpRequest, webook, etc.) - 80% confidence
 Short partials (http, sheet) - 52-60% confidence
 Cross-package (nodes-base.openai) - 90% confidence
 Deprecated prefixes (n8n-nodes-base) - 95% confidence
2025-09-24 07:38:59 +02:00

77 lines
2.9 KiB
TypeScript

#!/usr/bin/env npx tsx
import { createDatabaseAdapter } from '../database/database-adapter';
import { NodeRepository } from '../database/node-repository';
import { NodeSimilarityService } from '../services/node-similarity-service';
import path from 'path';
async function debugHttpSearch() {
const dbPath = path.join(process.cwd(), 'data/nodes.db');
const db = await createDatabaseAdapter(dbPath);
const repository = new NodeRepository(db);
const service = new NodeSimilarityService(repository);
console.log('Testing "http" search...\n');
// Check if httpRequest exists
const httpNode = repository.getNode('nodes-base.httpRequest');
console.log('HTTP Request node exists:', httpNode ? 'Yes' : 'No');
if (httpNode) {
console.log(' Display name:', httpNode.displayName);
}
// Test the search with internal details
const suggestions = await service.findSimilarNodes('http', 5);
console.log('\nSuggestions for "http":', suggestions.length);
suggestions.forEach(s => {
console.log(` - ${s.nodeType} (${Math.round(s.confidence * 100)}%)`);
});
// Manually calculate score for httpRequest
console.log('\nManual score calculation for httpRequest:');
const testNode = {
nodeType: 'nodes-base.httpRequest',
displayName: 'HTTP Request',
category: 'Core Nodes'
};
const cleanInvalid = 'http';
const cleanValid = 'nodesbasehttprequest';
const displayNameClean = 'httprequest';
// Check substring
const hasSubstring = cleanValid.includes(cleanInvalid) || displayNameClean.includes(cleanInvalid);
console.log(` Substring match: ${hasSubstring}`);
// This should give us pattern match score
const patternScore = hasSubstring ? 35 : 0; // Using 35 for short searches
console.log(` Pattern score: ${patternScore}`);
// Name similarity would be low
console.log(` Total score would need to be >= 50 to appear`);
// Get all nodes and check which ones contain 'http'
const allNodes = repository.getAllNodes();
const httpNodes = allNodes.filter(n =>
n.nodeType.toLowerCase().includes('http') ||
(n.displayName && n.displayName.toLowerCase().includes('http'))
);
console.log('\n\nNodes containing "http" in name:');
httpNodes.slice(0, 5).forEach(n => {
console.log(` - ${n.nodeType} (${n.displayName})`);
// Calculate score for this node
const normalizedSearch = 'http';
const normalizedType = n.nodeType.toLowerCase().replace(/[^a-z0-9]/g, '');
const normalizedDisplay = (n.displayName || '').toLowerCase().replace(/[^a-z0-9]/g, '');
const containsInType = normalizedType.includes(normalizedSearch);
const containsInDisplay = normalizedDisplay.includes(normalizedSearch);
console.log(` Type check: "${normalizedType}" includes "${normalizedSearch}" = ${containsInType}`);
console.log(` Display check: "${normalizedDisplay}" includes "${normalizedSearch}" = ${containsInDisplay}`);
});
}
debugHttpSearch().catch(console.error);