@anvia/core 0.26.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -11
- package/dist/agent/index.d.ts +26 -68
- package/dist/agent/index.js +20 -17
- package/dist/agent-DGYY_onS.d.ts +145 -0
- package/dist/audio-generation/index.d.ts +12 -14
- package/dist/audio-generation/index.js +5 -39
- package/dist/audio-generation/index.js.map +1 -1
- package/dist/{chunk-MRQLEK2B.js → chunk-5XKDW36Z.js} +30 -7
- package/dist/chunk-5XKDW36Z.js.map +1 -0
- package/dist/chunk-6WGGTJE6.js +139 -0
- package/dist/chunk-6WGGTJE6.js.map +1 -0
- package/dist/chunk-A3UBYTJT.js +157 -0
- package/dist/chunk-A3UBYTJT.js.map +1 -0
- package/dist/{chunk-NCPN4SJR.js → chunk-DMPUP4R3.js} +10 -10
- package/dist/chunk-DMPUP4R3.js.map +1 -0
- package/dist/{chunk-MNWK2USR.js → chunk-DZ3CKYTH.js} +29 -5
- package/dist/chunk-DZ3CKYTH.js.map +1 -0
- package/dist/{chunk-CWUJUSOS.js → chunk-FNQB2JEH.js} +1 -1
- package/dist/chunk-FNQB2JEH.js.map +1 -0
- package/dist/chunk-I6G7BC42.js +41 -0
- package/dist/chunk-I6G7BC42.js.map +1 -0
- package/dist/{chunk-BALBBVI3.js → chunk-IL3ZSNJI.js} +2720 -1704
- package/dist/chunk-IL3ZSNJI.js.map +1 -0
- package/dist/chunk-J6GNQART.js +122 -0
- package/dist/chunk-J6GNQART.js.map +1 -0
- package/dist/{chunk-MC3CCKEB.js → chunk-M3IOWB4Y.js} +124 -65
- package/dist/chunk-M3IOWB4Y.js.map +1 -0
- package/dist/chunk-QY5GZ7HR.js +39 -0
- package/dist/chunk-QY5GZ7HR.js.map +1 -0
- package/dist/{chunk-MELYDKWQ.js → chunk-R2LJSQUW.js} +190 -20
- package/dist/chunk-R2LJSQUW.js.map +1 -0
- package/dist/{chunk-WQKHFADH.js → chunk-RFDVKCIE.js} +3 -3
- package/dist/chunk-RFDVKCIE.js.map +1 -0
- package/dist/chunk-RMUBRRSK.js +34 -0
- package/dist/chunk-RMUBRRSK.js.map +1 -0
- package/dist/{chunk-I6XOQ4LK.js → chunk-RXKHOYEH.js} +1 -1
- package/dist/chunk-RXKHOYEH.js.map +1 -0
- package/dist/chunk-XDRSPSR7.js +38 -0
- package/dist/chunk-XDRSPSR7.js.map +1 -0
- package/dist/completion/index.d.ts +5 -36
- package/dist/completion/index.js +4 -5
- package/dist/dynamic-tools-i9woysFa.d.ts +33 -0
- package/dist/embeddings/index.d.ts +2 -2
- package/dist/embeddings/index.js +1 -2
- package/dist/{errors-2moLDuuN.d.ts → errors-CYKUcU89.d.ts} +2 -2
- package/dist/evals/index.d.ts +22 -15
- package/dist/evals/index.js +57 -35
- package/dist/evals/index.js.map +1 -1
- package/dist/extractor/index.d.ts +23 -35
- package/dist/extractor/index.js +7 -21
- package/dist/guardrails/index.d.ts +2 -2
- package/dist/guardrails/index.js +1 -1
- package/dist/image-generation/index.d.ts +12 -14
- package/dist/image-generation/index.js +5 -39
- package/dist/image-generation/index.js.map +1 -1
- package/dist/index-DxB74ybJ.d.ts +349 -0
- package/dist/index.d.ts +20 -17
- package/dist/index.js +31 -36
- package/dist/internal/agent.d.ts +152 -9
- package/dist/internal/agent.js +22 -17
- package/dist/{json-BVPssigK.d.ts → json-Zo7K3xmt.d.ts} +12 -11
- package/dist/loaders/index.d.ts +5 -10
- package/dist/loaders/index.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/memory/index.d.ts +4 -4
- package/dist/memory/index.js +6 -7
- package/dist/middleware-KynLg_RW.d.ts +56 -0
- package/dist/observability/index.d.ts +6 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/pipeline/index.d.ts +40 -47
- package/dist/pipeline/index.js +99 -99
- package/dist/pipeline/index.js.map +1 -1
- package/dist/retry-D3Ruy-ba.d.ts +15 -0
- package/dist/skills/index.d.ts +4 -4
- package/dist/skills/index.js +5 -6
- package/dist/streaming/index.js +37 -3
- package/dist/streaming/index.js.map +1 -1
- package/dist/{think-tool-DfCMuO8e.d.ts → think-tool-DZqZj2LV.d.ts} +5 -5
- package/dist/tool/index.d.ts +8 -6
- package/dist/tool/index.js +12 -15
- package/dist/tool-C_8GudXn.d.ts +49 -0
- package/dist/transcription/index.d.ts +14 -16
- 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-G12i56s2.d.ts → types-B3A4YxaA.d.ts} +1 -1
- package/dist/{types-BrLbKnEz.d.ts → types-BBEGKB9m.d.ts} +1 -1
- package/dist/{types-O-abTIin.d.ts → types-DT3nEemY.d.ts} +3 -3
- package/dist/{types-04LqWrmy.d.ts → types-DhQfwiZn.d.ts} +1 -1
- package/dist/{types-JJCxRnaZ.d.ts → types-DulRCYdB.d.ts} +2 -2
- package/dist/{types-BCTRUGex.d.ts → types-p55Jc-sr.d.ts} +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/vector-store/index.d.ts +5 -5
- package/dist/vector-store/index.js +4 -4
- package/package.json +2 -10
- package/dist/agent-x3YTyv5i.d.ts +0 -222
- package/dist/chunk-2ODTMRHP.js +0 -54
- package/dist/chunk-2ODTMRHP.js.map +0 -1
- 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.map +0 -1
- package/dist/chunk-JI5YZWNT.js +0 -220
- package/dist/chunk-JI5YZWNT.js.map +0 -1
- package/dist/chunk-MC3CCKEB.js.map +0 -1
- package/dist/chunk-MELYDKWQ.js.map +0 -1
- 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.map +0 -1
- package/dist/chunk-XUUY2L2D.js +0 -42
- package/dist/chunk-XUUY2L2D.js.map +0 -1
- package/dist/chunk-YLMDBQO4.js +0 -141
- package/dist/chunk-YLMDBQO4.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -12
- package/dist/hooks/index.js +0 -17
- package/dist/hooks/index.js.map +0 -1
- package/dist/index-BxSbmOMr.d.ts +0 -257
- 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-D9JpeAPF.d.ts +0 -114
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createCompletion
|
|
3
|
+
} from "./chunk-M3IOWB4Y.js";
|
|
4
|
+
import {
|
|
5
|
+
toProviderJsonSchema
|
|
6
|
+
} from "./chunk-RFDVKCIE.js";
|
|
7
|
+
import {
|
|
8
|
+
CompletionCapabilityError,
|
|
9
|
+
Message,
|
|
10
|
+
Usage
|
|
11
|
+
} from "./chunk-ADH7NNCS.js";
|
|
12
|
+
import {
|
|
13
|
+
resolveRetryOptions,
|
|
14
|
+
retryDelayMs,
|
|
15
|
+
waitForRetry
|
|
16
|
+
} from "./chunk-A3UBYTJT.js";
|
|
17
|
+
|
|
18
|
+
// src/extractor/extractor.ts
|
|
19
|
+
import { z } from "zod";
|
|
20
|
+
var SUBMIT_TOOL_NAME = "submit";
|
|
21
|
+
var DEFAULT_EXTRACTOR_INSTRUCTIONS = "You are an AI assistant whose purpose is to extract structured data from the provided text.\nYou have access to a `submit` function that defines the structure of the data to extract.\nAlways call the `submit` function with the structured data. Use default or null values when information is missing.";
|
|
22
|
+
var ExtractionError = class extends Error {
|
|
23
|
+
constructor(message, cause) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.cause = cause;
|
|
26
|
+
this.name = "ExtractionError";
|
|
27
|
+
}
|
|
28
|
+
cause;
|
|
29
|
+
};
|
|
30
|
+
var Extractor = class {
|
|
31
|
+
model;
|
|
32
|
+
outputSchema;
|
|
33
|
+
instructions;
|
|
34
|
+
submitTool;
|
|
35
|
+
constructor(options) {
|
|
36
|
+
if (!(options.outputSchema instanceof z.ZodType)) {
|
|
37
|
+
throw new TypeError("Extractor outputSchema must be a Zod schema.");
|
|
38
|
+
}
|
|
39
|
+
this.model = options.model;
|
|
40
|
+
this.outputSchema = options.outputSchema;
|
|
41
|
+
this.instructions = options.instructions === void 0 || options.instructions.length === 0 ? DEFAULT_EXTRACTOR_INSTRUCTIONS : `${DEFAULT_EXTRACTOR_INSTRUCTIONS}
|
|
42
|
+
|
|
43
|
+
${options.instructions}`;
|
|
44
|
+
this.submitTool = {
|
|
45
|
+
name: SUBMIT_TOOL_NAME,
|
|
46
|
+
description: "Submit the structured data extracted from the provided text.",
|
|
47
|
+
parameters: toProviderJsonSchema(this.outputSchema, { io: "input" })
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async extract(text, options = {}) {
|
|
51
|
+
return (await this.extractResult(text, options)).data;
|
|
52
|
+
}
|
|
53
|
+
async extractResult(text, options = {}) {
|
|
54
|
+
const prompt = Message.user(text);
|
|
55
|
+
const retries = resolveExtractionRetries(options.retries);
|
|
56
|
+
const maxAttempts = retries?.maxAttempts ?? 1;
|
|
57
|
+
let usage = Usage.empty();
|
|
58
|
+
let lastError;
|
|
59
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
60
|
+
try {
|
|
61
|
+
const result = await createCompletion(prompt, {
|
|
62
|
+
model: this.model,
|
|
63
|
+
instructions: this.instructions,
|
|
64
|
+
tools: [globalThis.structuredClone(this.submitTool)],
|
|
65
|
+
temperature: options.temperature,
|
|
66
|
+
maxTokens: options.maxTokens,
|
|
67
|
+
additionalParams: options.additionalParams,
|
|
68
|
+
toolChoice: "required"
|
|
69
|
+
});
|
|
70
|
+
const response = result.response;
|
|
71
|
+
usage = Usage.add(usage, response.usage);
|
|
72
|
+
const data = extractSubmittedData(response, this.outputSchema);
|
|
73
|
+
return {
|
|
74
|
+
data,
|
|
75
|
+
usage,
|
|
76
|
+
messages: [prompt, Message.assistant(response.choice, response.messageId)]
|
|
77
|
+
};
|
|
78
|
+
} catch (error) {
|
|
79
|
+
if (error instanceof CompletionCapabilityError) {
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
lastError = error;
|
|
83
|
+
if (retries === void 0 || attempt >= retries.maxAttempts || !retries.shouldRetry({
|
|
84
|
+
error,
|
|
85
|
+
attempt,
|
|
86
|
+
maxAttempts: retries.maxAttempts,
|
|
87
|
+
streaming: false
|
|
88
|
+
})) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
await waitForRetry(retryDelayMs(retries, attempt));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
throw new ExtractionError("No data extracted", lastError);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
function resolveExtractionRetries(options) {
|
|
98
|
+
if (options === void 0) {
|
|
99
|
+
return void 0;
|
|
100
|
+
}
|
|
101
|
+
return resolveRetryOptions({
|
|
102
|
+
...options,
|
|
103
|
+
shouldRetry: options.shouldRetry ?? (() => true)
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function extractSubmittedData(response, schema) {
|
|
107
|
+
const submitted = response.choice.filter((content) => content.type === "tool_call").filter((toolCall) => toolCall.function.name === SUBMIT_TOOL_NAME).at(-1);
|
|
108
|
+
if (submitted === void 0) {
|
|
109
|
+
throw new ExtractionError("The model did not call the submit tool");
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
return schema.parse(submitted.function.arguments);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
throw new ExtractionError("Submitted data failed output schema validation", error);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
ExtractionError,
|
|
120
|
+
Extractor
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=chunk-J6GNQART.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extractor/extractor.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n CompletionCapabilityError,\n type CompletionModel,\n type CompletionResponse,\n createCompletion,\n type JsonValue,\n type Message,\n Message as MessageFactory,\n type ToolDefinition,\n Usage,\n} from \"../completion/index\";\nimport {\n type ResolvedRetryOptions,\n type RetryOptions,\n resolveRetryOptions,\n retryDelayMs,\n waitForRetry,\n} from \"../retry\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\n\nconst SUBMIT_TOOL_NAME = \"submit\";\n\nconst DEFAULT_EXTRACTOR_INSTRUCTIONS =\n \"You are an AI assistant whose purpose is to extract structured data from the provided text.\\n\" +\n \"You have access to a `submit` function that defines the structure of the data to extract.\\n\" +\n \"Always call the `submit` function with the structured data. Use default or null values when information is missing.\";\n\nexport type ExtractorOptions<T, M extends CompletionModel = CompletionModel> = {\n model: M;\n outputSchema: ZodSchema<T>;\n instructions?: string | undefined;\n};\n\nexport type ExtractOptions = {\n retries?: RetryOptions | undefined;\n temperature?: number | undefined;\n maxTokens?: number | undefined;\n additionalParams?: JsonValue | undefined;\n};\n\nexport type ExtractionResult<T> = {\n data: T;\n usage: Usage;\n messages: Message[];\n};\n\nexport class ExtractionError extends Error {\n constructor(\n message: string,\n readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"ExtractionError\";\n }\n}\n\n/** Converts text into data validated and transformed by a Zod output schema. */\nexport class Extractor<T, M extends CompletionModel = CompletionModel> {\n readonly model: M;\n readonly outputSchema: ZodSchema<T>;\n\n private readonly instructions: string;\n private readonly submitTool: ToolDefinition;\n\n constructor(options: ExtractorOptions<T, M>) {\n if (!(options.outputSchema instanceof z.ZodType)) {\n throw new TypeError(\"Extractor outputSchema must be a Zod schema.\");\n }\n\n this.model = options.model;\n this.outputSchema = options.outputSchema;\n this.instructions =\n options.instructions === undefined || options.instructions.length === 0\n ? DEFAULT_EXTRACTOR_INSTRUCTIONS\n : `${DEFAULT_EXTRACTOR_INSTRUCTIONS}\\n\\n${options.instructions}`;\n this.submitTool = {\n name: SUBMIT_TOOL_NAME,\n description: \"Submit the structured data extracted from the provided text.\",\n parameters: toProviderJsonSchema(this.outputSchema, { io: \"input\" }),\n };\n }\n\n async extract(text: string, options: ExtractOptions = {}): Promise<T> {\n return (await this.extractResult(text, options)).data;\n }\n\n async extractResult(text: string, options: ExtractOptions = {}): Promise<ExtractionResult<T>> {\n const prompt = MessageFactory.user(text);\n const retries = resolveExtractionRetries(options.retries);\n const maxAttempts = retries?.maxAttempts ?? 1;\n let usage = Usage.empty();\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const result = await createCompletion(prompt, {\n model: this.model,\n instructions: this.instructions,\n tools: [globalThis.structuredClone(this.submitTool)],\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n additionalParams: options.additionalParams,\n toolChoice: \"required\",\n });\n const response = result.response;\n usage = Usage.add(usage, response.usage);\n const data = extractSubmittedData(response, this.outputSchema);\n return {\n data,\n usage,\n messages: [prompt, MessageFactory.assistant(response.choice, response.messageId)],\n };\n } catch (error) {\n if (error instanceof CompletionCapabilityError) {\n throw error;\n }\n lastError = error;\n if (\n retries === undefined ||\n attempt >= retries.maxAttempts ||\n !retries.shouldRetry({\n error,\n attempt,\n maxAttempts: retries.maxAttempts,\n streaming: false,\n })\n ) {\n break;\n }\n await waitForRetry(retryDelayMs(retries, attempt));\n }\n }\n\n throw new ExtractionError(\"No data extracted\", lastError);\n }\n}\n\nfunction resolveExtractionRetries(\n options: RetryOptions | undefined,\n): ResolvedRetryOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n return resolveRetryOptions({\n ...options,\n shouldRetry: options.shouldRetry ?? (() => true),\n });\n}\n\nfunction extractSubmittedData<T>(response: CompletionResponse, schema: ZodSchema<T>): T {\n const submitted = response.choice\n .filter((content) => content.type === \"tool_call\")\n .filter((toolCall) => toolCall.function.name === SUBMIT_TOOL_NAME)\n .at(-1);\n\n if (submitted === undefined) {\n throw new ExtractionError(\"The model did not call the submit tool\");\n }\n\n try {\n return schema.parse(submitted.function.arguments);\n } catch (error) {\n throw new ExtractionError(\"Submitted data failed output schema validation\", error);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,72 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toProviderJsonSchema
|
|
3
|
+
} from "./chunk-RFDVKCIE.js";
|
|
1
4
|
import {
|
|
2
5
|
Message,
|
|
6
|
+
Usage,
|
|
3
7
|
assertCompletionRequestSupported,
|
|
4
8
|
isProviderTool,
|
|
5
9
|
textFromAssistantContent
|
|
6
10
|
} from "./chunk-ADH7NNCS.js";
|
|
7
11
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
resolveRetryOptions,
|
|
13
|
+
retryDelayMs,
|
|
14
|
+
retryOptionsForFailure,
|
|
15
|
+
runWithRetries,
|
|
16
|
+
waitForRetry
|
|
17
|
+
} from "./chunk-A3UBYTJT.js";
|
|
10
18
|
|
|
11
|
-
// src/completion
|
|
12
|
-
function
|
|
13
|
-
return sendCompletion(model, options);
|
|
14
|
-
}
|
|
15
|
-
function createCompletionStream(model, options) {
|
|
16
|
-
const request = toCompletionRequest(options);
|
|
17
|
-
if (!isStreamingCompletionModel(model) || !model.capabilities.streaming) {
|
|
18
|
-
throw new Error("This completion model does not support streaming");
|
|
19
|
-
}
|
|
20
|
-
assertCompletionRequestSupported(model, request, { streaming: true });
|
|
21
|
-
return model.streamCompletion(request);
|
|
22
|
-
}
|
|
23
|
-
async function createParsedCompletion(model, options) {
|
|
24
|
-
const { schema, ...completionOptions } = options;
|
|
25
|
-
const request = toCompletionRequest(
|
|
26
|
-
{
|
|
27
|
-
...completionOptions,
|
|
28
|
-
outputSchema: toProviderJsonSchema(schema)
|
|
29
|
-
},
|
|
30
|
-
"createParsedCompletion"
|
|
31
|
-
);
|
|
32
|
-
assertCompletionRequestSupported(model, request);
|
|
33
|
-
const response = await model.completion(request);
|
|
34
|
-
const text = textFromAssistantContent(response.choice);
|
|
35
|
-
return {
|
|
36
|
-
data: parseCompletionData(text, schema),
|
|
37
|
-
text,
|
|
38
|
-
content: response.choice,
|
|
39
|
-
usage: response.usage,
|
|
40
|
-
response
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
async function sendCompletion(model, options) {
|
|
44
|
-
const request = toCompletionRequest(options);
|
|
45
|
-
assertCompletionRequestSupported(model, request);
|
|
46
|
-
const response = await model.completion(request);
|
|
47
|
-
return {
|
|
48
|
-
text: textFromAssistantContent(response.choice),
|
|
49
|
-
content: response.choice,
|
|
50
|
-
usage: response.usage,
|
|
51
|
-
response
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
function toCompletionRequest(options, helperName = "createCompletion") {
|
|
55
|
-
const chatHistory = [
|
|
56
|
-
...messagesFromMessages(options.messages),
|
|
57
|
-
...messagesFromInput(options.input)
|
|
58
|
-
];
|
|
59
|
-
if (chatHistory.length === 0) {
|
|
60
|
-
throw new Error(`${helperName} requires input or messages.`);
|
|
61
|
-
}
|
|
19
|
+
// src/internal/completion-request.ts
|
|
20
|
+
function createCompletionRequest(input, options) {
|
|
62
21
|
const configuredTools = options.tools ?? [];
|
|
63
22
|
const request = {
|
|
64
|
-
chatHistory,
|
|
23
|
+
chatHistory: messagesFromInput(input),
|
|
65
24
|
documents: [...options.documents ?? []],
|
|
66
25
|
tools: configuredTools.filter((tool) => !isProviderTool(tool))
|
|
67
26
|
};
|
|
68
27
|
const providerTools = configuredTools.filter(isProviderTool);
|
|
69
28
|
if (providerTools.length > 0) request.providerTools = providerTools;
|
|
29
|
+
if (options.modelOverride !== void 0) request.model = options.modelOverride;
|
|
70
30
|
if (options.instructions !== void 0 && options.instructions.length > 0) {
|
|
71
31
|
request.instructions = options.instructions;
|
|
72
32
|
}
|
|
@@ -74,30 +34,27 @@ function toCompletionRequest(options, helperName = "createCompletion") {
|
|
|
74
34
|
if (options.maxTokens !== void 0) request.maxTokens = options.maxTokens;
|
|
75
35
|
if (options.toolChoice !== void 0) request.toolChoice = options.toolChoice;
|
|
76
36
|
if (options.outputSchema !== void 0) request.outputSchema = options.outputSchema;
|
|
77
|
-
if (options.
|
|
37
|
+
if (options.additionalParams !== void 0) request.additionalParams = options.additionalParams;
|
|
78
38
|
return request;
|
|
79
39
|
}
|
|
80
40
|
function messagesFromInput(input) {
|
|
81
|
-
if (input === void 0) {
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
41
|
if (typeof input === "string") {
|
|
85
42
|
return [Message.user(input)];
|
|
86
43
|
}
|
|
87
44
|
if (Array.isArray(input)) {
|
|
88
|
-
return normalizeMessageArray(input
|
|
45
|
+
return normalizeMessageArray(input);
|
|
89
46
|
}
|
|
90
47
|
if (!isCoreMessage(input)) {
|
|
91
48
|
throw new TypeError("input must be a string, Message, or Message[].");
|
|
92
49
|
}
|
|
93
50
|
return [input];
|
|
94
51
|
}
|
|
95
|
-
function
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
52
|
+
function normalizeMessageArray(messages) {
|
|
53
|
+
if (messages.length === 0) {
|
|
54
|
+
throw new Error("input must contain at least one Message.");
|
|
55
|
+
}
|
|
99
56
|
if (!messages.every(isCoreMessage)) {
|
|
100
|
-
throw new TypeError(
|
|
57
|
+
throw new TypeError("input must contain only Message values.");
|
|
101
58
|
}
|
|
102
59
|
return [...messages];
|
|
103
60
|
}
|
|
@@ -197,6 +154,107 @@ function isDocumentContent(value) {
|
|
|
197
154
|
function isRecord(value) {
|
|
198
155
|
return typeof value === "object" && value !== null;
|
|
199
156
|
}
|
|
157
|
+
|
|
158
|
+
// src/completion/create-completion.ts
|
|
159
|
+
async function createCompletion(input, options) {
|
|
160
|
+
const request = createCompletionRequest(input, options);
|
|
161
|
+
assertCompletionRequestSupported(options.model, request);
|
|
162
|
+
const retries = resolveOptionalRetries(options.retries);
|
|
163
|
+
return sendCompletion(options.model, request, retries);
|
|
164
|
+
}
|
|
165
|
+
function createCompletionStream(input, options) {
|
|
166
|
+
const request = createCompletionRequest(input, options);
|
|
167
|
+
if (!isStreamingCompletionModel(options.model) || !options.model.capabilities.streaming) {
|
|
168
|
+
throw new Error("This completion model does not support streaming");
|
|
169
|
+
}
|
|
170
|
+
assertCompletionRequestSupported(options.model, request, { streaming: true });
|
|
171
|
+
const retries = resolveOptionalRetries(options.retries);
|
|
172
|
+
return streamCompletionWithRetries(options.model, request, retries);
|
|
173
|
+
}
|
|
174
|
+
async function createParsedCompletion(input, options) {
|
|
175
|
+
const { schema, ...completionOptions } = options;
|
|
176
|
+
const result = await createCompletion(input, {
|
|
177
|
+
...completionOptions,
|
|
178
|
+
outputSchema: toProviderJsonSchema(schema)
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
...result,
|
|
182
|
+
data: parseCompletionData(result.text, schema)
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
async function sendCompletion(model, request, retries) {
|
|
186
|
+
const response = await runWithRetries(
|
|
187
|
+
() => model.completion(request),
|
|
188
|
+
retries,
|
|
189
|
+
{ streaming: false }
|
|
190
|
+
);
|
|
191
|
+
return {
|
|
192
|
+
text: textFromAssistantContent(response.choice),
|
|
193
|
+
content: response.choice,
|
|
194
|
+
usage: response.usage,
|
|
195
|
+
response
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function resolveOptionalRetries(options) {
|
|
199
|
+
return options === void 0 ? void 0 : resolveRetryOptions(options);
|
|
200
|
+
}
|
|
201
|
+
async function* streamCompletionWithRetries(model, request, retries) {
|
|
202
|
+
let attempt = 1;
|
|
203
|
+
let swallowedUsage = Usage.empty();
|
|
204
|
+
while (true) {
|
|
205
|
+
let exposedEvent = false;
|
|
206
|
+
let retryDelay;
|
|
207
|
+
try {
|
|
208
|
+
const events = model.streamCompletion(request);
|
|
209
|
+
for await (const event of events) {
|
|
210
|
+
if (event.type === "error" && !exposedEvent) {
|
|
211
|
+
const retryOptions = retryOptionsForFailure(retries, {
|
|
212
|
+
error: event.error,
|
|
213
|
+
attempt,
|
|
214
|
+
streaming: true
|
|
215
|
+
});
|
|
216
|
+
if (retryOptions !== void 0) {
|
|
217
|
+
if (event.usage !== void 0) {
|
|
218
|
+
swallowedUsage = Usage.add(swallowedUsage, event.usage);
|
|
219
|
+
}
|
|
220
|
+
retryDelay = retryDelayMs(retryOptions, attempt);
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
exposedEvent = true;
|
|
225
|
+
if (event.type === "final" && swallowedUsage.totalTokens > 0) {
|
|
226
|
+
yield {
|
|
227
|
+
...event,
|
|
228
|
+
response: {
|
|
229
|
+
...event.response,
|
|
230
|
+
usage: Usage.add(swallowedUsage, event.response.usage)
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
} else if (event.type === "error" && swallowedUsage.totalTokens > 0) {
|
|
234
|
+
yield {
|
|
235
|
+
...event,
|
|
236
|
+
usage: Usage.add(swallowedUsage, event.usage ?? Usage.empty())
|
|
237
|
+
};
|
|
238
|
+
} else {
|
|
239
|
+
yield event;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (retryDelay === void 0) return;
|
|
243
|
+
await waitForRetry(retryDelay);
|
|
244
|
+
attempt += 1;
|
|
245
|
+
} catch (error) {
|
|
246
|
+
if (exposedEvent) throw error;
|
|
247
|
+
const retryOptions = retryOptionsForFailure(retries, {
|
|
248
|
+
error,
|
|
249
|
+
attempt,
|
|
250
|
+
streaming: true
|
|
251
|
+
});
|
|
252
|
+
if (retryOptions === void 0) throw error;
|
|
253
|
+
await waitForRetry(retryDelayMs(retryOptions, attempt));
|
|
254
|
+
attempt += 1;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
200
258
|
function isStreamingCompletionModel(model) {
|
|
201
259
|
return typeof model.streamCompletion === "function";
|
|
202
260
|
}
|
|
@@ -213,9 +271,10 @@ function parseCompletionData(text, schema) {
|
|
|
213
271
|
}
|
|
214
272
|
|
|
215
273
|
export {
|
|
274
|
+
createCompletionRequest,
|
|
216
275
|
createCompletion,
|
|
217
276
|
createCompletionStream,
|
|
218
277
|
createParsedCompletion,
|
|
219
278
|
isStreamingCompletionModel
|
|
220
279
|
};
|
|
221
|
-
//# sourceMappingURL=chunk-
|
|
280
|
+
//# sourceMappingURL=chunk-M3IOWB4Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/completion-request.ts","../src/completion/create-completion.ts"],"sourcesContent":["import type {\n CompletionModel,\n CompletionRequest,\n CompletionTool,\n Document,\n JsonObject,\n JsonValue,\n Message as MessageType,\n ToolChoice,\n ToolDefinition,\n} from \"../completion/types\";\nimport { isProviderTool, Message } from \"../completion/types\";\n\ntype ModelNameOf<Model extends CompletionModel> =\n Model extends CompletionModel<unknown, infer ModelName> ? ModelName : string;\n\nexport type CompletionRequestFor<Model extends CompletionModel> = CompletionRequest<\n ModelNameOf<Model>\n>;\n\nexport type CompletionRequestOptions<Model extends CompletionModel = CompletionModel> = {\n model: Model;\n modelOverride?: ModelNameOf<Model> | undefined;\n instructions?: string | undefined;\n documents?: readonly Document[] | undefined;\n tools?: readonly CompletionTool[] | undefined;\n temperature?: number | undefined;\n maxTokens?: number | undefined;\n toolChoice?: ToolChoice | undefined;\n outputSchema?: JsonObject | undefined;\n additionalParams?: JsonValue | undefined;\n};\n\nexport function createCompletionRequest<Model extends CompletionModel>(\n input: string | MessageType | readonly MessageType[],\n options: CompletionRequestOptions<Model>,\n): CompletionRequestFor<Model> {\n const configuredTools = options.tools ?? [];\n const request: CompletionRequestFor<Model> = {\n chatHistory: messagesFromInput(input),\n documents: [...(options.documents ?? [])],\n tools: configuredTools.filter((tool): tool is ToolDefinition => !isProviderTool(tool)),\n };\n const providerTools = configuredTools.filter(isProviderTool);\n\n if (providerTools.length > 0) request.providerTools = providerTools;\n if (options.modelOverride !== undefined) request.model = options.modelOverride;\n if (options.instructions !== undefined && options.instructions.length > 0) {\n request.instructions = options.instructions;\n }\n if (options.temperature !== undefined) request.temperature = options.temperature;\n if (options.maxTokens !== undefined) request.maxTokens = options.maxTokens;\n if (options.toolChoice !== undefined) request.toolChoice = options.toolChoice;\n if (options.outputSchema !== undefined) request.outputSchema = options.outputSchema;\n if (options.additionalParams !== undefined) request.additionalParams = options.additionalParams;\n\n return request;\n}\n\nfunction messagesFromInput(input: string | MessageType | readonly MessageType[]): MessageType[] {\n if (typeof input === \"string\") {\n return [Message.user(input)];\n }\n if (Array.isArray(input)) {\n return normalizeMessageArray(input);\n }\n if (!isCoreMessage(input)) {\n throw new TypeError(\"input must be a string, Message, or Message[].\");\n }\n return [input];\n}\n\nfunction normalizeMessageArray(messages: readonly MessageType[]): MessageType[] {\n if (messages.length === 0) {\n throw new Error(\"input must contain at least one Message.\");\n }\n if (!messages.every(isCoreMessage)) {\n throw new TypeError(\"input must contain only Message values.\");\n }\n\n return [...messages];\n}\n\nfunction isCoreMessage(value: unknown): value is MessageType {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.role === \"system\") {\n return typeof value.content === \"string\";\n }\n\n if (value.role === \"user\") {\n return Array.isArray(value.content) && value.content.every(isUserContent);\n }\n\n if (value.role === \"assistant\") {\n return (\n (value.id === undefined || typeof value.id === \"string\") &&\n Array.isArray(value.content) &&\n value.content.every(isAssistantContent)\n );\n }\n\n if (value.role === \"tool\") {\n return Array.isArray(value.content) && value.content.every(isToolContent);\n }\n\n return false;\n}\n\nfunction isUserContent(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\") {\n return isImageContent(value);\n }\n\n if (value.type === \"document\") {\n return isDocumentContent(value);\n }\n\n return false;\n}\n\nfunction isAssistantContent(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"reasoning\") {\n return (\n typeof value.text === \"string\" &&\n (value.id === undefined || typeof value.id === \"string\") &&\n (value.content === undefined || Array.isArray(value.content))\n );\n }\n\n if (value.type === \"tool_call\") {\n return (\n typeof value.id === \"string\" &&\n (value.callId === undefined || typeof value.callId === \"string\") &&\n isRecord(value.function) &&\n typeof value.function.name === \"string\" &&\n \"arguments\" in value.function\n );\n }\n\n if (value.type === \"image\") {\n return isImageContent(value);\n }\n\n return false;\n}\n\nfunction isToolContent(value: unknown): boolean {\n return (\n isRecord(value) &&\n value.type === \"tool_result\" &&\n typeof value.id === \"string\" &&\n (value.callId === undefined || typeof value.callId === \"string\") &&\n (value.toolName === undefined || typeof value.toolName === \"string\") &&\n Array.isArray(value.content) &&\n value.content.every(isToolResultContent)\n );\n}\n\nfunction isToolResultContent(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\") {\n return (\n typeof value.data === \"string\" &&\n (value.mediaType === undefined || typeof value.mediaType === \"string\")\n );\n }\n\n return false;\n}\n\nfunction isImageContent(value: Record<string, unknown>): boolean {\n if (!isRecord(value.source)) {\n return false;\n }\n\n if (value.source.type === \"url\") {\n return typeof value.source.url === \"string\";\n }\n\n if (value.source.type === \"base64\") {\n return typeof value.source.data === \"string\" && typeof value.source.mediaType === \"string\";\n }\n\n return false;\n}\n\nfunction isDocumentContent(value: Record<string, unknown>): boolean {\n if (!isRecord(value.source)) {\n return false;\n }\n\n if (value.source.type === \"url\") {\n return typeof value.source.url === \"string\" && typeof value.source.mediaType === \"string\";\n }\n\n if (value.source.type === \"base64\") {\n return typeof value.source.data === \"string\" && typeof value.source.mediaType === \"string\";\n }\n\n if (value.source.type === \"text\") {\n return (\n typeof value.source.text === \"string\" &&\n (value.source.mediaType === undefined || typeof value.source.mediaType === \"string\")\n );\n }\n\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { createCompletionRequest } from \"../internal/completion-request\";\nimport {\n type ResolvedRetryOptions,\n type RetryOptions,\n resolveRetryOptions,\n retryDelayMs,\n retryOptionsForFailure,\n runWithRetries,\n waitForRetry,\n} from \"../retry\";\nimport { toProviderJsonSchema, type ZodSchema } from \"../schema/zod-schema\";\nimport type {\n AssistantContent,\n CompletionModel,\n CompletionRequest,\n CompletionResponse,\n CompletionStreamEvent,\n CompletionTool,\n Document,\n JsonObject,\n JsonValue,\n Message as MessageType,\n StreamingCompletionModel,\n ToolChoice,\n} from \"./types\";\nimport { assertCompletionRequestSupported, textFromAssistantContent, Usage } from \"./types\";\n\nexport type CreateCompletionInput = string | MessageType | MessageType[];\n\nexport type CreateCompletionBaseOptions<Model extends CompletionModel = CompletionModel> = {\n model: Model;\n instructions?: string | undefined;\n documents?: Document[] | undefined;\n tools?: CompletionTool[] | undefined;\n temperature?: number | undefined;\n maxTokens?: number | undefined;\n toolChoice?: ToolChoice | undefined;\n outputSchema?: JsonObject | undefined;\n additionalParams?: JsonValue | undefined;\n retries?: RetryOptions | undefined;\n};\n\nexport type CreateCompletionOptions<Model extends CompletionModel = CompletionModel> =\n CreateCompletionBaseOptions<Model>;\n\nexport type CreateCompletionStreamOptions<\n Model extends StreamingCompletionModel = StreamingCompletionModel,\n> = CreateCompletionBaseOptions<Model>;\n\nexport type CreateParsedCompletionOptions<\n T,\n Model extends CompletionModel = CompletionModel,\n> = Omit<CreateCompletionBaseOptions<Model>, \"outputSchema\"> & { schema: ZodSchema<T> };\n\nexport type CreateCompletionResult<RawResponse = unknown> = {\n text: string;\n content: AssistantContent[];\n usage: Usage;\n response: CompletionResponse<RawResponse>;\n};\n\nexport type CreateParsedCompletionResult<\n T,\n RawResponse = unknown,\n> = CreateCompletionResult<RawResponse> & {\n data: T;\n};\n\ntype RawResponseOf<Model> =\n Model extends CompletionModel<infer RawResponse, infer _ModelName> ? RawResponse : unknown;\n\nexport async function createCompletion<Model extends CompletionModel>(\n input: CreateCompletionInput,\n options: CreateCompletionOptions<Model>,\n): Promise<CreateCompletionResult<RawResponseOf<Model>>> {\n const request = createCompletionRequest(input, options);\n assertCompletionRequestSupported(options.model, request);\n const retries = resolveOptionalRetries(options.retries);\n return sendCompletion(options.model, request, retries);\n}\n\nexport function createCompletionStream<Model extends StreamingCompletionModel>(\n input: CreateCompletionInput,\n options: CreateCompletionStreamOptions<Model>,\n): AsyncIterable<CompletionStreamEvent<RawResponseOf<Model>>> {\n const request = createCompletionRequest(input, options);\n if (!isStreamingCompletionModel(options.model) || !options.model.capabilities.streaming) {\n throw new Error(\"This completion model does not support streaming\");\n }\n assertCompletionRequestSupported(options.model, request, { streaming: true });\n const retries = resolveOptionalRetries(options.retries);\n return streamCompletionWithRetries(options.model, request, retries);\n}\n\nexport async function createParsedCompletion<T, Model extends CompletionModel>(\n input: CreateCompletionInput,\n options: CreateParsedCompletionOptions<T, Model>,\n): Promise<CreateParsedCompletionResult<T, RawResponseOf<Model>>> {\n const { schema, ...completionOptions } = options;\n const result = await createCompletion(input, {\n ...completionOptions,\n outputSchema: toProviderJsonSchema(schema),\n });\n return {\n ...result,\n data: parseCompletionData(result.text, schema),\n };\n}\n\nasync function sendCompletion<Model extends CompletionModel>(\n model: Model,\n request: CompletionRequest,\n retries: ResolvedRetryOptions | undefined,\n): Promise<CreateCompletionResult<RawResponseOf<Model>>> {\n const response = await runWithRetries(\n () => model.completion(request) as Promise<CompletionResponse<RawResponseOf<Model>>>,\n retries,\n { streaming: false },\n );\n return {\n text: textFromAssistantContent(response.choice),\n content: response.choice,\n usage: response.usage,\n response,\n };\n}\n\nfunction resolveOptionalRetries(\n options: RetryOptions | undefined,\n): ResolvedRetryOptions | undefined {\n return options === undefined ? undefined : resolveRetryOptions(options);\n}\n\nasync function* streamCompletionWithRetries<Model extends StreamingCompletionModel>(\n model: Model,\n request: CompletionRequest,\n retries: ResolvedRetryOptions | undefined,\n): AsyncIterable<CompletionStreamEvent<RawResponseOf<Model>>> {\n let attempt = 1;\n let swallowedUsage = Usage.empty();\n\n while (true) {\n let exposedEvent = false;\n let retryDelay: number | undefined;\n try {\n const events = model.streamCompletion(request) as AsyncIterable<\n CompletionStreamEvent<RawResponseOf<Model>>\n >;\n for await (const event of events) {\n if (event.type === \"error\" && !exposedEvent) {\n const retryOptions = retryOptionsForFailure(retries, {\n error: event.error,\n attempt,\n streaming: true,\n });\n if (retryOptions !== undefined) {\n if (event.usage !== undefined) {\n swallowedUsage = Usage.add(swallowedUsage, event.usage);\n }\n retryDelay = retryDelayMs(retryOptions, attempt);\n break;\n }\n }\n\n exposedEvent = true;\n if (event.type === \"final\" && swallowedUsage.totalTokens > 0) {\n yield {\n ...event,\n response: {\n ...event.response,\n usage: Usage.add(swallowedUsage, event.response.usage),\n },\n };\n } else if (event.type === \"error\" && swallowedUsage.totalTokens > 0) {\n yield {\n ...event,\n usage: Usage.add(swallowedUsage, event.usage ?? Usage.empty()),\n };\n } else {\n yield event;\n }\n }\n if (retryDelay === undefined) return;\n await waitForRetry(retryDelay);\n attempt += 1;\n } catch (error) {\n if (exposedEvent) throw error;\n const retryOptions = retryOptionsForFailure(retries, {\n error,\n attempt,\n streaming: true,\n });\n if (retryOptions === undefined) throw error;\n await waitForRetry(retryDelayMs(retryOptions, attempt));\n attempt += 1;\n }\n }\n}\n\nexport function isStreamingCompletionModel(\n model: CompletionModel,\n): model is StreamingCompletionModel {\n return typeof (model as { streamCompletion?: unknown }).streamCompletion === \"function\";\n}\n\nfunction parseCompletionData<T>(text: string, schema: ZodSchema<T>): T {\n let json: unknown;\n try {\n json = JSON.parse(text);\n } catch (error) {\n throw new Error(\"createParsedCompletion expected the model response to be valid JSON.\", {\n cause: error,\n });\n }\n\n return schema.parse(json);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiCO,SAAS,wBACd,OACA,SAC6B;AAC7B,QAAM,kBAAkB,QAAQ,SAAS,CAAC;AAC1C,QAAM,UAAuC;AAAA,IAC3C,aAAa,kBAAkB,KAAK;AAAA,IACpC,WAAW,CAAC,GAAI,QAAQ,aAAa,CAAC,CAAE;AAAA,IACxC,OAAO,gBAAgB,OAAO,CAAC,SAAiC,CAAC,eAAe,IAAI,CAAC;AAAA,EACvF;AACA,QAAM,gBAAgB,gBAAgB,OAAO,cAAc;AAE3D,MAAI,cAAc,SAAS,EAAG,SAAQ,gBAAgB;AACtD,MAAI,QAAQ,kBAAkB,OAAW,SAAQ,QAAQ,QAAQ;AACjE,MAAI,QAAQ,iBAAiB,UAAa,QAAQ,aAAa,SAAS,GAAG;AACzE,YAAQ,eAAe,QAAQ;AAAA,EACjC;AACA,MAAI,QAAQ,gBAAgB,OAAW,SAAQ,cAAc,QAAQ;AACrE,MAAI,QAAQ,cAAc,OAAW,SAAQ,YAAY,QAAQ;AACjE,MAAI,QAAQ,eAAe,OAAW,SAAQ,aAAa,QAAQ;AACnE,MAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,MAAI,QAAQ,qBAAqB,OAAW,SAAQ,mBAAmB,QAAQ;AAE/E,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAqE;AAC9F,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,CAAC,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC7B;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,sBAAsB,KAAK;AAAA,EACpC;AACA,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,gDAAgD;AAAA,EACtE;AACA,SAAO,CAAC,KAAK;AACf;AAEA,SAAS,sBAAsB,UAAiD;AAC9E,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,MAAI,CAAC,SAAS,MAAM,aAAa,GAAG;AAClC,UAAM,IAAI,UAAU,yCAAyC;AAAA,EAC/D;AAEA,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,SAAS,cAAc,OAAsC;AAC3D,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO,OAAO,MAAM,YAAY;AAAA,EAClC;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,aAAa;AAAA,EAC1E;AAEA,MAAI,MAAM,SAAS,aAAa;AAC9B,YACG,MAAM,OAAO,UAAa,OAAO,MAAM,OAAO,aAC/C,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,MAAM,kBAAkB;AAAA,EAE1C;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,MAAM,QAAQ,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,aAAa;AAAA,EAC1E;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,OAAO,MAAM,SAAS;AAAA,EAC/B;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,kBAAkB,KAAK;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,OAAO,MAAM,SAAS;AAAA,EAC/B;AAEA,MAAI,MAAM,SAAS,aAAa;AAC9B,WACE,OAAO,MAAM,SAAS,aACrB,MAAM,OAAO,UAAa,OAAO,MAAM,OAAO,cAC9C,MAAM,YAAY,UAAa,MAAM,QAAQ,MAAM,OAAO;AAAA,EAE/D;AAEA,MAAI,MAAM,SAAS,aAAa;AAC9B,WACE,OAAO,MAAM,OAAO,aACnB,MAAM,WAAW,UAAa,OAAO,MAAM,WAAW,aACvD,SAAS,MAAM,QAAQ,KACvB,OAAO,MAAM,SAAS,SAAS,YAC/B,eAAe,MAAM;AAAA,EAEzB;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyB;AAC9C,SACE,SAAS,KAAK,KACd,MAAM,SAAS,iBACf,OAAO,MAAM,OAAO,aACnB,MAAM,WAAW,UAAa,OAAO,MAAM,WAAW,cACtD,MAAM,aAAa,UAAa,OAAO,MAAM,aAAa,aAC3D,MAAM,QAAQ,MAAM,OAAO,KAC3B,MAAM,QAAQ,MAAM,mBAAmB;AAE3C;AAEA,SAAS,oBAAoB,OAAyB;AACpD,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO,OAAO,MAAM,SAAS;AAAA,EAC/B;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,WACE,OAAO,MAAM,SAAS,aACrB,MAAM,cAAc,UAAa,OAAO,MAAM,cAAc;AAAA,EAEjE;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAyC;AAC/D,MAAI,CAAC,SAAS,MAAM,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,OAAO,SAAS,OAAO;AAC/B,WAAO,OAAO,MAAM,OAAO,QAAQ;AAAA,EACrC;AAEA,MAAI,MAAM,OAAO,SAAS,UAAU;AAClC,WAAO,OAAO,MAAM,OAAO,SAAS,YAAY,OAAO,MAAM,OAAO,cAAc;AAAA,EACpF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAyC;AAClE,MAAI,CAAC,SAAS,MAAM,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,OAAO,SAAS,OAAO;AAC/B,WAAO,OAAO,MAAM,OAAO,QAAQ,YAAY,OAAO,MAAM,OAAO,cAAc;AAAA,EACnF;AAEA,MAAI,MAAM,OAAO,SAAS,UAAU;AAClC,WAAO,OAAO,MAAM,OAAO,SAAS,YAAY,OAAO,MAAM,OAAO,cAAc;AAAA,EACpF;AAEA,MAAI,MAAM,OAAO,SAAS,QAAQ;AAChC,WACE,OAAO,MAAM,OAAO,SAAS,aAC5B,MAAM,OAAO,cAAc,UAAa,OAAO,MAAM,OAAO,cAAc;AAAA,EAE/E;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;;;ACtKA,eAAsB,iBACpB,OACA,SACuD;AACvD,QAAM,UAAU,wBAAwB,OAAO,OAAO;AACtD,mCAAiC,QAAQ,OAAO,OAAO;AACvD,QAAM,UAAU,uBAAuB,QAAQ,OAAO;AACtD,SAAO,eAAe,QAAQ,OAAO,SAAS,OAAO;AACvD;AAEO,SAAS,uBACd,OACA,SAC4D;AAC5D,QAAM,UAAU,wBAAwB,OAAO,OAAO;AACtD,MAAI,CAAC,2BAA2B,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,aAAa,WAAW;AACvF,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,mCAAiC,QAAQ,OAAO,SAAS,EAAE,WAAW,KAAK,CAAC;AAC5E,QAAM,UAAU,uBAAuB,QAAQ,OAAO;AACtD,SAAO,4BAA4B,QAAQ,OAAO,SAAS,OAAO;AACpE;AAEA,eAAsB,uBACpB,OACA,SACgE;AAChE,QAAM,EAAE,QAAQ,GAAG,kBAAkB,IAAI;AACzC,QAAM,SAAS,MAAM,iBAAiB,OAAO;AAAA,IAC3C,GAAG;AAAA,IACH,cAAc,qBAAqB,MAAM;AAAA,EAC3C,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,oBAAoB,OAAO,MAAM,MAAM;AAAA,EAC/C;AACF;AAEA,eAAe,eACb,OACA,SACA,SACuD;AACvD,QAAM,WAAW,MAAM;AAAA,IACrB,MAAM,MAAM,WAAW,OAAO;AAAA,IAC9B;AAAA,IACA,EAAE,WAAW,MAAM;AAAA,EACrB;AACA,SAAO;AAAA,IACL,MAAM,yBAAyB,SAAS,MAAM;AAAA,IAC9C,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,uBACP,SACkC;AAClC,SAAO,YAAY,SAAY,SAAY,oBAAoB,OAAO;AACxE;AAEA,gBAAgB,4BACd,OACA,SACA,SAC4D;AAC5D,MAAI,UAAU;AACd,MAAI,iBAAiB,MAAM,MAAM;AAEjC,SAAO,MAAM;AACX,QAAI,eAAe;AACnB,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,MAAM,iBAAiB,OAAO;AAG7C,uBAAiB,SAAS,QAAQ;AAChC,YAAI,MAAM,SAAS,WAAW,CAAC,cAAc;AAC3C,gBAAM,eAAe,uBAAuB,SAAS;AAAA,YACnD,OAAO,MAAM;AAAA,YACb;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AACD,cAAI,iBAAiB,QAAW;AAC9B,gBAAI,MAAM,UAAU,QAAW;AAC7B,+BAAiB,MAAM,IAAI,gBAAgB,MAAM,KAAK;AAAA,YACxD;AACA,yBAAa,aAAa,cAAc,OAAO;AAC/C;AAAA,UACF;AAAA,QACF;AAEA,uBAAe;AACf,YAAI,MAAM,SAAS,WAAW,eAAe,cAAc,GAAG;AAC5D,gBAAM;AAAA,YACJ,GAAG;AAAA,YACH,UAAU;AAAA,cACR,GAAG,MAAM;AAAA,cACT,OAAO,MAAM,IAAI,gBAAgB,MAAM,SAAS,KAAK;AAAA,YACvD;AAAA,UACF;AAAA,QACF,WAAW,MAAM,SAAS,WAAW,eAAe,cAAc,GAAG;AACnE,gBAAM;AAAA,YACJ,GAAG;AAAA,YACH,OAAO,MAAM,IAAI,gBAAgB,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,UAC/D;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AACA,UAAI,eAAe,OAAW;AAC9B,YAAM,aAAa,UAAU;AAC7B,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,UAAI,aAAc,OAAM;AACxB,YAAM,eAAe,uBAAuB,SAAS;AAAA,QACnD;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AACD,UAAI,iBAAiB,OAAW,OAAM;AACtC,YAAM,aAAa,aAAa,cAAc,OAAO,CAAC;AACtD,iBAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,2BACd,OACmC;AACnC,SAAO,OAAQ,MAAyC,qBAAqB;AAC/E;AAEA,SAAS,oBAAuB,MAAc,QAAyB;AACrE,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,wEAAwE;AAAA,MACtF,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,MAAM,IAAI;AAC1B;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveRetryOptions,
|
|
3
|
+
runWithRetries
|
|
4
|
+
} from "./chunk-A3UBYTJT.js";
|
|
5
|
+
|
|
6
|
+
// src/transcription/transcribe.ts
|
|
7
|
+
function transcribe(audio, options) {
|
|
8
|
+
const data = toUint8Array(audio);
|
|
9
|
+
if (data.byteLength === 0) {
|
|
10
|
+
throw new Error("Transcription audio cannot be empty.");
|
|
11
|
+
}
|
|
12
|
+
if (typeof options.filename !== "string" || options.filename.trim().length === 0) {
|
|
13
|
+
throw new TypeError("Transcription filename must be a non-empty string.");
|
|
14
|
+
}
|
|
15
|
+
const request = { data, filename: options.filename };
|
|
16
|
+
if (options.language !== void 0) request.language = options.language;
|
|
17
|
+
if (options.prompt !== void 0) request.prompt = options.prompt;
|
|
18
|
+
if (options.temperature !== void 0) request.temperature = options.temperature;
|
|
19
|
+
if (options.additionalParams !== void 0) request.additionalParams = options.additionalParams;
|
|
20
|
+
const retries = options.retries === void 0 ? void 0 : resolveRetryOptions(options.retries);
|
|
21
|
+
return runWithRetries(
|
|
22
|
+
() => options.model.transcription(request),
|
|
23
|
+
retries,
|
|
24
|
+
{ streaming: false }
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
function toUint8Array(bytes) {
|
|
28
|
+
if (bytes instanceof Uint8Array) {
|
|
29
|
+
return new Uint8Array(
|
|
30
|
+
bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return new Uint8Array(bytes.slice(0));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
transcribe
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=chunk-QY5GZ7HR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transcription/transcribe.ts"],"sourcesContent":["import type { JsonValue } from \"../completion\";\nimport { type RetryOptions, resolveRetryOptions, runWithRetries } from \"../retry\";\nimport type { TranscriptionModel, TranscriptionRequest } from \"./types\";\n\nexport type TranscribeOptions<Model extends TranscriptionModel = TranscriptionModel> = {\n model: Model;\n filename: string;\n language?: string | undefined;\n prompt?: string | undefined;\n temperature?: number | undefined;\n additionalParams?: JsonValue | undefined;\n retries?: RetryOptions | undefined;\n};\n\nexport function transcribe<Model extends TranscriptionModel>(\n audio: Uint8Array | ArrayBuffer,\n options: TranscribeOptions<Model>,\n): Promise<Awaited<ReturnType<Model[\"transcription\"]>>> {\n const data = toUint8Array(audio);\n if (data.byteLength === 0) {\n throw new Error(\"Transcription audio cannot be empty.\");\n }\n if (typeof options.filename !== \"string\" || options.filename.trim().length === 0) {\n throw new TypeError(\"Transcription filename must be a non-empty string.\");\n }\n\n const request: TranscriptionRequest = { data, filename: options.filename };\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.additionalParams !== undefined) request.additionalParams = options.additionalParams;\n\n const retries = options.retries === undefined ? undefined : resolveRetryOptions(options.retries);\n return runWithRetries<Awaited<ReturnType<Model[\"transcription\"]>>>(\n () =>\n options.model.transcription(request) as Promise<Awaited<ReturnType<Model[\"transcription\"]>>>,\n retries,\n { streaming: false },\n );\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":";;;;;;AAcO,SAAS,WACd,OACA,SACsD;AACtD,QAAM,OAAO,aAAa,KAAK;AAC/B,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,MAAI,OAAO,QAAQ,aAAa,YAAY,QAAQ,SAAS,KAAK,EAAE,WAAW,GAAG;AAChF,UAAM,IAAI,UAAU,oDAAoD;AAAA,EAC1E;AAEA,QAAM,UAAgC,EAAE,MAAM,UAAU,QAAQ,SAAS;AACzE,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,qBAAqB,OAAW,SAAQ,mBAAmB,QAAQ;AAE/E,QAAM,UAAU,QAAQ,YAAY,SAAY,SAAY,oBAAoB,QAAQ,OAAO;AAC/F,SAAO;AAAA,IACL,MACE,QAAQ,MAAM,cAAc,OAAO;AAAA,IACrC;AAAA,IACA,EAAE,WAAW,MAAM;AAAA,EACrB;AACF;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":[]}
|