Fix nebius AI
Browse files- README.md +3 -1
- server/routes.ts +77 -4
README.md
CHANGED
|
@@ -28,7 +28,9 @@ A production-ready AI-powered knowledge retrieval system featuring real document
|
|
| 28 |
|
| 29 |
**Submitted to**: [Hugging Face Agents-MCP-Hackathon](https://huggingface.co/Agents-MCP-Hackathon)
|
| 30 |
|
| 31 |
-
**Live Demo**: [Try KnowledgeBridge on Hugging Face Spaces](https://huggingface.co/spaces/
|
|
|
|
|
|
|
| 32 |
|
| 33 |
### **π "Show us the most incredible things that your agents can do!"**
|
| 34 |
|
|
|
|
| 28 |
|
| 29 |
**Submitted to**: [Hugging Face Agents-MCP-Hackathon](https://huggingface.co/Agents-MCP-Hackathon)
|
| 30 |
|
| 31 |
+
**Live Demo**: [Try KnowledgeBridge on Hugging Face Spaces](https://huggingface.co/spaces/Agents-MCP-Hackathon/KnowledgeBridge
|
| 32 |
+
|
| 33 |
+
[Video Link]{https://drive.google.com/drive/folders/1iQafhb7PmO6zWW-JDq1eWGo8KN10Ctdf?usp=sharing}
|
| 34 |
|
| 35 |
### **π "Show us the most incredible things that your agents can do!"**
|
| 36 |
|
server/routes.ts
CHANGED
|
@@ -813,9 +813,82 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|
| 813 |
const streaming = req.body.streaming === true;
|
| 814 |
const startTime = Date.now();
|
| 815 |
|
| 816 |
-
|
| 817 |
-
|
| 818 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 819 |
|
| 820 |
// Validate URLs in local storage results as well
|
| 821 |
if (allDocuments.length > 0) {
|
|
@@ -837,7 +910,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
|
| 837 |
return isValid;
|
| 838 |
});
|
| 839 |
|
| 840 |
-
console.log(`Local URL validation completed. ${allDocuments.length}
|
| 841 |
}
|
| 842 |
}
|
| 843 |
|
|
|
|
| 813 |
const streaming = req.body.streaming === true;
|
| 814 |
const startTime = Date.now();
|
| 815 |
|
| 816 |
+
let allDocuments: any[] = [];
|
| 817 |
+
|
| 818 |
+
// Use Nebius AI for semantic search (important for hackathon demo)
|
| 819 |
+
if (searchRequest.searchType === "semantic") {
|
| 820 |
+
console.log(`π€ Using Nebius AI for semantic search: "${searchRequest.query}"`);
|
| 821 |
+
|
| 822 |
+
try {
|
| 823 |
+
// Get all documents for AI analysis
|
| 824 |
+
const allDocs = await storage.getDocuments(1000, 0);
|
| 825 |
+
console.log(`π Found ${allDocs.length} documents for AI analysis`);
|
| 826 |
+
|
| 827 |
+
// Use Nebius AI to find semantically relevant documents
|
| 828 |
+
const prompt = `Given the search query: "${searchRequest.query}"
|
| 829 |
+
|
| 830 |
+
Analyze these documents and return ONLY a JSON array of the 5 most relevant document IDs, ranked by semantic relevance to the query.
|
| 831 |
+
|
| 832 |
+
Documents:
|
| 833 |
+
${allDocs.slice(0, 15).map(doc => `ID: ${doc.id} | Title: ${doc.title} | Content: ${doc.content.substring(0, 150)}...`).join('\n')}
|
| 834 |
+
|
| 835 |
+
Return format: [4, 21, 23, 2, 7]`;
|
| 836 |
+
|
| 837 |
+
console.log(`π Sending prompt to Nebius AI...`);
|
| 838 |
+
const aiResponse = await nebiusClient.createChatCompletion({
|
| 839 |
+
model: 'deepseek-ai/DeepSeek-R1-0528',
|
| 840 |
+
messages: [{ role: 'user', content: prompt }],
|
| 841 |
+
max_tokens: 100,
|
| 842 |
+
temperature: 0.1
|
| 843 |
+
});
|
| 844 |
+
|
| 845 |
+
console.log(`π₯ Received AI response`);
|
| 846 |
+
|
| 847 |
+
if (aiResponse && aiResponse.choices && aiResponse.choices[0]) {
|
| 848 |
+
const cleanResponse = aiResponse.choices[0].message.content.trim();
|
| 849 |
+
console.log(`π AI Response: ${cleanResponse}`);
|
| 850 |
+
|
| 851 |
+
// Extract JSON array - be more flexible with the matching
|
| 852 |
+
const jsonMatch = cleanResponse.match(/\[[\d,\s]+\]/);
|
| 853 |
+
|
| 854 |
+
if (jsonMatch) {
|
| 855 |
+
try {
|
| 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 |
+
}));
|
| 870 |
+
|
| 871 |
+
console.log(`β
Nebius AI found ${allDocuments.length} semantically relevant documents`);
|
| 872 |
+
} catch (parseError) {
|
| 873 |
+
console.error(`β Failed to parse AI response JSON: ${parseError}`);
|
| 874 |
+
}
|
| 875 |
+
} else {
|
| 876 |
+
console.log(`β No JSON array found in AI response: ${cleanResponse}`);
|
| 877 |
+
}
|
| 878 |
+
} else {
|
| 879 |
+
console.log(`β No valid AI response received from Nebius`);
|
| 880 |
+
}
|
| 881 |
+
} catch (aiError) {
|
| 882 |
+
console.error('β Nebius AI semantic search failed:', aiError);
|
| 883 |
+
// Fallback to regular search
|
| 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 |
+
allDocuments = localResults.results || [];
|
| 891 |
+
}
|
| 892 |
|
| 893 |
// Validate URLs in local storage results as well
|
| 894 |
if (allDocuments.length > 0) {
|
|
|
|
| 910 |
return isValid;
|
| 911 |
});
|
| 912 |
|
| 913 |
+
console.log(`Local URL validation completed. ${allDocuments.length} documents have valid URLs.`);
|
| 914 |
}
|
| 915 |
}
|
| 916 |
|