Spaces:
Runtime error
Runtime error
add route
Browse files- server/routes.ts +33 -15
server/routes.ts
CHANGED
|
@@ -397,7 +397,7 @@ function transformWebResultToDocument(result: any, rank: number, query: string):
|
|
| 397 |
search_type: result.type,
|
| 398 |
fetched_at: new Date().toISOString()
|
| 399 |
},
|
| 400 |
-
relevanceScore: Math.max(0.
|
| 401 |
rank: rank + 1,
|
| 402 |
searchQuery: query,
|
| 403 |
retrievalTime: Math.random() * 0.2 + 0.1,
|
|
@@ -544,7 +544,7 @@ function transformGitHubRepoToDocument(repo: GitHubRepo, rank: number, query: st
|
|
| 544 |
created_at: repo.created_at,
|
| 545 |
updated_at: repo.updated_at
|
| 546 |
},
|
| 547 |
-
relevanceScore: Math.max(0.
|
| 548 |
rank: rank + 1,
|
| 549 |
searchQuery: query,
|
| 550 |
retrievalTime: Math.random() * 0.3 + 0.1,
|
|
@@ -856,14 +856,14 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
| 856 |
const docIds = JSON.parse(jsonMatch[0]);
|
| 857 |
console.log(`🎯 AI extracted document IDs: ${JSON.stringify(docIds)}`);
|
| 858 |
|
| 859 |
-
// Get the relevant documents in order
|
| 860 |
allDocuments = docIds
|
| 861 |
.map((id: number) => allDocs.find(doc => doc.id === id))
|
| 862 |
.filter((doc: any) => doc !== undefined)
|
| 863 |
.slice(0, searchRequest.limit)
|
| 864 |
.map((doc: any, index: number) => ({
|
| 865 |
...doc,
|
| 866 |
-
relevanceScore: 1.0 - (index * 0.1),
|
| 867 |
rank: index + 1,
|
| 868 |
snippet: doc.content.substring(0, 200) + '...'
|
| 869 |
}));
|
|
@@ -884,10 +884,25 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
| 884 |
const localResults = await storage.searchDocuments(searchRequest);
|
| 885 |
allDocuments = localResults.results || [];
|
| 886 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 887 |
} else {
|
| 888 |
// Use regular keyword search for other search types
|
| 889 |
const localResults = await storage.searchDocuments(searchRequest);
|
| 890 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 891 |
}
|
| 892 |
|
| 893 |
// Validate URLs in local storage results as well
|
|
@@ -914,10 +929,9 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
| 914 |
}
|
| 915 |
}
|
| 916 |
|
| 917 |
-
// If local results
|
| 918 |
-
|
| 919 |
-
|
| 920 |
-
console.log(`Local search returned ${allDocuments.length} results, fetching external sources...`);
|
| 921 |
|
| 922 |
// Check if we should search GitHub for code-related queries
|
| 923 |
const isCodeQuery = searchRequest.query.toLowerCase().includes('python') ||
|
|
@@ -933,16 +947,16 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
| 933 |
searchPromises.push(
|
| 934 |
searchGitHubRepos(searchRequest.query, Math.min(5, searchRequest.limit))
|
| 935 |
.then(repos => repos.map((repo, index) =>
|
| 936 |
-
transformGitHubRepoToDocument(repo, index
|
| 937 |
))
|
| 938 |
);
|
| 939 |
}
|
| 940 |
|
| 941 |
-
// Always include web search for broader coverage
|
| 942 |
searchPromises.push(
|
| 943 |
-
searchWeb(searchRequest.query, Math.min(5, searchRequest.limit
|
| 944 |
.then(webResults => webResults.map((result, index) =>
|
| 945 |
-
transformWebResultToDocument(result, index
|
| 946 |
))
|
| 947 |
);
|
| 948 |
|
|
@@ -950,10 +964,14 @@ Return format: [4, 21, 23, 2, 7]`;
|
|
| 950 |
const externalResults = await Promise.all(searchPromises);
|
| 951 |
const flattenedResults = externalResults.flat();
|
| 952 |
|
| 953 |
-
//
|
| 954 |
-
allDocuments =
|
| 955 |
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
| 956 |
.slice(0, searchRequest.limit);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 957 |
}
|
| 958 |
|
| 959 |
const searchTime = (Date.now() - startTime) / 1000;
|
|
|
|
| 397 |
search_type: result.type,
|
| 398 |
fetched_at: new Date().toISOString()
|
| 399 |
},
|
| 400 |
+
relevanceScore: Math.max(0.2, 0.6 - (rank * 0.1)), // Lower scores for external results
|
| 401 |
rank: rank + 1,
|
| 402 |
searchQuery: query,
|
| 403 |
retrievalTime: Math.random() * 0.2 + 0.1,
|
|
|
|
| 544 |
created_at: repo.created_at,
|
| 545 |
updated_at: repo.updated_at
|
| 546 |
},
|
| 547 |
+
relevanceScore: Math.max(0.3, 0.7 - (rank * 0.1)), // Lower scores for GitHub results
|
| 548 |
rank: rank + 1,
|
| 549 |
searchQuery: query,
|
| 550 |
retrievalTime: Math.random() * 0.3 + 0.1,
|
|
|
|
| 856 |
const docIds = JSON.parse(jsonMatch[0]);
|
| 857 |
console.log(`🎯 AI extracted document IDs: ${JSON.stringify(docIds)}`);
|
| 858 |
|
| 859 |
+
// Get the relevant documents in order with boosted scores
|
| 860 |
allDocuments = docIds
|
| 861 |
.map((id: number) => allDocs.find(doc => doc.id === id))
|
| 862 |
.filter((doc: any) => doc !== undefined)
|
| 863 |
.slice(0, searchRequest.limit)
|
| 864 |
.map((doc: any, index: number) => ({
|
| 865 |
...doc,
|
| 866 |
+
relevanceScore: Math.min(1.0 - (index * 0.05), 1.0), // Higher scores for knowledge base
|
| 867 |
rank: index + 1,
|
| 868 |
snippet: doc.content.substring(0, 200) + '...'
|
| 869 |
}));
|
|
|
|
| 884 |
const localResults = await storage.searchDocuments(searchRequest);
|
| 885 |
allDocuments = localResults.results || [];
|
| 886 |
}
|
| 887 |
+
|
| 888 |
+
// If AI search failed or returned no results, fallback to regular search
|
| 889 |
+
if (allDocuments.length === 0) {
|
| 890 |
+
console.log('🔄 AI search returned no results, falling back to regular keyword search...');
|
| 891 |
+
const localResults = await storage.searchDocuments(searchRequest);
|
| 892 |
+
// Boost relevance scores for knowledge base documents to prioritize them
|
| 893 |
+
allDocuments = (localResults.results || []).map(doc => ({
|
| 894 |
+
...doc,
|
| 895 |
+
relevanceScore: Math.min(doc.relevanceScore + 0.5, 1.0) // Boost by 0.5
|
| 896 |
+
}));
|
| 897 |
+
}
|
| 898 |
} else {
|
| 899 |
// Use regular keyword search for other search types
|
| 900 |
const localResults = await storage.searchDocuments(searchRequest);
|
| 901 |
+
// Boost relevance scores for knowledge base documents to prioritize them
|
| 902 |
+
allDocuments = (localResults.results || []).map(doc => ({
|
| 903 |
+
...doc,
|
| 904 |
+
relevanceScore: Math.min(doc.relevanceScore + 0.5, 1.0) // Boost by 0.5
|
| 905 |
+
}));
|
| 906 |
}
|
| 907 |
|
| 908 |
// Validate URLs in local storage results as well
|
|
|
|
| 929 |
}
|
| 930 |
}
|
| 931 |
|
| 932 |
+
// If we have local results, prioritize them. Only add external sources if no local results found.
|
| 933 |
+
if (allDocuments.length === 0) {
|
| 934 |
+
console.log(`No local results found for "${searchRequest.query}", searching external sources...`);
|
|
|
|
| 935 |
|
| 936 |
// Check if we should search GitHub for code-related queries
|
| 937 |
const isCodeQuery = searchRequest.query.toLowerCase().includes('python') ||
|
|
|
|
| 947 |
searchPromises.push(
|
| 948 |
searchGitHubRepos(searchRequest.query, Math.min(5, searchRequest.limit))
|
| 949 |
.then(repos => repos.map((repo, index) =>
|
| 950 |
+
transformGitHubRepoToDocument(repo, index, searchRequest.query)
|
| 951 |
))
|
| 952 |
);
|
| 953 |
}
|
| 954 |
|
| 955 |
+
// Always include web search for broader coverage when no local results
|
| 956 |
searchPromises.push(
|
| 957 |
+
searchWeb(searchRequest.query, Math.min(5, searchRequest.limit))
|
| 958 |
.then(webResults => webResults.map((result, index) =>
|
| 959 |
+
transformWebResultToDocument(result, index, searchRequest.query)
|
| 960 |
))
|
| 961 |
);
|
| 962 |
|
|
|
|
| 964 |
const externalResults = await Promise.all(searchPromises);
|
| 965 |
const flattenedResults = externalResults.flat();
|
| 966 |
|
| 967 |
+
// Sort external results by relevance (external results have lower base scores)
|
| 968 |
+
allDocuments = flattenedResults
|
| 969 |
.sort((a, b) => b.relevanceScore - a.relevanceScore)
|
| 970 |
.slice(0, searchRequest.limit);
|
| 971 |
+
} else {
|
| 972 |
+
console.log(`Found ${allDocuments.length} local documents, prioritizing knowledge base results.`);
|
| 973 |
+
// Limit local results to the requested amount
|
| 974 |
+
allDocuments = allDocuments.slice(0, searchRequest.limit);
|
| 975 |
}
|
| 976 |
|
| 977 |
const searchTime = (Date.now() - startTime) / 1000;
|