@anvia/core 0.26.0 → 1.0.0-rc.2
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.
- package/README.md +303 -94
- package/dist/agent/index.d.ts +36 -70
- package/dist/agent/index.js +25 -18
- package/dist/agent-yBG8e9Jj.d.ts +153 -0
- package/dist/chunk-4WI3VGZK.js +127 -0
- package/dist/chunk-4WI3VGZK.js.map +1 -0
- package/dist/chunk-77AIYARB.js +654 -0
- package/dist/chunk-77AIYARB.js.map +1 -0
- package/dist/chunk-AI5JMUW7.js +45 -0
- package/dist/chunk-AI5JMUW7.js.map +1 -0
- package/dist/chunk-BEYBU7VJ.js +53 -0
- package/dist/chunk-BEYBU7VJ.js.map +1 -0
- package/dist/chunk-CWM7B2OO.js +315 -0
- package/dist/chunk-CWM7B2OO.js.map +1 -0
- package/dist/chunk-D37WMSP6.js +131 -0
- package/dist/chunk-D37WMSP6.js.map +1 -0
- package/dist/chunk-DBSCKTUL.js +3793 -0
- package/dist/chunk-DBSCKTUL.js.map +1 -0
- package/dist/chunk-EINTGEGY.js +629 -0
- package/dist/chunk-EINTGEGY.js.map +1 -0
- package/dist/chunk-FMHLROPQ.js +351 -0
- package/dist/chunk-FMHLROPQ.js.map +1 -0
- package/dist/chunk-FN7HLLAZ.js +211 -0
- package/dist/chunk-FN7HLLAZ.js.map +1 -0
- package/dist/chunk-GKDERULJ.js +50 -0
- package/dist/chunk-GKDERULJ.js.map +1 -0
- package/dist/{chunk-CWUJUSOS.js → chunk-KIDGIJM7.js} +26 -5
- package/dist/chunk-KIDGIJM7.js.map +1 -0
- package/dist/chunk-KR3RCCHJ.js +500 -0
- package/dist/chunk-KR3RCCHJ.js.map +1 -0
- package/dist/chunk-MGNTXGTX.js +37 -0
- package/dist/chunk-MGNTXGTX.js.map +1 -0
- package/dist/{chunk-MRQLEK2B.js → chunk-OJH6HWHX.js} +63 -51
- package/dist/chunk-OJH6HWHX.js.map +1 -0
- package/dist/chunk-QOUPWOGW.js +29 -0
- package/dist/chunk-QOUPWOGW.js.map +1 -0
- package/dist/chunk-TIZYTPJO.js +208 -0
- package/dist/chunk-TIZYTPJO.js.map +1 -0
- package/dist/{chunk-NCPN4SJR.js → chunk-XKYYBABH.js} +13 -13
- package/dist/chunk-XKYYBABH.js.map +1 -0
- package/dist/client-B8DT1vUG.d.ts +83 -0
- package/dist/completion/index.d.ts +6 -36
- package/dist/completion/index.js +25 -29
- package/dist/dynamic-tools-KwEGRbHp.d.ts +45 -0
- package/dist/embeddings/index.d.ts +11 -9
- package/dist/embeddings/index.js +2 -4
- package/dist/evals/index.d.ts +47 -20
- package/dist/evals/index.js +104 -65
- package/dist/evals/index.js.map +1 -1
- package/dist/extractor/index.d.ts +27 -42
- package/dist/extractor/index.js +7 -22
- package/dist/guardrails/index.d.ts +3 -2
- package/dist/guardrails/index.js +1 -1
- package/dist/image-generation/index.d.ts +23 -23
- package/dist/image-generation/index.js +5 -39
- package/dist/image-generation/index.js.map +1 -1
- package/dist/index.d.ts +25 -20
- package/dist/index.js +60 -63
- package/dist/internal/agent.d.ts +163 -9
- package/dist/internal/agent.js +25 -18
- package/dist/loaders/index.d.ts +6 -10
- package/dist/loaders/index.js.map +1 -1
- package/dist/mcp/index.d.ts +19 -13
- package/dist/mcp/index.js +13 -348
- package/dist/mcp/index.js.map +1 -1
- package/dist/memory/index.d.ts +20 -6
- package/dist/memory/index.js +9 -10
- package/dist/message-schema-Cn7ezRfJ.d.ts +52 -0
- package/dist/middleware-C7PdmKF7.d.ts +56 -0
- package/dist/model-call-options-CZkSw_xN.d.ts +6 -0
- package/dist/model-listing/index.d.ts +3 -1
- package/dist/observability/index.d.ts +20 -3
- package/dist/observability/index.js +8 -5
- package/dist/observability/index.js.map +1 -1
- package/dist/pipeline/index.d.ts +114 -72
- package/dist/pipeline/index.js +478 -286
- package/dist/pipeline/index.js.map +1 -1
- package/dist/retry-CjvSlKGW.d.ts +16 -0
- package/dist/skills/index.d.ts +5 -4
- package/dist/skills/index.js +7 -8
- package/dist/speech-generation/index.d.ts +37 -0
- package/dist/speech-generation/index.js +8 -0
- package/dist/streaming/index.js +37 -3
- package/dist/streaming/index.js.map +1 -1
- package/dist/{think-tool-DfCMuO8e.d.ts → think-tool-6H2QNQzQ.d.ts} +5 -5
- package/dist/tool/index.d.ts +10 -6
- package/dist/tool/index.js +15 -21
- package/dist/tool--Mz4v1eL.d.ts +57 -0
- package/dist/transcription/index.d.ts +29 -22
- package/dist/transcription/index.js +5 -57
- package/dist/transcription/index.js.map +1 -1
- package/dist/type-utils-CtHVDRn_.d.ts +6 -0
- package/dist/types-3x3mOLHU.d.ts +379 -0
- package/dist/types-BVzM4RsC.d.ts +155 -0
- package/dist/types-CQ_ioXWK.d.ts +319 -0
- package/dist/types-Cr4uiYo5.d.ts +99 -0
- package/dist/{types-04LqWrmy.d.ts → types-DiJqJejp.d.ts} +1 -1
- package/dist/types-Dld1TpWj.d.ts +130 -0
- package/dist/vector-store/index.d.ts +33 -34
- package/dist/vector-store/index.js +6 -6
- package/package.json +6 -18
- package/dist/agent-x3YTyv5i.d.ts +0 -222
- package/dist/audio-generation/index.d.ts +0 -33
- package/dist/audio-generation/index.js +0 -42
- package/dist/audio-generation/index.js.map +0 -1
- package/dist/chunk-2ODTMRHP.js +0 -54
- package/dist/chunk-2ODTMRHP.js.map +0 -1
- package/dist/chunk-ADH7NNCS.js +0 -512
- package/dist/chunk-ADH7NNCS.js.map +0 -1
- package/dist/chunk-BALBBVI3.js +0 -2732
- package/dist/chunk-BALBBVI3.js.map +0 -1
- package/dist/chunk-CWUJUSOS.js.map +0 -1
- package/dist/chunk-DALYP4PX.js +0 -225
- package/dist/chunk-DALYP4PX.js.map +0 -1
- package/dist/chunk-HYUYZEAJ.js +0 -223
- package/dist/chunk-HYUYZEAJ.js.map +0 -1
- package/dist/chunk-I6XOQ4LK.js +0 -466
- package/dist/chunk-I6XOQ4LK.js.map +0 -1
- package/dist/chunk-JI5YZWNT.js +0 -220
- package/dist/chunk-JI5YZWNT.js.map +0 -1
- package/dist/chunk-MC3CCKEB.js +0 -221
- package/dist/chunk-MC3CCKEB.js.map +0 -1
- package/dist/chunk-MELYDKWQ.js +0 -337
- package/dist/chunk-MELYDKWQ.js.map +0 -1
- package/dist/chunk-MNWK2USR.js +0 -243
- package/dist/chunk-MNWK2USR.js.map +0 -1
- package/dist/chunk-MRQLEK2B.js.map +0 -1
- package/dist/chunk-NCPN4SJR.js.map +0 -1
- package/dist/chunk-OIMLU4SF.js +0 -20
- package/dist/chunk-OIMLU4SF.js.map +0 -1
- package/dist/chunk-Q25IWLBT.js +0 -138
- package/dist/chunk-Q25IWLBT.js.map +0 -1
- package/dist/chunk-UQX6EXWG.js +0 -33
- package/dist/chunk-UQX6EXWG.js.map +0 -1
- package/dist/chunk-WQKHFADH.js +0 -12
- package/dist/chunk-WQKHFADH.js.map +0 -1
- package/dist/chunk-XUUY2L2D.js +0 -42
- package/dist/chunk-XUUY2L2D.js.map +0 -1
- package/dist/chunk-XWUC7CIT.js +0 -1
- package/dist/chunk-XWUC7CIT.js.map +0 -1
- package/dist/chunk-YLMDBQO4.js +0 -141
- package/dist/chunk-YLMDBQO4.js.map +0 -1
- package/dist/errors-2moLDuuN.d.ts +0 -17
- package/dist/hooks/index.d.ts +0 -12
- package/dist/hooks/index.js +0 -17
- package/dist/index-BxSbmOMr.d.ts +0 -257
- package/dist/json-BVPssigK.d.ts +0 -39
- package/dist/middleware-Dp3d_pxi.d.ts +0 -90
- package/dist/request/index.d.ts +0 -28
- package/dist/request/index.js +0 -25
- package/dist/request/index.js.map +0 -1
- package/dist/tool-Cohdv5GC.d.ts +0 -65
- package/dist/types-BCTRUGex.d.ts +0 -47
- package/dist/types-BrLbKnEz.d.ts +0 -119
- package/dist/types-D9JpeAPF.d.ts +0 -114
- package/dist/types-G12i56s2.d.ts +0 -354
- package/dist/types-JJCxRnaZ.d.ts +0 -70
- package/dist/types-O-abTIin.d.ts +0 -79
- package/dist/ui/index.d.ts +0 -107
- package/dist/ui/index.js +0 -10
- package/dist/ui/index.js.map +0 -1
- /package/dist/{hooks → speech-generation}/index.js.map +0 -0
package/dist/chunk-MELYDKWQ.js
DELETED
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
cosineSimilarity,
|
|
3
|
-
embedText
|
|
4
|
-
} from "./chunk-MNWK2USR.js";
|
|
5
|
-
import {
|
|
6
|
-
toProviderJsonSchema
|
|
7
|
-
} from "./chunk-WQKHFADH.js";
|
|
8
|
-
|
|
9
|
-
// src/vector-store/index.ts
|
|
10
|
-
import { z } from "zod";
|
|
11
|
-
|
|
12
|
-
// src/tool/create-tool.ts
|
|
13
|
-
function createTool(options) {
|
|
14
|
-
const parameters = toProviderJsonSchema(options.input);
|
|
15
|
-
const definition = () => ({
|
|
16
|
-
name: options.name,
|
|
17
|
-
description: options.description,
|
|
18
|
-
parameters
|
|
19
|
-
});
|
|
20
|
-
const call = async (args, context = {}) => {
|
|
21
|
-
const parsedArgs = options.input.parse(args);
|
|
22
|
-
const result = await options.execute(parsedArgs, context);
|
|
23
|
-
return options.output === void 0 ? result : options.output.parse(result);
|
|
24
|
-
};
|
|
25
|
-
const parseApprovalArgs = (args) => options.input.parse(args);
|
|
26
|
-
if (options.approval === void 0) {
|
|
27
|
-
return { name: options.name, definition, call, parseApprovalArgs };
|
|
28
|
-
}
|
|
29
|
-
return {
|
|
30
|
-
name: options.name,
|
|
31
|
-
approval: options.approval,
|
|
32
|
-
definition,
|
|
33
|
-
call,
|
|
34
|
-
parseApprovalArgs
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// src/vector-store/filter.ts
|
|
39
|
-
var vectorFilter = {
|
|
40
|
-
eq(key, value) {
|
|
41
|
-
return { type: "eq", key, value };
|
|
42
|
-
},
|
|
43
|
-
gt(key, value) {
|
|
44
|
-
return { type: "gt", key, value };
|
|
45
|
-
},
|
|
46
|
-
lt(key, value) {
|
|
47
|
-
return { type: "lt", key, value };
|
|
48
|
-
},
|
|
49
|
-
and(left, right) {
|
|
50
|
-
return { type: "and", filters: [left, right] };
|
|
51
|
-
},
|
|
52
|
-
or(left, right) {
|
|
53
|
-
return { type: "or", filters: [left, right] };
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
function matchesVectorFilter(metadata, filter) {
|
|
57
|
-
if (filter === void 0) {
|
|
58
|
-
return true;
|
|
59
|
-
}
|
|
60
|
-
if (metadata === void 0) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
switch (filter.type) {
|
|
64
|
-
case "eq":
|
|
65
|
-
return metadata[filter.key] === filter.value;
|
|
66
|
-
case "gt":
|
|
67
|
-
return compare(metadata[filter.key], filter.value) > 0;
|
|
68
|
-
case "lt":
|
|
69
|
-
return compare(metadata[filter.key], filter.value) < 0;
|
|
70
|
-
case "and":
|
|
71
|
-
return matchesVectorFilter(metadata, filter.filters[0]) && matchesVectorFilter(metadata, filter.filters[1]);
|
|
72
|
-
case "or":
|
|
73
|
-
return matchesVectorFilter(metadata, filter.filters[0]) || matchesVectorFilter(metadata, filter.filters[1]);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function compare(left, right) {
|
|
77
|
-
if (typeof left === "number" && typeof right === "number") {
|
|
78
|
-
return left - right;
|
|
79
|
-
}
|
|
80
|
-
if (typeof left === "string" && typeof right === "string") {
|
|
81
|
-
return left.localeCompare(right);
|
|
82
|
-
}
|
|
83
|
-
if (typeof left === "boolean" && typeof right === "boolean") {
|
|
84
|
-
return Number(left) - Number(right);
|
|
85
|
-
}
|
|
86
|
-
return 0;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// src/vector-store/lsh.ts
|
|
90
|
-
var LshIndex = class {
|
|
91
|
-
constructor(dimensions, options) {
|
|
92
|
-
this.options = options;
|
|
93
|
-
const rng = seededRandom(options.seed ?? 42);
|
|
94
|
-
this.hyperplanes = [];
|
|
95
|
-
for (let index = 0; index < options.numTables * options.numHyperplanes; index += 1) {
|
|
96
|
-
const plane = Array.from({ length: dimensions }, () => rng() * 2 - 1);
|
|
97
|
-
const norm = Math.sqrt(plane.reduce((sum, value) => sum + value ** 2, 0));
|
|
98
|
-
this.hyperplanes.push(norm === 0 ? plane : plane.map((value) => value / norm));
|
|
99
|
-
}
|
|
100
|
-
this.tables = Array.from({ length: options.numTables }, () => /* @__PURE__ */ new Map());
|
|
101
|
-
}
|
|
102
|
-
options;
|
|
103
|
-
hyperplanes;
|
|
104
|
-
tables;
|
|
105
|
-
insert(id, vector) {
|
|
106
|
-
for (let table = 0; table < this.options.numTables; table += 1) {
|
|
107
|
-
const hash = this.hash(vector, table);
|
|
108
|
-
const bucket = this.tables[table]?.get(hash) ?? /* @__PURE__ */ new Set();
|
|
109
|
-
bucket.add(id);
|
|
110
|
-
this.tables[table]?.set(hash, bucket);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
query(vector) {
|
|
114
|
-
const candidates = /* @__PURE__ */ new Set();
|
|
115
|
-
for (let table = 0; table < this.options.numTables; table += 1) {
|
|
116
|
-
const hash = this.hash(vector, table);
|
|
117
|
-
for (const id of this.tables[table]?.get(hash) ?? []) {
|
|
118
|
-
candidates.add(id);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return candidates;
|
|
122
|
-
}
|
|
123
|
-
hash(vector, table) {
|
|
124
|
-
let hash = "";
|
|
125
|
-
const start = table * this.options.numHyperplanes;
|
|
126
|
-
for (let offset = 0; offset < this.options.numHyperplanes; offset += 1) {
|
|
127
|
-
const plane = this.hyperplanes[start + offset];
|
|
128
|
-
const dot = vector.reduce((sum, value, index) => sum + value * (plane[index] ?? 0), 0);
|
|
129
|
-
hash += dot >= 0 ? "1" : "0";
|
|
130
|
-
}
|
|
131
|
-
return hash;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
function seededRandom(seed) {
|
|
135
|
-
let state = seed >>> 0;
|
|
136
|
-
return () => {
|
|
137
|
-
state = state * 1664525 + 1013904223 >>> 0;
|
|
138
|
-
return state / 4294967296;
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// src/vector-store/index.ts
|
|
143
|
-
var InMemoryVectorStore = class _InMemoryVectorStore {
|
|
144
|
-
documents = /* @__PURE__ */ new Map();
|
|
145
|
-
indexStrategy;
|
|
146
|
-
lshIndex;
|
|
147
|
-
embeddingDimension;
|
|
148
|
-
constructor(options = {}) {
|
|
149
|
-
this.indexStrategy = options.index ?? { type: "bruteForce" };
|
|
150
|
-
}
|
|
151
|
-
static fromDocuments(documents, options = {}) {
|
|
152
|
-
const store = new _InMemoryVectorStore(options);
|
|
153
|
-
store.addDocuments(documents);
|
|
154
|
-
return store;
|
|
155
|
-
}
|
|
156
|
-
addDocuments(documents) {
|
|
157
|
-
this.validateDocumentDimensions(documents);
|
|
158
|
-
for (const document of documents) {
|
|
159
|
-
this.documents.set(document.id, document);
|
|
160
|
-
}
|
|
161
|
-
this.rebuildLshIndex();
|
|
162
|
-
return this;
|
|
163
|
-
}
|
|
164
|
-
get(id) {
|
|
165
|
-
return this.documents.get(id);
|
|
166
|
-
}
|
|
167
|
-
values() {
|
|
168
|
-
return [...this.documents.values()];
|
|
169
|
-
}
|
|
170
|
-
len() {
|
|
171
|
-
return this.documents.size;
|
|
172
|
-
}
|
|
173
|
-
isEmpty() {
|
|
174
|
-
return this.documents.size === 0;
|
|
175
|
-
}
|
|
176
|
-
index(model) {
|
|
177
|
-
return new InMemoryVectorIndex(model, this);
|
|
178
|
-
}
|
|
179
|
-
candidates(queryEmbedding) {
|
|
180
|
-
this.validateQueryDimension(queryEmbedding);
|
|
181
|
-
if (this.indexStrategy.type !== "lsh" || this.lshIndex === void 0) {
|
|
182
|
-
return this.values();
|
|
183
|
-
}
|
|
184
|
-
const candidateIds = this.lshIndex.query(queryEmbedding.vector);
|
|
185
|
-
if (candidateIds.size === 0) {
|
|
186
|
-
return this.values();
|
|
187
|
-
}
|
|
188
|
-
return [...candidateIds].flatMap((id) => {
|
|
189
|
-
const document = this.documents.get(id);
|
|
190
|
-
return document === void 0 ? [] : [document];
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
rebuildLshIndex() {
|
|
194
|
-
if (this.indexStrategy.type !== "lsh") {
|
|
195
|
-
this.lshIndex = void 0;
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
const firstEmbedding = this.values().flatMap((document) => document.embeddings)[0];
|
|
199
|
-
if (firstEmbedding === void 0) {
|
|
200
|
-
this.lshIndex = void 0;
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const index = new LshIndex(firstEmbedding.vector.length, this.indexStrategy);
|
|
204
|
-
for (const document of this.documents.values()) {
|
|
205
|
-
for (const embedding of document.embeddings) {
|
|
206
|
-
index.insert(document.id, embedding.vector);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
this.lshIndex = index;
|
|
210
|
-
}
|
|
211
|
-
validateDocumentDimensions(documents) {
|
|
212
|
-
let dimension = this.embeddingDimension;
|
|
213
|
-
for (const document of documents) {
|
|
214
|
-
for (const embedding of document.embeddings) {
|
|
215
|
-
dimension = validateEmbeddingDimension(dimension, embedding, document.id);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
this.embeddingDimension = dimension;
|
|
219
|
-
}
|
|
220
|
-
validateQueryDimension(queryEmbedding) {
|
|
221
|
-
if (this.embeddingDimension === void 0) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, "query");
|
|
225
|
-
}
|
|
226
|
-
};
|
|
227
|
-
var InMemoryVectorIndex = class {
|
|
228
|
-
constructor(model, store) {
|
|
229
|
-
this.model = model;
|
|
230
|
-
this.store = store;
|
|
231
|
-
}
|
|
232
|
-
model;
|
|
233
|
-
store;
|
|
234
|
-
async search(request) {
|
|
235
|
-
const queryEmbedding = await embedText(this.model, request.query);
|
|
236
|
-
return this.store.candidates(queryEmbedding).filter((document) => matchesVectorFilter(document.metadata, request.filter)).flatMap((document) => {
|
|
237
|
-
const score = bestScore(queryEmbedding, document.embeddings);
|
|
238
|
-
if (score === void 0) {
|
|
239
|
-
return [];
|
|
240
|
-
}
|
|
241
|
-
if (request.threshold !== void 0 && score < request.threshold) {
|
|
242
|
-
return [];
|
|
243
|
-
}
|
|
244
|
-
const result = {
|
|
245
|
-
score,
|
|
246
|
-
id: document.id,
|
|
247
|
-
document: document.document
|
|
248
|
-
};
|
|
249
|
-
if (document.metadata !== void 0) {
|
|
250
|
-
result.metadata = document.metadata;
|
|
251
|
-
}
|
|
252
|
-
return [result];
|
|
253
|
-
}).sort((left, right) => right.score - left.score).slice(0, Math.max(0, Math.trunc(request.topK)));
|
|
254
|
-
}
|
|
255
|
-
async searchIds(request) {
|
|
256
|
-
return (await this.search(request)).map(({ score, id }) => ({ score, id }));
|
|
257
|
-
}
|
|
258
|
-
async inspect(request) {
|
|
259
|
-
const limit = Math.max(0, Math.trunc(request.limit));
|
|
260
|
-
const start = Math.max(0, Math.trunc(Number(request.cursor ?? "0")));
|
|
261
|
-
const documents = this.store.values().filter((document) => matchesVectorFilter(document.metadata, request.filter));
|
|
262
|
-
const page = documents.slice(start, start + limit);
|
|
263
|
-
const nextOffset = start + page.length;
|
|
264
|
-
const result = {
|
|
265
|
-
items: page.map((document) => {
|
|
266
|
-
const item = {
|
|
267
|
-
id: document.id,
|
|
268
|
-
document: document.document
|
|
269
|
-
};
|
|
270
|
-
if (document.metadata !== void 0) {
|
|
271
|
-
item.metadata = document.metadata;
|
|
272
|
-
}
|
|
273
|
-
return item;
|
|
274
|
-
})
|
|
275
|
-
};
|
|
276
|
-
if (nextOffset < documents.length) {
|
|
277
|
-
result.nextCursor = String(nextOffset);
|
|
278
|
-
}
|
|
279
|
-
result.totalCount = documents.length;
|
|
280
|
-
return result;
|
|
281
|
-
}
|
|
282
|
-
asTool(options) {
|
|
283
|
-
return createVectorSearchTool(this, options);
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
function createVectorSearchTool(index, options) {
|
|
287
|
-
return createTool({
|
|
288
|
-
name: options.name,
|
|
289
|
-
description: options.description ?? "Search a vector store for documents relevant to the provided query.",
|
|
290
|
-
input: z.object({
|
|
291
|
-
query: z.string().describe("The query string to search for relevant documents."),
|
|
292
|
-
topK: z.number().int().positive().optional().describe("The maximum number of results.")
|
|
293
|
-
}),
|
|
294
|
-
output: z.array(
|
|
295
|
-
z.object({
|
|
296
|
-
score: z.number(),
|
|
297
|
-
id: z.string(),
|
|
298
|
-
document: z.any(),
|
|
299
|
-
metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional()
|
|
300
|
-
})
|
|
301
|
-
),
|
|
302
|
-
execute: ({ query, topK }) => index.search({
|
|
303
|
-
query,
|
|
304
|
-
topK: topK ?? options.topK ?? 5,
|
|
305
|
-
threshold: options.threshold,
|
|
306
|
-
filter: options.filter
|
|
307
|
-
})
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
function bestScore(queryEmbedding, embeddings) {
|
|
311
|
-
let best;
|
|
312
|
-
for (const embedding of embeddings) {
|
|
313
|
-
const score = cosineSimilarity(queryEmbedding.vector, embedding.vector);
|
|
314
|
-
best = best === void 0 ? score : Math.max(best, score);
|
|
315
|
-
}
|
|
316
|
-
return best;
|
|
317
|
-
}
|
|
318
|
-
function validateEmbeddingDimension(expectedDimension, embedding, id) {
|
|
319
|
-
if (expectedDimension === void 0) {
|
|
320
|
-
return embedding.vector.length;
|
|
321
|
-
}
|
|
322
|
-
if (embedding.vector.length !== expectedDimension) {
|
|
323
|
-
throw new Error(
|
|
324
|
-
`Vector dimension mismatch: expected ${expectedDimension} dimensions but received ${embedding.vector.length} for ${id}`
|
|
325
|
-
);
|
|
326
|
-
}
|
|
327
|
-
return expectedDimension;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
export {
|
|
331
|
-
createTool,
|
|
332
|
-
vectorFilter,
|
|
333
|
-
InMemoryVectorStore,
|
|
334
|
-
InMemoryVectorIndex,
|
|
335
|
-
createVectorSearchTool
|
|
336
|
-
};
|
|
337
|
-
//# sourceMappingURL=chunk-MELYDKWQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector-store/index.ts","../src/tool/create-tool.ts","../src/vector-store/filter.ts","../src/vector-store/lsh.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n cosineSimilarity,\n type EmbeddedDocument,\n type Embedding,\n type EmbeddingModel,\n embedText,\n type VectorMetadata,\n} from \"../embeddings\";\nimport { createTool } from \"../tool/create-tool\";\nimport type { Tool } from \"../tool/tool\";\nimport { matchesVectorFilter } from \"./filter\";\nimport { LshIndex } from \"./lsh\";\nimport type {\n IndexStrategy,\n VectorInspectItem,\n VectorInspectPage,\n VectorInspectRequest,\n VectorSearchIndex,\n VectorSearchRequest,\n VectorSearchResult,\n VectorSearchToolOptions,\n} from \"./types\";\n\nexport { vectorFilter } from \"./filter\";\nexport type * from \"./types\";\n\ntype StoredDocument<T, Metadata extends VectorMetadata> = EmbeddedDocument<T, Metadata>;\n\nexport class InMemoryVectorStore<T, Metadata extends VectorMetadata = VectorMetadata> {\n private readonly documents = new Map<string, StoredDocument<T, Metadata>>();\n private indexStrategy: IndexStrategy;\n private lshIndex: LshIndex | undefined;\n private embeddingDimension: number | undefined;\n\n constructor(options: { index?: IndexStrategy } = {}) {\n this.indexStrategy = options.index ?? { type: \"bruteForce\" };\n }\n\n static fromDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n documents: Array<EmbeddedDocument<T, Metadata>>,\n options: { index?: IndexStrategy } = {},\n ): InMemoryVectorStore<T, Metadata> {\n const store = new InMemoryVectorStore<T, Metadata>(options);\n store.addDocuments(documents);\n return store;\n }\n\n addDocuments(documents: Array<EmbeddedDocument<T, Metadata>>): this {\n this.validateDocumentDimensions(documents);\n for (const document of documents) {\n this.documents.set(document.id, document);\n }\n this.rebuildLshIndex();\n return this;\n }\n\n get(id: string): StoredDocument<T, Metadata> | undefined {\n return this.documents.get(id);\n }\n\n values(): Array<StoredDocument<T, Metadata>> {\n return [...this.documents.values()];\n }\n\n len(): number {\n return this.documents.size;\n }\n\n isEmpty(): boolean {\n return this.documents.size === 0;\n }\n\n index(model: EmbeddingModel): InMemoryVectorIndex<T, Metadata> {\n return new InMemoryVectorIndex(model, this);\n }\n\n candidates(queryEmbedding: Embedding): Array<StoredDocument<T, Metadata>> {\n this.validateQueryDimension(queryEmbedding);\n if (this.indexStrategy.type !== \"lsh\" || this.lshIndex === undefined) {\n return this.values();\n }\n\n const candidateIds = this.lshIndex.query(queryEmbedding.vector);\n if (candidateIds.size === 0) {\n return this.values();\n }\n\n return [...candidateIds].flatMap((id) => {\n const document = this.documents.get(id);\n return document === undefined ? [] : [document];\n });\n }\n\n private rebuildLshIndex(): void {\n if (this.indexStrategy.type !== \"lsh\") {\n this.lshIndex = undefined;\n return;\n }\n\n const firstEmbedding = this.values().flatMap((document) => document.embeddings)[0];\n if (firstEmbedding === undefined) {\n this.lshIndex = undefined;\n return;\n }\n\n const index = new LshIndex(firstEmbedding.vector.length, this.indexStrategy);\n for (const document of this.documents.values()) {\n for (const embedding of document.embeddings) {\n index.insert(document.id, embedding.vector);\n }\n }\n this.lshIndex = index;\n }\n\n private validateDocumentDimensions(documents: Array<EmbeddedDocument<T, Metadata>>): void {\n let dimension = this.embeddingDimension;\n for (const document of documents) {\n for (const embedding of document.embeddings) {\n dimension = validateEmbeddingDimension(dimension, embedding, document.id);\n }\n }\n this.embeddingDimension = dimension;\n }\n\n private validateQueryDimension(queryEmbedding: Embedding): void {\n if (this.embeddingDimension === undefined) {\n return;\n }\n validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, \"query\");\n }\n}\n\nexport class InMemoryVectorIndex<T, Metadata extends VectorMetadata = VectorMetadata>\n implements VectorSearchIndex<T, Metadata>\n{\n constructor(\n private readonly model: EmbeddingModel,\n private readonly store: InMemoryVectorStore<T, Metadata>,\n ) {}\n\n async search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>> {\n const queryEmbedding = await embedText(this.model, request.query);\n return this.store\n .candidates(queryEmbedding)\n .filter((document) => matchesVectorFilter(document.metadata, request.filter))\n .flatMap((document) => {\n const score = bestScore(queryEmbedding, document.embeddings);\n if (score === undefined) {\n return [];\n }\n if (request.threshold !== undefined && score < request.threshold) {\n return [];\n }\n const result: VectorSearchResult<T, Metadata> = {\n score,\n id: document.id,\n document: document.document,\n };\n if (document.metadata !== undefined) {\n result.metadata = document.metadata;\n }\n return [result];\n })\n .sort((left, right) => right.score - left.score)\n .slice(0, Math.max(0, Math.trunc(request.topK)));\n }\n\n async searchIds(request: VectorSearchRequest): Promise<Array<{ score: number; id: string }>> {\n return (await this.search(request)).map(({ score, id }) => ({ score, id }));\n }\n\n async inspect(request: VectorInspectRequest): Promise<VectorInspectPage<T, Metadata>> {\n const limit = Math.max(0, Math.trunc(request.limit));\n const start = Math.max(0, Math.trunc(Number(request.cursor ?? \"0\")));\n const documents = this.store\n .values()\n .filter((document) => matchesVectorFilter(document.metadata, request.filter));\n const page = documents.slice(start, start + limit);\n const nextOffset = start + page.length;\n const result: VectorInspectPage<T, Metadata> = {\n items: page.map((document) => {\n const item: VectorInspectItem<T, Metadata> = {\n id: document.id,\n document: document.document,\n };\n if (document.metadata !== undefined) {\n item.metadata = document.metadata;\n }\n return item;\n }),\n };\n if (nextOffset < documents.length) {\n result.nextCursor = String(nextOffset);\n }\n result.totalCount = documents.length;\n return result;\n }\n\n asTool(options: VectorSearchToolOptions): Tool<{ query: string; topK?: number }, unknown> {\n return createVectorSearchTool(this, options);\n }\n}\n\nexport function createVectorSearchTool<T, Metadata extends VectorMetadata>(\n index: VectorSearchIndex<T, Metadata>,\n options: VectorSearchToolOptions,\n): Tool<{ query: string; topK?: number }, Array<VectorSearchResult<T, Metadata>>> {\n return createTool({\n name: options.name,\n description:\n options.description ?? \"Search a vector store for documents relevant to the provided query.\",\n input: z.object({\n query: z.string().describe(\"The query string to search for relevant documents.\"),\n topK: z.number().int().positive().optional().describe(\"The maximum number of results.\"),\n }),\n output: z.array(\n z.object({\n score: z.number(),\n id: z.string(),\n document: z.any(),\n metadata: z\n .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()]))\n .optional(),\n }),\n ),\n execute: ({ query, topK }) =>\n index.search({\n query,\n topK: topK ?? options.topK ?? 5,\n threshold: options.threshold,\n filter: options.filter,\n }),\n }) as Tool<{ query: string; topK?: number }, Array<VectorSearchResult<T, Metadata>>>;\n}\n\nfunction bestScore(queryEmbedding: Embedding, embeddings: Embedding[]): number | undefined {\n let best: number | undefined;\n for (const embedding of embeddings) {\n const score = cosineSimilarity(queryEmbedding.vector, embedding.vector);\n best = best === undefined ? score : Math.max(best, score);\n }\n return best;\n}\n\nfunction validateEmbeddingDimension(\n expectedDimension: number | undefined,\n embedding: Embedding,\n id: string,\n): number {\n if (expectedDimension === undefined) {\n return embedding.vector.length;\n }\n if (embedding.vector.length !== expectedDimension) {\n throw new Error(\n `Vector dimension mismatch: expected ${expectedDimension} dimensions but received ${embedding.vector.length} for ${id}`,\n );\n }\n return expectedDimension;\n}\n","import type { z } from \"zod\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\nimport type { Tool, ToolApprovalPolicy, ToolCallContext } from \"./tool\";\n\nexport type CreateToolOptions<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\n Output = unknown,\n> = {\n name: string;\n description: string;\n input: InputSchema;\n output?: OutputSchema;\n approval?: ToolApprovalPolicy<z.output<InputSchema>>;\n execute(\n args: z.output<InputSchema>,\n context: ToolCallContext,\n ): OutputSchema extends ZodSchema\n ? z.input<OutputSchema> | Promise<z.input<OutputSchema>>\n : Output | Promise<Output>;\n};\n\ntype CreateToolOutput<\n OutputSchema extends ZodSchema | undefined,\n Output,\n> = OutputSchema extends ZodSchema ? z.output<OutputSchema> : Output;\n\nexport function createTool<InputSchema extends ZodSchema, Output = unknown>(\n options: CreateToolOptions<InputSchema, undefined, Output> & { output?: undefined },\n): Tool<z.output<InputSchema>, Output>;\n\nexport function createTool<InputSchema extends ZodSchema, OutputSchema extends ZodSchema>(\n options: CreateToolOptions<InputSchema, OutputSchema>,\n): Tool<z.output<InputSchema>, z.output<OutputSchema>>;\n\nexport function createTool<\n InputSchema extends ZodSchema,\n OutputSchema extends ZodSchema | undefined = undefined,\n Output = unknown,\n>(\n options: CreateToolOptions<InputSchema, OutputSchema, Output>,\n): Tool<z.output<InputSchema>, CreateToolOutput<OutputSchema, Output>> {\n const parameters = toProviderJsonSchema(options.input);\n const definition = () => ({\n name: options.name,\n description: options.description,\n parameters,\n });\n const call = async (\n args: z.output<InputSchema>,\n context: ToolCallContext = {},\n ): Promise<CreateToolOutput<OutputSchema, Output>> => {\n const parsedArgs = options.input.parse(args);\n const result = await options.execute(parsedArgs, context);\n return (\n options.output === undefined ? result : options.output.parse(result)\n ) as CreateToolOutput<OutputSchema, Output>;\n };\n const parseApprovalArgs = (args: unknown): z.output<InputSchema> => options.input.parse(args);\n\n if (options.approval === undefined) {\n return { name: options.name, definition, call, parseApprovalArgs };\n }\n return {\n name: options.name,\n approval: options.approval,\n definition,\n call,\n parseApprovalArgs,\n };\n}\n","import type { VectorMetadata, VectorMetadataValue } from \"../embeddings\";\nimport type { VectorFilter } from \"./types\";\n\nexport type { VectorFilter } from \"./types\";\n\nexport const vectorFilter = {\n eq(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"eq\", key, value };\n },\n gt(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"gt\", key, value };\n },\n lt(key: string, value: VectorMetadataValue): VectorFilter {\n return { type: \"lt\", key, value };\n },\n and(left: VectorFilter, right: VectorFilter): VectorFilter {\n return { type: \"and\", filters: [left, right] };\n },\n or(left: VectorFilter, right: VectorFilter): VectorFilter {\n return { type: \"or\", filters: [left, right] };\n },\n};\n\nexport function matchesVectorFilter(\n metadata: VectorMetadata | undefined,\n filter: VectorFilter | undefined,\n): boolean {\n if (filter === undefined) {\n return true;\n }\n if (metadata === undefined) {\n return false;\n }\n\n switch (filter.type) {\n case \"eq\":\n return metadata[filter.key] === filter.value;\n case \"gt\":\n return compare(metadata[filter.key], filter.value) > 0;\n case \"lt\":\n return compare(metadata[filter.key], filter.value) < 0;\n case \"and\":\n return (\n matchesVectorFilter(metadata, filter.filters[0]) &&\n matchesVectorFilter(metadata, filter.filters[1])\n );\n case \"or\":\n return (\n matchesVectorFilter(metadata, filter.filters[0]) ||\n matchesVectorFilter(metadata, filter.filters[1])\n );\n }\n}\n\nfunction compare(left: VectorMetadataValue | undefined, right: VectorMetadataValue): number {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return left - right;\n }\n if (typeof left === \"string\" && typeof right === \"string\") {\n return left.localeCompare(right);\n }\n if (typeof left === \"boolean\" && typeof right === \"boolean\") {\n return Number(left) - Number(right);\n }\n return 0;\n}\n","import type { LshOptions } from \"./types\";\n\nexport type { LshOptions } from \"./types\";\n\nexport class LshIndex {\n private readonly hyperplanes: number[][];\n private readonly tables: Array<Map<string, Set<string>>>;\n\n constructor(\n dimensions: number,\n private readonly options: LshOptions,\n ) {\n const rng = seededRandom(options.seed ?? 42);\n this.hyperplanes = [];\n for (let index = 0; index < options.numTables * options.numHyperplanes; index += 1) {\n const plane = Array.from({ length: dimensions }, () => rng() * 2 - 1);\n const norm = Math.sqrt(plane.reduce((sum, value) => sum + value ** 2, 0));\n this.hyperplanes.push(norm === 0 ? plane : plane.map((value) => value / norm));\n }\n this.tables = Array.from({ length: options.numTables }, () => new Map());\n }\n\n insert(id: string, vector: number[]): void {\n for (let table = 0; table < this.options.numTables; table += 1) {\n const hash = this.hash(vector, table);\n const bucket = this.tables[table]?.get(hash) ?? new Set<string>();\n bucket.add(id);\n this.tables[table]?.set(hash, bucket);\n }\n }\n\n query(vector: number[]): Set<string> {\n const candidates = new Set<string>();\n for (let table = 0; table < this.options.numTables; table += 1) {\n const hash = this.hash(vector, table);\n for (const id of this.tables[table]?.get(hash) ?? []) {\n candidates.add(id);\n }\n }\n return candidates;\n }\n\n private hash(vector: number[], table: number): string {\n let hash = \"\";\n const start = table * this.options.numHyperplanes;\n for (let offset = 0; offset < this.options.numHyperplanes; offset += 1) {\n const plane = this.hyperplanes[start + offset] as number[];\n const dot = vector.reduce((sum, value, index) => sum + value * (plane[index] ?? 0), 0);\n hash += dot >= 0 ? \"1\" : \"0\";\n }\n return hash;\n }\n}\n\nfunction seededRandom(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (state * 1664525 + 1013904223) >>> 0;\n return state / 0x100000000;\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-MNWK2USR.js
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
mapWithConcurrency
|
|
3
|
-
} from "./chunk-OIMLU4SF.js";
|
|
4
|
-
|
|
5
|
-
// src/embeddings/distance.ts
|
|
6
|
-
function dotProduct(left, right) {
|
|
7
|
-
assertSameDimensions(left, right);
|
|
8
|
-
return left.reduce((sum, value, index) => sum + value * right[index], 0);
|
|
9
|
-
}
|
|
10
|
-
function cosineSimilarity(left, right) {
|
|
11
|
-
assertSameDimensions(left, right);
|
|
12
|
-
const leftMagnitude = magnitude(left);
|
|
13
|
-
const rightMagnitude = magnitude(right);
|
|
14
|
-
if (leftMagnitude === 0 || rightMagnitude === 0) {
|
|
15
|
-
return 0;
|
|
16
|
-
}
|
|
17
|
-
return dotProduct(left, right) / (leftMagnitude * rightMagnitude);
|
|
18
|
-
}
|
|
19
|
-
function angularDistance(left, right) {
|
|
20
|
-
const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));
|
|
21
|
-
return Math.acos(similarity) / Math.PI;
|
|
22
|
-
}
|
|
23
|
-
function euclideanDistance(left, right) {
|
|
24
|
-
assertSameDimensions(left, right);
|
|
25
|
-
return Math.sqrt(
|
|
26
|
-
left.reduce((sum, value, index) => sum + (value - right[index]) ** 2, 0)
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
function manhattanDistance(left, right) {
|
|
30
|
-
assertSameDimensions(left, right);
|
|
31
|
-
return left.reduce((sum, value, index) => sum + Math.abs(value - right[index]), 0);
|
|
32
|
-
}
|
|
33
|
-
function chebyshevDistance(left, right) {
|
|
34
|
-
assertSameDimensions(left, right);
|
|
35
|
-
return left.reduce(
|
|
36
|
-
(max, value, index) => Math.max(max, Math.abs(value - right[index])),
|
|
37
|
-
0
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
function magnitude(vector) {
|
|
41
|
-
return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));
|
|
42
|
-
}
|
|
43
|
-
function assertSameDimensions(left, right) {
|
|
44
|
-
if (left.length !== right.length) {
|
|
45
|
-
throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// src/embeddings/embed.ts
|
|
50
|
-
async function embedText(model, text) {
|
|
51
|
-
const embeddings = await embedTexts(model, [text]);
|
|
52
|
-
const embedding = embeddings[0];
|
|
53
|
-
if (embedding === void 0) {
|
|
54
|
-
throw new Error("Embedding model returned no embeddings");
|
|
55
|
-
}
|
|
56
|
-
return embedding;
|
|
57
|
-
}
|
|
58
|
-
async function embedTexts(model, texts) {
|
|
59
|
-
if (texts.length === 0) {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
62
|
-
const maxBatchSize = Math.max(1, Math.trunc(model.maxBatchSize ?? texts.length));
|
|
63
|
-
const batches = [];
|
|
64
|
-
for (let index = 0; index < texts.length; index += maxBatchSize) {
|
|
65
|
-
batches.push(texts.slice(index, index + maxBatchSize));
|
|
66
|
-
}
|
|
67
|
-
const results = await mapWithConcurrency(batches, 1, (batch) => model.embedTexts(batch));
|
|
68
|
-
const embeddings = results.flat();
|
|
69
|
-
if (embeddings.length !== texts.length) {
|
|
70
|
-
throw new Error(
|
|
71
|
-
`Embedding model returned ${embeddings.length} embeddings for ${texts.length} texts`
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
return embeddings;
|
|
75
|
-
}
|
|
76
|
-
async function embedSparseTexts(model, texts) {
|
|
77
|
-
if (texts.length === 0) {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
const maxBatchSize = Math.max(1, Math.trunc(model.maxBatchSize ?? texts.length));
|
|
81
|
-
const batches = [];
|
|
82
|
-
for (let index = 0; index < texts.length; index += maxBatchSize) {
|
|
83
|
-
batches.push(texts.slice(index, index + maxBatchSize));
|
|
84
|
-
}
|
|
85
|
-
const results = await mapWithConcurrency(batches, 1, (batch) => model.embedTexts(batch));
|
|
86
|
-
const embeddings = results.flat();
|
|
87
|
-
if (embeddings.length !== texts.length) {
|
|
88
|
-
throw new Error(
|
|
89
|
-
`Sparse embedding model returned ${embeddings.length} embeddings for ${texts.length} texts`
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
return embeddings;
|
|
93
|
-
}
|
|
94
|
-
async function embedSparseQuery(model, query) {
|
|
95
|
-
return model.embedQuery(query);
|
|
96
|
-
}
|
|
97
|
-
async function embedDocuments(model, documents, options) {
|
|
98
|
-
const prepared = prepareDocuments(documents, options);
|
|
99
|
-
const flatTexts = prepared.flatMap(
|
|
100
|
-
(item, documentIndex) => item.texts.map((text) => ({ documentIndex, text }))
|
|
101
|
-
);
|
|
102
|
-
const embeddings = await mapWithConcurrency(
|
|
103
|
-
chunk(flatTexts, Math.max(1, Math.trunc(model.maxBatchSize ?? (flatTexts.length || 1)))),
|
|
104
|
-
Math.max(1, Math.trunc(options.concurrency ?? 1)),
|
|
105
|
-
async (batch) => {
|
|
106
|
-
const batchEmbeddings = await model.embedTexts(batch.map((item) => item.text));
|
|
107
|
-
if (batchEmbeddings.length !== batch.length) {
|
|
108
|
-
throw new Error(
|
|
109
|
-
`Embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
return batch.map((item, index) => ({
|
|
113
|
-
documentIndex: item.documentIndex,
|
|
114
|
-
embedding: batchEmbeddings[index]
|
|
115
|
-
}));
|
|
116
|
-
}
|
|
117
|
-
);
|
|
118
|
-
const byDocument = /* @__PURE__ */ new Map();
|
|
119
|
-
for (const item of embeddings.flat()) {
|
|
120
|
-
const list = byDocument.get(item.documentIndex) ?? [];
|
|
121
|
-
list.push(item.embedding);
|
|
122
|
-
byDocument.set(item.documentIndex, list);
|
|
123
|
-
}
|
|
124
|
-
return prepared.map((item, index) => {
|
|
125
|
-
const documentEmbeddings = byDocument.get(index) ?? [];
|
|
126
|
-
if (item.metadata === void 0) {
|
|
127
|
-
return { id: item.id, document: item.document, embeddings: documentEmbeddings };
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
id: item.id,
|
|
131
|
-
document: item.document,
|
|
132
|
-
metadata: item.metadata,
|
|
133
|
-
embeddings: documentEmbeddings
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
async function embedHybridDocuments(models, documents, options) {
|
|
138
|
-
const prepared = prepareDocuments(documents, options);
|
|
139
|
-
const flatTexts = prepared.flatMap(
|
|
140
|
-
(item, documentIndex) => item.texts.map((text) => ({ documentIndex, text }))
|
|
141
|
-
);
|
|
142
|
-
const concurrency = Math.max(1, Math.trunc(options.concurrency ?? 1));
|
|
143
|
-
const denseBatches = chunk(
|
|
144
|
-
flatTexts,
|
|
145
|
-
Math.max(1, Math.trunc(models.dense.maxBatchSize ?? (flatTexts.length || 1)))
|
|
146
|
-
);
|
|
147
|
-
const sparseBatches = chunk(
|
|
148
|
-
flatTexts,
|
|
149
|
-
Math.max(1, Math.trunc(models.sparse.maxBatchSize ?? (flatTexts.length || 1)))
|
|
150
|
-
);
|
|
151
|
-
const [denseResults, sparseResults] = await Promise.all([
|
|
152
|
-
mapWithConcurrency(denseBatches, concurrency, async (batch) => {
|
|
153
|
-
const batchEmbeddings = await models.dense.embedTexts(batch.map((item) => item.text));
|
|
154
|
-
if (batchEmbeddings.length !== batch.length) {
|
|
155
|
-
throw new Error(
|
|
156
|
-
`Embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
return batch.map((item, index) => ({
|
|
160
|
-
documentIndex: item.documentIndex,
|
|
161
|
-
embedding: batchEmbeddings[index]
|
|
162
|
-
}));
|
|
163
|
-
}),
|
|
164
|
-
mapWithConcurrency(sparseBatches, concurrency, async (batch) => {
|
|
165
|
-
const batchEmbeddings = await models.sparse.embedTexts(batch.map((item) => item.text));
|
|
166
|
-
if (batchEmbeddings.length !== batch.length) {
|
|
167
|
-
throw new Error(
|
|
168
|
-
`Sparse embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
return batch.map((item, index) => ({
|
|
172
|
-
documentIndex: item.documentIndex,
|
|
173
|
-
embedding: batchEmbeddings[index]
|
|
174
|
-
}));
|
|
175
|
-
})
|
|
176
|
-
]);
|
|
177
|
-
const denseByDocument = /* @__PURE__ */ new Map();
|
|
178
|
-
for (const item of denseResults.flat()) {
|
|
179
|
-
const list = denseByDocument.get(item.documentIndex) ?? [];
|
|
180
|
-
list.push(item.embedding);
|
|
181
|
-
denseByDocument.set(item.documentIndex, list);
|
|
182
|
-
}
|
|
183
|
-
const sparseByDocument = /* @__PURE__ */ new Map();
|
|
184
|
-
for (const item of sparseResults.flat()) {
|
|
185
|
-
const list = sparseByDocument.get(item.documentIndex) ?? [];
|
|
186
|
-
list.push(item.embedding);
|
|
187
|
-
sparseByDocument.set(item.documentIndex, list);
|
|
188
|
-
}
|
|
189
|
-
return prepared.map((item, index) => {
|
|
190
|
-
const embeddings = denseByDocument.get(index) ?? [];
|
|
191
|
-
const sparseEmbeddings = sparseByDocument.get(index) ?? [];
|
|
192
|
-
if (embeddings.length !== sparseEmbeddings.length) {
|
|
193
|
-
throw new Error(
|
|
194
|
-
`Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
if (item.metadata === void 0) {
|
|
198
|
-
return { id: item.id, document: item.document, embeddings, sparseEmbeddings };
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
id: item.id,
|
|
202
|
-
document: item.document,
|
|
203
|
-
metadata: item.metadata,
|
|
204
|
-
embeddings,
|
|
205
|
-
sparseEmbeddings
|
|
206
|
-
};
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
function prepareDocuments(documents, options) {
|
|
210
|
-
return documents.map((document, index) => {
|
|
211
|
-
const content = options.content(document, index);
|
|
212
|
-
const texts = Array.isArray(content) ? content : [content];
|
|
213
|
-
return {
|
|
214
|
-
id: options.id?.(document, index) ?? `doc${index}`,
|
|
215
|
-
document,
|
|
216
|
-
metadata: options.metadata?.(document, index),
|
|
217
|
-
texts
|
|
218
|
-
};
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
function chunk(items, size) {
|
|
222
|
-
const chunks = [];
|
|
223
|
-
for (let index = 0; index < items.length; index += size) {
|
|
224
|
-
chunks.push(items.slice(index, index + size));
|
|
225
|
-
}
|
|
226
|
-
return chunks;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
export {
|
|
230
|
-
dotProduct,
|
|
231
|
-
cosineSimilarity,
|
|
232
|
-
angularDistance,
|
|
233
|
-
euclideanDistance,
|
|
234
|
-
manhattanDistance,
|
|
235
|
-
chebyshevDistance,
|
|
236
|
-
embedText,
|
|
237
|
-
embedTexts,
|
|
238
|
-
embedSparseTexts,
|
|
239
|
-
embedSparseQuery,
|
|
240
|
-
embedDocuments,
|
|
241
|
-
embedHybridDocuments
|
|
242
|
-
};
|
|
243
|
-
//# sourceMappingURL=chunk-MNWK2USR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/embeddings/distance.ts","../src/embeddings/embed.ts"],"sourcesContent":["export function dotProduct(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + value * (right[index] as number), 0);\n}\n\nexport function cosineSimilarity(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n const leftMagnitude = magnitude(left);\n const rightMagnitude = magnitude(right);\n if (leftMagnitude === 0 || rightMagnitude === 0) {\n return 0;\n }\n return dotProduct(left, right) / (leftMagnitude * rightMagnitude);\n}\n\nexport function angularDistance(left: number[], right: number[]): number {\n const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));\n return Math.acos(similarity) / Math.PI;\n}\n\nexport function euclideanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return Math.sqrt(\n left.reduce((sum, value, index) => sum + (value - (right[index] as number)) ** 2, 0),\n );\n}\n\nexport function manhattanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + Math.abs(value - (right[index] as number)), 0);\n}\n\nexport function chebyshevDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce(\n (max, value, index) => Math.max(max, Math.abs(value - (right[index] as number))),\n 0,\n );\n}\n\nfunction magnitude(vector: number[]): number {\n return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));\n}\n\nfunction assertSameDimensions(left: number[], right: number[]): void {\n if (left.length !== right.length) {\n throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);\n }\n}\n","import { mapWithConcurrency } from \"../internal/concurrency\";\nimport type {\n EmbedDocumentsOptions,\n EmbeddedDocument,\n Embedding,\n EmbeddingModel,\n EmbedHybridDocumentsOptions,\n SparseEmbedding,\n SparseEmbeddingModel,\n VectorMetadata,\n} from \"./types\";\n\nexport async function embedText(model: EmbeddingModel, text: string): Promise<Embedding> {\n const embeddings = await embedTexts(model, [text]);\n const embedding = embeddings[0];\n if (embedding === undefined) {\n throw new Error(\"Embedding model returned no embeddings\");\n }\n return embedding;\n}\n\nexport async function embedTexts(model: EmbeddingModel, texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const maxBatchSize = Math.max(1, Math.trunc(model.maxBatchSize ?? texts.length));\n const batches: string[][] = [];\n for (let index = 0; index < texts.length; index += maxBatchSize) {\n batches.push(texts.slice(index, index + maxBatchSize));\n }\n\n const results = await mapWithConcurrency(batches, 1, (batch) => model.embedTexts(batch));\n const embeddings = results.flat();\n if (embeddings.length !== texts.length) {\n throw new Error(\n `Embedding model returned ${embeddings.length} embeddings for ${texts.length} texts`,\n );\n }\n return embeddings;\n}\n\nexport async function embedSparseTexts(\n model: SparseEmbeddingModel,\n texts: string[],\n): Promise<SparseEmbedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const maxBatchSize = Math.max(1, Math.trunc(model.maxBatchSize ?? texts.length));\n const batches: string[][] = [];\n for (let index = 0; index < texts.length; index += maxBatchSize) {\n batches.push(texts.slice(index, index + maxBatchSize));\n }\n\n const results = await mapWithConcurrency(batches, 1, (batch) => model.embedTexts(batch));\n const embeddings = results.flat();\n if (embeddings.length !== texts.length) {\n throw new Error(\n `Sparse embedding model returned ${embeddings.length} embeddings for ${texts.length} texts`,\n );\n }\n return embeddings;\n}\n\nexport async function embedSparseQuery(\n model: SparseEmbeddingModel,\n query: string,\n): Promise<SparseEmbedding> {\n return model.embedQuery(query);\n}\n\nexport async function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n model: EmbeddingModel,\n documents: T[],\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<Array<EmbeddedDocument<T, Metadata>>> {\n const prepared = prepareDocuments(documents, options);\n\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const embeddings = await mapWithConcurrency(\n chunk(flatTexts, Math.max(1, Math.trunc(model.maxBatchSize ?? (flatTexts.length || 1)))),\n Math.max(1, Math.trunc(options.concurrency ?? 1)),\n async (batch) => {\n const batchEmbeddings = await model.embedTexts(batch.map((item) => item.text));\n if (batchEmbeddings.length !== batch.length) {\n throw new Error(\n `Embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`,\n );\n }\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: batchEmbeddings[index] as Embedding,\n }));\n },\n );\n\n const byDocument = new Map<number, Embedding[]>();\n for (const item of embeddings.flat()) {\n const list = byDocument.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n byDocument.set(item.documentIndex, list);\n }\n\n return prepared.map((item, index) => {\n const documentEmbeddings = byDocument.get(index) ?? [];\n if (item.metadata === undefined) {\n return { id: item.id, document: item.document, embeddings: documentEmbeddings };\n }\n return {\n id: item.id,\n document: item.document,\n metadata: item.metadata,\n embeddings: documentEmbeddings,\n };\n });\n}\n\nexport async function embedHybridDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n models: EmbedHybridDocumentsOptions,\n documents: T[],\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<Array<EmbeddedDocument<T, Metadata>>> {\n const prepared = prepareDocuments(documents, options);\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const concurrency = Math.max(1, Math.trunc(options.concurrency ?? 1));\n\n const denseBatches = chunk(\n flatTexts,\n Math.max(1, Math.trunc(models.dense.maxBatchSize ?? (flatTexts.length || 1))),\n );\n const sparseBatches = chunk(\n flatTexts,\n Math.max(1, Math.trunc(models.sparse.maxBatchSize ?? (flatTexts.length || 1))),\n );\n\n const [denseResults, sparseResults] = await Promise.all([\n mapWithConcurrency(denseBatches, concurrency, async (batch) => {\n const batchEmbeddings = await models.dense.embedTexts(batch.map((item) => item.text));\n if (batchEmbeddings.length !== batch.length) {\n throw new Error(\n `Embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`,\n );\n }\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: batchEmbeddings[index] as Embedding,\n }));\n }),\n mapWithConcurrency(sparseBatches, concurrency, async (batch) => {\n const batchEmbeddings = await models.sparse.embedTexts(batch.map((item) => item.text));\n if (batchEmbeddings.length !== batch.length) {\n throw new Error(\n `Sparse embedding model returned ${batchEmbeddings.length} embeddings for ${batch.length} texts`,\n );\n }\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: batchEmbeddings[index] as SparseEmbedding,\n }));\n }),\n ]);\n\n const denseByDocument = new Map<number, Embedding[]>();\n for (const item of denseResults.flat()) {\n const list = denseByDocument.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n denseByDocument.set(item.documentIndex, list);\n }\n\n const sparseByDocument = new Map<number, SparseEmbedding[]>();\n for (const item of sparseResults.flat()) {\n const list = sparseByDocument.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n sparseByDocument.set(item.documentIndex, list);\n }\n\n return prepared.map((item, index) => {\n const embeddings = denseByDocument.get(index) ?? [];\n const sparseEmbeddings = sparseByDocument.get(index) ?? [];\n if (embeddings.length !== sparseEmbeddings.length) {\n throw new Error(\n `Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`,\n );\n }\n if (item.metadata === undefined) {\n return { id: item.id, document: item.document, embeddings, sparseEmbeddings };\n }\n return {\n id: item.id,\n document: item.document,\n metadata: item.metadata,\n embeddings,\n sparseEmbeddings,\n };\n });\n}\n\nfunction prepareDocuments<T, Metadata extends VectorMetadata>(\n documents: T[],\n options: EmbedDocumentsOptions<T, Metadata>,\n) {\n return documents.map((document, index) => {\n const content = options.content(document, index);\n const texts = Array.isArray(content) ? content : [content];\n return {\n id: options.id?.(document, index) ?? `doc${index}`,\n document,\n metadata: options.metadata?.(document, index),\n texts,\n };\n });\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size) {\n chunks.push(items.slice(index, index + size));\n }\n return chunks;\n}\n"],"mappings":";;;;;AAAO,SAAS,WAAW,MAAgB,OAAyB;AAClE,uBAAqB,MAAM,KAAK;AAChC,SAAO,KAAK,OAAO,CAAC,KAAK,OAAO,UAAU,MAAM,QAAS,MAAM,KAAK,GAAc,CAAC;AACrF;AAEO,SAAS,iBAAiB,MAAgB,OAAyB;AACxE,uBAAqB,MAAM,KAAK;AAChC,QAAM,gBAAgB,UAAU,IAAI;AACpC,QAAM,iBAAiB,UAAU,KAAK;AACtC,MAAI,kBAAkB,KAAK,mBAAmB,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,WAAW,MAAM,KAAK,KAAK,gBAAgB;AACpD;AAEO,SAAS,gBAAgB,MAAgB,OAAyB;AACvE,QAAM,aAAa,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,iBAAiB,MAAM,KAAK,CAAC,CAAC;AAC1E,SAAO,KAAK,KAAK,UAAU,IAAI,KAAK;AACtC;AAEO,SAAS,kBAAkB,MAAgB,OAAyB;AACzE,uBAAqB,MAAM,KAAK;AAChC,SAAO,KAAK;AAAA,IACV,KAAK,OAAO,CAAC,KAAK,OAAO,UAAU,OAAO,QAAS,MAAM,KAAK,MAAiB,GAAG,CAAC;AAAA,EACrF;AACF;AAEO,SAAS,kBAAkB,MAAgB,OAAyB;AACzE,uBAAqB,MAAM,KAAK;AAChC,SAAO,KAAK,OAAO,CAAC,KAAK,OAAO,UAAU,MAAM,KAAK,IAAI,QAAS,MAAM,KAAK,CAAY,GAAG,CAAC;AAC/F;AAEO,SAAS,kBAAkB,MAAgB,OAAyB;AACzE,uBAAqB,MAAM,KAAK;AAChC,SAAO,KAAK;AAAA,IACV,CAAC,KAAK,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,QAAS,MAAM,KAAK,CAAY,CAAC;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,SAAS,UAAU,QAA0B;AAC3C,SAAO,KAAK,KAAK,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,SAAS,GAAG,CAAC,CAAC;AACrE;AAEA,SAAS,qBAAqB,MAAgB,OAAuB;AACnE,MAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,UAAM,IAAI,MAAM,8BAA8B,KAAK,MAAM,QAAQ,MAAM,MAAM,EAAE;AAAA,EACjF;AACF;;;ACpCA,eAAsB,UAAU,OAAuB,MAAkC;AACvF,QAAM,aAAa,MAAM,WAAW,OAAO,CAAC,IAAI,CAAC;AACjD,QAAM,YAAY,WAAW,CAAC;AAC9B,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,eAAsB,WAAW,OAAuB,OAAuC;AAC7F,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,gBAAgB,MAAM,MAAM,CAAC;AAC/E,QAAM,UAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,cAAc;AAC/D,YAAQ,KAAK,MAAM,MAAM,OAAO,QAAQ,YAAY,CAAC;AAAA,EACvD;AAEA,QAAM,UAAU,MAAM,mBAAmB,SAAS,GAAG,CAAC,UAAU,MAAM,WAAW,KAAK,CAAC;AACvF,QAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,WAAW,WAAW,MAAM,QAAQ;AACtC,UAAM,IAAI;AAAA,MACR,4BAA4B,WAAW,MAAM,mBAAmB,MAAM,MAAM;AAAA,IAC9E;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,iBACpB,OACA,OAC4B;AAC5B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,gBAAgB,MAAM,MAAM,CAAC;AAC/E,QAAM,UAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,cAAc;AAC/D,YAAQ,KAAK,MAAM,MAAM,OAAO,QAAQ,YAAY,CAAC;AAAA,EACvD;AAEA,QAAM,UAAU,MAAM,mBAAmB,SAAS,GAAG,CAAC,UAAU,MAAM,WAAW,KAAK,CAAC;AACvF,QAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,WAAW,WAAW,MAAM,QAAQ;AACtC,UAAM,IAAI;AAAA,MACR,mCAAmC,WAAW,MAAM,mBAAmB,MAAM,MAAM;AAAA,IACrF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,iBACpB,OACA,OAC0B;AAC1B,SAAO,MAAM,WAAW,KAAK;AAC/B;AAEA,eAAsB,eACpB,OACA,WACA,SAC+C;AAC/C,QAAM,WAAW,iBAAiB,WAAW,OAAO;AAEpD,QAAM,YAAY,SAAS;AAAA,IAAQ,CAAC,MAAM,kBACxC,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,KAAK,EAAE;AAAA,EACpD;AACA,QAAM,aAAa,MAAM;AAAA,IACvB,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,iBAAiB,UAAU,UAAU,EAAE,CAAC,CAAC;AAAA,IACvF,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,eAAe,CAAC,CAAC;AAAA,IAChD,OAAO,UAAU;AACf,YAAM,kBAAkB,MAAM,MAAM,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAC7E,UAAI,gBAAgB,WAAW,MAAM,QAAQ;AAC3C,cAAM,IAAI;AAAA,UACR,4BAA4B,gBAAgB,MAAM,mBAAmB,MAAM,MAAM;AAAA,QACnF;AAAA,MACF;AACA,aAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QACjC,eAAe,KAAK;AAAA,QACpB,WAAW,gBAAgB,KAAK;AAAA,MAClC,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,aAAa,oBAAI,IAAyB;AAChD,aAAW,QAAQ,WAAW,KAAK,GAAG;AACpC,UAAM,OAAO,WAAW,IAAI,KAAK,aAAa,KAAK,CAAC;AACpD,SAAK,KAAK,KAAK,SAAS;AACxB,eAAW,IAAI,KAAK,eAAe,IAAI;AAAA,EACzC;AAEA,SAAO,SAAS,IAAI,CAAC,MAAM,UAAU;AACnC,UAAM,qBAAqB,WAAW,IAAI,KAAK,KAAK,CAAC;AACrD,QAAI,KAAK,aAAa,QAAW;AAC/B,aAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU,YAAY,mBAAmB;AAAA,IAChF;AACA,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,qBACpB,QACA,WACA,SAC+C;AAC/C,QAAM,WAAW,iBAAiB,WAAW,OAAO;AACpD,QAAM,YAAY,SAAS;AAAA,IAAQ,CAAC,MAAM,kBACxC,KAAK,MAAM,IAAI,CAAC,UAAU,EAAE,eAAe,KAAK,EAAE;AAAA,EACpD;AACA,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,eAAe,CAAC,CAAC;AAEpE,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,MAAM,iBAAiB,UAAU,UAAU,EAAE,CAAC;AAAA,EAC9E;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,OAAO,iBAAiB,UAAU,UAAU,EAAE,CAAC;AAAA,EAC/E;AAEA,QAAM,CAAC,cAAc,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtD,mBAAmB,cAAc,aAAa,OAAO,UAAU;AAC7D,YAAM,kBAAkB,MAAM,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACpF,UAAI,gBAAgB,WAAW,MAAM,QAAQ;AAC3C,cAAM,IAAI;AAAA,UACR,4BAA4B,gBAAgB,MAAM,mBAAmB,MAAM,MAAM;AAAA,QACnF;AAAA,MACF;AACA,aAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QACjC,eAAe,KAAK;AAAA,QACpB,WAAW,gBAAgB,KAAK;AAAA,MAClC,EAAE;AAAA,IACJ,CAAC;AAAA,IACD,mBAAmB,eAAe,aAAa,OAAO,UAAU;AAC9D,YAAM,kBAAkB,MAAM,OAAO,OAAO,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACrF,UAAI,gBAAgB,WAAW,MAAM,QAAQ;AAC3C,cAAM,IAAI;AAAA,UACR,mCAAmC,gBAAgB,MAAM,mBAAmB,MAAM,MAAM;AAAA,QAC1F;AAAA,MACF;AACA,aAAO,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,QACjC,eAAe,KAAK;AAAA,QACpB,WAAW,gBAAgB,KAAK;AAAA,MAClC,EAAE;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AAED,QAAM,kBAAkB,oBAAI,IAAyB;AACrD,aAAW,QAAQ,aAAa,KAAK,GAAG;AACtC,UAAM,OAAO,gBAAgB,IAAI,KAAK,aAAa,KAAK,CAAC;AACzD,SAAK,KAAK,KAAK,SAAS;AACxB,oBAAgB,IAAI,KAAK,eAAe,IAAI;AAAA,EAC9C;AAEA,QAAM,mBAAmB,oBAAI,IAA+B;AAC5D,aAAW,QAAQ,cAAc,KAAK,GAAG;AACvC,UAAM,OAAO,iBAAiB,IAAI,KAAK,aAAa,KAAK,CAAC;AAC1D,SAAK,KAAK,KAAK,SAAS;AACxB,qBAAiB,IAAI,KAAK,eAAe,IAAI;AAAA,EAC/C;AAEA,SAAO,SAAS,IAAI,CAAC,MAAM,UAAU;AACnC,UAAM,aAAa,gBAAgB,IAAI,KAAK,KAAK,CAAC;AAClD,UAAM,mBAAmB,iBAAiB,IAAI,KAAK,KAAK,CAAC;AACzD,QAAI,WAAW,WAAW,iBAAiB,QAAQ;AACjD,YAAM,IAAI;AAAA,QACR,6BAA6B,WAAW,MAAM,cAAc,iBAAiB,MAAM,gCAAgC,KAAK,EAAE;AAAA,MAC5H;AAAA,IACF;AACA,QAAI,KAAK,aAAa,QAAW;AAC/B,aAAO,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU,YAAY,iBAAiB;AAAA,IAC9E;AACA,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,iBACP,WACA,SACA;AACA,SAAO,UAAU,IAAI,CAAC,UAAU,UAAU;AACxC,UAAM,UAAU,QAAQ,QAAQ,UAAU,KAAK;AAC/C,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACzD,WAAO;AAAA,MACL,IAAI,QAAQ,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK;AAAA,MAChD;AAAA,MACA,UAAU,QAAQ,WAAW,UAAU,KAAK;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,MAAS,OAAY,MAAqB;AACjD,QAAM,SAAgB,CAAC;AACvB,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,MAAM;AACvD,WAAO,KAAK,MAAM,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,EAC9C;AACA,SAAO;AACT;","names":[]}
|