Enhance chatbot conversation engine and add retrieval eval suite

This commit is contained in:
nmemmert
2026-04-14 10:36:22 -04:00
parent 36594d5e16
commit 50459b7234
8 changed files with 1451 additions and 121 deletions
+30 -11
View File
@@ -740,6 +740,7 @@ app.get('/api/admin-content', async (_req, res) => {
const MAX_CHATBOT_ENTRIES = 500
let chatbotEntries = []
let chatbotWritePromise = Promise.resolve()
let chatbotFileMtimeMs = 0
function queueChatbotWrite() {
chatbotWritePromise = chatbotWritePromise
@@ -756,25 +757,43 @@ function queueChatbotWrite() {
})
}
function loadChatbotFromDisk() {
return readFile(CHATBOT_FILE, 'utf8')
.then(raw => {
const parsed = JSON.parse(raw)
chatbotEntries = Array.isArray(parsed) ? parsed.slice(0, MAX_CHATBOT_ENTRIES) : []
})
.catch(() => {
chatbotEntries = []
})
async function loadChatbotFromDisk() {
try {
const [fileStats, raw] = await Promise.all([
stat(CHATBOT_FILE),
readFile(CHATBOT_FILE, 'utf8'),
])
const parsed = JSON.parse(raw)
chatbotEntries = Array.isArray(parsed) ? parsed.slice(0, MAX_CHATBOT_ENTRIES) : []
chatbotFileMtimeMs = fileStats.mtimeMs
} catch {
chatbotEntries = []
chatbotFileMtimeMs = 0
}
}
async function refreshChatbotFromDiskIfChanged() {
try {
const fileStats = await stat(CHATBOT_FILE)
if (fileStats.mtimeMs <= chatbotFileMtimeMs) return
await loadChatbotFromDisk()
} catch {
if (chatbotFileMtimeMs === 0) return
chatbotEntries = []
chatbotFileMtimeMs = 0
}
}
// Public: return all chatbot entries for client-side matching
app.get('/api/chatbot-content', (req, res) => {
app.get('/api/chatbot-content', async (req, res) => {
await refreshChatbotFromDiskIfChanged()
res.json(chatbotEntries)
})
// Admin: get all entries
app.get('/api/admin/chatbot-content', (req, res) => {
app.get('/api/admin/chatbot-content', async (req, res) => {
if (!isValidAdminSession(req)) { res.status(401).json({ message: 'Not authenticated.' }); return }
await refreshChatbotFromDiskIfChanged()
res.json(chatbotEntries)
})