mem-os-python 1.6.27__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mem_os_python-1.6.27.dist-info/METADATA +1032 -0
- mem_os_python-1.6.27.dist-info/RECORD +253 -0
- mem_os_python-1.6.27.dist-info/WHEEL +4 -0
- mem_os_python-1.6.27.dist-info/entry_points.txt +2 -0
- mem_os_python-1.6.27.dist-info/licenses/LICENSE +21 -0
- memos/__init__.py +16 -0
- memos/_js/adapters/anthropic.d.ts +279 -0
- memos/_js/adapters/anthropic.d.ts.map +1 -0
- memos/_js/adapters/anthropic.js +348 -0
- memos/_js/adapters/anthropic.js.map +1 -0
- memos/_js/adapters/base.d.ts +10 -0
- memos/_js/adapters/base.d.ts.map +1 -0
- memos/_js/adapters/base.js +2 -0
- memos/_js/adapters/base.js.map +1 -0
- memos/_js/adapters/openai.d.ts +264 -0
- memos/_js/adapters/openai.d.ts.map +1 -0
- memos/_js/adapters/openai.js +342 -0
- memos/_js/adapters/openai.js.map +1 -0
- memos/_js/apps/explorer.d.ts +244 -0
- memos/_js/apps/explorer.d.ts.map +1 -0
- memos/_js/apps/explorer.js +738 -0
- memos/_js/apps/explorer.js.map +1 -0
- memos/_js/citations.d.ts +65 -0
- memos/_js/citations.d.ts.map +1 -0
- memos/_js/citations.js +143 -0
- memos/_js/citations.js.map +1 -0
- memos/_js/cli-browse.d.ts +3 -0
- memos/_js/cli-browse.d.ts.map +1 -0
- memos/_js/cli-browse.js +129 -0
- memos/_js/cli-browse.js.map +1 -0
- memos/_js/cli-completion.d.ts +31 -0
- memos/_js/cli-completion.d.ts.map +1 -0
- memos/_js/cli-completion.js +340 -0
- memos/_js/cli-completion.js.map +1 -0
- memos/_js/cli-help.d.ts +18 -0
- memos/_js/cli-help.d.ts.map +1 -0
- memos/_js/cli-help.js +357 -0
- memos/_js/cli-help.js.map +1 -0
- memos/_js/cli.d.ts +28 -0
- memos/_js/cli.d.ts.map +1 -0
- memos/_js/cli.js +2880 -0
- memos/_js/cli.js.map +1 -0
- memos/_js/compression.d.ts +25 -0
- memos/_js/compression.d.ts.map +1 -0
- memos/_js/compression.js +319 -0
- memos/_js/compression.js.map +1 -0
- memos/_js/confidence-machine.d.ts +99 -0
- memos/_js/confidence-machine.d.ts.map +1 -0
- memos/_js/confidence-machine.js +222 -0
- memos/_js/confidence-machine.js.map +1 -0
- memos/_js/context-pack.d.ts +506 -0
- memos/_js/context-pack.d.ts.map +1 -0
- memos/_js/context-pack.js +1435 -0
- memos/_js/context-pack.js.map +1 -0
- memos/_js/contradictions.d.ts +160 -0
- memos/_js/contradictions.d.ts.map +1 -0
- memos/_js/contradictions.js +255 -0
- memos/_js/contradictions.js.map +1 -0
- memos/_js/dashboard.d.ts +30 -0
- memos/_js/dashboard.d.ts.map +1 -0
- memos/_js/dashboard.js +302 -0
- memos/_js/dashboard.js.map +1 -0
- memos/_js/ebbinghaus.d.ts +29 -0
- memos/_js/ebbinghaus.d.ts.map +1 -0
- memos/_js/ebbinghaus.js +32 -0
- memos/_js/ebbinghaus.js.map +1 -0
- memos/_js/embedding-queue.d.ts +190 -0
- memos/_js/embedding-queue.d.ts.map +1 -0
- memos/_js/embedding-queue.js +316 -0
- memos/_js/embedding-queue.js.map +1 -0
- memos/_js/embeddings.d.ts +187 -0
- memos/_js/embeddings.d.ts.map +1 -0
- memos/_js/embeddings.js +633 -0
- memos/_js/embeddings.js.map +1 -0
- memos/_js/entity-extraction.d.ts +54 -0
- memos/_js/entity-extraction.d.ts.map +1 -0
- memos/_js/entity-extraction.js +325 -0
- memos/_js/entity-extraction.js.map +1 -0
- memos/_js/entity-index.d.ts +93 -0
- memos/_js/entity-index.d.ts.map +1 -0
- memos/_js/entity-index.js +165 -0
- memos/_js/entity-index.js.map +1 -0
- memos/_js/event-memory.d.ts +147 -0
- memos/_js/event-memory.d.ts.map +1 -0
- memos/_js/event-memory.js +290 -0
- memos/_js/event-memory.js.map +1 -0
- memos/_js/external-import.d.ts +98 -0
- memos/_js/external-import.d.ts.map +1 -0
- memos/_js/external-import.js +669 -0
- memos/_js/external-import.js.map +1 -0
- memos/_js/fidelity.d.ts +367 -0
- memos/_js/fidelity.d.ts.map +1 -0
- memos/_js/fidelity.js +911 -0
- memos/_js/fidelity.js.map +1 -0
- memos/_js/graph-expansion.d.ts +119 -0
- memos/_js/graph-expansion.d.ts.map +1 -0
- memos/_js/graph-expansion.js +213 -0
- memos/_js/graph-expansion.js.map +1 -0
- memos/_js/graph-mermaid.d.ts +13 -0
- memos/_js/graph-mermaid.d.ts.map +1 -0
- memos/_js/graph-mermaid.js +32 -0
- memos/_js/graph-mermaid.js.map +1 -0
- memos/_js/graph.d.ts +170 -0
- memos/_js/graph.d.ts.map +1 -0
- memos/_js/graph.js +482 -0
- memos/_js/graph.js.map +1 -0
- memos/_js/harness.d.ts +63 -0
- memos/_js/harness.d.ts.map +1 -0
- memos/_js/harness.js +93 -0
- memos/_js/harness.js.map +1 -0
- memos/_js/importance.d.ts +118 -0
- memos/_js/importance.d.ts.map +1 -0
- memos/_js/importance.js +144 -0
- memos/_js/importance.js.map +1 -0
- memos/_js/index.d.ts +51 -0
- memos/_js/index.d.ts.map +1 -0
- memos/_js/index.js +53 -0
- memos/_js/index.js.map +1 -0
- memos/_js/mcp.d.ts +58 -0
- memos/_js/mcp.d.ts.map +1 -0
- memos/_js/mcp.js +1853 -0
- memos/_js/mcp.js.map +1 -0
- memos/_js/memory.d.ts +1762 -0
- memos/_js/memory.d.ts.map +1 -0
- memos/_js/memory.js +6283 -0
- memos/_js/memory.js.map +1 -0
- memos/_js/procedural.d.ts +74 -0
- memos/_js/procedural.d.ts.map +1 -0
- memos/_js/procedural.js +125 -0
- memos/_js/procedural.js.map +1 -0
- memos/_js/project-config.d.ts +68 -0
- memos/_js/project-config.d.ts.map +1 -0
- memos/_js/project-config.js +59 -0
- memos/_js/project-config.js.map +1 -0
- memos/_js/proof-of-forgetting.d.ts +57 -0
- memos/_js/proof-of-forgetting.d.ts.map +1 -0
- memos/_js/proof-of-forgetting.js +80 -0
- memos/_js/proof-of-forgetting.js.map +1 -0
- memos/_js/provenance.d.ts +122 -0
- memos/_js/provenance.d.ts.map +1 -0
- memos/_js/provenance.js +182 -0
- memos/_js/provenance.js.map +1 -0
- memos/_js/quarantine-commands.d.ts +23 -0
- memos/_js/quarantine-commands.d.ts.map +1 -0
- memos/_js/quarantine-commands.js +42 -0
- memos/_js/quarantine-commands.js.map +1 -0
- memos/_js/quarantine.d.ts +120 -0
- memos/_js/quarantine.d.ts.map +1 -0
- memos/_js/quarantine.js +873 -0
- memos/_js/quarantine.js.map +1 -0
- memos/_js/redact.d.ts +12 -0
- memos/_js/redact.d.ts.map +1 -0
- memos/_js/redact.js +26 -0
- memos/_js/redact.js.map +1 -0
- memos/_js/repl.d.ts +57 -0
- memos/_js/repl.d.ts.map +1 -0
- memos/_js/repl.js +295 -0
- memos/_js/repl.js.map +1 -0
- memos/_js/rerank-local.d.ts +61 -0
- memos/_js/rerank-local.d.ts.map +1 -0
- memos/_js/rerank-local.js +210 -0
- memos/_js/rerank-local.js.map +1 -0
- memos/_js/retain-filter.d.ts +98 -0
- memos/_js/retain-filter.d.ts.map +1 -0
- memos/_js/retain-filter.js +232 -0
- memos/_js/retain-filter.js.map +1 -0
- memos/_js/retrieval.d.ts +265 -0
- memos/_js/retrieval.d.ts.map +1 -0
- memos/_js/retrieval.js +1018 -0
- memos/_js/retrieval.js.map +1 -0
- memos/_js/revert.d.ts +77 -0
- memos/_js/revert.d.ts.map +1 -0
- memos/_js/revert.js +252 -0
- memos/_js/revert.js.map +1 -0
- memos/_js/scope.d.ts +30 -0
- memos/_js/scope.d.ts.map +1 -0
- memos/_js/scope.js +71 -0
- memos/_js/scope.js.map +1 -0
- memos/_js/semantic-screen.d.ts +152 -0
- memos/_js/semantic-screen.d.ts.map +1 -0
- memos/_js/semantic-screen.js +290 -0
- memos/_js/semantic-screen.js.map +1 -0
- memos/_js/session-hooks.d.ts +127 -0
- memos/_js/session-hooks.d.ts.map +1 -0
- memos/_js/session-hooks.js +482 -0
- memos/_js/session-hooks.js.map +1 -0
- memos/_js/storage/sqlite.d.ts +427 -0
- memos/_js/storage/sqlite.d.ts.map +1 -0
- memos/_js/storage/sqlite.js +2428 -0
- memos/_js/storage/sqlite.js.map +1 -0
- memos/_js/sync.d.ts +213 -0
- memos/_js/sync.d.ts.map +1 -0
- memos/_js/sync.js +389 -0
- memos/_js/sync.js.map +1 -0
- memos/_js/tamper-log.d.ts +98 -0
- memos/_js/tamper-log.d.ts.map +1 -0
- memos/_js/tamper-log.js +327 -0
- memos/_js/tamper-log.js.map +1 -0
- memos/_js/temporal.d.ts +92 -0
- memos/_js/temporal.d.ts.map +1 -0
- memos/_js/temporal.js +536 -0
- memos/_js/temporal.js.map +1 -0
- memos/_js/time-travel.d.ts +38 -0
- memos/_js/time-travel.d.ts.map +1 -0
- memos/_js/time-travel.js +46 -0
- memos/_js/time-travel.js.map +1 -0
- memos/_js/timestamp-format.d.ts +18 -0
- memos/_js/timestamp-format.d.ts.map +1 -0
- memos/_js/timestamp-format.js +52 -0
- memos/_js/timestamp-format.js.map +1 -0
- memos/_js/triple-extraction.d.ts +31 -0
- memos/_js/triple-extraction.d.ts.map +1 -0
- memos/_js/triple-extraction.js +116 -0
- memos/_js/triple-extraction.js.map +1 -0
- memos/_js/types.d.ts +2474 -0
- memos/_js/types.d.ts.map +1 -0
- memos/_js/types.js +20 -0
- memos/_js/types.js.map +1 -0
- memos/_js/updater.d.ts +95 -0
- memos/_js/updater.d.ts.map +1 -0
- memos/_js/updater.js +268 -0
- memos/_js/updater.js.map +1 -0
- memos/_js/version.d.ts +17 -0
- memos/_js/version.d.ts.map +1 -0
- memos/_js/version.js +34 -0
- memos/_js/version.js.map +1 -0
- memos/_js/vision/clip-query-cache.d.ts +58 -0
- memos/_js/vision/clip-query-cache.d.ts.map +1 -0
- memos/_js/vision/clip-query-cache.js +79 -0
- memos/_js/vision/clip-query-cache.js.map +1 -0
- memos/_js/vision/clip.d.ts +113 -0
- memos/_js/vision/clip.d.ts.map +1 -0
- memos/_js/vision/clip.js +224 -0
- memos/_js/vision/clip.js.map +1 -0
- memos/_js/vision/fake-clip.d.ts +55 -0
- memos/_js/vision/fake-clip.d.ts.map +1 -0
- memos/_js/vision/fake-clip.js +122 -0
- memos/_js/vision/fake-clip.js.map +1 -0
- memos/_js/vision/index.d.ts +15 -0
- memos/_js/vision/index.d.ts.map +1 -0
- memos/_js/vision/index.js +13 -0
- memos/_js/vision/index.js.map +1 -0
- memos/_js/vision/store.d.ts +137 -0
- memos/_js/vision/store.d.ts.map +1 -0
- memos/_js/vision/store.js +383 -0
- memos/_js/vision/store.js.map +1 -0
- memos/adapters/__init__.py +0 -0
- memos/adapters/crewai.py +385 -0
- memos/adapters/langchain.py +301 -0
- memos/adapters/ollama.py +396 -0
- memos/server/__init__.py +0 -0
- memos/server/main.py +547 -0
- memos/server/routes.py +360 -0
memos/_js/embeddings.js
ADDED
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip all trailing slash characters from a URL/base path without using a
|
|
3
|
+
* regular expression. Avoids a ReDoS-flagged `/+$/` pattern on user-supplied
|
|
4
|
+
* input (CodeQL js/regular-expression-polynomial-redos).
|
|
5
|
+
*/
|
|
6
|
+
export function stripTrailingSlashes(url) {
|
|
7
|
+
let result = url;
|
|
8
|
+
while (result.endsWith("/")) {
|
|
9
|
+
result = result.slice(0, -1);
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
const DEFAULT_DIMENSIONS = 384;
|
|
14
|
+
const SYNONYMS = {
|
|
15
|
+
// Preference language
|
|
16
|
+
prefer: ["like", "favor", "preference"],
|
|
17
|
+
prefers: ["like", "likes", "preference"],
|
|
18
|
+
preference: ["prefer", "like", "likes"],
|
|
19
|
+
preferences: ["prefer", "likes", "favorite"],
|
|
20
|
+
likes: ["prefer", "preference", "favorite"],
|
|
21
|
+
favorite: ["favourite", "preferred", "likes"],
|
|
22
|
+
// UI / appearance
|
|
23
|
+
dark: ["night", "black", "dim"],
|
|
24
|
+
theme: ["mode", "ui", "appearance"],
|
|
25
|
+
themes: ["mode", "ui", "appearance"],
|
|
26
|
+
mode: ["theme", "ui", "appearance"],
|
|
27
|
+
// Memory vocabulary
|
|
28
|
+
remember: ["memory", "recall"],
|
|
29
|
+
remembers: ["memory", "recall"],
|
|
30
|
+
memories: ["memory", "recall"],
|
|
31
|
+
// Tasks
|
|
32
|
+
todo: ["task", "action"],
|
|
33
|
+
tasks: ["todo", "action"],
|
|
34
|
+
// Exercise & fitness — paraphrases like "exercise routine" must reach
|
|
35
|
+
// memories phrased as "runs 5k three times a week".
|
|
36
|
+
exercise: ["workout", "training", "fitness", "runs", "running", "gym"],
|
|
37
|
+
exercises: ["workout", "training", "fitness", "running"],
|
|
38
|
+
workout: ["exercise", "training", "fitness", "gym"],
|
|
39
|
+
runs: ["running", "jogging", "exercise"],
|
|
40
|
+
running: ["runs", "jogging", "exercise"],
|
|
41
|
+
routine: ["schedule", "habit", "regular"],
|
|
42
|
+
routines: ["schedule", "habit", "regular"],
|
|
43
|
+
habit: ["routine", "regular"],
|
|
44
|
+
habits: ["routine", "regular"],
|
|
45
|
+
gym: ["workout", "exercise", "fitness"],
|
|
46
|
+
// Reading & books — "book author preferences" must reach "reads sci-fi,
|
|
47
|
+
// especially Le Guin".
|
|
48
|
+
book: ["books", "reads", "reading", "novel", "author", "literature"],
|
|
49
|
+
books: ["book", "reading", "novel", "literature"],
|
|
50
|
+
author: ["writer", "novelist", "book", "books"],
|
|
51
|
+
authors: ["writers", "book", "books"],
|
|
52
|
+
reads: ["reading", "book", "books"],
|
|
53
|
+
reading: ["reads", "book", "books"],
|
|
54
|
+
novel: ["book", "fiction", "literature"],
|
|
55
|
+
// Media
|
|
56
|
+
podcast: ["show", "audio", "episode"],
|
|
57
|
+
music: ["song", "songs", "listening"],
|
|
58
|
+
// Travel
|
|
59
|
+
vacation: ["trip", "travel", "holiday"],
|
|
60
|
+
holiday: ["vacation", "trip", "travel"],
|
|
61
|
+
trip: ["travel", "vacation", "journey"],
|
|
62
|
+
travel: ["trip", "vacation", "journey"],
|
|
63
|
+
// Work
|
|
64
|
+
job: ["work", "employment", "company", "employer", "career"],
|
|
65
|
+
works: ["work", "job", "employment"],
|
|
66
|
+
company: ["employer", "workplace", "business"],
|
|
67
|
+
employer: ["company", "workplace"],
|
|
68
|
+
career: ["job", "work", "profession"],
|
|
69
|
+
// Relationships & family
|
|
70
|
+
partner: ["spouse", "wife", "husband", "girlfriend", "boyfriend"],
|
|
71
|
+
siblings: ["sister", "brother", "family"],
|
|
72
|
+
sibling: ["sister", "brother", "family"],
|
|
73
|
+
sister: ["sibling", "family"],
|
|
74
|
+
brother: ["sibling", "family"],
|
|
75
|
+
// Health
|
|
76
|
+
allergies: ["allergic", "allergy", "intolerance", "reaction"],
|
|
77
|
+
allergy: ["allergic", "intolerance"],
|
|
78
|
+
allergic: ["allergy", "intolerance"],
|
|
79
|
+
health: ["healthy", "wellness", "medical"],
|
|
80
|
+
// Transport
|
|
81
|
+
transportation: ["transport", "commute", "commuting"],
|
|
82
|
+
commute: ["commuting", "transport"],
|
|
83
|
+
bike: ["bicycle", "cycling"],
|
|
84
|
+
bicycle: ["bike", "cycling"],
|
|
85
|
+
// Hobbies & games
|
|
86
|
+
hobby: ["hobbies", "pastime", "interest"],
|
|
87
|
+
hobbies: ["hobby", "pastime", "interests"],
|
|
88
|
+
games: ["game", "gaming", "playing"],
|
|
89
|
+
gaming: ["games", "playing"],
|
|
90
|
+
skill: ["level", "rating", "ability"],
|
|
91
|
+
rating: ["score", "rank", "level"],
|
|
92
|
+
// Instruments
|
|
93
|
+
instrument: ["piano", "guitar", "musical"],
|
|
94
|
+
piano: ["instrument", "keyboard", "musical"],
|
|
95
|
+
guitar: ["instrument", "musical"],
|
|
96
|
+
// Pets
|
|
97
|
+
dog: ["pet", "puppy"],
|
|
98
|
+
cat: ["pet", "kitten"],
|
|
99
|
+
pet: ["dog", "cat", "animal"],
|
|
100
|
+
// Food & drink
|
|
101
|
+
coffee: ["espresso", "caffeine"],
|
|
102
|
+
drinks: ["drink", "beverage"],
|
|
103
|
+
};
|
|
104
|
+
function tokenize(text) {
|
|
105
|
+
return text
|
|
106
|
+
.toLowerCase()
|
|
107
|
+
.normalize("NFKD")
|
|
108
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
109
|
+
.split(/[^a-z0-9]+/)
|
|
110
|
+
.filter((token) => token.length > 1);
|
|
111
|
+
}
|
|
112
|
+
function hashToken(token) {
|
|
113
|
+
let hash = 2166136261;
|
|
114
|
+
for (let index = 0; index < token.length; index += 1) {
|
|
115
|
+
hash ^= token.charCodeAt(index);
|
|
116
|
+
hash = Math.imul(hash, 16777619);
|
|
117
|
+
}
|
|
118
|
+
return hash >>> 0;
|
|
119
|
+
}
|
|
120
|
+
function addFeature(vector, feature, weight) {
|
|
121
|
+
const hash = hashToken(feature);
|
|
122
|
+
const index = hash % vector.length;
|
|
123
|
+
const sign = hash & 1 ? 1 : -1;
|
|
124
|
+
vector[index] += sign * weight;
|
|
125
|
+
}
|
|
126
|
+
export function normalizeVector(vector) {
|
|
127
|
+
const norm = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0));
|
|
128
|
+
if (norm === 0)
|
|
129
|
+
return vector;
|
|
130
|
+
return vector.map((value) => value / norm);
|
|
131
|
+
}
|
|
132
|
+
export function cosineSimilarity(a, b) {
|
|
133
|
+
const length = Math.min(a.length, b.length);
|
|
134
|
+
if (length === 0)
|
|
135
|
+
return 0;
|
|
136
|
+
let dot = 0;
|
|
137
|
+
let aNorm = 0;
|
|
138
|
+
let bNorm = 0;
|
|
139
|
+
for (let index = 0; index < length; index += 1) {
|
|
140
|
+
dot += a[index] * b[index];
|
|
141
|
+
aNorm += a[index] * a[index];
|
|
142
|
+
bNorm += b[index] * b[index];
|
|
143
|
+
}
|
|
144
|
+
if (aNorm === 0 || bNorm === 0)
|
|
145
|
+
return 0;
|
|
146
|
+
return dot / Math.sqrt(aNorm * bNorm);
|
|
147
|
+
}
|
|
148
|
+
export class LocalHashEmbeddingProvider {
|
|
149
|
+
id = "local-hash";
|
|
150
|
+
model;
|
|
151
|
+
dimensions;
|
|
152
|
+
constructor(options = {}) {
|
|
153
|
+
this.dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;
|
|
154
|
+
this.model = options.model ?? `local-hash-${this.dimensions}`;
|
|
155
|
+
}
|
|
156
|
+
async embed(text) {
|
|
157
|
+
const vector = Array.from({ length: this.dimensions }, () => 0);
|
|
158
|
+
const tokens = tokenize(text);
|
|
159
|
+
const uniqueTokens = [...new Set(tokens)];
|
|
160
|
+
for (const token of uniqueTokens) {
|
|
161
|
+
addFeature(vector, `tok:${token}`, 1);
|
|
162
|
+
for (let length = 3; length <= Math.min(token.length, 5); length += 1) {
|
|
163
|
+
for (let index = 0; index <= token.length - length; index += 1) {
|
|
164
|
+
addFeature(vector, `ng:${token.slice(index, index + length)}`, 0.12);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
for (const synonym of SYNONYMS[token] ?? []) {
|
|
168
|
+
addFeature(vector, `tok:${synonym}`, 0.45);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
172
|
+
addFeature(vector, `bi:${tokens[index]}:${tokens[index + 1]}`, 0.35);
|
|
173
|
+
}
|
|
174
|
+
return normalizeVector(vector);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export class OllamaEmbeddingProvider {
|
|
178
|
+
id = "ollama";
|
|
179
|
+
model;
|
|
180
|
+
dimensions;
|
|
181
|
+
baseUrl;
|
|
182
|
+
queryPrefix;
|
|
183
|
+
documentPrefix;
|
|
184
|
+
constructor(options = {}) {
|
|
185
|
+
this.baseUrl = stripTrailingSlashes(options.baseUrl ?? "http://127.0.0.1:11434");
|
|
186
|
+
this.model = options.model ?? "nomic-embed-text";
|
|
187
|
+
this.dimensions = options.dimensions ?? 768;
|
|
188
|
+
this.queryPrefix = options.queryPrefix ?? "";
|
|
189
|
+
this.documentPrefix = options.documentPrefix ?? "";
|
|
190
|
+
}
|
|
191
|
+
async callEmbed(input) {
|
|
192
|
+
const response = await fetch(`${this.baseUrl}/api/embed`, {
|
|
193
|
+
method: "POST",
|
|
194
|
+
headers: { "Content-Type": "application/json" },
|
|
195
|
+
body: JSON.stringify({ model: this.model, input }),
|
|
196
|
+
});
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
throw new Error(`Ollama embedding request failed: ${response.status} ${response.statusText}`);
|
|
199
|
+
}
|
|
200
|
+
const payload = (await response.json());
|
|
201
|
+
const vectors = payload.embeddings ??
|
|
202
|
+
(payload.embedding ? [payload.embedding] : undefined);
|
|
203
|
+
if (!Array.isArray(vectors)) {
|
|
204
|
+
throw new Error("Ollama embedding response did not include a vector.");
|
|
205
|
+
}
|
|
206
|
+
if (Array.isArray(input) && vectors.length !== input.length) {
|
|
207
|
+
throw new Error(`Ollama embedding response length mismatch: got ${vectors.length}, expected ${input.length}.`);
|
|
208
|
+
}
|
|
209
|
+
return vectors.map((v) => normalizeVector(v));
|
|
210
|
+
}
|
|
211
|
+
async embed(text) {
|
|
212
|
+
const input = this.documentPrefix ? `${this.documentPrefix}${text}` : text;
|
|
213
|
+
return this.callEmbed(input).then((v) => v[0]);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Query embedding applies the configured `queryPrefix`, when set, so the
|
|
217
|
+
* retrieval question is embedded in the model's query mode. Documents are
|
|
218
|
+
* embedded WITHOUT the prefix (plain indexing text).
|
|
219
|
+
*/
|
|
220
|
+
embedQuery(text) {
|
|
221
|
+
const input = this.queryPrefix ? `${this.queryPrefix}${text}` : text;
|
|
222
|
+
return this.callEmbed(input).then((v) => v[0]);
|
|
223
|
+
}
|
|
224
|
+
async batchEmbed(texts) {
|
|
225
|
+
const input = this.documentPrefix
|
|
226
|
+
? texts.map((t) => `${this.documentPrefix}${t}`)
|
|
227
|
+
: texts;
|
|
228
|
+
return this.callEmbed(input);
|
|
229
|
+
}
|
|
230
|
+
async embedDocuments(texts) {
|
|
231
|
+
if (texts.length === 1) {
|
|
232
|
+
return this.embed(texts[0]).then((v) => [v]);
|
|
233
|
+
}
|
|
234
|
+
return this.batchEmbed(texts);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export class OpenAICompatibleEmbeddingProvider {
|
|
238
|
+
id = "openai-compatible";
|
|
239
|
+
model;
|
|
240
|
+
dimensions;
|
|
241
|
+
baseUrl;
|
|
242
|
+
apiKey;
|
|
243
|
+
queryPrefix;
|
|
244
|
+
documentPrefix;
|
|
245
|
+
constructor(options) {
|
|
246
|
+
this.baseUrl = stripTrailingSlashes(options.baseUrl ?? "https://api.openai.com/v1");
|
|
247
|
+
this.apiKey = options.apiKey ?? "";
|
|
248
|
+
this.model = options.model ?? "text-embedding-3-small";
|
|
249
|
+
this.dimensions = options.dimensions ?? 1536;
|
|
250
|
+
this.queryPrefix = options.queryPrefix ?? "";
|
|
251
|
+
this.documentPrefix = options.documentPrefix ?? "";
|
|
252
|
+
}
|
|
253
|
+
async callEmbeddings(input) {
|
|
254
|
+
const headers = new Headers({ "Content-Type": "application/json" });
|
|
255
|
+
if (this.apiKey)
|
|
256
|
+
headers.set("Authorization", `Bearer ${this.apiKey}`);
|
|
257
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
258
|
+
method: "POST",
|
|
259
|
+
headers,
|
|
260
|
+
body: JSON.stringify({ model: this.model, input }),
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
throw new Error(`Embedding request failed: ${response.status} ${response.statusText}`);
|
|
264
|
+
}
|
|
265
|
+
const payload = (await response.json());
|
|
266
|
+
if (!Array.isArray(payload.data)) {
|
|
267
|
+
throw new Error("Embedding response did not include a `data` array.");
|
|
268
|
+
}
|
|
269
|
+
if (payload.data.length !== input.length) {
|
|
270
|
+
throw new Error(`Embedding response length mismatch: got ${payload.data.length}, expected ${input.length}.`);
|
|
271
|
+
}
|
|
272
|
+
return payload.data.map((row) => {
|
|
273
|
+
if (!Array.isArray(row.embedding)) {
|
|
274
|
+
throw new Error("Embedding response contained a non-vector entry.");
|
|
275
|
+
}
|
|
276
|
+
return normalizeVector(row.embedding);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
async embed(text) {
|
|
280
|
+
const input = this.documentPrefix ? `${this.documentPrefix}${text}` : text;
|
|
281
|
+
return this.callEmbeddings([input]).then((v) => v[0]);
|
|
282
|
+
}
|
|
283
|
+
embedQuery(text) {
|
|
284
|
+
const input = this.queryPrefix ? `${this.queryPrefix}${text}` : text;
|
|
285
|
+
return this.callEmbeddings([input]).then((v) => v[0]);
|
|
286
|
+
}
|
|
287
|
+
async batchEmbed(texts) {
|
|
288
|
+
const input = this.documentPrefix
|
|
289
|
+
? texts.map((t) => `${this.documentPrefix}${t}`)
|
|
290
|
+
: texts;
|
|
291
|
+
return this.callEmbeddings(input);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Voyage AI embedding provider.
|
|
296
|
+
*
|
|
297
|
+
* Voyage's `voyage-3` family is the strongest open-weight-class
|
|
298
|
+
* retrieval model we can hit over HTTP, and it's a common default
|
|
299
|
+
* for serious RAG work. The provider uses the public
|
|
300
|
+
* `https://api.voyageai.com/v1/embeddings` endpoint and Bearer auth.
|
|
301
|
+
*/
|
|
302
|
+
export class VoyageAIEmbeddingProvider {
|
|
303
|
+
id = "voyage";
|
|
304
|
+
model;
|
|
305
|
+
dimensions;
|
|
306
|
+
apiKey;
|
|
307
|
+
baseUrl;
|
|
308
|
+
constructor(options = {}) {
|
|
309
|
+
if (!options.apiKey) {
|
|
310
|
+
throw new Error("VoyageAIEmbeddingProvider requires an `apiKey` (e.g. `pa-…`).");
|
|
311
|
+
}
|
|
312
|
+
this.apiKey = options.apiKey;
|
|
313
|
+
this.model = options.model ?? "voyage-3";
|
|
314
|
+
this.dimensions = options.dimensions ?? 1024;
|
|
315
|
+
this.baseUrl = stripTrailingSlashes(options.baseUrl ?? "https://api.voyageai.com/v1");
|
|
316
|
+
}
|
|
317
|
+
async embed(text) {
|
|
318
|
+
return this.callEmbeddings([text]).then((v) => v[0]);
|
|
319
|
+
}
|
|
320
|
+
async batchEmbed(texts) {
|
|
321
|
+
return this.callEmbeddings(texts);
|
|
322
|
+
}
|
|
323
|
+
async callEmbeddings(texts) {
|
|
324
|
+
const response = await fetch(`${this.baseUrl}/embeddings`, {
|
|
325
|
+
method: "POST",
|
|
326
|
+
headers: {
|
|
327
|
+
"Content-Type": "application/json",
|
|
328
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
329
|
+
},
|
|
330
|
+
body: JSON.stringify({ model: this.model, input: texts }),
|
|
331
|
+
});
|
|
332
|
+
if (!response.ok) {
|
|
333
|
+
throw new Error(`Voyage embedding request failed: ${response.status} ${response.statusText}`);
|
|
334
|
+
}
|
|
335
|
+
const payload = (await response.json());
|
|
336
|
+
if (!Array.isArray(payload.data)) {
|
|
337
|
+
throw new Error("Voyage embedding response missing `data` array.");
|
|
338
|
+
}
|
|
339
|
+
const vectors = payload.data.map((row) => {
|
|
340
|
+
if (!Array.isArray(row.embedding)) {
|
|
341
|
+
throw new Error("Voyage embedding response contained a non-vector entry.");
|
|
342
|
+
}
|
|
343
|
+
return row.embedding;
|
|
344
|
+
});
|
|
345
|
+
if (vectors.length !== texts.length) {
|
|
346
|
+
throw new Error(`Voyage embedding response length mismatch: got ${vectors.length}, expected ${texts.length}.`);
|
|
347
|
+
}
|
|
348
|
+
return vectors.map((v) => normalizeVector(v));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
export function createEmbeddingProvider(config) {
|
|
352
|
+
if (config?.provider && typeof config.provider === "object") {
|
|
353
|
+
return config.provider;
|
|
354
|
+
}
|
|
355
|
+
const provider = config?.provider ?? "fastembed";
|
|
356
|
+
// NOTE: "fastembed" is the default because a bare `new MemOS()` should
|
|
357
|
+
// give real local semantic search. FastEmbedEmbeddingProvider lazily
|
|
358
|
+
// loads the transformers pipeline on first use and degrades loudly to
|
|
359
|
+
// the deterministic local hash when the optional peer dep isn't
|
|
360
|
+
// installed — so the default is always safe, just sometimes degraded.
|
|
361
|
+
if (provider === "ollama") {
|
|
362
|
+
return new OllamaEmbeddingProvider(config);
|
|
363
|
+
}
|
|
364
|
+
if (provider === "openai-compatible") {
|
|
365
|
+
return new OpenAICompatibleEmbeddingProvider(config ?? {});
|
|
366
|
+
}
|
|
367
|
+
if (provider === "voyage") {
|
|
368
|
+
return new VoyageAIEmbeddingProvider(config ?? {});
|
|
369
|
+
}
|
|
370
|
+
if (provider === "cohere") {
|
|
371
|
+
return new CohereEmbeddingProvider(config ?? {});
|
|
372
|
+
}
|
|
373
|
+
if (provider === "fastembed") {
|
|
374
|
+
return new FastEmbedEmbeddingProvider(config ?? {});
|
|
375
|
+
}
|
|
376
|
+
return new LocalHashEmbeddingProvider(config);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Cohere embed-v3 embedding provider.
|
|
380
|
+
*
|
|
381
|
+
* Cohere's `embed-english-v3.0` (and its multilingual sibling) is a
|
|
382
|
+
* strong default for English retrieval. The provider hits
|
|
383
|
+
* `https://api.cohere.ai/v1/embed` and returns a normalized vector.
|
|
384
|
+
*/
|
|
385
|
+
export class CohereEmbeddingProvider {
|
|
386
|
+
id = "cohere";
|
|
387
|
+
model;
|
|
388
|
+
dimensions;
|
|
389
|
+
apiKey;
|
|
390
|
+
baseUrl;
|
|
391
|
+
inputType;
|
|
392
|
+
constructor(options = {}) {
|
|
393
|
+
if (!options.apiKey) {
|
|
394
|
+
throw new Error("CohereEmbeddingProvider requires an `apiKey`.");
|
|
395
|
+
}
|
|
396
|
+
this.apiKey = options.apiKey;
|
|
397
|
+
this.model = options.model ?? "embed-english-v3.0";
|
|
398
|
+
this.dimensions = options.dimensions ?? 1024;
|
|
399
|
+
this.baseUrl = stripTrailingSlashes(options.baseUrl ?? "https://api.cohere.ai/v1");
|
|
400
|
+
// `search_document` is the right value for indexing; callers that
|
|
401
|
+
// need query-side embeddings can construct a separate provider
|
|
402
|
+
// instance with input_type=`search_query`.
|
|
403
|
+
this.inputType = options.inputType ?? "search_document";
|
|
404
|
+
}
|
|
405
|
+
async embed(text) {
|
|
406
|
+
return this.callEmbed([text]).then((v) => v[0]);
|
|
407
|
+
}
|
|
408
|
+
async batchEmbed(texts) {
|
|
409
|
+
return this.callEmbed(texts);
|
|
410
|
+
}
|
|
411
|
+
async callEmbed(texts) {
|
|
412
|
+
const response = await fetch(`${this.baseUrl}/embed`, {
|
|
413
|
+
method: "POST",
|
|
414
|
+
headers: {
|
|
415
|
+
"Content-Type": "application/json",
|
|
416
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
417
|
+
},
|
|
418
|
+
body: JSON.stringify({
|
|
419
|
+
model: this.model,
|
|
420
|
+
texts,
|
|
421
|
+
input_type: this.inputType,
|
|
422
|
+
}),
|
|
423
|
+
});
|
|
424
|
+
if (!response.ok) {
|
|
425
|
+
throw new Error(`Cohere embedding request failed: ${response.status} ${response.statusText}`);
|
|
426
|
+
}
|
|
427
|
+
const payload = (await response.json());
|
|
428
|
+
if (!Array.isArray(payload.embeddings)) {
|
|
429
|
+
throw new Error("Cohere embedding response missing `embeddings` array.");
|
|
430
|
+
}
|
|
431
|
+
if (payload.embeddings.length !== texts.length) {
|
|
432
|
+
throw new Error(`Cohere embedding response length mismatch: got ${payload.embeddings.length}, expected ${texts.length}.`);
|
|
433
|
+
}
|
|
434
|
+
return payload.embeddings.map((v) => normalizeVector(v));
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* In-process FastEmbed-style embedding provider.
|
|
439
|
+
*
|
|
440
|
+
* Tries to load `@xenova/transformers` at runtime. If the package is
|
|
441
|
+
* installed (the recommended path for real semantic quality), the
|
|
442
|
+
* provider uses the BAAI/bge-small-en-v1.5 model and runs entirely
|
|
443
|
+
* in-process — no network, no API key, ideal for air-gapped setups.
|
|
444
|
+
*
|
|
445
|
+
* If the package is not installed, falls back to a deterministic
|
|
446
|
+
* feature-hash embedding so the rest of the SDK still works for
|
|
447
|
+
* tests, CI, and offline development. The vector shape and L2 norm
|
|
448
|
+
* are identical between the two modes, so swapping in the real
|
|
449
|
+
* FastEmbed later is a no-op for downstream code.
|
|
450
|
+
*/
|
|
451
|
+
/**
|
|
452
|
+
* Warn-once flag for the FastEmbed local-hash fallback. The fallback keeps
|
|
453
|
+
* the SDK working with zero extra installs, but users deserve to know
|
|
454
|
+
* their "semantic" search is degraded — and exactly how to fix it.
|
|
455
|
+
*/
|
|
456
|
+
let warnedEmbeddingFallback = false;
|
|
457
|
+
export class FastEmbedEmbeddingProvider {
|
|
458
|
+
id = "fastembed";
|
|
459
|
+
model;
|
|
460
|
+
dimensions;
|
|
461
|
+
pipeline = null;
|
|
462
|
+
resolved = false;
|
|
463
|
+
/**
|
|
464
|
+
* Set when the transformers pipeline could NOT be loaded and the
|
|
465
|
+
* deterministic local hash fallback is serving embeddings instead.
|
|
466
|
+
* Null while unresolved or when the real model loaded fine. Exposed
|
|
467
|
+
* via `getRuntimeInfo()` so benchmarks can detect — and optionally
|
|
468
|
+
* refuse to run on — the fallback.
|
|
469
|
+
*/
|
|
470
|
+
fallbackReason = null;
|
|
471
|
+
constructor(options = {}) {
|
|
472
|
+
this.model = options.model ?? "BAAI/bge-small-en-v1.5";
|
|
473
|
+
this.dimensions = options.dimensions ?? 384;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Runtime resolution metadata. `fallbackActive` is only meaningful after
|
|
477
|
+
* the first `embed()` call (or an explicit probe) has triggered
|
|
478
|
+
* `resolve()`; before that it reports `false` with a null reason, which
|
|
479
|
+
* callers should read as "not yet known" rather than "no fallback".
|
|
480
|
+
*/
|
|
481
|
+
getRuntimeInfo() {
|
|
482
|
+
return {
|
|
483
|
+
requestedProvider: "fastembed",
|
|
484
|
+
resolvedProvider: this.fallbackReason
|
|
485
|
+
? "local-hash-fallback"
|
|
486
|
+
: "fastembed",
|
|
487
|
+
requestedModel: this.model,
|
|
488
|
+
resolvedModel: this.fallbackReason
|
|
489
|
+
? `local-hash-fallback-${this.dimensions}`
|
|
490
|
+
: this.model,
|
|
491
|
+
modelRevision: null,
|
|
492
|
+
requestedDimensions: this.dimensions,
|
|
493
|
+
observedDimensions: this.lastObservedDimensions,
|
|
494
|
+
fallbackActive: this.fallbackReason !== null,
|
|
495
|
+
fallbackReason: this.fallbackReason,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
/** Dimensions seen on the most recent embed/batchEmbed result. */
|
|
499
|
+
lastObservedDimensions = null;
|
|
500
|
+
/**
|
|
501
|
+
* Lazily resolve the transformers pipeline. We use a dynamic import so
|
|
502
|
+
* the optional dep is only paid for when (and if) the user installs it.
|
|
503
|
+
* Any failure to load silently falls back to the local hash.
|
|
504
|
+
*
|
|
505
|
+
* Tries `@huggingface/transformers` (the maintained successor) first,
|
|
506
|
+
* then falls back to the abandoned `@xenova/transformers` for users who
|
|
507
|
+
* still have it installed.
|
|
508
|
+
*/
|
|
509
|
+
async resolve() {
|
|
510
|
+
if (this.resolved)
|
|
511
|
+
return;
|
|
512
|
+
this.resolved = true;
|
|
513
|
+
try {
|
|
514
|
+
// Both packages are optional peer deps — users opt in by installing
|
|
515
|
+
// one of them. We use dynamic imports so they're only paid for when
|
|
516
|
+
// installed. Types are declared in `src/xenova-transformers.d.ts`.
|
|
517
|
+
const mod = (await import("@huggingface/transformers").catch(() => null));
|
|
518
|
+
const legacyMod = mod
|
|
519
|
+
? null
|
|
520
|
+
: (await import("@xenova/transformers").catch(() => null));
|
|
521
|
+
const resolved = mod ?? legacyMod;
|
|
522
|
+
if (!resolved) {
|
|
523
|
+
// Neither optional peer dep is installed — record WHY so
|
|
524
|
+
// `getRuntimeInfo()` can report the fallback, then fall through
|
|
525
|
+
// to the local hash. (The early return here previously skipped
|
|
526
|
+
// the missing-package reason entirely — the silent-fallback bug.)
|
|
527
|
+
this.fallbackReason =
|
|
528
|
+
"neither @huggingface/transformers nor @xenova/transformers is installed";
|
|
529
|
+
this.warnFallbackOnce();
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
const pipeline = await resolved.pipeline("feature-extraction", this.model);
|
|
533
|
+
// @huggingface/transformers v3+/v4 pipelines are callable directly;
|
|
534
|
+
// older shapes exposed `.feature`. Normalize both behind one function.
|
|
535
|
+
this.pipeline =
|
|
536
|
+
typeof pipeline === "function"
|
|
537
|
+
? pipeline
|
|
538
|
+
: (pipeline
|
|
539
|
+
.feature ?? null);
|
|
540
|
+
if (!this.pipeline) {
|
|
541
|
+
this.fallbackReason = `pipeline for model "${this.model}" exposed no callable feature-extraction interface`;
|
|
542
|
+
this.warnFallbackOnce();
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
catch (err) {
|
|
546
|
+
// Record the failure for runtime info, then fall through to the
|
|
547
|
+
// local hash. The SDK keeps its resilient default behavior — but
|
|
548
|
+
// benchmarks can now SEE the fallback instead of silently scoring it.
|
|
549
|
+
this.fallbackReason = `pipeline construction failed for model "${this.model}": ${String(err).substring(0, 200)}`;
|
|
550
|
+
this.warnFallbackOnce();
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
/**
|
|
554
|
+
* One-time loud warning when the local-hash fallback activates. Silent
|
|
555
|
+
* degradation is the worst plug-in experience: everything "works" but
|
|
556
|
+
* semantic search quietly returns garbage.
|
|
557
|
+
*/
|
|
558
|
+
warnFallbackOnce() {
|
|
559
|
+
if (warnedEmbeddingFallback)
|
|
560
|
+
return;
|
|
561
|
+
warnedEmbeddingFallback = true;
|
|
562
|
+
console.warn(`[memos] embedding fallback: ${this.fallbackReason}. ` +
|
|
563
|
+
"Semantic search is degraded to a deterministic local hash. " +
|
|
564
|
+
"For real embeddings: pnpm add @huggingface/transformers");
|
|
565
|
+
}
|
|
566
|
+
async embed(text) {
|
|
567
|
+
await this.resolve();
|
|
568
|
+
if (this.pipeline) {
|
|
569
|
+
const out = await this.pipeline(text, {
|
|
570
|
+
pooling: "mean",
|
|
571
|
+
normalize: true,
|
|
572
|
+
});
|
|
573
|
+
this.lastObservedDimensions = out.data.length;
|
|
574
|
+
return Array.from(out.data);
|
|
575
|
+
}
|
|
576
|
+
return this.fallbackEmbed(text);
|
|
577
|
+
}
|
|
578
|
+
async batchEmbed(texts) {
|
|
579
|
+
await this.resolve();
|
|
580
|
+
if (this.pipeline) {
|
|
581
|
+
// The transformers pipeline runs array input as one batched ONNX
|
|
582
|
+
// session — far cheaper than one session run per text. Batched output
|
|
583
|
+
// is a single Tensor with dims [batch, hidden]; slice it per row.
|
|
584
|
+
// Chunked to bound peak memory on large backfills.
|
|
585
|
+
const CHUNK_SIZE = 32;
|
|
586
|
+
const vectors = [];
|
|
587
|
+
for (let i = 0; i < texts.length; i += CHUNK_SIZE) {
|
|
588
|
+
const chunk = texts.slice(i, i + CHUNK_SIZE);
|
|
589
|
+
const out = await this.pipeline(chunk, {
|
|
590
|
+
pooling: "mean",
|
|
591
|
+
normalize: true,
|
|
592
|
+
});
|
|
593
|
+
const hidden = out.dims[out.dims.length - 1];
|
|
594
|
+
this.lastObservedDimensions = hidden;
|
|
595
|
+
for (let r = 0; r < chunk.length; r += 1) {
|
|
596
|
+
vectors.push(Array.from(out.data.slice(r * hidden, (r + 1) * hidden)));
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return vectors;
|
|
600
|
+
}
|
|
601
|
+
return texts.map((t) => this.fallbackEmbed(t));
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Deterministic feature-hash fallback. Produces a `dimensions`-long
|
|
605
|
+
* vector with the same shape (and L2 norm) as a real
|
|
606
|
+
* sentence-transformer embedding, so storage and ranking code is
|
|
607
|
+
* identical to the online path.
|
|
608
|
+
*/
|
|
609
|
+
fallbackEmbed(text) {
|
|
610
|
+
this.lastObservedDimensions = this.dimensions;
|
|
611
|
+
const vector = Array.from({ length: this.dimensions }, () => 0);
|
|
612
|
+
const tokens = text
|
|
613
|
+
.toLowerCase()
|
|
614
|
+
.normalize("NFKD")
|
|
615
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
616
|
+
.split(/[^a-z0-9]+/)
|
|
617
|
+
.filter((t) => t.length > 1);
|
|
618
|
+
const unique = [...new Set(tokens)];
|
|
619
|
+
for (const token of unique) {
|
|
620
|
+
addFeature(vector, `tok:${token}`, 1);
|
|
621
|
+
for (let length = 3; length <= Math.min(token.length, 5); length += 1) {
|
|
622
|
+
for (let i = 0; i <= token.length - length; i += 1) {
|
|
623
|
+
addFeature(vector, `ng:${token.slice(i, i + length)}`, 0.12);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
for (let i = 0; i < tokens.length - 1; i += 1) {
|
|
628
|
+
addFeature(vector, `bi:${tokens[i]}:${tokens[i + 1]}`, 0.35);
|
|
629
|
+
}
|
|
630
|
+
return normalizeVector(vector);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
|