| 257 | } |
| 258 | |
| 259 | function mergeEmbeddingVectors(vectors: number[][], weights: number[]): number[] { |
| 260 | if (vectors.length === 0) throw new Error("Cannot merge empty embedding vectors"); |
| 261 | if (vectors.length === 1) return vectors[0]; |
| 262 | |
| 263 | const dimension = vectors[0].length; |
| 264 | const merged = new Array<number>(dimension).fill(0); |
| 265 | let totalWeight = 0; |
| 266 | |
| 267 | for (let i = 0; i < vectors.length; i++) { |
| 268 | const vector = vectors[i]; |
| 269 | if (vector.length !== dimension) { |
| 270 | throw new Error(`Embedding dimension mismatch: expected ${dimension}, got ${vector.length}`); |
| 271 | } |
| 272 | const weight = Math.max(1, weights[i] ?? 1); |
| 273 | totalWeight += weight; |
| 274 | for (let d = 0; d < dimension; d++) merged[d] += vector[d] * weight; |
| 275 | } |
| 276 | |
| 277 | if (totalWeight <= 0) return vectors[0]; |
| 278 | for (let d = 0; d < merged.length; d++) merged[d] /= totalWeight; |
| 279 | return merged; |
| 280 | } |
| 281 | |
| 282 | export async function fetchEmbedding(input: string | string[]): Promise<number[][]> { |
| 283 | const inputs = Array.isArray(input) ? input : [input]; |