Merge Memory V2 runtime facade
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
const DEFAULT_DIMENSIONS = 3;
|
||||
|
||||
function resolveDimensions(value) {
|
||||
const dimensions = Number(value ?? process.env.MEMORY_V2_LOCAL_EMBEDDING_DIMENSIONS ?? DEFAULT_DIMENSIONS);
|
||||
if (!Number.isInteger(dimensions) || dimensions < 1 || dimensions > 4096) {
|
||||
throw new Error(`Invalid MEMORY_V2_LOCAL_EMBEDDING_DIMENSIONS: ${value}`);
|
||||
}
|
||||
return dimensions;
|
||||
}
|
||||
|
||||
function hashToken(token) {
|
||||
let hash = 2166136261;
|
||||
for (const char of String(token)) {
|
||||
hash ^= char.codePointAt(0);
|
||||
hash = Math.imul(hash, 16777619);
|
||||
}
|
||||
return hash >>> 0;
|
||||
}
|
||||
|
||||
function tokenize(text) {
|
||||
return String(text ?? '')
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9\u4e00-\u9fa5]+/gu, ' ')
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
export function embedText(text, { dimensions = undefined } = {}) {
|
||||
const resolvedDimensions = resolveDimensions(dimensions);
|
||||
const vector = Array.from({ length: resolvedDimensions }, () => 0);
|
||||
const tokens = tokenize(text);
|
||||
for (const token of tokens.length ? tokens : ['empty']) {
|
||||
const hash = hashToken(token);
|
||||
const index = hash % resolvedDimensions;
|
||||
const sign = hash & 1 ? 1 : -1;
|
||||
vector[index] += sign * (1 + (token.length % 7));
|
||||
}
|
||||
const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0)) || 1;
|
||||
return vector.map((value) => Number((value / norm).toFixed(8)));
|
||||
}
|
||||
|
||||
export async function embedQuery(query, input = {}) {
|
||||
return embedText(query, {
|
||||
dimensions: input.dimensions ?? input.embeddingDimensions,
|
||||
});
|
||||
}
|
||||
|
||||
export default embedQuery;
|
||||
Reference in New Issue
Block a user