Spaces:
Running
Running
Update index.js
Browse files
index.js
CHANGED
|
@@ -3,22 +3,20 @@ import cors from 'cors';
|
|
| 3 |
import fetch from 'node-fetch';
|
| 4 |
import rateLimit from 'express-rate-limit';
|
| 5 |
const app = express();
|
| 6 |
-
// ββ
|
| 7 |
-
import { searchDuckDuckGo, scrapeSiteKnowledge, buildIsabellaPrompt } from './consultant.js';
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
|
|
|
| 11 |
const KNOWLEDGE_URLS = [
|
| 12 |
-
'https://domify-academy.free.nf/
|
| 13 |
-
'
|
| 14 |
-
'https://domify-academy.free.nf/
|
| 15 |
-
'https://domify-academy.free.nf/about-us',
|
| 16 |
'https://domify-academy.free.nf/privacy',
|
| 17 |
-
'https://domify-academy.free.nf
|
| 18 |
-
'https://domify-academy.free.nf',
|
| 19 |
];
|
| 20 |
|
| 21 |
-
// Cached knowledge (refreshed periodically)
|
| 22 |
let cachedKnowledge = null;
|
| 23 |
let knowledgeLastFetched = 0;
|
| 24 |
|
|
@@ -29,25 +27,29 @@ async function getKnowledge() {
|
|
| 29 |
}
|
| 30 |
cachedKnowledge = await scrapeSiteKnowledge(KNOWLEDGE_URLS);
|
| 31 |
knowledgeLastFetched = now;
|
| 32 |
-
console.log('π
|
| 33 |
return cachedKnowledge;
|
| 34 |
}
|
| 35 |
|
| 36 |
-
// ββ Isabella Chat Endpoint βββββββββββββββββββββββββ
|
| 37 |
app.post('/api/isabella/chat', async (req, res) => {
|
| 38 |
try {
|
| 39 |
-
const { message, userName, pageName, conversationHistory } = req.body;
|
| 40 |
-
|
| 41 |
if (!message) {
|
| 42 |
return res.status(400).json({ error: 'Message required' });
|
| 43 |
}
|
| 44 |
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
const [knowledge, searchResults] = await Promise.all([
|
| 47 |
getKnowledge(),
|
| 48 |
searchDuckDuckGo(message)
|
| 49 |
]);
|
| 50 |
|
|
|
|
| 51 |
const systemPrompt = buildIsabellaPrompt(
|
| 52 |
userName || '',
|
| 53 |
pageName || 'unknown',
|
|
@@ -55,19 +57,30 @@ app.post('/api/isabella/chat', async (req, res) => {
|
|
| 55 |
searchResults
|
| 56 |
);
|
| 57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
res.json({
|
| 59 |
-
|
| 60 |
-
|
| 61 |
knowledgeRefreshed: Date.now() - knowledgeLastFetched < 60000
|
| 62 |
});
|
| 63 |
|
| 64 |
} catch (err) {
|
| 65 |
-
console.error('Isabella
|
| 66 |
-
res.status(500).json({ error:
|
| 67 |
}
|
| 68 |
});
|
| 69 |
|
| 70 |
-
// ββ
|
| 71 |
app.post('/api/isabella/refresh-knowledge', async (req, res) => {
|
| 72 |
cachedKnowledge = await scrapeSiteKnowledge(KNOWLEDGE_URLS);
|
| 73 |
knowledgeLastFetched = Date.now();
|
|
|
|
| 3 |
import fetch from 'node-fetch';
|
| 4 |
import rateLimit from 'express-rate-limit';
|
| 5 |
const app = express();
|
| 6 |
+
// ββ Isabella Consultant Endpoint (standalone) βββββ
|
| 7 |
+
import { searchDuckDuckGo, scrapeSiteKnowledge, buildIsabellaPrompt, callNVIDIA } from './consultant.js';
|
| 8 |
|
| 9 |
+
const ISABELLA_NVIDIA_KEY = process.env.ISABELLA_NVIDIA_KEY || '';
|
| 10 |
+
|
| 11 |
+
// URLs to scrape for knowledge
|
| 12 |
const KNOWLEDGE_URLS = [
|
| 13 |
+
'https://domify-academy.free.nf/about-us',
|
| 14 |
+
'domify-academy.free.nf/product-Price',
|
| 15 |
+
'https://domify-academy.free.nf/refund',
|
|
|
|
| 16 |
'https://domify-academy.free.nf/privacy',
|
| 17 |
+
'https://domify-academy.free.nf'
|
|
|
|
| 18 |
];
|
| 19 |
|
|
|
|
| 20 |
let cachedKnowledge = null;
|
| 21 |
let knowledgeLastFetched = 0;
|
| 22 |
|
|
|
|
| 27 |
}
|
| 28 |
cachedKnowledge = await scrapeSiteKnowledge(KNOWLEDGE_URLS);
|
| 29 |
knowledgeLastFetched = now;
|
| 30 |
+
console.log('π Isabella knowledge base refreshed');
|
| 31 |
return cachedKnowledge;
|
| 32 |
}
|
| 33 |
|
|
|
|
| 34 |
app.post('/api/isabella/chat', async (req, res) => {
|
| 35 |
try {
|
| 36 |
+
const { message, userName, pageName, conversationHistory = [] } = req.body;
|
| 37 |
+
|
| 38 |
if (!message) {
|
| 39 |
return res.status(400).json({ error: 'Message required' });
|
| 40 |
}
|
| 41 |
|
| 42 |
+
if (!ISABELLA_NVIDIA_KEY) {
|
| 43 |
+
return res.status(500).json({ error: 'Isabella NVIDIA key not configured' });
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
// Get knowledge and search in parallel
|
| 47 |
const [knowledge, searchResults] = await Promise.all([
|
| 48 |
getKnowledge(),
|
| 49 |
searchDuckDuckGo(message)
|
| 50 |
]);
|
| 51 |
|
| 52 |
+
// Build enriched system prompt
|
| 53 |
const systemPrompt = buildIsabellaPrompt(
|
| 54 |
userName || '',
|
| 55 |
pageName || 'unknown',
|
|
|
|
| 57 |
searchResults
|
| 58 |
);
|
| 59 |
|
| 60 |
+
// Call NVIDIA for actual response
|
| 61 |
+
const reply = await callNVIDIA(systemPrompt, message, ISABELLA_NVIDIA_KEY, conversationHistory);
|
| 62 |
+
|
| 63 |
+
// Check for embedded issue reports
|
| 64 |
+
let issue = null;
|
| 65 |
+
const issueMatch = reply.match(/\[ISSUE:\s*(.+?)\]/);
|
| 66 |
+
if (issueMatch) {
|
| 67 |
+
issue = issueMatch[1];
|
| 68 |
+
reply = reply.replace(/\[ISSUE:.*?\]/g, '').trim();
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
res.json({
|
| 72 |
+
reply,
|
| 73 |
+
issue,
|
| 74 |
knowledgeRefreshed: Date.now() - knowledgeLastFetched < 60000
|
| 75 |
});
|
| 76 |
|
| 77 |
} catch (err) {
|
| 78 |
+
console.error('Isabella error:', err.message);
|
| 79 |
+
res.status(500).json({ error: 'Isabella is thinking... try again' });
|
| 80 |
}
|
| 81 |
});
|
| 82 |
|
| 83 |
+
// ββ Knowledge refresh ββββββββββββββββββββββββββββ
|
| 84 |
app.post('/api/isabella/refresh-knowledge', async (req, res) => {
|
| 85 |
cachedKnowledge = await scrapeSiteKnowledge(KNOWLEDGE_URLS);
|
| 86 |
knowledgeLastFetched = Date.now();
|