ai 7.0.123 → 7.0.124
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/CHANGELOG.md +14 -0
- package/dist/index.d.ts +191 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +383 -91
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +199 -8
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +9 -3
- package/dist/internal/index.js.map +1 -1
- package/docs/03-ai-sdk-core/36-transcription.mdx +36 -0
- package/docs/03-ai-sdk-core/37-speech.mdx +21 -0
- package/docs/03-ai-sdk-core/60-telemetry.mdx +49 -1
- package/docs/07-reference/01-ai-sdk-core/11-stream-transcribe.mdx +7 -0
- package/docs/07-reference/01-ai-sdk-core/11-transcribe.mdx +7 -0
- package/docs/07-reference/01-ai-sdk-core/12-generate-speech.mdx +7 -0
- package/package.json +12 -12
- package/src/generate-speech/generate-speech.ts +163 -38
- package/src/generate-speech/index.ts +4 -0
- package/src/generate-speech/speech-events.ts +91 -0
- package/src/telemetry/create-telemetry-dispatcher.ts +18 -5
- package/src/telemetry/telemetry.ts +38 -6
- package/src/telemetry/tracing-channel.ts +3 -0
- package/src/transcribe/index.ts +6 -0
- package/src/transcribe/stream-transcribe.ts +182 -31
- package/src/transcribe/transcribe.ts +186 -33
- package/src/transcribe/transcription-events.ts +111 -0
package/dist/index.js
CHANGED
|
@@ -1102,7 +1102,7 @@ function cloneValue(value) {
|
|
|
1102
1102
|
}
|
|
1103
1103
|
//#endregion
|
|
1104
1104
|
//#region src/version.ts
|
|
1105
|
-
const VERSION = "7.0.
|
|
1105
|
+
const VERSION = "7.0.124";
|
|
1106
1106
|
//#endregion
|
|
1107
1107
|
//#region src/util/download/download.ts
|
|
1108
1108
|
/**
|
|
@@ -4356,11 +4356,15 @@ function createTelemetryDispatcher({ telemetry }) {
|
|
|
4356
4356
|
includeToolsContext: telemetry?.includeToolsContext
|
|
4357
4357
|
};
|
|
4358
4358
|
const mergeTelemetryCallback = (key) => {
|
|
4359
|
-
const
|
|
4359
|
+
const integrationCallbacks = integrations.map((integration) => integration[key]?.bind(integration)).filter(Boolean).map((callback) => ((event) => callback(augmentEvent(event, telemetryMetadata))));
|
|
4360
|
+
if (integrationCallbacks.length === 0) return;
|
|
4361
|
+
const mergedIntegrationCallback = mergeCallbacks(...integrationCallbacks);
|
|
4360
4362
|
return async (event) => {
|
|
4361
4363
|
await mergedIntegrationCallback(event);
|
|
4362
4364
|
};
|
|
4363
4365
|
};
|
|
4366
|
+
const onStepEnd = mergeTelemetryCallback("onStepEnd");
|
|
4367
|
+
const onStepFinish = mergeTelemetryCallback("onStepFinish");
|
|
4364
4368
|
const executeLanguageModelCallWrappers = integrations.map((integration) => integration.executeLanguageModelCall?.bind(integration)).filter(Boolean);
|
|
4365
4369
|
const executeToolWrappers = integrations.map((integration) => integration.executeTool?.bind(integration)).filter(Boolean);
|
|
4366
4370
|
return {
|
|
@@ -4381,7 +4385,7 @@ function createTelemetryDispatcher({ telemetry }) {
|
|
|
4381
4385
|
onLanguageModelCallEnd: mergeTelemetryCallback("onLanguageModelCallEnd"),
|
|
4382
4386
|
onToolExecutionStart: mergeTelemetryCallback("onToolExecutionStart"),
|
|
4383
4387
|
onToolExecutionEnd: mergeTelemetryCallback("onToolExecutionEnd"),
|
|
4384
|
-
onStepEnd: mergeCallbacks(
|
|
4388
|
+
onStepEnd: onStepEnd == null && onStepFinish == null ? void 0 : mergeCallbacks(onStepEnd, onStepFinish),
|
|
4385
4389
|
onObjectStepStart: mergeTelemetryCallback("onObjectStepStart"),
|
|
4386
4390
|
onObjectStepEnd: mergeTelemetryCallback("onObjectStepEnd"),
|
|
4387
4391
|
onEmbedStart: mergeTelemetryCallback("onEmbedStart"),
|
|
@@ -4392,6 +4396,8 @@ function createTelemetryDispatcher({ telemetry }) {
|
|
|
4392
4396
|
experimental_onEvaluationModelCallStart: mergeTelemetryCallback("experimental_onEvaluationModelCallStart"),
|
|
4393
4397
|
experimental_onEvaluationModelCallEnd: mergeTelemetryCallback("experimental_onEvaluationModelCallEnd"),
|
|
4394
4398
|
experimental_onEvaluateEnd: mergeTelemetryCallback("experimental_onEvaluateEnd"),
|
|
4399
|
+
experimental_onStreamTranscriptionStart: mergeTelemetryCallback("experimental_onStreamTranscriptionStart"),
|
|
4400
|
+
experimental_onStreamTranscriptionEnd: mergeTelemetryCallback("experimental_onStreamTranscriptionEnd"),
|
|
4395
4401
|
onEnd: mergeTelemetryCallback("onEnd"),
|
|
4396
4402
|
onAbort: mergeTelemetryCallback("onAbort"),
|
|
4397
4403
|
onError: mergeTelemetryCallback("onError"),
|
|
@@ -5041,7 +5047,7 @@ const originalGenerateId$4 = createIdGenerator$1({
|
|
|
5041
5047
|
prefix: "aitxt",
|
|
5042
5048
|
size: 24
|
|
5043
5049
|
});
|
|
5044
|
-
const originalGenerateCallId$
|
|
5050
|
+
const originalGenerateCallId$9 = createIdGenerator$1({
|
|
5045
5051
|
prefix: "call",
|
|
5046
5052
|
size: 24
|
|
5047
5053
|
});
|
|
@@ -5112,7 +5118,7 @@ const originalGenerateCallId$6 = createIdGenerator$1({
|
|
|
5112
5118
|
* @returns
|
|
5113
5119
|
* A result object that contains the generated text, the results of the tool calls, and additional information.
|
|
5114
5120
|
*/
|
|
5115
|
-
async function generateText({ model: modelArg, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries: maxRetriesArg, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, providerOptions, activeTools, toolOrder, prepareStep, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_download: download, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { generateId = originalGenerateId$4, generateCallId = originalGenerateCallId$
|
|
5121
|
+
async function generateText({ model: modelArg, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries: maxRetriesArg, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, providerOptions, activeTools, toolOrder, prepareStep, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_download: download, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { generateId = originalGenerateId$4, generateCallId = originalGenerateCallId$9, now: now$4 = now } = {}, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, onStepEnd, onStepFinish, onFinish, onEnd = onFinish, ...settings }) {
|
|
5116
5122
|
include = {
|
|
5117
5123
|
requestBody: include?.requestBody ?? false,
|
|
5118
5124
|
requestMessages: include?.requestMessages ?? false,
|
|
@@ -7948,7 +7954,7 @@ const originalGenerateId$3 = createIdGenerator$1({
|
|
|
7948
7954
|
prefix: "aitxt",
|
|
7949
7955
|
size: 24
|
|
7950
7956
|
});
|
|
7951
|
-
const originalGenerateCallId$
|
|
7957
|
+
const originalGenerateCallId$8 = createIdGenerator$1({
|
|
7952
7958
|
prefix: "call",
|
|
7953
7959
|
size: 24
|
|
7954
7960
|
});
|
|
@@ -8001,7 +8007,7 @@ const originalGenerateCallId$5 = createIdGenerator$1({
|
|
|
8001
8007
|
*
|
|
8002
8008
|
* @returns A stream of model call parts together with request and response metadata when available.
|
|
8003
8009
|
*/
|
|
8004
|
-
async function streamLanguageModelCall({ model, tools, toolOrder, output, toolChoice, prompt, system, instructions, messages, allowSystemInMessages, download, abortSignal, headers, includeRawChunks, providerOptions, repairToolCall, refineToolInput, executeLanguageModelCallInTelemetryContext = async ({ execute }) => await execute(), callId, toolsContext, experimental_sandbox: sandbox, _internal: { generateId = originalGenerateId$3, generateCallId = originalGenerateCallId$
|
|
8010
|
+
async function streamLanguageModelCall({ model, tools, toolOrder, output, toolChoice, prompt, system, instructions, messages, allowSystemInMessages, download, abortSignal, headers, includeRawChunks, providerOptions, repairToolCall, refineToolInput, executeLanguageModelCallInTelemetryContext = async ({ execute }) => await execute(), callId, toolsContext, experimental_sandbox: sandbox, _internal: { generateId = originalGenerateId$3, generateCallId = originalGenerateCallId$8, now: now$3 = now } = {}, onStart, onLanguageModelCallStart, onLanguageModelCallEnd, ...callSettings }) {
|
|
8005
8011
|
const resolvedModel = resolveLanguageModel(model);
|
|
8006
8012
|
const effectiveCallId = callId ?? generateCallId();
|
|
8007
8013
|
const standardizedPrompt = await standardizePrompt({
|
|
@@ -8464,7 +8470,7 @@ const originalGenerateId$2 = createIdGenerator$1({
|
|
|
8464
8470
|
prefix: "aitxt",
|
|
8465
8471
|
size: 24
|
|
8466
8472
|
});
|
|
8467
|
-
const originalGenerateCallId$
|
|
8473
|
+
const originalGenerateCallId$7 = createIdGenerator$1({
|
|
8468
8474
|
prefix: "call",
|
|
8469
8475
|
size: 24
|
|
8470
8476
|
});
|
|
@@ -8574,7 +8580,7 @@ function isOutputChunk(chunk) {
|
|
|
8574
8580
|
* @returns
|
|
8575
8581
|
* A result object for accessing different stream types and additional information.
|
|
8576
8582
|
*/
|
|
8577
|
-
function streamText({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, streamRetries, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, prepareStep, providerOptions, activeTools, toolOrder, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_transform: transform, experimental_download: download, includeRawChunks, onChunk, onError: onErrorArg, onFinish, onEnd = onFinish, onAbort, onStepEnd, onStepFinish, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { now: now$2 = now, generateId = originalGenerateId$2, generateCallId = originalGenerateCallId$
|
|
8583
|
+
function streamText({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, streamRetries, abortSignal, timeout, headers, stopWhen = isStepCount(1), experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry = experimental_telemetry, prepareStep, providerOptions, activeTools, toolOrder, experimental_repairToolCall, repairToolCall = experimental_repairToolCall, experimental_refineToolInput: refineToolInput, experimental_transform: transform, experimental_download: download, includeRawChunks, onChunk, onError: onErrorArg, onFinish, onEnd = onFinish, onAbort, onStepEnd, onStepFinish, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, runtimeContext = {}, toolsContext = {}, experimental_include, include = experimental_include, _internal: { now: now$2 = now, generateId = originalGenerateId$2, generateCallId = originalGenerateCallId$7 } = {}, ...settings }) {
|
|
8578
8584
|
const totalTimeoutMs = getTotalTimeoutMs(timeout);
|
|
8579
8585
|
const stepTimeoutMs = getStepTimeoutMs(timeout);
|
|
8580
8586
|
const firstChunkTimeoutMs = getFirstChunkTimeoutMs(timeout);
|
|
@@ -11992,7 +11998,7 @@ function createRestrictedTelemetryDispatcher$2({ telemetry }) {
|
|
|
11992
11998
|
}
|
|
11993
11999
|
//#endregion
|
|
11994
12000
|
//#region src/embed/embed.ts
|
|
11995
|
-
const originalGenerateCallId$
|
|
12001
|
+
const originalGenerateCallId$6 = createIdGenerator$1({
|
|
11996
12002
|
prefix: "call",
|
|
11997
12003
|
size: 24
|
|
11998
12004
|
});
|
|
@@ -12015,7 +12021,7 @@ const originalGenerateCallId$3 = createIdGenerator$1({
|
|
|
12015
12021
|
*
|
|
12016
12022
|
* @returns A result object that contains the embedding, the value, and additional information.
|
|
12017
12023
|
*/
|
|
12018
|
-
async function embed({ model: modelArg, value, providerOptions, maxRetries: maxRetriesArg, abortSignal, headers, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId$
|
|
12024
|
+
async function embed({ model: modelArg, value, providerOptions, maxRetries: maxRetriesArg, abortSignal, headers, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId$6 } = {} }) {
|
|
12019
12025
|
const model = resolveEmbeddingModel(modelArg);
|
|
12020
12026
|
const { maxRetries, retry } = prepareRetries({
|
|
12021
12027
|
maxRetries: maxRetriesArg,
|
|
@@ -12175,7 +12181,7 @@ function splitArray(array, chunkSize) {
|
|
|
12175
12181
|
}
|
|
12176
12182
|
//#endregion
|
|
12177
12183
|
//#region src/embed/embed-many.ts
|
|
12178
|
-
const originalGenerateCallId$
|
|
12184
|
+
const originalGenerateCallId$5 = createIdGenerator$1({
|
|
12179
12185
|
prefix: "call",
|
|
12180
12186
|
size: 24
|
|
12181
12187
|
});
|
|
@@ -12207,7 +12213,7 @@ const originalGenerateCallId$2 = createIdGenerator$1({
|
|
|
12207
12213
|
*
|
|
12208
12214
|
* @returns A result object that contains the embeddings, the value, and additional information.
|
|
12209
12215
|
*/
|
|
12210
|
-
async function embedMany({ model: modelArg, values, maxParallelCalls = Infinity, maxRetries: maxRetriesArg, abortSignal, headers, providerOptions, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId$
|
|
12216
|
+
async function embedMany({ model: modelArg, values, maxParallelCalls = Infinity, maxRetries: maxRetriesArg, abortSignal, headers, providerOptions, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId$5 } = {} }) {
|
|
12211
12217
|
const model = resolveEmbeddingModel(modelArg);
|
|
12212
12218
|
const { maxRetries, retry } = prepareRetries({
|
|
12213
12219
|
maxRetries: maxRetriesArg,
|
|
@@ -12611,12 +12617,12 @@ function validateEvaluationAnswers({ questions, answers, rounding }) {
|
|
|
12611
12617
|
}
|
|
12612
12618
|
//#endregion
|
|
12613
12619
|
//#region src/evaluate/evaluate.ts
|
|
12614
|
-
const originalGenerateCallId$
|
|
12620
|
+
const originalGenerateCallId$4 = createIdGenerator$1({
|
|
12615
12621
|
prefix: "call",
|
|
12616
12622
|
size: 24
|
|
12617
12623
|
});
|
|
12618
12624
|
/** Evaluate typed questions against one shared state. Experimental. */
|
|
12619
|
-
async function evaluate({ model: modelArg, state, questions, maxRetries, abortSignal, headers, providerOptions = {}, telemetry, runtimeContext = {}, onStart, onEnd, _internal: { generateCallId = originalGenerateCallId$
|
|
12625
|
+
async function evaluate({ model: modelArg, state, questions, maxRetries, abortSignal, headers, providerOptions = {}, telemetry, runtimeContext = {}, onStart, onEnd, _internal: { generateCallId = originalGenerateCallId$4 } = {} }) {
|
|
12620
12626
|
const model = resolveEvaluationModel(modelArg);
|
|
12621
12627
|
validateEvaluationInput({
|
|
12622
12628
|
state,
|
|
@@ -14071,6 +14077,10 @@ var DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {
|
|
|
14071
14077
|
};
|
|
14072
14078
|
//#endregion
|
|
14073
14079
|
//#region src/generate-speech/generate-speech.ts
|
|
14080
|
+
const originalGenerateCallId$3 = createIdGenerator$1({
|
|
14081
|
+
prefix: "call",
|
|
14082
|
+
size: 24
|
|
14083
|
+
});
|
|
14074
14084
|
/**
|
|
14075
14085
|
* Generates speech audio using a speech model.
|
|
14076
14086
|
*
|
|
@@ -14086,48 +14096,126 @@ var DefaultGeneratedAudioFile = class extends DefaultGeneratedFile {
|
|
|
14086
14096
|
* @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
|
|
14087
14097
|
* @param abortSignal - An optional abort signal that can be used to cancel the call.
|
|
14088
14098
|
* @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
|
|
14099
|
+
* @param telemetry - Optional telemetry configuration.
|
|
14089
14100
|
*
|
|
14090
14101
|
* @returns A result object that contains the generated audio data.
|
|
14091
14102
|
*/
|
|
14092
|
-
async function generateSpeech({ model, text, voice, outputFormat, instructions, speed, language, providerOptions = {}, maxRetries: maxRetriesArg, abortSignal, headers }) {
|
|
14103
|
+
async function generateSpeech({ model, text, voice, outputFormat, instructions, speed, language, providerOptions = {}, maxRetries: maxRetriesArg, abortSignal, headers, telemetry, _internal: { generateCallId = originalGenerateCallId$3 } = {} }) {
|
|
14093
14104
|
const resolvedModel = resolveSpeechModel(model);
|
|
14094
14105
|
if (!resolvedModel) throw new Error("Model could not be resolved");
|
|
14095
14106
|
const headersWithUserAgent = withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`);
|
|
14096
|
-
const { retry } = prepareRetries({
|
|
14107
|
+
const { maxRetries, retry } = prepareRetries({
|
|
14097
14108
|
maxRetries: maxRetriesArg,
|
|
14098
14109
|
abortSignal
|
|
14099
14110
|
});
|
|
14100
|
-
const
|
|
14111
|
+
const callId = generateCallId();
|
|
14112
|
+
const telemetryDispatcher = createTelemetryDispatcher({ telemetry });
|
|
14113
|
+
const runInTracingChannelSpan = telemetryDispatcher.runInTracingChannelSpan ?? (async ({ execute }) => await execute());
|
|
14114
|
+
const startEvent = {
|
|
14115
|
+
callId,
|
|
14116
|
+
operationId: "ai.generateSpeech",
|
|
14117
|
+
provider: resolvedModel.provider,
|
|
14118
|
+
modelId: resolvedModel.modelId,
|
|
14101
14119
|
text,
|
|
14102
14120
|
voice,
|
|
14103
14121
|
outputFormat,
|
|
14104
14122
|
instructions,
|
|
14105
14123
|
speed,
|
|
14106
14124
|
language,
|
|
14107
|
-
|
|
14108
|
-
headers
|
|
14125
|
+
maxRetries,
|
|
14126
|
+
headers,
|
|
14109
14127
|
providerOptions
|
|
14110
|
-
}
|
|
14111
|
-
|
|
14112
|
-
|
|
14113
|
-
|
|
14114
|
-
|
|
14115
|
-
|
|
14116
|
-
|
|
14117
|
-
|
|
14118
|
-
|
|
14119
|
-
|
|
14120
|
-
|
|
14121
|
-
|
|
14122
|
-
|
|
14123
|
-
|
|
14124
|
-
|
|
14125
|
-
|
|
14126
|
-
|
|
14127
|
-
|
|
14128
|
-
|
|
14128
|
+
};
|
|
14129
|
+
return await runInTracingChannelSpan({
|
|
14130
|
+
type: "generateSpeech",
|
|
14131
|
+
event: startEvent,
|
|
14132
|
+
execute: async () => {
|
|
14133
|
+
await notify({
|
|
14134
|
+
event: startEvent,
|
|
14135
|
+
callbacks: [telemetryDispatcher.onStart]
|
|
14136
|
+
});
|
|
14137
|
+
try {
|
|
14138
|
+
const result = await retry(() => resolvedModel.doGenerate({
|
|
14139
|
+
text,
|
|
14140
|
+
voice,
|
|
14141
|
+
outputFormat,
|
|
14142
|
+
instructions,
|
|
14143
|
+
speed,
|
|
14144
|
+
language,
|
|
14145
|
+
abortSignal,
|
|
14146
|
+
headers: headersWithUserAgent,
|
|
14147
|
+
providerOptions
|
|
14148
|
+
}));
|
|
14149
|
+
if (!result.audio || result.audio.length === 0) throw new NoSpeechGeneratedError({ responses: [result.response] });
|
|
14150
|
+
logWarnings({
|
|
14151
|
+
warnings: result.warnings,
|
|
14152
|
+
provider: resolvedModel.provider,
|
|
14153
|
+
model: resolvedModel.modelId
|
|
14154
|
+
});
|
|
14155
|
+
const detectedMediaType = detectMediaType({
|
|
14156
|
+
data: result.audio,
|
|
14157
|
+
topLevelType: "audio"
|
|
14158
|
+
});
|
|
14159
|
+
const audio = new DefaultGeneratedAudioFile({
|
|
14160
|
+
data: result.audio,
|
|
14161
|
+
mediaType: detectedMediaType ?? getResponseAudioMediaType(result.response.headers) ?? getOutputFormatMediaType(outputFormat) ?? "audio/mp3"
|
|
14162
|
+
});
|
|
14163
|
+
if (telemetryDispatcher.onEnd != null) await notify({
|
|
14164
|
+
event: {
|
|
14165
|
+
callId,
|
|
14166
|
+
operationId: "ai.generateSpeech",
|
|
14167
|
+
provider: resolvedModel.provider,
|
|
14168
|
+
modelId: resolvedModel.modelId,
|
|
14169
|
+
text,
|
|
14170
|
+
audio: {
|
|
14171
|
+
byteLength: getBase64OrBinaryByteLength(result.audio),
|
|
14172
|
+
mediaType: audio.mediaType,
|
|
14173
|
+
format: audio.format
|
|
14174
|
+
},
|
|
14175
|
+
usage: result.usage,
|
|
14176
|
+
warnings: result.warnings,
|
|
14177
|
+
providerMetadata: result.providerMetadata,
|
|
14178
|
+
response: getTelemetryResponseMetadata(result.response)
|
|
14179
|
+
},
|
|
14180
|
+
callbacks: [telemetryDispatcher.onEnd]
|
|
14181
|
+
});
|
|
14182
|
+
return new DefaultSpeechResult({
|
|
14183
|
+
audio,
|
|
14184
|
+
warnings: result.warnings,
|
|
14185
|
+
responses: [result.response],
|
|
14186
|
+
providerMetadata: result.providerMetadata
|
|
14187
|
+
});
|
|
14188
|
+
} catch (error) {
|
|
14189
|
+
await telemetryDispatcher.onError?.({
|
|
14190
|
+
callId,
|
|
14191
|
+
error
|
|
14192
|
+
});
|
|
14193
|
+
throw error;
|
|
14194
|
+
}
|
|
14195
|
+
}
|
|
14129
14196
|
});
|
|
14130
14197
|
}
|
|
14198
|
+
function getBase64OrBinaryByteLength(audio) {
|
|
14199
|
+
if (audio instanceof Uint8Array) return audio.byteLength;
|
|
14200
|
+
let characterCount = 0;
|
|
14201
|
+
let lastCharacter = "";
|
|
14202
|
+
let secondLastCharacter = "";
|
|
14203
|
+
for (const character of audio) {
|
|
14204
|
+
if (/\s/.test(character)) continue;
|
|
14205
|
+
characterCount++;
|
|
14206
|
+
secondLastCharacter = lastCharacter;
|
|
14207
|
+
lastCharacter = character;
|
|
14208
|
+
}
|
|
14209
|
+
const padding = lastCharacter === "=" ? secondLastCharacter === "=" ? 2 : 1 : 0;
|
|
14210
|
+
return Math.floor(characterCount * 3 / 4) - padding;
|
|
14211
|
+
}
|
|
14212
|
+
function getTelemetryResponseMetadata(response) {
|
|
14213
|
+
return {
|
|
14214
|
+
timestamp: response.timestamp,
|
|
14215
|
+
modelId: response.modelId,
|
|
14216
|
+
headers: response.headers
|
|
14217
|
+
};
|
|
14218
|
+
}
|
|
14131
14219
|
function getResponseAudioMediaType(headers) {
|
|
14132
14220
|
const mediaType = Object.entries(headers ?? {}).find(([name]) => name.toLowerCase() === "content-type")?.[1];
|
|
14133
14221
|
if (mediaType == null) return;
|
|
@@ -18187,7 +18275,7 @@ function createRestrictedTelemetryDispatcher({ telemetry }) {
|
|
|
18187
18275
|
}
|
|
18188
18276
|
//#endregion
|
|
18189
18277
|
//#region src/rerank/rerank.ts
|
|
18190
|
-
const originalGenerateCallId = createIdGenerator$1({
|
|
18278
|
+
const originalGenerateCallId$2 = createIdGenerator$1({
|
|
18191
18279
|
prefix: "call",
|
|
18192
18280
|
size: 24
|
|
18193
18281
|
});
|
|
@@ -18208,7 +18296,7 @@ const originalGenerateCallId = createIdGenerator$1({
|
|
|
18208
18296
|
*
|
|
18209
18297
|
* @returns A result object that contains the reranked documents, the reranked indices, and additional information.
|
|
18210
18298
|
*/
|
|
18211
|
-
async function rerank({ model: modelArg, documents, query, topN, maxRetries: maxRetriesArg, abortSignal, headers, providerOptions, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId } = {} }) {
|
|
18299
|
+
async function rerank({ model: modelArg, documents, query, topN, maxRetries: maxRetriesArg, abortSignal, headers, providerOptions, experimental_telemetry, telemetry = experimental_telemetry, runtimeContext = {}, onStart, experimental_onStart, onEnd, experimental_onEnd, _internal: { generateCallId = originalGenerateCallId$2 } = {} }) {
|
|
18212
18300
|
const model = resolveRerankingModel(modelArg);
|
|
18213
18301
|
const callId = generateCallId();
|
|
18214
18302
|
const resolvedOnStart = onStart ?? experimental_onStart;
|
|
@@ -18415,6 +18503,10 @@ var DefaultRerankResult = class {
|
|
|
18415
18503
|
};
|
|
18416
18504
|
//#endregion
|
|
18417
18505
|
//#region src/transcribe/transcribe.ts
|
|
18506
|
+
const originalGenerateCallId$1 = createIdGenerator$1({
|
|
18507
|
+
prefix: "call",
|
|
18508
|
+
size: 24
|
|
18509
|
+
});
|
|
18418
18510
|
/**
|
|
18419
18511
|
* Generates transcripts using a transcription model.
|
|
18420
18512
|
*
|
|
@@ -18425,47 +18517,149 @@ var DefaultRerankResult = class {
|
|
|
18425
18517
|
* @param maxRetries - Maximum number of retries. Set to 0 to disable retries. Default: 2.
|
|
18426
18518
|
* @param abortSignal - An optional abort signal that can be used to cancel the call.
|
|
18427
18519
|
* @param headers - Additional HTTP headers to be sent with the request. Only applicable for HTTP-based providers.
|
|
18520
|
+
* @param telemetry - Optional telemetry configuration.
|
|
18428
18521
|
*
|
|
18429
18522
|
* @returns A result object that contains the generated transcript.
|
|
18430
18523
|
*/
|
|
18431
18524
|
const defaultDownload = createDownload();
|
|
18432
|
-
async function transcribe({ model, audio, providerOptions = {}, maxRetries: maxRetriesArg, abortSignal, headers, download: downloadFn = defaultDownload }) {
|
|
18525
|
+
async function transcribe({ model, audio, providerOptions = {}, maxRetries: maxRetriesArg, abortSignal, headers, telemetry, download: downloadFn = defaultDownload, _internal: { generateCallId = originalGenerateCallId$1 } = {} }) {
|
|
18433
18526
|
const resolvedModel = resolveTranscriptionModel(model);
|
|
18434
18527
|
if (!resolvedModel) throw new Error("Model could not be resolved");
|
|
18435
|
-
const { retry } = prepareRetries({
|
|
18528
|
+
const { maxRetries, retry } = prepareRetries({
|
|
18436
18529
|
maxRetries: maxRetriesArg,
|
|
18437
18530
|
abortSignal
|
|
18438
18531
|
});
|
|
18439
18532
|
const headersWithUserAgent = withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`);
|
|
18440
|
-
const
|
|
18441
|
-
|
|
18442
|
-
|
|
18443
|
-
})
|
|
18444
|
-
|
|
18445
|
-
|
|
18446
|
-
abortSignal,
|
|
18447
|
-
headers: headersWithUserAgent,
|
|
18448
|
-
providerOptions,
|
|
18449
|
-
mediaType: detectMediaType({
|
|
18450
|
-
data: audioData,
|
|
18451
|
-
topLevelType: "audio"
|
|
18452
|
-
}) ?? "audio/wav"
|
|
18453
|
-
}));
|
|
18454
|
-
logWarnings({
|
|
18455
|
-
warnings: result.warnings,
|
|
18533
|
+
const callId = generateCallId();
|
|
18534
|
+
const telemetryDispatcher = createTelemetryDispatcher({ telemetry });
|
|
18535
|
+
const runInTracingChannelSpan = telemetryDispatcher.runInTracingChannelSpan ?? (async ({ execute }) => await execute());
|
|
18536
|
+
const createStartEvent = ({ byteLength, mediaType }) => ({
|
|
18537
|
+
callId,
|
|
18538
|
+
operationId: "ai.transcribe",
|
|
18456
18539
|
provider: resolvedModel.provider,
|
|
18457
|
-
|
|
18540
|
+
modelId: resolvedModel.modelId,
|
|
18541
|
+
audio: {
|
|
18542
|
+
byteLength,
|
|
18543
|
+
mediaType
|
|
18544
|
+
},
|
|
18545
|
+
inputAudioFormat: void 0,
|
|
18546
|
+
maxRetries,
|
|
18547
|
+
headers,
|
|
18548
|
+
providerOptions
|
|
18458
18549
|
});
|
|
18459
|
-
|
|
18460
|
-
|
|
18461
|
-
|
|
18462
|
-
|
|
18463
|
-
|
|
18464
|
-
|
|
18465
|
-
|
|
18466
|
-
|
|
18467
|
-
|
|
18550
|
+
const executeWithStartEvent = async ({ startEvent, execute }) => await runInTracingChannelSpan({
|
|
18551
|
+
type: "transcribe",
|
|
18552
|
+
event: startEvent,
|
|
18553
|
+
execute: async () => {
|
|
18554
|
+
await notify({
|
|
18555
|
+
event: startEvent,
|
|
18556
|
+
callbacks: [telemetryDispatcher.onStart]
|
|
18557
|
+
});
|
|
18558
|
+
return await execute();
|
|
18559
|
+
}
|
|
18560
|
+
});
|
|
18561
|
+
let preparationError;
|
|
18562
|
+
let preparationFailed = false;
|
|
18563
|
+
let audioData;
|
|
18564
|
+
let downloadedMediaType;
|
|
18565
|
+
try {
|
|
18566
|
+
if (audio instanceof URL) {
|
|
18567
|
+
const downloadResult = await downloadFn({
|
|
18568
|
+
url: audio,
|
|
18569
|
+
abortSignal
|
|
18570
|
+
});
|
|
18571
|
+
audioData = downloadResult.data;
|
|
18572
|
+
downloadedMediaType = downloadResult.mediaType;
|
|
18573
|
+
} else audioData = convertDataContentToUint8Array(audio);
|
|
18574
|
+
} catch (error) {
|
|
18575
|
+
preparationFailed = true;
|
|
18576
|
+
preparationError = error;
|
|
18577
|
+
audioData = /* @__PURE__ */ new Uint8Array();
|
|
18578
|
+
}
|
|
18579
|
+
if (preparationFailed) {
|
|
18580
|
+
const startEvent = createStartEvent({
|
|
18581
|
+
byteLength: void 0,
|
|
18582
|
+
mediaType: void 0
|
|
18583
|
+
});
|
|
18584
|
+
try {
|
|
18585
|
+
return await executeWithStartEvent({
|
|
18586
|
+
startEvent,
|
|
18587
|
+
execute: () => {
|
|
18588
|
+
throw preparationError;
|
|
18589
|
+
}
|
|
18590
|
+
});
|
|
18591
|
+
} catch (error) {
|
|
18592
|
+
await telemetryDispatcher.onError?.({
|
|
18593
|
+
callId,
|
|
18594
|
+
error
|
|
18595
|
+
});
|
|
18596
|
+
throw error;
|
|
18597
|
+
}
|
|
18598
|
+
}
|
|
18599
|
+
const mediaType = downloadedMediaType ?? detectMediaType({
|
|
18600
|
+
data: audioData,
|
|
18601
|
+
topLevelType: "audio"
|
|
18602
|
+
}) ?? "audio/wav";
|
|
18603
|
+
const startEvent = createStartEvent({
|
|
18604
|
+
byteLength: audioData.byteLength,
|
|
18605
|
+
mediaType
|
|
18468
18606
|
});
|
|
18607
|
+
try {
|
|
18608
|
+
return await executeWithStartEvent({
|
|
18609
|
+
startEvent,
|
|
18610
|
+
execute: async () => {
|
|
18611
|
+
const result = await retry(() => resolvedModel.doGenerate({
|
|
18612
|
+
audio: audioData,
|
|
18613
|
+
abortSignal,
|
|
18614
|
+
headers: headersWithUserAgent,
|
|
18615
|
+
providerOptions,
|
|
18616
|
+
mediaType
|
|
18617
|
+
}));
|
|
18618
|
+
logWarnings({
|
|
18619
|
+
warnings: result.warnings,
|
|
18620
|
+
provider: resolvedModel.provider,
|
|
18621
|
+
model: resolvedModel.modelId
|
|
18622
|
+
});
|
|
18623
|
+
if (!result.text) throw new NoTranscriptGeneratedError({ responses: [result.response] });
|
|
18624
|
+
await notify({
|
|
18625
|
+
event: {
|
|
18626
|
+
callId,
|
|
18627
|
+
operationId: "ai.transcribe",
|
|
18628
|
+
provider: resolvedModel.provider,
|
|
18629
|
+
modelId: resolvedModel.modelId,
|
|
18630
|
+
audio: {
|
|
18631
|
+
byteLength: audioData.byteLength,
|
|
18632
|
+
mediaType
|
|
18633
|
+
},
|
|
18634
|
+
text: result.text,
|
|
18635
|
+
segments: result.segments,
|
|
18636
|
+
language: result.language,
|
|
18637
|
+
durationInSeconds: result.durationInSeconds,
|
|
18638
|
+
usage: result.usage,
|
|
18639
|
+
warnings: result.warnings,
|
|
18640
|
+
providerMetadata: result.providerMetadata,
|
|
18641
|
+
response: result.response
|
|
18642
|
+
},
|
|
18643
|
+
callbacks: [telemetryDispatcher.onEnd]
|
|
18644
|
+
});
|
|
18645
|
+
return new DefaultTranscriptionResult({
|
|
18646
|
+
text: result.text,
|
|
18647
|
+
segments: result.segments,
|
|
18648
|
+
language: result.language,
|
|
18649
|
+
durationInSeconds: result.durationInSeconds,
|
|
18650
|
+
warnings: result.warnings,
|
|
18651
|
+
responses: [result.response],
|
|
18652
|
+
providerMetadata: result.providerMetadata
|
|
18653
|
+
});
|
|
18654
|
+
}
|
|
18655
|
+
});
|
|
18656
|
+
} catch (error) {
|
|
18657
|
+
await telemetryDispatcher.onError?.({
|
|
18658
|
+
callId,
|
|
18659
|
+
error
|
|
18660
|
+
});
|
|
18661
|
+
throw error;
|
|
18662
|
+
}
|
|
18469
18663
|
}
|
|
18470
18664
|
var DefaultTranscriptionResult = class {
|
|
18471
18665
|
constructor(options) {
|
|
@@ -18480,6 +18674,10 @@ var DefaultTranscriptionResult = class {
|
|
|
18480
18674
|
};
|
|
18481
18675
|
//#endregion
|
|
18482
18676
|
//#region src/transcribe/stream-transcribe.ts
|
|
18677
|
+
const originalGenerateCallId = createIdGenerator$1({
|
|
18678
|
+
prefix: "call",
|
|
18679
|
+
size: 24
|
|
18680
|
+
});
|
|
18483
18681
|
/**
|
|
18484
18682
|
* Streams transcripts using a transcription model.
|
|
18485
18683
|
*
|
|
@@ -18489,10 +18687,11 @@ var DefaultTranscriptionResult = class {
|
|
|
18489
18687
|
* @param providerOptions - Additional provider-specific options.
|
|
18490
18688
|
* @param abortSignal - An optional abort signal that can be used to cancel the call.
|
|
18491
18689
|
* @param headers - Additional HTTP/WebSocket headers to send when supported by the provider.
|
|
18690
|
+
* @param telemetry - Optional telemetry configuration.
|
|
18492
18691
|
*
|
|
18493
18692
|
* @returns A result object that contains the streaming transcript and final transcript metadata.
|
|
18494
18693
|
*/
|
|
18495
|
-
function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}, abortSignal, headers, includeRawChunks, _internal: { currentDate = () => /* @__PURE__ */ new Date() } = {} }) {
|
|
18694
|
+
function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}, abortSignal, headers, includeRawChunks, telemetry, _internal: { currentDate = () => /* @__PURE__ */ new Date(), generateCallId = originalGenerateCallId } = {} }) {
|
|
18496
18695
|
const resolvedModel = resolveTranscriptionModel(model);
|
|
18497
18696
|
if (!resolvedModel) throw new Error("Model could not be resolved");
|
|
18498
18697
|
const doStream = resolvedModel.doStream?.bind(resolvedModel);
|
|
@@ -18501,6 +18700,27 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18501
18700
|
message: `The ${resolvedModel.provider} model "${resolvedModel.modelId}" does not support streaming transcription.` + (typeof model === "string" ? " String model IDs resolve through the global provider (AI Gateway by default). If that provider does not support streaming transcription, pass a provider model instance instead (e.g. openai.transcription('gpt-realtime-whisper')) or upgrade @ai-sdk/gateway to a version with streaming transcription support." : "")
|
|
18502
18701
|
});
|
|
18503
18702
|
const headersWithUserAgent = withUserAgentSuffix(headers ?? {}, `ai/${VERSION}`);
|
|
18703
|
+
const callId = generateCallId();
|
|
18704
|
+
const telemetryDispatcher = createTelemetryDispatcher({ telemetry });
|
|
18705
|
+
const runInTracingChannelSpan = telemetryDispatcher.runInTracingChannelSpan ?? (async ({ execute }) => await execute());
|
|
18706
|
+
let audioByteLength = 0;
|
|
18707
|
+
const countedAudio = telemetryDispatcher.experimental_onStreamTranscriptionEnd != null ? createByteCountingStream(audio, (byteLength) => {
|
|
18708
|
+
audioByteLength += byteLength;
|
|
18709
|
+
}) : audio;
|
|
18710
|
+
const startEvent = {
|
|
18711
|
+
callId,
|
|
18712
|
+
operationId: "ai.streamTranscribe",
|
|
18713
|
+
provider: resolvedModel.provider,
|
|
18714
|
+
modelId: resolvedModel.modelId,
|
|
18715
|
+
audio: {
|
|
18716
|
+
byteLength: void 0,
|
|
18717
|
+
mediaType: inputAudioFormat.type
|
|
18718
|
+
},
|
|
18719
|
+
inputAudioFormat,
|
|
18720
|
+
maxRetries: void 0,
|
|
18721
|
+
headers,
|
|
18722
|
+
providerOptions
|
|
18723
|
+
};
|
|
18504
18724
|
const textPromise = new DelayedPromise();
|
|
18505
18725
|
const segmentsPromise = new DelayedPromise();
|
|
18506
18726
|
const languagePromise = new DelayedPromise();
|
|
@@ -18508,6 +18728,8 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18508
18728
|
const warningsPromise = new DelayedPromise();
|
|
18509
18729
|
const responsesPromise = new DelayedPromise();
|
|
18510
18730
|
const providerMetadataPromise = new DelayedPromise();
|
|
18731
|
+
let warnings = [];
|
|
18732
|
+
let telemetrySettled = false;
|
|
18511
18733
|
const rejectPendingPromises = (error) => {
|
|
18512
18734
|
for (const promise of [
|
|
18513
18735
|
textPromise,
|
|
@@ -18525,17 +18747,18 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18525
18747
|
timestamp: startedAt,
|
|
18526
18748
|
modelId: resolvedModel.modelId
|
|
18527
18749
|
};
|
|
18528
|
-
const resolveWarnings = (
|
|
18529
|
-
|
|
18750
|
+
const resolveWarnings = (resolvedWarnings) => {
|
|
18751
|
+
warnings = resolvedWarnings;
|
|
18752
|
+
warningsPromise.resolve(resolvedWarnings);
|
|
18530
18753
|
logWarnings({
|
|
18531
|
-
warnings,
|
|
18754
|
+
warnings: resolvedWarnings,
|
|
18532
18755
|
provider: resolvedModel.provider,
|
|
18533
18756
|
model: resolvedModel.modelId
|
|
18534
18757
|
});
|
|
18535
18758
|
};
|
|
18536
18759
|
const pipeAbortController = new AbortController();
|
|
18537
18760
|
const transform = new TransformStream({
|
|
18538
|
-
transform(value, controller) {
|
|
18761
|
+
async transform(value, controller) {
|
|
18539
18762
|
switch (value.type) {
|
|
18540
18763
|
case "stream-start":
|
|
18541
18764
|
resolveWarnings(value.warnings);
|
|
@@ -18563,6 +18786,28 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18563
18786
|
durationInSecondsPromise.resolve(value.durationInSeconds);
|
|
18564
18787
|
responsesPromise.resolve([currentResponseMetadata()]);
|
|
18565
18788
|
providerMetadataPromise.resolve(value.providerMetadata ?? {});
|
|
18789
|
+
telemetrySettled = true;
|
|
18790
|
+
if (telemetryDispatcher.experimental_onStreamTranscriptionEnd != null) await notify({
|
|
18791
|
+
event: {
|
|
18792
|
+
callId,
|
|
18793
|
+
operationId: "ai.streamTranscribe",
|
|
18794
|
+
provider: resolvedModel.provider,
|
|
18795
|
+
modelId: resolvedModel.modelId,
|
|
18796
|
+
audio: {
|
|
18797
|
+
byteLength: audioByteLength,
|
|
18798
|
+
mediaType: inputAudioFormat.type
|
|
18799
|
+
},
|
|
18800
|
+
text: value.text,
|
|
18801
|
+
segments: value.segments,
|
|
18802
|
+
language: value.language,
|
|
18803
|
+
durationInSeconds: value.durationInSeconds,
|
|
18804
|
+
usage: value.usage,
|
|
18805
|
+
warnings,
|
|
18806
|
+
providerMetadata: value.providerMetadata,
|
|
18807
|
+
response: currentResponseMetadata()
|
|
18808
|
+
},
|
|
18809
|
+
callbacks: [telemetryDispatcher.experimental_onStreamTranscriptionEnd]
|
|
18810
|
+
});
|
|
18566
18811
|
}
|
|
18567
18812
|
},
|
|
18568
18813
|
flush() {
|
|
@@ -18572,25 +18817,40 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18572
18817
|
pipeAbortController.abort(reason ?? /* @__PURE__ */ new Error("Transcription stream was cancelled."));
|
|
18573
18818
|
}
|
|
18574
18819
|
});
|
|
18575
|
-
(
|
|
18576
|
-
|
|
18577
|
-
|
|
18578
|
-
|
|
18579
|
-
|
|
18580
|
-
|
|
18581
|
-
|
|
18582
|
-
|
|
18583
|
-
|
|
18584
|
-
|
|
18585
|
-
|
|
18586
|
-
|
|
18587
|
-
|
|
18588
|
-
|
|
18589
|
-
|
|
18590
|
-
|
|
18820
|
+
runInTracingChannelSpan({
|
|
18821
|
+
type: "streamTranscribe",
|
|
18822
|
+
event: startEvent,
|
|
18823
|
+
execute: async () => {
|
|
18824
|
+
await notify({
|
|
18825
|
+
event: startEvent,
|
|
18826
|
+
callbacks: [telemetryDispatcher.experimental_onStreamTranscriptionStart]
|
|
18827
|
+
});
|
|
18828
|
+
const result = await doStream({
|
|
18829
|
+
audio: countedAudio,
|
|
18830
|
+
inputAudioFormat,
|
|
18831
|
+
providerOptions,
|
|
18832
|
+
abortSignal: mergeAbortSignals(abortSignal, pipeAbortController.signal),
|
|
18833
|
+
headers: headersWithUserAgent,
|
|
18834
|
+
includeRawChunks
|
|
18835
|
+
});
|
|
18836
|
+
response = {
|
|
18837
|
+
timestamp: result.response?.timestamp ?? startedAt,
|
|
18838
|
+
modelId: result.response?.modelId ?? resolvedModel.modelId,
|
|
18839
|
+
headers: result.response?.headers
|
|
18840
|
+
};
|
|
18841
|
+
await result.stream.pipeTo(transform.writable, { signal: pipeAbortController.signal });
|
|
18842
|
+
}
|
|
18843
|
+
}).catch(async (error) => {
|
|
18591
18844
|
const reason = error ?? /* @__PURE__ */ new Error("Transcription stream was cancelled or errored.");
|
|
18592
18845
|
rejectPendingPromises(reason);
|
|
18593
|
-
|
|
18846
|
+
if (!telemetrySettled) {
|
|
18847
|
+
telemetrySettled = true;
|
|
18848
|
+
await telemetryDispatcher.onError?.({
|
|
18849
|
+
callId,
|
|
18850
|
+
error: reason
|
|
18851
|
+
});
|
|
18852
|
+
}
|
|
18853
|
+
countedAudio.cancel(reason).catch(() => {});
|
|
18594
18854
|
transform.writable.abort(reason).catch(() => {});
|
|
18595
18855
|
});
|
|
18596
18856
|
let streamOwner = "unclaimed";
|
|
@@ -18641,6 +18901,38 @@ function streamTranscribe({ model, audio, inputAudioFormat, providerOptions = {}
|
|
|
18641
18901
|
}
|
|
18642
18902
|
};
|
|
18643
18903
|
}
|
|
18904
|
+
function createByteCountingStream(audio, onChunk) {
|
|
18905
|
+
let audioReader;
|
|
18906
|
+
return new ReadableStream({
|
|
18907
|
+
async pull(controller) {
|
|
18908
|
+
audioReader ??= audio.getReader();
|
|
18909
|
+
const { done, value } = await audioReader.read();
|
|
18910
|
+
if (done) {
|
|
18911
|
+
controller.close();
|
|
18912
|
+
return;
|
|
18913
|
+
}
|
|
18914
|
+
onChunk(typeof value === "string" ? getBase64ByteLength(value) : value.byteLength);
|
|
18915
|
+
controller.enqueue(value);
|
|
18916
|
+
},
|
|
18917
|
+
async cancel(reason) {
|
|
18918
|
+
if (audioReader != null) await audioReader.cancel(reason);
|
|
18919
|
+
else await audio.cancel(reason);
|
|
18920
|
+
}
|
|
18921
|
+
});
|
|
18922
|
+
}
|
|
18923
|
+
function getBase64ByteLength(value) {
|
|
18924
|
+
let characterCount = 0;
|
|
18925
|
+
let lastCharacter = "";
|
|
18926
|
+
let secondLastCharacter = "";
|
|
18927
|
+
for (const character of value) {
|
|
18928
|
+
if (/\s/.test(character)) continue;
|
|
18929
|
+
characterCount++;
|
|
18930
|
+
secondLastCharacter = lastCharacter;
|
|
18931
|
+
lastCharacter = character;
|
|
18932
|
+
}
|
|
18933
|
+
const padding = lastCharacter === "=" ? secondLastCharacter === "=" ? 2 : 1 : 0;
|
|
18934
|
+
return Math.floor(characterCount * 3 / 4) - padding;
|
|
18935
|
+
}
|
|
18644
18936
|
//#endregion
|
|
18645
18937
|
//#region src/transcribe/index.ts
|
|
18646
18938
|
/**
|