From bd600d98650afbd0e9204768162d43ccde0dd9a2 Mon Sep 17 00:00:00 2001 From: Storme-bit Date: Sat, 4 Apr 2026 08:08:57 -0700 Subject: [PATCH] minor constants refactoring --- packages/memory-service/src/episodic/index.js | 7 +++-- packages/memory-service/src/semantic/index.js | 29 ++++++------------- packages/shared/src/config/constants.js | 26 +++++++++++++++++ packages/shared/src/index.js | 3 +- 4 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 packages/shared/src/config/constants.js diff --git a/packages/memory-service/src/episodic/index.js b/packages/memory-service/src/episodic/index.js index 0bf3a5c..d4a757b 100644 --- a/packages/memory-service/src/episodic/index.js +++ b/packages/memory-service/src/episodic/index.js @@ -1,4 +1,5 @@ const {getDB} = require('../db'); +const { EPISODIC } = require('@nexusai/shared'); // --Sessions -------------------------------------------------- @@ -73,7 +74,7 @@ function getEpisode(id) { } // Retrieves episodes for a given session, ordered by creation time descending, with pagination -function getEpisodesBySession(sessionId, limit = 20, offset = 0) { +function getEpisodesBySession(sessionId, limit = EPISODIC.DEFAULT_PAGE_SIZE, offset = 0) { const db = getDB(); const stmt = db.prepare(` SELECT * FROM episodes @@ -85,7 +86,7 @@ function getEpisodesBySession(sessionId, limit = 20, offset = 0) { } // Retrieves recent episodes across all sessions, ordered by creation time descending, with a limit -function getRecentEpisodes(limit = 10) { +function getRecentEpisodes(limit = EPISODIC.DEFAULT_RECENT_LIMIT) { // Cross-session recent episodes — useful for recency-based retrieval const db = getDB(); const stmt = db.prepare(` @@ -98,7 +99,7 @@ function getRecentEpisodes(limit = 10) { // Searches episodes using FTS5 full-text search, ordered by relevance, with a limit -function searchEpisodes(query, limit = 10) { +function searchEpisodes(query, limit = EPISODIC.DEFAULT_SEARCH_LIMIT) { // FTS5 full-text search across all episodes const db = getDB(); const stmt = db.prepare(` diff --git a/packages/memory-service/src/semantic/index.js b/packages/memory-service/src/semantic/index.js index de5ea60..521c4fa 100644 --- a/packages/memory-service/src/semantic/index.js +++ b/packages/memory-service/src/semantic/index.js @@ -1,27 +1,17 @@ const {QdrantClient} = require('@qdrant/js-client-rest'); -const {getEnv} = require('@nexusai/shared'); +const {QDRANT, COLLECTIONS, getEnv} = require('@nexusai/shared'); let client; // ********** QDrant Client ********** function getClient(){ if(!client){ - const url = getEnv('QDrant_URL', 'http://localhost:6333'); - client = new QdrantClient({url}); + client = new QdrantClient({url: getEnv('QDRANT_URL', QDRANT.DEFAULT_URL)}); } return client; } // ********** Collections ********** -const COLLECTIONS = { - EPISODES: 'episodes', - ENTITIES: 'entities', - SUMMARIES: 'summaries' -}; - -// Vectoir size much match the embedding model output dimension -// nomic-embed-text outputs 768 dimensions -const VECTOR_SIZE = 768; async function initCollections() { const client = getClient(); @@ -29,9 +19,9 @@ async function initCollections() { const exists = await collectionExists(name); if (!exists) { await client.createCollection(name, { - vectors: { - size: VECTOR_SIZE, - distance: 'Cosine' // Cosine similarity — best for text embeddings + vectors: { + size: QDRANT.VECTOR_SIZE, + distance: QDRANT.DISTANCE_METRIC } }); console.log(`Created Qdrant collection: ${name}`); @@ -77,7 +67,7 @@ async function upsertSummary(id, vector, payload={}) { } //********** Search Vectors ********** */ -async function searchCollection(collection, vector, limit = 10, filter = null){ +async function searchCollection(collection, vector, limit = QDRANT.DEFAULT_LIMIT, filter = null){ const client = getClient(); const params = {vector,limit, with_payload: true}; @@ -85,13 +75,13 @@ async function searchCollection(collection, vector, limit = 10, filter = null){ return client.search(collection, params); } -async function searchEpisodes(vector, limit = 10, filter = null) { +async function searchEpisodes(vector, limit = QDRANT.DEFAULT_LIMIT, filter = null) { return searchCollection(COLLECTIONS.EPISODES, vector, limit, filter); } -async function searchEntities(vector, limit = 10, filter = null) { +async function searchEntities(vector, limit = QDRANT.DEFAULT_LIMIT, filter = null) { return searchCollection(COLLECTIONS.ENTITIES, vector, limit, filter); } -async function searchSummaries(vector, limit = 10, filter = null) { +async function searchSummaries(vector, limit = QDRANT.DEFAULT_LIMIT, filter = null) { return searchCollection(COLLECTIONS.SUMMARIES, vector, limit, filter); } @@ -106,7 +96,6 @@ async function deleteVector(collection, id) { } module.exports = { - COLLECTIONS, initCollections, upsertEpisode, upsertEntity, diff --git a/packages/shared/src/config/constants.js b/packages/shared/src/config/constants.js new file mode 100644 index 0000000..657f6d0 --- /dev/null +++ b/packages/shared/src/config/constants.js @@ -0,0 +1,26 @@ +//A store for tunables and constants used across the codebase, to avoid magic numbers and hardcoded values + +const QDRANT = { + DEFAULT_URL: 'http://localhost:6333', + VECTOR_SIZE: 768, // Must match the output dimension of the embedding model (e.g. nomic-embed-text) + DISTANCE_METRIC: 'Cosine', // Best for normalized embeddings like text vectors + DEFAULT_LIMIT: 10, //Default top-=k for vector searches +}; + +const COLLECTIONS = { + EPISODES: 'episodes', + ENTITIES: 'entities', + SUMMARIES: 'summaries' +}; + +const EPISODIC = { + DEFAULT_RECENT_LIMIT: 10, // Default number of recent episodes to retrieve + DEFAULT_PAGE_SIZE: 20, // Default number of episodes per page for pagination + DEFAULT_SEARCH_LIMIT: 10, // Default number of search results to return +}; + +module.exports = { + QDRANT, + COLLECTIONS, + EPISODIC +}; \ No newline at end of file diff --git a/packages/shared/src/index.js b/packages/shared/src/index.js index ddbe26a..fcda50a 100644 --- a/packages/shared/src/index.js +++ b/packages/shared/src/index.js @@ -1,3 +1,4 @@ const {getEnv} = require('./config/env'); +const {QDRANT, COLLECTIONS, EPISODIC } = require('./config/constants'); -module.exports = {getEnv}; \ No newline at end of file +module.exports = {getEnv, QDRANT, COLLECTIONS, EPISODIC}; \ No newline at end of file