code clean up pass
This commit is contained in:
@@ -98,21 +98,20 @@ function deleteSessionByExternalId(externalId) {
|
|||||||
|
|
||||||
// --Episodes --------------------------------------------------
|
// --Episodes --------------------------------------------------
|
||||||
// Creates a new episode linked to a session, with user message, AI response, optional token count, and metadata
|
// Creates a new episode linked to a session, with user message, AI response, optional token count, and metadata
|
||||||
async function createEpisode(sessionId, userMessage, aiResponse, tokenCount = null, metadata = null, projectId=null) {
|
async function createEpisode(sessionId, userMessage, aiResponse, tokenCount = null, projectId=null) {
|
||||||
const db = getDB();
|
const db = getDB();
|
||||||
|
|
||||||
// Wrap insert + session touch in a transaction — both succeed or neither does
|
// Wrap insert + session touch in a transaction — both succeed or neither does
|
||||||
const insert = db.transaction(() => {
|
const insert = db.transaction(() => {
|
||||||
const stmt = db.prepare(`
|
const stmt = db.prepare(`
|
||||||
INSERT INTO episodes (session_id, user_message, ai_response, token_count, metadata)
|
INSERT INTO episodes (session_id, user_message, ai_response, token_count)
|
||||||
VALUES (?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?)
|
||||||
`);
|
`);
|
||||||
const result = stmt.run(
|
const result = stmt.run(
|
||||||
sessionId,
|
sessionId,
|
||||||
userMessage,
|
userMessage,
|
||||||
aiResponse,
|
aiResponse,
|
||||||
tokenCount,
|
tokenCount,
|
||||||
metadata ? JSON.stringify(metadata) : null
|
|
||||||
);
|
);
|
||||||
touchSession(sessionId);
|
touchSession(sessionId);
|
||||||
return getEpisode(result.lastInsertRowid);
|
return getEpisode(result.lastInsertRowid);
|
||||||
@@ -155,11 +154,12 @@ function getEpisodesBySession(sessionId, limit = EPISODIC.DEFAULT_PAGE_SIZE, off
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retrieves recent episodes across all sessions, ordered by creation time descending, with a limit
|
// Retrieves recent episodes across all sessions, ordered by creation time descending, with a limit
|
||||||
function getRecentEpisodes(limit = EPISODIC.DEFAULT_RECENT_LIMIT) {
|
function getRecentEpisodes(sessionId, limit = EPISODIC.DEFAULT_RECENT_LIMIT) {
|
||||||
// Cross-session recent episodes — useful for recency-based retrieval
|
// Cross-session recent episodes — useful for recency-based retrieval
|
||||||
const db = getDB();
|
const db = getDB();
|
||||||
const stmt = db.prepare(`
|
const stmt = db.prepare(`
|
||||||
SELECT * FROM episodes
|
SELECT * FROM episodes
|
||||||
|
WHERE session_id = ?
|
||||||
ORDER BY created_at DESC
|
ORDER BY created_at DESC
|
||||||
LIMIT ?
|
LIMIT ?
|
||||||
`);
|
`);
|
||||||
|
|||||||
@@ -83,9 +83,7 @@ app.patch('/sessions/by-external/:externalId', (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Deletes a session and all associated episodes
|
||||||
|
|
||||||
// Updates the session's updated_at timestamp to now
|
|
||||||
app.delete('/sessions/by-external/:externalId', (req, res) => {
|
app.delete('/sessions/by-external/:externalId', (req, res) => {
|
||||||
episodic.deleteSessionByExternalId(req.params.externalId);
|
episodic.deleteSessionByExternalId(req.params.externalId);
|
||||||
res.status(204).send();
|
res.status(204).send();
|
||||||
@@ -103,13 +101,6 @@ app.post('/episodes', async (req, res) => {
|
|||||||
}
|
}
|
||||||
const episode = await episodic.createEpisode(sessionId, userMessage, aiResponse, tokenCount, metadata, projectId);
|
const episode = await episodic.createEpisode(sessionId, userMessage, aiResponse, tokenCount, metadata, projectId);
|
||||||
|
|
||||||
console.log('[memory] create episode body:', {
|
|
||||||
sessionId,
|
|
||||||
userMessageLength: userMessage?.length,
|
|
||||||
aiResponseLength: aiResponse?.length,
|
|
||||||
tokenCount
|
|
||||||
});
|
|
||||||
|
|
||||||
res.status(201).json(episode);
|
res.status(201).json(episode);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -182,20 +182,15 @@ async function chat(externalId, userMessage, options = {}) {
|
|||||||
const result = await inference.complete(prompt, {...options, temperature, repeatPenalty, topP, topK});
|
const result = await inference.complete(prompt, {...options, temperature, repeatPenalty, topP, topK});
|
||||||
|
|
||||||
// 6. Write episode back to memory
|
// 6. Write episode back to memory
|
||||||
memory
|
try {
|
||||||
.createEpisode(
|
await memory.createEpisode(
|
||||||
session.id,
|
session.id, userMessage, result.text,
|
||||||
userMessage,
|
|
||||||
result.text,
|
|
||||||
(result.evalCount || 0) + (result.promptEvalCount || 0),
|
(result.evalCount || 0) + (result.promptEvalCount || 0),
|
||||||
session.project_id ?? null,
|
session.project_id ?? null,
|
||||||
)
|
|
||||||
.catch((err) =>
|
|
||||||
console.error(`[orchestration] Failed to save episode`, err.message),
|
|
||||||
);
|
);
|
||||||
|
} catch (err) {
|
||||||
// 7. Trigger summarization check (fire-and-forget)
|
console.error('[orchestration] Failed to save episode:', err.message);
|
||||||
// Pass full episodes list so summarization can sum tokens accurately
|
}
|
||||||
const allEpisodes = await memory.getRecentEpisodes(session.id, 9999);
|
const allEpisodes = await memory.getRecentEpisodes(session.id, 9999);
|
||||||
triggerSummary(session, allEpisodes);
|
triggerSummary(session, allEpisodes);
|
||||||
|
|
||||||
@@ -258,7 +253,6 @@ async function chatStream(externalId, userMessage, onChunk, options = {}) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const entities = await getRelevantEntities(userMessage, session.project_id ?? null);
|
const entities = await getRelevantEntities(userMessage, session.project_id ?? null);
|
||||||
console.log('[orchestration] entity search projectId:', session.project_id ?? null);
|
|
||||||
|
|
||||||
const prompt = buildPrompt(
|
const prompt = buildPrompt(
|
||||||
recentEpisodes,
|
recentEpisodes,
|
||||||
|
|||||||
Reference in New Issue
Block a user