@lov3kaizen/agentsea-embeddings 0.5.1

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.
@@ -0,0 +1,259 @@
1
+ // src/core/EmbeddingModel.ts
2
+ var EmbeddingModel = class {
3
+ /**
4
+ * Get model dimensions
5
+ */
6
+ get dimensions() {
7
+ return this.info.dimensions;
8
+ }
9
+ /**
10
+ * Get max tokens
11
+ */
12
+ get maxTokens() {
13
+ return this.info.maxTokens;
14
+ }
15
+ /**
16
+ * Get max batch size
17
+ */
18
+ get maxBatchSize() {
19
+ return this.info.maxBatchSize;
20
+ }
21
+ /**
22
+ * Get model name
23
+ */
24
+ get name() {
25
+ return this.info.name;
26
+ }
27
+ /**
28
+ * Get provider name
29
+ */
30
+ get provider() {
31
+ return this.info.provider;
32
+ }
33
+ /**
34
+ * Count tokens in text (default implementation)
35
+ * Subclasses should override for accurate counting
36
+ */
37
+ countTokens(text) {
38
+ return Math.ceil(text.length / 4);
39
+ }
40
+ /**
41
+ * Check if text exceeds max tokens
42
+ */
43
+ exceedsMaxTokens(text) {
44
+ return this.countTokens(text) > this.maxTokens;
45
+ }
46
+ /**
47
+ * Truncate text to max tokens
48
+ */
49
+ truncateToMaxTokens(text) {
50
+ const tokens = this.countTokens(text);
51
+ if (tokens <= this.maxTokens) {
52
+ return text;
53
+ }
54
+ const ratio = this.maxTokens / tokens;
55
+ const targetLength = Math.floor(text.length * ratio * 0.95);
56
+ return text.slice(0, targetLength);
57
+ }
58
+ /**
59
+ * Calculate similarity between two vectors
60
+ */
61
+ static cosineSimilarity(a, b) {
62
+ if (a.length !== b.length) {
63
+ throw new Error(`Vector dimensions mismatch: ${a.length} vs ${b.length}`);
64
+ }
65
+ let dotProduct = 0;
66
+ let normA = 0;
67
+ let normB = 0;
68
+ for (let i = 0; i < a.length; i++) {
69
+ dotProduct += a[i] * b[i];
70
+ normA += a[i] * a[i];
71
+ normB += b[i] * b[i];
72
+ }
73
+ const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
74
+ if (magnitude === 0) {
75
+ return 0;
76
+ }
77
+ return dotProduct / magnitude;
78
+ }
79
+ /**
80
+ * Calculate Euclidean distance between two vectors
81
+ */
82
+ static euclideanDistance(a, b) {
83
+ if (a.length !== b.length) {
84
+ throw new Error(`Vector dimensions mismatch: ${a.length} vs ${b.length}`);
85
+ }
86
+ let sum = 0;
87
+ for (let i = 0; i < a.length; i++) {
88
+ const diff = a[i] - b[i];
89
+ sum += diff * diff;
90
+ }
91
+ return Math.sqrt(sum);
92
+ }
93
+ /**
94
+ * Calculate dot product of two vectors
95
+ */
96
+ static dotProduct(a, b) {
97
+ if (a.length !== b.length) {
98
+ throw new Error(`Vector dimensions mismatch: ${a.length} vs ${b.length}`);
99
+ }
100
+ let result = 0;
101
+ for (let i = 0; i < a.length; i++) {
102
+ result += a[i] * b[i];
103
+ }
104
+ return result;
105
+ }
106
+ /**
107
+ * Normalize a vector to unit length
108
+ */
109
+ static normalize(vector) {
110
+ let norm = 0;
111
+ for (let i = 0; i < vector.length; i++) {
112
+ norm += vector[i] * vector[i];
113
+ }
114
+ norm = Math.sqrt(norm);
115
+ if (norm === 0) {
116
+ return vector.slice();
117
+ }
118
+ return vector.map((v) => v / norm);
119
+ }
120
+ /**
121
+ * Average multiple vectors
122
+ */
123
+ static average(vectors) {
124
+ if (vectors.length === 0) {
125
+ throw new Error("Cannot average empty array of vectors");
126
+ }
127
+ const dimensions = vectors[0].length;
128
+ const result = new Array(dimensions).fill(0);
129
+ for (const vector of vectors) {
130
+ if (vector.length !== dimensions) {
131
+ throw new Error(
132
+ `Vector dimensions mismatch: expected ${dimensions}, got ${vector.length}`
133
+ );
134
+ }
135
+ for (let i = 0; i < dimensions; i++) {
136
+ result[i] += vector[i];
137
+ }
138
+ }
139
+ for (let i = 0; i < dimensions; i++) {
140
+ result[i] /= vectors.length;
141
+ }
142
+ return result;
143
+ }
144
+ /**
145
+ * Weighted average of vectors
146
+ */
147
+ static weightedAverage(vectors, weights) {
148
+ if (vectors.length === 0) {
149
+ throw new Error("Cannot average empty array of vectors");
150
+ }
151
+ if (vectors.length !== weights.length) {
152
+ throw new Error("Vectors and weights arrays must have same length");
153
+ }
154
+ const dimensions = vectors[0].length;
155
+ const result = new Array(dimensions).fill(0);
156
+ let totalWeight = 0;
157
+ for (let j = 0; j < vectors.length; j++) {
158
+ const vector = vectors[j];
159
+ const weight = weights[j];
160
+ totalWeight += weight;
161
+ if (vector.length !== dimensions) {
162
+ throw new Error(
163
+ `Vector dimensions mismatch: expected ${dimensions}, got ${vector.length}`
164
+ );
165
+ }
166
+ for (let i = 0; i < dimensions; i++) {
167
+ result[i] += vector[i] * weight;
168
+ }
169
+ }
170
+ if (totalWeight === 0) {
171
+ throw new Error("Total weight cannot be zero");
172
+ }
173
+ for (let i = 0; i < dimensions; i++) {
174
+ result[i] /= totalWeight;
175
+ }
176
+ return result;
177
+ }
178
+ };
179
+ var ModelRegistry = class {
180
+ models = /* @__PURE__ */ new Map();
181
+ defaultModel = null;
182
+ /**
183
+ * Register a model
184
+ */
185
+ register(model, isDefault = false) {
186
+ const key = `${model.provider}:${model.name}`;
187
+ this.models.set(key, model);
188
+ if (isDefault || this.defaultModel === null) {
189
+ this.defaultModel = key;
190
+ }
191
+ }
192
+ /**
193
+ * Get a model by provider and name
194
+ */
195
+ get(provider, name) {
196
+ return this.models.get(`${provider}:${name}`);
197
+ }
198
+ /**
199
+ * Get model by key
200
+ */
201
+ getByKey(key) {
202
+ return this.models.get(key);
203
+ }
204
+ /**
205
+ * Get the default model
206
+ */
207
+ getDefault() {
208
+ if (this.defaultModel === null) {
209
+ return void 0;
210
+ }
211
+ return this.models.get(this.defaultModel);
212
+ }
213
+ /**
214
+ * Set default model
215
+ */
216
+ setDefault(provider, name) {
217
+ const key = `${provider}:${name}`;
218
+ if (!this.models.has(key)) {
219
+ throw new Error(`Model ${key} not found in registry`);
220
+ }
221
+ this.defaultModel = key;
222
+ }
223
+ /**
224
+ * List all registered models
225
+ */
226
+ list() {
227
+ return Array.from(this.models.values()).map((m) => m.info);
228
+ }
229
+ /**
230
+ * Check if a model is registered
231
+ */
232
+ has(provider, name) {
233
+ return this.models.has(`${provider}:${name}`);
234
+ }
235
+ /**
236
+ * Remove a model
237
+ */
238
+ remove(provider, name) {
239
+ const key = `${provider}:${name}`;
240
+ if (this.defaultModel === key) {
241
+ this.defaultModel = null;
242
+ }
243
+ return this.models.delete(key);
244
+ }
245
+ /**
246
+ * Clear all models
247
+ */
248
+ clear() {
249
+ this.models.clear();
250
+ this.defaultModel = null;
251
+ }
252
+ };
253
+ var modelRegistry = new ModelRegistry();
254
+
255
+ export {
256
+ EmbeddingModel,
257
+ ModelRegistry,
258
+ modelRegistry
259
+ };