trivial turn patch

This commit is contained in:
Storme-bit
2026-08-17 06:23:00 -07:00
parent 7e8aead917
commit ff1c0ab215
5 changed files with 119 additions and 19 deletions
@@ -2,7 +2,7 @@ const memory = require("../services/memory");
const inference = require("../services/inference");
const embedding = require("../services/embedding");
const qdrant = require("../services/qdrant");
const { ORCHESTRATION, RETRIEVAL, logger } = require("@nexusai/shared");
const { ORCHESTRATION, RETRIEVAL, logger, isTrivialTurn } = require("@nexusai/shared");
const appSettings = require("../config/settings");
const {triggerSummary} = require('../services/summarization')
const graph = require('../services/graph');
@@ -283,20 +283,27 @@ async function assembleContext(externalId, userMessage) {
const isFirstMessage = recentEpisodes.length === 0;
const recentIds = new Set(recentEpisodes.map(e => e.id));
// 4. Embed the query once — the vector is shared by semantic episode search
// and entity search, so embedding it twice was a wasted round-trip + Ollama call.
let queryVector = null;
try {
queryVector = await embedding.embed(userMessage);
} catch (err) {
logger.warn('[orchestration] Query embedding failed; semantic + entity search disabled this turn:', err.message);
}
// 4. Retrieval — skipped entirely on contentless social turns (greetings,
// sign-offs). On those, recent history alone is the right context; running
// semantic/keyword/entity retrieval only surfaces marginal noise the model
// then confabulates around. Embed once (shared by episode + entity search).
let fusedWithScores = [];
let entityResults = [];
if (!isTrivialTurn(userMessage)) {
let queryVector = null;
try {
queryVector = await embedding.embed(userMessage);
} catch (err) {
logger.warn('[orchestration] Query embedding failed; semantic + entity search disabled this turn:', err.message);
}
// 4b. Fused retrieval + entity search in parallel (both are independent)
const [fusedWithScores, entityResults] = await Promise.all([
getFusedEpisodes(userMessage, session, recentIds, projectSessionIds, queryVector, { semanticLimit, scoreThreshold, semanticWeight, keywordWeight }),
getRelevantEntities(queryVector, session.project_id ?? null),
]);
[fusedWithScores, entityResults] = await Promise.all([
getFusedEpisodes(userMessage, session, recentIds, projectSessionIds, queryVector, { semanticLimit, scoreThreshold, semanticWeight, keywordWeight }),
getRelevantEntities(queryVector, session.project_id ?? null),
]);
} else {
logger.debug('[orchestration] Trivial turn — skipping semantic/keyword/entity retrieval');
}
// 5. Entity-linked episode IDs for scoring bonus
const entityIds = entityResults.map(e => e.id);