@anvia/core 1.0.0-rc.1 → 1.0.0-rc.3
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 +344 -85
- package/dist/agent/index.d.ts +33 -18
- package/dist/agent/index.js +42 -17
- package/dist/agent-CXScUOpX.d.ts +150 -0
- package/dist/{chunk-R2LJSQUW.js → chunk-3CMWKK32.js} +260 -104
- package/dist/chunk-3CMWKK32.js.map +1 -0
- package/dist/chunk-3RM57ZT2.js +31 -0
- package/dist/chunk-3RM57ZT2.js.map +1 -0
- package/dist/chunk-5MK3BISB.js +704 -0
- package/dist/chunk-5MK3BISB.js.map +1 -0
- package/dist/chunk-AI5JMUW7.js +45 -0
- package/dist/chunk-AI5JMUW7.js.map +1 -0
- package/dist/{chunk-FNQB2JEH.js → chunk-AZB6N7P4.js} +94 -65
- package/dist/chunk-AZB6N7P4.js.map +1 -0
- package/dist/chunk-BEYBU7VJ.js +53 -0
- package/dist/chunk-BEYBU7VJ.js.map +1 -0
- package/dist/chunk-BY4OMNIU.js +4699 -0
- package/dist/chunk-BY4OMNIU.js.map +1 -0
- package/dist/chunk-D2ECOWN5.js +515 -0
- package/dist/chunk-D2ECOWN5.js.map +1 -0
- package/dist/{chunk-A3UBYTJT.js → chunk-FN7HLLAZ.js} +60 -6
- 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-GQL5KRAH.js +331 -0
- package/dist/chunk-GQL5KRAH.js.map +1 -0
- package/dist/{chunk-5XKDW36Z.js → chunk-KFR4CDGK.js} +70 -75
- package/dist/chunk-KFR4CDGK.js.map +1 -0
- package/dist/chunk-KV6QCRQ4.js +171 -0
- package/dist/chunk-KV6QCRQ4.js.map +1 -0
- package/dist/{chunk-DMPUP4R3.js → chunk-LXMAFD23.js} +5 -5
- package/dist/{chunk-I6G7BC42.js → chunk-MGNTXGTX.js} +2 -6
- package/dist/chunk-MGNTXGTX.js.map +1 -0
- package/dist/chunk-PK5LKOFL.js +239 -0
- package/dist/chunk-PK5LKOFL.js.map +1 -0
- package/dist/chunk-QOUPWOGW.js +29 -0
- package/dist/chunk-QOUPWOGW.js.map +1 -0
- package/dist/chunk-TRQ3XRFD.js +54 -0
- package/dist/chunk-TRQ3XRFD.js.map +1 -0
- package/dist/chunk-VKYZZXP5.js +323 -0
- package/dist/chunk-VKYZZXP5.js.map +1 -0
- package/dist/chunk-ZCPOIDAQ.js +127 -0
- package/dist/chunk-ZCPOIDAQ.js.map +1 -0
- package/dist/client-DvUatElp.d.ts +84 -0
- package/dist/completion/index.d.ts +5 -4
- package/dist/completion/index.js +25 -28
- package/dist/documents/index.d.ts +34 -0
- package/dist/documents/index.js +315 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/{dynamic-tools-i9woysFa.d.ts → dynamic-tools-AEBOTgu1.d.ts} +21 -9
- package/dist/embeddings/index.d.ts +11 -9
- package/dist/embeddings/index.js +3 -3
- package/dist/evals/index.d.ts +53 -25
- package/dist/evals/index.js +153 -103
- package/dist/evals/index.js.map +1 -1
- package/dist/extractor/index.d.ts +23 -26
- package/dist/extractor/index.js +7 -8
- package/dist/guardrails/index.d.ts +7 -129
- package/dist/guardrails/index.js +1 -1
- package/dist/image-generation/index.d.ts +18 -16
- package/dist/image-generation/index.js +2 -2
- package/dist/index.d.ts +26 -23
- package/dist/index.js +71 -48
- package/dist/interactions-csssHYcN.d.ts +174 -0
- package/dist/internal/agent.d.ts +36 -29
- package/dist/internal/agent.js +48 -15
- package/dist/internal/agent.js.map +1 -1
- package/dist/mcp/index.d.ts +19 -13
- package/dist/mcp/index.js +14 -348
- package/dist/mcp/index.js.map +1 -1
- package/dist/memory/index.d.ts +20 -6
- package/dist/memory/index.js +10 -10
- package/dist/message-schema-B2M7AYzR.d.ts +52 -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 +21 -6
- package/dist/observability/index.js +8 -5
- package/dist/observability/index.js.map +1 -1
- package/dist/pipeline/index.d.ts +106 -57
- package/dist/pipeline/index.js +419 -236
- package/dist/pipeline/index.js.map +1 -1
- package/dist/{retry-D3Ruy-ba.d.ts → retry-CjvSlKGW.d.ts} +2 -1
- package/dist/skills/index.d.ts +5 -4
- package/dist/skills/index.js +8 -7
- package/dist/speech-generation/index.d.ts +37 -0
- package/dist/speech-generation/index.js +8 -0
- package/dist/text-C_6eKrbC.d.ts +32 -0
- package/dist/{think-tool-DZqZj2LV.d.ts → think-tool-D8frXxwV.d.ts} +16 -2
- package/dist/tool/index.d.ts +9 -7
- package/dist/tool/index.js +12 -10
- package/dist/{tool-C_8GudXn.d.ts → tool-r62gf3QY.d.ts} +17 -8
- package/dist/transcription/index.d.ts +23 -14
- package/dist/transcription/index.js +2 -2
- package/dist/types-C3gv9EX6.d.ts +130 -0
- package/dist/{index-DxB74ybJ.d.ts → types-CElwurHZ.d.ts} +139 -88
- package/dist/types-CIPaIbZo.d.ts +105 -0
- package/dist/types-Cr4uiYo5.d.ts +99 -0
- package/dist/types-D9rKQ_as.d.ts +341 -0
- package/dist/types-DbolvLtZ.d.ts +155 -0
- package/dist/{types-DhQfwiZn.d.ts → types-RT3cuyRk.d.ts} +1 -1
- package/dist/vector-store/index.d.ts +33 -34
- package/dist/vector-store/index.js +7 -6
- package/package.json +10 -14
- package/dist/agent-DGYY_onS.d.ts +0 -145
- package/dist/audio-generation/index.d.ts +0 -31
- package/dist/audio-generation/index.js +0 -8
- package/dist/chunk-5XKDW36Z.js.map +0 -1
- package/dist/chunk-6WGGTJE6.js +0 -139
- package/dist/chunk-6WGGTJE6.js.map +0 -1
- package/dist/chunk-A3UBYTJT.js.map +0 -1
- package/dist/chunk-ADH7NNCS.js +0 -512
- package/dist/chunk-ADH7NNCS.js.map +0 -1
- package/dist/chunk-DZ3CKYTH.js +0 -267
- package/dist/chunk-DZ3CKYTH.js.map +0 -1
- package/dist/chunk-FNQB2JEH.js.map +0 -1
- package/dist/chunk-I6G7BC42.js.map +0 -1
- package/dist/chunk-IL3ZSNJI.js +0 -3748
- package/dist/chunk-IL3ZSNJI.js.map +0 -1
- package/dist/chunk-J6GNQART.js +0 -122
- package/dist/chunk-J6GNQART.js.map +0 -1
- package/dist/chunk-M3IOWB4Y.js +0 -280
- package/dist/chunk-M3IOWB4Y.js.map +0 -1
- package/dist/chunk-QY5GZ7HR.js +0 -39
- package/dist/chunk-QY5GZ7HR.js.map +0 -1
- package/dist/chunk-R2LJSQUW.js.map +0 -1
- package/dist/chunk-RFDVKCIE.js +0 -12
- package/dist/chunk-RFDVKCIE.js.map +0 -1
- package/dist/chunk-RMUBRRSK.js +0 -34
- package/dist/chunk-RMUBRRSK.js.map +0 -1
- package/dist/chunk-RXKHOYEH.js +0 -466
- package/dist/chunk-RXKHOYEH.js.map +0 -1
- package/dist/chunk-XDRSPSR7.js +0 -38
- package/dist/chunk-XDRSPSR7.js.map +0 -1
- package/dist/chunk-XWUC7CIT.js +0 -1
- package/dist/chunk-XWUC7CIT.js.map +0 -1
- package/dist/errors-CYKUcU89.d.ts +0 -17
- package/dist/json-Zo7K3xmt.d.ts +0 -40
- package/dist/loaders/index.d.ts +0 -86
- package/dist/loaders/index.js +0 -299
- package/dist/loaders/index.js.map +0 -1
- package/dist/middleware-KynLg_RW.d.ts +0 -56
- package/dist/types-B3A4YxaA.d.ts +0 -354
- package/dist/types-BBEGKB9m.d.ts +0 -119
- package/dist/types-DT3nEemY.d.ts +0 -79
- package/dist/types-DulRCYdB.d.ts +0 -70
- package/dist/types-p55Jc-sr.d.ts +0 -47
- 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/{chunk-DMPUP4R3.js.map → chunk-LXMAFD23.js.map} +0 -0
- /package/dist/{audio-generation → speech-generation}/index.js.map +0 -0
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
// src/internal/abort.ts
|
|
2
|
+
function throwIfAborted(signal) {
|
|
3
|
+
if (signal?.aborted === true) {
|
|
4
|
+
throw abortError(signal.reason);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
function abortError(reason) {
|
|
8
|
+
if (isAbortError(reason)) {
|
|
9
|
+
return reason;
|
|
10
|
+
}
|
|
11
|
+
const error = new Error(
|
|
12
|
+
"The operation was aborted.",
|
|
13
|
+
reason === void 0 ? void 0 : { cause: reason }
|
|
14
|
+
);
|
|
15
|
+
error.name = "AbortError";
|
|
16
|
+
return error;
|
|
17
|
+
}
|
|
18
|
+
function isAbortError(error) {
|
|
19
|
+
const seen = /* @__PURE__ */ new Set();
|
|
20
|
+
let current = error;
|
|
21
|
+
while (typeof current === "object" && current !== null && !seen.has(current)) {
|
|
22
|
+
seen.add(current);
|
|
23
|
+
if ("name" in current && current.name === "AbortError") {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
current = "cause" in current ? current.cause : void 0;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function waitForAbortableDelay(delayMs, signal) {
|
|
31
|
+
throwIfAborted(signal);
|
|
32
|
+
if (delayMs === 0) return Promise.resolve();
|
|
33
|
+
if (signal === void 0) {
|
|
34
|
+
return new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
35
|
+
}
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const timer = setTimeout(() => {
|
|
38
|
+
signal.removeEventListener("abort", onAbort);
|
|
39
|
+
resolve();
|
|
40
|
+
}, delayMs);
|
|
41
|
+
const onAbort = () => {
|
|
42
|
+
clearTimeout(timer);
|
|
43
|
+
reject(abortError(signal.reason));
|
|
44
|
+
};
|
|
45
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
1
49
|
// src/retry.ts
|
|
2
50
|
var DEFAULT_MAX_ATTEMPTS = 3;
|
|
3
51
|
var DEFAULT_INITIAL_DELAY_MS = 100;
|
|
@@ -60,11 +108,11 @@ function retryErrorAttributes(error) {
|
|
|
60
108
|
const errorCode = errors.map((candidate) => errorCodeProperty(candidate)).find((value) => value !== void 0);
|
|
61
109
|
return { errorName, statusCode, errorCode };
|
|
62
110
|
}
|
|
63
|
-
async function waitForRetry(delayMs) {
|
|
64
|
-
|
|
65
|
-
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
111
|
+
async function waitForRetry(delayMs, abortSignal) {
|
|
112
|
+
await waitForAbortableDelay(delayMs, abortSignal);
|
|
66
113
|
}
|
|
67
114
|
function retryOptionsForFailure(options, context) {
|
|
115
|
+
if (isAbortError(context.error)) return void 0;
|
|
68
116
|
if (options === void 0 || context.attempt >= options.maxAttempts) return void 0;
|
|
69
117
|
return options.shouldRetry({ ...context, maxAttempts: options.maxAttempts }) ? options : void 0;
|
|
70
118
|
}
|
|
@@ -74,16 +122,19 @@ async function runWithRetries(operation, options, context) {
|
|
|
74
122
|
try {
|
|
75
123
|
return await operation();
|
|
76
124
|
} catch (error) {
|
|
125
|
+
if (context.abortSignal?.aborted === true) {
|
|
126
|
+
throw abortError(context.abortSignal.reason);
|
|
127
|
+
}
|
|
77
128
|
const retryOptions = retryOptionsForFailure(options, { error, attempt, ...context });
|
|
78
129
|
if (retryOptions === void 0) throw error;
|
|
79
|
-
await waitForRetry(retryDelayMs(retryOptions, attempt));
|
|
130
|
+
await waitForRetry(retryDelayMs(retryOptions, attempt), context.abortSignal);
|
|
80
131
|
attempt += 1;
|
|
81
132
|
}
|
|
82
133
|
}
|
|
83
134
|
}
|
|
84
135
|
function defaultShouldRetry(context) {
|
|
85
136
|
const errors = errorChain(context.error);
|
|
86
|
-
if (
|
|
137
|
+
if (isAbortError(context.error)) return false;
|
|
87
138
|
const statusCode = firstStatusCode(errors);
|
|
88
139
|
if (statusCode !== void 0) {
|
|
89
140
|
return RETRYABLE_STATUS_CODES.has(statusCode) || statusCode >= 500 && statusCode <= 599;
|
|
@@ -147,6 +198,9 @@ function isObject(value) {
|
|
|
147
198
|
}
|
|
148
199
|
|
|
149
200
|
export {
|
|
201
|
+
throwIfAborted,
|
|
202
|
+
abortError,
|
|
203
|
+
isAbortError,
|
|
150
204
|
resolveRetryOptions,
|
|
151
205
|
retryDelayMs,
|
|
152
206
|
retryErrorAttributes,
|
|
@@ -154,4 +208,4 @@ export {
|
|
|
154
208
|
retryOptionsForFailure,
|
|
155
209
|
runWithRetries
|
|
156
210
|
};
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-FN7HLLAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/abort.ts","../src/retry.ts"],"sourcesContent":["export function throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw abortError(signal.reason);\n }\n}\n\nexport function abortError(reason?: unknown): Error {\n if (isAbortError(reason)) {\n return reason;\n }\n\n const error = new Error(\n \"The operation was aborted.\",\n reason === undefined ? undefined : { cause: reason },\n );\n error.name = \"AbortError\";\n return error;\n}\n\nexport function isAbortError(error: unknown): error is Error {\n const seen = new Set<object>();\n let current = error;\n while (typeof current === \"object\" && current !== null && !seen.has(current)) {\n seen.add(current);\n if (\"name\" in current && current.name === \"AbortError\") {\n return true;\n }\n current = \"cause\" in current ? current.cause : undefined;\n }\n return false;\n}\n\nexport function waitForAbortableDelay(\n delayMs: number,\n signal: AbortSignal | undefined,\n): Promise<void> {\n throwIfAborted(signal);\n if (delayMs === 0) return Promise.resolve();\n if (signal === undefined) {\n return new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortError(signal.reason));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n","import type { JsonValue } from \"./completion/types\";\nimport { abortError, isAbortError, waitForAbortableDelay } from \"./internal/abort\";\n\nexport type RetryContext = {\n error: unknown;\n attempt: number;\n maxAttempts: number;\n streaming: boolean;\n turn?: number | undefined;\n};\n\nexport type RetryOptions = {\n maxAttempts?: number | undefined;\n initialDelayMs?: number | undefined;\n maxDelayMs?: number | undefined;\n shouldRetry?: ((context: RetryContext) => boolean) | undefined;\n};\n\nexport type RetrySetting = RetryOptions | false;\n\nexport type ResolvedRetryOptions = {\n maxAttempts: number;\n initialDelayMs: number;\n maxDelayMs: number;\n shouldRetry: (context: RetryContext) => boolean;\n};\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_INITIAL_DELAY_MS = 100;\nconst DEFAULT_MAX_DELAY_MS = 1_000;\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nconst RETRYABLE_STATUS_CODES = new Set([408, 409, 425, 429]);\nconst RETRYABLE_NUMERIC_ERROR_CODES = new Set([4, 8, 14]);\nconst RETRYABLE_ERROR_NAMES = new Set([\n \"APIConnectionError\",\n \"APIConnectionTimeoutError\",\n \"TimeoutError\",\n]);\nconst RETRYABLE_ERROR_CODES = new Set([\n \"DEADLINE_EXCEEDED\",\n \"EAI_AGAIN\",\n \"ECONNREFUSED\",\n \"ECONNRESET\",\n \"EHOSTUNREACH\",\n \"ENETDOWN\",\n \"ENETUNREACH\",\n \"EPIPE\",\n \"ETIMEDOUT\",\n \"RESOURCE_EXHAUSTED\",\n \"UNAVAILABLE\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n]);\n\nexport function resolveRetryOptions(options: RetryOptions): ResolvedRetryOptions {\n const maxAttempts = options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n const initialDelayMs = options.initialDelayMs ?? DEFAULT_INITIAL_DELAY_MS;\n const maxDelayMs = options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n\n if (!Number.isSafeInteger(maxAttempts) || maxAttempts < 1) {\n throw new RangeError(\"Retry maxAttempts must be a positive integer.\");\n }\n assertDelay(initialDelayMs, \"initialDelayMs\");\n assertDelay(maxDelayMs, \"maxDelayMs\");\n if (maxDelayMs < initialDelayMs) {\n throw new RangeError(\"Retry maxDelayMs must be greater than or equal to initialDelayMs.\");\n }\n if (options.shouldRetry !== undefined && typeof options.shouldRetry !== \"function\") {\n throw new TypeError(\"Retry shouldRetry must be a function.\");\n }\n\n return {\n maxAttempts,\n initialDelayMs,\n maxDelayMs,\n shouldRetry: options.shouldRetry ?? defaultShouldRetry,\n };\n}\n\nexport function retryDelayMs(options: ResolvedRetryOptions, failedAttempt: number): number {\n const exponentialDelay = options.initialDelayMs * 2 ** (failedAttempt - 1);\n const cappedDelay = Math.min(options.maxDelayMs, exponentialDelay);\n return Math.random() * cappedDelay;\n}\n\nexport function retryErrorAttributes(error: unknown): Record<string, JsonValue | undefined> {\n const errors = errorChain(error);\n const errorName = errors\n .map((candidate) => stringProperty(candidate, \"name\"))\n .find((value) => value !== undefined);\n const statusCode = firstStatusCode(errors);\n const errorCode = errors\n .map((candidate) => errorCodeProperty(candidate))\n .find((value) => value !== undefined);\n\n return { errorName, statusCode, errorCode };\n}\n\nexport async function waitForRetry(\n delayMs: number,\n abortSignal?: AbortSignal | undefined,\n): Promise<void> {\n await waitForAbortableDelay(delayMs, abortSignal);\n}\n\nexport function retryOptionsForFailure(\n options: ResolvedRetryOptions | undefined,\n context: Omit<RetryContext, \"maxAttempts\">,\n): ResolvedRetryOptions | undefined {\n if (isAbortError(context.error)) return undefined;\n if (options === undefined || context.attempt >= options.maxAttempts) return undefined;\n return options.shouldRetry({ ...context, maxAttempts: options.maxAttempts })\n ? options\n : undefined;\n}\n\nexport async function runWithRetries<T>(\n operation: () => Promise<T>,\n options: ResolvedRetryOptions | undefined,\n context: {\n streaming: boolean;\n turn?: number | undefined;\n abortSignal?: AbortSignal | undefined;\n },\n): Promise<T> {\n let attempt = 1;\n while (true) {\n try {\n return await operation();\n } catch (error) {\n if (context.abortSignal?.aborted === true) {\n throw abortError(context.abortSignal.reason);\n }\n const retryOptions = retryOptionsForFailure(options, { error, attempt, ...context });\n if (retryOptions === undefined) throw error;\n await waitForRetry(retryDelayMs(retryOptions, attempt), context.abortSignal);\n attempt += 1;\n }\n }\n}\n\nfunction defaultShouldRetry(context: RetryContext): boolean {\n const errors = errorChain(context.error);\n if (isAbortError(context.error)) return false;\n\n const statusCode = firstStatusCode(errors);\n if (statusCode !== undefined) {\n return RETRYABLE_STATUS_CODES.has(statusCode) || (statusCode >= 500 && statusCode <= 599);\n }\n\n return errors.some((error) => {\n const name = stringProperty(error, \"name\");\n if (name !== undefined && RETRYABLE_ERROR_NAMES.has(name)) return true;\n const code = stringProperty(error, \"code\")?.toUpperCase();\n if (code !== undefined && RETRYABLE_ERROR_CODES.has(code)) return true;\n const numericCode = numberProperty(error, \"code\");\n return numericCode !== undefined && RETRYABLE_NUMERIC_ERROR_CODES.has(numericCode);\n });\n}\n\nfunction firstStatusCode(errors: Record<string, unknown>[]): number | undefined {\n for (const error of errors) {\n const status = numberProperty(error, \"status\");\n if (status !== undefined && status >= 100 && status <= 599) return status;\n const statusCode = numberProperty(error, \"statusCode\");\n if (statusCode !== undefined && statusCode >= 100 && statusCode <= 599) return statusCode;\n const code = numberProperty(error, \"code\");\n if (code !== undefined && code >= 100 && code <= 599) return code;\n }\n return undefined;\n}\n\nfunction errorChain(error: unknown): Record<string, unknown>[] {\n const errors: Record<string, unknown>[] = [];\n const seen = new Set<object>();\n let current = error;\n while (isObject(current) && !seen.has(current)) {\n seen.add(current);\n errors.push(current);\n current = property(current, \"cause\");\n }\n return errors;\n}\n\nfunction assertDelay(value: number, name: string): void {\n if (!Number.isFinite(value) || value < 0 || value > MAX_TIMER_DELAY_MS) {\n throw new RangeError(`Retry ${name} must be between 0 and ${MAX_TIMER_DELAY_MS} milliseconds.`);\n }\n}\n\nfunction numberProperty(value: Record<string, unknown>, name: string): number | undefined {\n const candidate = property(value, name);\n return typeof candidate === \"number\" && Number.isFinite(candidate) ? candidate : undefined;\n}\n\nfunction stringProperty(value: Record<string, unknown>, name: string): string | undefined {\n const candidate = property(value, name);\n return typeof candidate === \"string\" && candidate.length > 0 ? candidate : undefined;\n}\n\nfunction errorCodeProperty(value: Record<string, unknown>): string | number | undefined {\n return stringProperty(value, \"code\") ?? numberProperty(value, \"code\");\n}\n\nfunction property(value: Record<string, unknown>, name: string): unknown {\n try {\n return value[name];\n } catch {\n return undefined;\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveRetryOptions,
|
|
3
|
+
runWithRetries,
|
|
4
|
+
throwIfAborted
|
|
5
|
+
} from "./chunk-FN7HLLAZ.js";
|
|
6
|
+
|
|
7
|
+
// src/transcription/transcribe.ts
|
|
8
|
+
async function transcribe(options) {
|
|
9
|
+
const data = toUint8Array(options.audio.data);
|
|
10
|
+
if (data.byteLength === 0) {
|
|
11
|
+
throw new Error("Transcription audio cannot be empty.");
|
|
12
|
+
}
|
|
13
|
+
if (typeof options.audio.filename !== "string" || options.audio.filename.trim().length === 0) {
|
|
14
|
+
throw new TypeError("Transcription filename must be a non-empty string.");
|
|
15
|
+
}
|
|
16
|
+
throwIfAborted(options.abortSignal);
|
|
17
|
+
const request = { data, filename: options.audio.filename };
|
|
18
|
+
if (options.audio.mediaType !== void 0) request.mediaType = options.audio.mediaType;
|
|
19
|
+
if (options.language !== void 0) request.language = options.language;
|
|
20
|
+
if (options.prompt !== void 0) request.prompt = options.prompt;
|
|
21
|
+
if (options.temperature !== void 0) request.temperature = options.temperature;
|
|
22
|
+
if (options.providerOptions !== void 0) request.providerOptions = options.providerOptions;
|
|
23
|
+
return await runWithRetries(
|
|
24
|
+
() => {
|
|
25
|
+
throwIfAborted(options.abortSignal);
|
|
26
|
+
return options.model.transcription(request, modelCallOptions(options.abortSignal));
|
|
27
|
+
},
|
|
28
|
+
resolveRetries(options.retries),
|
|
29
|
+
{ streaming: false, abortSignal: options.abortSignal }
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
function resolveRetries(setting) {
|
|
33
|
+
return setting === void 0 || setting === false ? void 0 : resolveRetryOptions(setting);
|
|
34
|
+
}
|
|
35
|
+
function modelCallOptions(abortSignal) {
|
|
36
|
+
return abortSignal === void 0 ? void 0 : { abortSignal };
|
|
37
|
+
}
|
|
38
|
+
function toUint8Array(bytes) {
|
|
39
|
+
if (bytes instanceof Uint8Array) {
|
|
40
|
+
return new Uint8Array(
|
|
41
|
+
bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
return new Uint8Array(bytes.slice(0));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
transcribe
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=chunk-GKDERULJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transcription/transcribe.ts"],"sourcesContent":["import type { JsonObject } from \"../completion\";\nimport { throwIfAborted } from \"../internal/abort\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport {\n type ResolvedRetryOptions,\n type RetrySetting,\n resolveRetryOptions,\n runWithRetries,\n} from \"../retry\";\nimport type { TranscriptionModel, TranscriptionRequest, TranscriptionResult } from \"./types\";\n\nexport type TranscriptionAudio = {\n data: Uint8Array | ArrayBuffer;\n filename: string;\n mediaType?: string | undefined;\n};\n\nexport type TranscribeOptions<Model extends TranscriptionModel = TranscriptionModel> = {\n model: Model;\n audio: TranscriptionAudio;\n language?: string | undefined;\n prompt?: string | undefined;\n temperature?: number | undefined;\n providerOptions?: JsonObject | undefined;\n retries?: RetrySetting | undefined;\n abortSignal?: AbortSignal | undefined;\n};\n\ntype RawResponseOf<Model> =\n Model extends TranscriptionModel<infer RawResponse> ? RawResponse : unknown;\n\nexport async function transcribe<Model extends TranscriptionModel>(\n options: TranscribeOptions<Model>,\n): Promise<TranscriptionResult<RawResponseOf<Model>>> {\n const data = toUint8Array(options.audio.data);\n if (data.byteLength === 0) {\n throw new Error(\"Transcription audio cannot be empty.\");\n }\n if (typeof options.audio.filename !== \"string\" || options.audio.filename.trim().length === 0) {\n throw new TypeError(\"Transcription filename must be a non-empty string.\");\n }\n throwIfAborted(options.abortSignal);\n\n const request: TranscriptionRequest = { data, filename: options.audio.filename };\n if (options.audio.mediaType !== undefined) request.mediaType = options.audio.mediaType;\n if (options.language !== undefined) request.language = options.language;\n if (options.prompt !== undefined) request.prompt = options.prompt;\n if (options.temperature !== undefined) request.temperature = options.temperature;\n if (options.providerOptions !== undefined) request.providerOptions = options.providerOptions;\n\n return await runWithRetries(\n () => {\n throwIfAborted(options.abortSignal);\n return options.model.transcription(request, modelCallOptions(options.abortSignal)) as Promise<\n TranscriptionResult<RawResponseOf<Model>>\n >;\n },\n resolveRetries(options.retries),\n { streaming: false, abortSignal: options.abortSignal },\n );\n}\n\nfunction resolveRetries(setting: RetrySetting | undefined): ResolvedRetryOptions | undefined {\n return setting === undefined || setting === false ? undefined : resolveRetryOptions(setting);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n if (bytes instanceof Uint8Array) {\n return new Uint8Array(\n bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength),\n );\n }\n return new Uint8Array(bytes.slice(0));\n}\n"],"mappings":";;;;;;;AA+BA,eAAsB,WACpB,SACoD;AACpD,QAAM,OAAO,aAAa,QAAQ,MAAM,IAAI;AAC5C,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,MAAI,OAAO,QAAQ,MAAM,aAAa,YAAY,QAAQ,MAAM,SAAS,KAAK,EAAE,WAAW,GAAG;AAC5F,UAAM,IAAI,UAAU,oDAAoD;AAAA,EAC1E;AACA,iBAAe,QAAQ,WAAW;AAElC,QAAM,UAAgC,EAAE,MAAM,UAAU,QAAQ,MAAM,SAAS;AAC/E,MAAI,QAAQ,MAAM,cAAc,OAAW,SAAQ,YAAY,QAAQ,MAAM;AAC7E,MAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAC/D,MAAI,QAAQ,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC3D,MAAI,QAAQ,gBAAgB,OAAW,SAAQ,cAAc,QAAQ;AACrE,MAAI,QAAQ,oBAAoB,OAAW,SAAQ,kBAAkB,QAAQ;AAE7E,SAAO,MAAM;AAAA,IACX,MAAM;AACJ,qBAAe,QAAQ,WAAW;AAClC,aAAO,QAAQ,MAAM,cAAc,SAAS,iBAAiB,QAAQ,WAAW,CAAC;AAAA,IAGnF;AAAA,IACA,eAAe,QAAQ,OAAO;AAAA,IAC9B,EAAE,WAAW,OAAO,aAAa,QAAQ,YAAY;AAAA,EACvD;AACF;AAEA,SAAS,eAAe,SAAqE;AAC3F,SAAO,YAAY,UAAa,YAAY,QAAQ,SAAY,oBAAoB,OAAO;AAC7F;AAEA,SAAS,iBAAiB,aAAoE;AAC5F,SAAO,gBAAgB,SAAY,SAAY,EAAE,YAAY;AAC/D;AAEA,SAAS,aAAa,OAA6C;AACjE,MAAI,iBAAiB,YAAY;AAC/B,WAAO,IAAI;AAAA,MACT,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU;AAAA,IAC1E;AAAA,EACF;AACA,SAAO,IAAI,WAAW,MAAM,MAAM,CAAC,CAAC;AACtC;","names":[]}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mapWithConcurrency
|
|
3
|
+
} from "./chunk-3RM57ZT2.js";
|
|
4
|
+
import {
|
|
5
|
+
resolveRetryOptions,
|
|
6
|
+
runWithRetries,
|
|
7
|
+
throwIfAborted
|
|
8
|
+
} from "./chunk-FN7HLLAZ.js";
|
|
9
|
+
|
|
10
|
+
// src/embeddings/distance.ts
|
|
11
|
+
function dotProduct(left, right) {
|
|
12
|
+
assertSameDimensions(left, right);
|
|
13
|
+
return left.reduce((sum, value, index) => sum + value * right[index], 0);
|
|
14
|
+
}
|
|
15
|
+
function cosineSimilarity(left, right) {
|
|
16
|
+
assertSameDimensions(left, right);
|
|
17
|
+
const leftMagnitude = magnitude(left);
|
|
18
|
+
const rightMagnitude = magnitude(right);
|
|
19
|
+
if (leftMagnitude === 0 || rightMagnitude === 0) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
return dotProduct(left, right) / (leftMagnitude * rightMagnitude);
|
|
23
|
+
}
|
|
24
|
+
function angularDistance(left, right) {
|
|
25
|
+
const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));
|
|
26
|
+
return Math.acos(similarity) / Math.PI;
|
|
27
|
+
}
|
|
28
|
+
function euclideanDistance(left, right) {
|
|
29
|
+
assertSameDimensions(left, right);
|
|
30
|
+
return Math.sqrt(
|
|
31
|
+
left.reduce((sum, value, index) => sum + (value - right[index]) ** 2, 0)
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
function manhattanDistance(left, right) {
|
|
35
|
+
assertSameDimensions(left, right);
|
|
36
|
+
return left.reduce((sum, value, index) => sum + Math.abs(value - right[index]), 0);
|
|
37
|
+
}
|
|
38
|
+
function chebyshevDistance(left, right) {
|
|
39
|
+
assertSameDimensions(left, right);
|
|
40
|
+
return left.reduce(
|
|
41
|
+
(max, value, index) => Math.max(max, Math.abs(value - right[index])),
|
|
42
|
+
0
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
function magnitude(vector) {
|
|
46
|
+
return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));
|
|
47
|
+
}
|
|
48
|
+
function assertSameDimensions(left, right) {
|
|
49
|
+
if (left.length !== right.length) {
|
|
50
|
+
throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/embeddings/embed.ts
|
|
55
|
+
async function embedText(options) {
|
|
56
|
+
const { embeddings } = await embedTexts({
|
|
57
|
+
model: options.model,
|
|
58
|
+
texts: [options.text],
|
|
59
|
+
retries: options.retries,
|
|
60
|
+
abortSignal: options.abortSignal
|
|
61
|
+
});
|
|
62
|
+
const embedding = embeddings[0];
|
|
63
|
+
if (embedding === void 0) throw new Error("Embedding model returned no embeddings");
|
|
64
|
+
return { embedding };
|
|
65
|
+
}
|
|
66
|
+
async function embedTexts(options) {
|
|
67
|
+
throwIfAborted(options.abortSignal);
|
|
68
|
+
if (options.texts.length === 0) return { embeddings: [] };
|
|
69
|
+
const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));
|
|
70
|
+
const results = await mapWithConcurrency(
|
|
71
|
+
batches,
|
|
72
|
+
concurrency(options.concurrency),
|
|
73
|
+
(batch) => embedDenseBatch(options.model, batch, options)
|
|
74
|
+
);
|
|
75
|
+
const embeddings = results.flat();
|
|
76
|
+
if (embeddings.length !== options.texts.length) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`Embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return { embeddings };
|
|
82
|
+
}
|
|
83
|
+
async function embedSparseTexts(options) {
|
|
84
|
+
throwIfAborted(options.abortSignal);
|
|
85
|
+
if (options.texts.length === 0) return { embeddings: [] };
|
|
86
|
+
const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));
|
|
87
|
+
const results = await mapWithConcurrency(
|
|
88
|
+
batches,
|
|
89
|
+
concurrency(options.concurrency),
|
|
90
|
+
(batch) => embedSparseBatch(options.model, batch, options)
|
|
91
|
+
);
|
|
92
|
+
const embeddings = results.flat();
|
|
93
|
+
if (embeddings.length !== options.texts.length) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Sparse embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return { embeddings };
|
|
99
|
+
}
|
|
100
|
+
async function embedSparseQuery(options) {
|
|
101
|
+
throwIfAborted(options.abortSignal);
|
|
102
|
+
const embedding = await runWithRetries(
|
|
103
|
+
() => {
|
|
104
|
+
throwIfAborted(options.abortSignal);
|
|
105
|
+
return options.model.embedQuery(options.query, modelCallOptions(options.abortSignal));
|
|
106
|
+
},
|
|
107
|
+
resolveRetries(options),
|
|
108
|
+
{ streaming: false, abortSignal: options.abortSignal }
|
|
109
|
+
);
|
|
110
|
+
throwIfAborted(options.abortSignal);
|
|
111
|
+
validateSparseEmbedding(embedding, "query");
|
|
112
|
+
return { embedding };
|
|
113
|
+
}
|
|
114
|
+
async function embedDocuments(options) {
|
|
115
|
+
throwIfAborted(options.abortSignal);
|
|
116
|
+
const prepared = prepareDocuments(options.documents, options);
|
|
117
|
+
const flatTexts = prepared.flatMap(
|
|
118
|
+
(item, documentIndex) => item.texts.map((text) => ({ documentIndex, text }))
|
|
119
|
+
);
|
|
120
|
+
const concurrencyLimit = concurrency(options.concurrency);
|
|
121
|
+
if ("model" in options && options.model !== void 0) {
|
|
122
|
+
const batches = chunk(flatTexts, batchSize(options.model.maxBatchSize, flatTexts.length || 1));
|
|
123
|
+
const results = await mapWithConcurrency(batches, concurrencyLimit, async (batch) => {
|
|
124
|
+
const embeddings = await embedDenseBatch(
|
|
125
|
+
options.model,
|
|
126
|
+
batch.map((item) => item.text),
|
|
127
|
+
options
|
|
128
|
+
);
|
|
129
|
+
assertBatchLength("Embedding", embeddings.length, batch.length);
|
|
130
|
+
return batch.map((item, index) => ({
|
|
131
|
+
documentIndex: item.documentIndex,
|
|
132
|
+
embedding: embeddings[index]
|
|
133
|
+
}));
|
|
134
|
+
});
|
|
135
|
+
const byDocument = groupEmbeddings(results.flat());
|
|
136
|
+
return {
|
|
137
|
+
documents: prepared.map((item, index) => embeddedDocument(item, byDocument.get(index) ?? []))
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const { dense, sparse } = options.models;
|
|
141
|
+
const [denseResults, sparseResults] = await Promise.all([
|
|
142
|
+
mapWithConcurrency(
|
|
143
|
+
chunk(flatTexts, batchSize(dense.maxBatchSize, flatTexts.length || 1)),
|
|
144
|
+
concurrencyLimit,
|
|
145
|
+
async (batch) => {
|
|
146
|
+
const embeddings = await embedDenseBatch(
|
|
147
|
+
dense,
|
|
148
|
+
batch.map((item) => item.text),
|
|
149
|
+
options
|
|
150
|
+
);
|
|
151
|
+
assertBatchLength("Embedding", embeddings.length, batch.length);
|
|
152
|
+
return batch.map((item, index) => ({
|
|
153
|
+
documentIndex: item.documentIndex,
|
|
154
|
+
embedding: embeddings[index]
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
),
|
|
158
|
+
mapWithConcurrency(
|
|
159
|
+
chunk(flatTexts, batchSize(sparse.maxBatchSize, flatTexts.length || 1)),
|
|
160
|
+
concurrencyLimit,
|
|
161
|
+
async (batch) => {
|
|
162
|
+
const embeddings = await embedSparseBatch(
|
|
163
|
+
sparse,
|
|
164
|
+
batch.map((item) => item.text),
|
|
165
|
+
options
|
|
166
|
+
);
|
|
167
|
+
assertBatchLength("Sparse embedding", embeddings.length, batch.length);
|
|
168
|
+
return batch.map((item, index) => ({
|
|
169
|
+
documentIndex: item.documentIndex,
|
|
170
|
+
embedding: embeddings[index]
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
]);
|
|
175
|
+
const denseByDocument = groupEmbeddings(denseResults.flat());
|
|
176
|
+
const sparseByDocument = groupEmbeddings(sparseResults.flat());
|
|
177
|
+
return {
|
|
178
|
+
documents: prepared.map((item, index) => {
|
|
179
|
+
const embeddings = denseByDocument.get(index) ?? [];
|
|
180
|
+
const sparseEmbeddings = sparseByDocument.get(index) ?? [];
|
|
181
|
+
if (embeddings.length !== sparseEmbeddings.length) {
|
|
182
|
+
throw new Error(
|
|
183
|
+
`Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
return embeddedDocument(item, embeddings, sparseEmbeddings);
|
|
187
|
+
})
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async function embedDenseBatch(model, texts, options) {
|
|
191
|
+
throwIfAborted(options.abortSignal);
|
|
192
|
+
const embeddings = await runWithRetries(
|
|
193
|
+
() => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
|
|
194
|
+
resolveRetries(options),
|
|
195
|
+
{ streaming: false, abortSignal: options.abortSignal }
|
|
196
|
+
);
|
|
197
|
+
throwIfAborted(options.abortSignal);
|
|
198
|
+
for (const [index, embedding] of embeddings.entries()) {
|
|
199
|
+
validateDenseEmbedding(embedding, model.dimensions, index);
|
|
200
|
+
}
|
|
201
|
+
return embeddings;
|
|
202
|
+
}
|
|
203
|
+
async function embedSparseBatch(model, texts, options) {
|
|
204
|
+
throwIfAborted(options.abortSignal);
|
|
205
|
+
const embeddings = await runWithRetries(
|
|
206
|
+
() => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
|
|
207
|
+
resolveRetries(options),
|
|
208
|
+
{ streaming: false, abortSignal: options.abortSignal }
|
|
209
|
+
);
|
|
210
|
+
throwIfAborted(options.abortSignal);
|
|
211
|
+
for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);
|
|
212
|
+
return embeddings;
|
|
213
|
+
}
|
|
214
|
+
function prepareDocuments(documents, options) {
|
|
215
|
+
const ids = /* @__PURE__ */ new Set();
|
|
216
|
+
return documents.map((document, index) => {
|
|
217
|
+
const id = options.id?.(document, index) ?? `doc${index}`;
|
|
218
|
+
if (id.length === 0) throw new TypeError("Embedded document ids must not be empty");
|
|
219
|
+
if (ids.has(id)) throw new TypeError(`Duplicate embedded document id: ${id}`);
|
|
220
|
+
ids.add(id);
|
|
221
|
+
const content = options.content(document, index);
|
|
222
|
+
if (Array.isArray(content) && content.length === 0)
|
|
223
|
+
throw new TypeError(`Embedded document ${id} must contain at least one text chunk`);
|
|
224
|
+
return {
|
|
225
|
+
id,
|
|
226
|
+
document,
|
|
227
|
+
metadata: options.metadata?.(document, index),
|
|
228
|
+
texts: Array.isArray(content) ? content : [content]
|
|
229
|
+
};
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
function embeddedDocument(item, embeddings, sparseEmbeddings) {
|
|
233
|
+
let result = {
|
|
234
|
+
id: item.id,
|
|
235
|
+
document: item.document,
|
|
236
|
+
embeddings
|
|
237
|
+
};
|
|
238
|
+
if (item.metadata !== void 0) {
|
|
239
|
+
result = { ...result, metadata: item.metadata };
|
|
240
|
+
}
|
|
241
|
+
if (sparseEmbeddings !== void 0) {
|
|
242
|
+
result = { ...result, sparseEmbeddings };
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
function groupEmbeddings(items) {
|
|
247
|
+
const groups = /* @__PURE__ */ new Map();
|
|
248
|
+
for (const item of items) {
|
|
249
|
+
const list = groups.get(item.documentIndex) ?? [];
|
|
250
|
+
list.push(item.embedding);
|
|
251
|
+
groups.set(item.documentIndex, list);
|
|
252
|
+
}
|
|
253
|
+
return groups;
|
|
254
|
+
}
|
|
255
|
+
function assertBatchLength(name, actual, expected) {
|
|
256
|
+
if (actual !== expected)
|
|
257
|
+
throw new Error(`${name} model returned ${actual} embeddings for ${expected} texts`);
|
|
258
|
+
}
|
|
259
|
+
function resolveRetries(options) {
|
|
260
|
+
return options.retries === void 0 || options.retries === false ? void 0 : resolveRetryOptions(options.retries);
|
|
261
|
+
}
|
|
262
|
+
function modelCallOptions(abortSignal) {
|
|
263
|
+
return abortSignal === void 0 ? void 0 : { abortSignal };
|
|
264
|
+
}
|
|
265
|
+
function chunk(items, size) {
|
|
266
|
+
const chunks = [];
|
|
267
|
+
for (let index = 0; index < items.length; index += size)
|
|
268
|
+
chunks.push(items.slice(index, index + size));
|
|
269
|
+
return chunks;
|
|
270
|
+
}
|
|
271
|
+
function batchSize(configured, fallback) {
|
|
272
|
+
if (configured === void 0) return fallback;
|
|
273
|
+
if (!Number.isSafeInteger(configured) || configured < 1) {
|
|
274
|
+
throw new RangeError("Embedding model maxBatchSize must be a positive safe integer");
|
|
275
|
+
}
|
|
276
|
+
return configured;
|
|
277
|
+
}
|
|
278
|
+
function concurrency(configured) {
|
|
279
|
+
if (configured === void 0) return 1;
|
|
280
|
+
if (!Number.isSafeInteger(configured) || configured < 1) {
|
|
281
|
+
throw new RangeError("Embedding concurrency must be a positive safe integer");
|
|
282
|
+
}
|
|
283
|
+
return configured;
|
|
284
|
+
}
|
|
285
|
+
function validateDenseEmbedding(embedding, dimensions, index) {
|
|
286
|
+
if (embedding.vector.length === 0) {
|
|
287
|
+
throw new TypeError(`Embedding model returned an empty vector at index ${index}`);
|
|
288
|
+
}
|
|
289
|
+
if (!embedding.vector.every(Number.isFinite)) {
|
|
290
|
+
throw new TypeError(`Embedding model returned a non-finite vector at index ${index}`);
|
|
291
|
+
}
|
|
292
|
+
if (dimensions !== void 0) {
|
|
293
|
+
if (!Number.isSafeInteger(dimensions) || dimensions < 1)
|
|
294
|
+
throw new TypeError("Embedding model dimensions must be a positive safe integer");
|
|
295
|
+
if (embedding.vector.length !== dimensions) {
|
|
296
|
+
throw new Error(
|
|
297
|
+
`Embedding model returned ${embedding.vector.length} dimensions at index ${index}; expected ${dimensions}`
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
function validateSparseEmbedding(embedding, index) {
|
|
303
|
+
const { indices, values } = embedding.vector;
|
|
304
|
+
if (indices.length !== values.length) {
|
|
305
|
+
throw new Error(`Sparse embedding at ${index} has mismatched indices and values`);
|
|
306
|
+
}
|
|
307
|
+
if (!indices.every((value) => Number.isSafeInteger(value) && value >= 0)) {
|
|
308
|
+
throw new TypeError(`Sparse embedding at ${index} has an invalid index`);
|
|
309
|
+
}
|
|
310
|
+
if (new Set(indices).size !== indices.length) {
|
|
311
|
+
throw new TypeError(`Sparse embedding at ${index} has duplicate indices`);
|
|
312
|
+
}
|
|
313
|
+
if (!values.every(Number.isFinite)) {
|
|
314
|
+
throw new TypeError(`Sparse embedding at ${index} has a non-finite value`);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export {
|
|
319
|
+
dotProduct,
|
|
320
|
+
cosineSimilarity,
|
|
321
|
+
angularDistance,
|
|
322
|
+
euclideanDistance,
|
|
323
|
+
manhattanDistance,
|
|
324
|
+
chebyshevDistance,
|
|
325
|
+
embedText,
|
|
326
|
+
embedTexts,
|
|
327
|
+
embedSparseTexts,
|
|
328
|
+
embedSparseQuery,
|
|
329
|
+
embedDocuments
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=chunk-GQL5KRAH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { throwIfAborted } from \"../internal/abort\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport { type ResolvedRetryOptions, resolveRetryOptions, runWithRetries } from \"../retry\";\nimport type {\n EmbedDocumentsOptions,\n EmbedDocumentsResult,\n EmbeddedDocument,\n Embedding,\n EmbeddingOperationOptions,\n EmbedHybridDocumentsOptions,\n EmbedSparseQueryOptions,\n EmbedSparseQueryResult,\n EmbedSparseTextsOptions,\n EmbedSparseTextsResult,\n EmbedTextOptions,\n EmbedTextResult,\n EmbedTextsOptions,\n EmbedTextsResult,\n SparseEmbedding,\n VectorMetadata,\n} from \"./types\";\n\nexport async function embedText(options: EmbedTextOptions): Promise<EmbedTextResult> {\n const { embeddings } = await embedTexts({\n model: options.model,\n texts: [options.text],\n retries: options.retries,\n abortSignal: options.abortSignal,\n });\n const embedding = embeddings[0];\n if (embedding === undefined) throw new Error(\"Embedding model returned no embeddings\");\n return { embedding };\n}\n\nexport async function embedTexts(options: EmbedTextsOptions): Promise<EmbedTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedDenseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n if (embeddings.length !== options.texts.length) {\n throw new Error(\n `Embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`,\n );\n }\n return { embeddings };\n}\n\nexport async function embedSparseTexts(\n options: EmbedSparseTextsOptions,\n): Promise<EmbedSparseTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedSparseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n if (embeddings.length !== options.texts.length) {\n throw new Error(\n `Sparse embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`,\n );\n }\n return { embeddings };\n}\n\nexport async function embedSparseQuery(\n options: EmbedSparseQueryOptions,\n): Promise<EmbedSparseQueryResult> {\n throwIfAborted(options.abortSignal);\n const embedding = await runWithRetries(\n () => {\n throwIfAborted(options.abortSignal);\n return options.model.embedQuery(options.query, modelCallOptions(options.abortSignal));\n },\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n validateSparseEmbedding(embedding, \"query\");\n return { embedding };\n}\n\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport async function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata> | EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>> {\n throwIfAborted(options.abortSignal);\n const prepared = prepareDocuments(options.documents, options);\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const concurrencyLimit = concurrency(options.concurrency);\n\n if (\"model\" in options && options.model !== undefined) {\n const batches = chunk(flatTexts, batchSize(options.model.maxBatchSize, flatTexts.length || 1));\n const results = await mapWithConcurrency(batches, concurrencyLimit, async (batch) => {\n const embeddings = await embedDenseBatch(\n options.model,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n });\n const byDocument = groupEmbeddings(results.flat());\n return {\n documents: prepared.map((item, index) => embeddedDocument(item, byDocument.get(index) ?? [])),\n };\n }\n\n const { dense, sparse } = options.models;\n const [denseResults, sparseResults] = await Promise.all([\n mapWithConcurrency(\n chunk(flatTexts, batchSize(dense.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedDenseBatch(\n dense,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n },\n ),\n mapWithConcurrency(\n chunk(flatTexts, batchSize(sparse.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedSparseBatch(\n sparse,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Sparse embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as SparseEmbedding,\n }));\n },\n ),\n ]);\n const denseByDocument = groupEmbeddings(denseResults.flat());\n const sparseByDocument = groupEmbeddings(sparseResults.flat());\n return {\n documents: 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 return embeddedDocument(item, embeddings, sparseEmbeddings);\n }),\n };\n}\n\nasync function embedDenseBatch(\n model: EmbedTextOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<Embedding[]> {\n throwIfAborted(options.abortSignal);\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) {\n validateDenseEmbedding(embedding, model.dimensions, index);\n }\n return embeddings;\n}\n\nasync function embedSparseBatch(\n model: EmbedSparseTextsOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<SparseEmbedding[]> {\n throwIfAborted(options.abortSignal);\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);\n return embeddings;\n}\n\nfunction prepareDocuments<T, Metadata extends VectorMetadata>(\n documents: T[],\n options: Pick<EmbedDocumentsOptions<T, Metadata>, \"id\" | \"content\" | \"metadata\">,\n) {\n const ids = new Set<string>();\n return documents.map((document, index) => {\n const id = options.id?.(document, index) ?? `doc${index}`;\n if (id.length === 0) throw new TypeError(\"Embedded document ids must not be empty\");\n if (ids.has(id)) throw new TypeError(`Duplicate embedded document id: ${id}`);\n ids.add(id);\n const content = options.content(document, index);\n if (Array.isArray(content) && content.length === 0)\n throw new TypeError(`Embedded document ${id} must contain at least one text chunk`);\n return {\n id,\n document,\n metadata: options.metadata?.(document, index),\n texts: Array.isArray(content) ? content : [content],\n };\n });\n}\n\nfunction embeddedDocument<T, Metadata extends VectorMetadata>(\n item: { id: string; document: T; metadata: Metadata | undefined },\n embeddings: Embedding[],\n sparseEmbeddings?: SparseEmbedding[],\n): EmbeddedDocument<T, Metadata> {\n let result: EmbeddedDocument<T, Metadata> = {\n id: item.id,\n document: item.document,\n embeddings,\n };\n if (item.metadata !== undefined) {\n result = { ...result, metadata: item.metadata };\n }\n if (sparseEmbeddings !== undefined) {\n result = { ...result, sparseEmbeddings };\n }\n return result;\n}\n\nfunction groupEmbeddings<E>(\n items: Array<{ documentIndex: number; embedding: E }>,\n): Map<number, E[]> {\n const groups = new Map<number, E[]>();\n for (const item of items) {\n const list = groups.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n groups.set(item.documentIndex, list);\n }\n return groups;\n}\n\nfunction assertBatchLength(name: string, actual: number, expected: number): void {\n if (actual !== expected)\n throw new Error(`${name} model returned ${actual} embeddings for ${expected} texts`);\n}\n\nfunction resolveRetries(options: EmbeddingOperationOptions): ResolvedRetryOptions | undefined {\n return options.retries === undefined || options.retries === false\n ? undefined\n : resolveRetryOptions(options.retries);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\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 return chunks;\n}\n\nfunction batchSize(configured: number | undefined, fallback: number): number {\n if (configured === undefined) return fallback;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding model maxBatchSize must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction concurrency(configured: number | undefined): number {\n if (configured === undefined) return 1;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding concurrency must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction validateDenseEmbedding(\n embedding: Embedding,\n dimensions: number | undefined,\n index: number,\n): void {\n if (embedding.vector.length === 0) {\n throw new TypeError(`Embedding model returned an empty vector at index ${index}`);\n }\n if (!embedding.vector.every(Number.isFinite)) {\n throw new TypeError(`Embedding model returned a non-finite vector at index ${index}`);\n }\n if (dimensions !== undefined) {\n if (!Number.isSafeInteger(dimensions) || dimensions < 1)\n throw new TypeError(\"Embedding model dimensions must be a positive safe integer\");\n if (embedding.vector.length !== dimensions) {\n throw new Error(\n `Embedding model returned ${embedding.vector.length} dimensions at index ${index}; expected ${dimensions}`,\n );\n }\n }\n}\n\nfunction validateSparseEmbedding(embedding: SparseEmbedding, index: number | \"query\"): void {\n const { indices, values } = embedding.vector;\n if (indices.length !== values.length) {\n throw new Error(`Sparse embedding at ${index} has mismatched indices and values`);\n }\n if (!indices.every((value) => Number.isSafeInteger(value) && value >= 0)) {\n throw new TypeError(`Sparse embedding at ${index} has an invalid index`);\n }\n if (new Set(indices).size !== indices.length) {\n throw new TypeError(`Sparse embedding at ${index} has duplicate indices`);\n }\n if (!values.every(Number.isFinite)) {\n throw new TypeError(`Sparse embedding at ${index} has a non-finite value`);\n }\n}\n"],"mappings":"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","names":[]}
|