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/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.123";
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 mergedIntegrationCallback = mergeCallbacks(...integrations.map((integration) => integration[key]?.bind(integration)).filter(Boolean).map((callback) => ((event) => callback(augmentEvent(event, telemetryMetadata)))));
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(mergeTelemetryCallback("onStepEnd"), mergeTelemetryCallback("onStepFinish")),
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$6 = createIdGenerator$1({
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$6, 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 }) {
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$5 = createIdGenerator$1({
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$5, now: now$3 = now } = {}, onStart, onLanguageModelCallStart, onLanguageModelCallEnd, ...callSettings }) {
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$4 = createIdGenerator$1({
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$4 } = {}, ...settings }) {
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$3 = createIdGenerator$1({
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$3 } = {} }) {
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$2 = createIdGenerator$1({
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$2 } = {} }) {
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$1 = createIdGenerator$1({
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$1 } = {} }) {
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 result = await retry(() => resolvedModel.doGenerate({
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
- abortSignal,
14108
- headers: headersWithUserAgent,
14125
+ maxRetries,
14126
+ headers,
14109
14127
  providerOptions
14110
- }));
14111
- if (!result.audio || result.audio.length === 0) throw new NoSpeechGeneratedError({ responses: [result.response] });
14112
- logWarnings({
14113
- warnings: result.warnings,
14114
- provider: resolvedModel.provider,
14115
- model: resolvedModel.modelId
14116
- });
14117
- const detectedMediaType = detectMediaType({
14118
- data: result.audio,
14119
- topLevelType: "audio"
14120
- });
14121
- return new DefaultSpeechResult({
14122
- audio: new DefaultGeneratedAudioFile({
14123
- data: result.audio,
14124
- mediaType: detectedMediaType ?? getResponseAudioMediaType(result.response.headers) ?? getOutputFormatMediaType(outputFormat) ?? "audio/mp3"
14125
- }),
14126
- warnings: result.warnings,
14127
- responses: [result.response],
14128
- providerMetadata: result.providerMetadata
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 audioData = audio instanceof URL ? (await downloadFn({
18441
- url: audio,
18442
- abortSignal
18443
- })).data : convertDataContentToUint8Array(audio);
18444
- const result = await retry(() => resolvedModel.doGenerate({
18445
- audio: audioData,
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
- model: resolvedModel.modelId
18540
+ modelId: resolvedModel.modelId,
18541
+ audio: {
18542
+ byteLength,
18543
+ mediaType
18544
+ },
18545
+ inputAudioFormat: void 0,
18546
+ maxRetries,
18547
+ headers,
18548
+ providerOptions
18458
18549
  });
18459
- if (!result.text) throw new NoTranscriptGeneratedError({ responses: [result.response] });
18460
- return new DefaultTranscriptionResult({
18461
- text: result.text,
18462
- segments: result.segments,
18463
- language: result.language,
18464
- durationInSeconds: result.durationInSeconds,
18465
- warnings: result.warnings,
18466
- responses: [result.response],
18467
- providerMetadata: result.providerMetadata
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 = (warnings) => {
18529
- warningsPromise.resolve(warnings);
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
- (async () => {
18576
- const result = await doStream({
18577
- audio,
18578
- inputAudioFormat,
18579
- providerOptions,
18580
- abortSignal: mergeAbortSignals(abortSignal, pipeAbortController.signal),
18581
- headers: headersWithUserAgent,
18582
- includeRawChunks
18583
- });
18584
- response = {
18585
- timestamp: result.response?.timestamp ?? startedAt,
18586
- modelId: result.response?.modelId ?? resolvedModel.modelId,
18587
- headers: result.response?.headers
18588
- };
18589
- await result.stream.pipeTo(transform.writable, { signal: pipeAbortController.signal });
18590
- })().catch((error) => {
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
- audio.cancel(reason).catch(() => {});
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
  /**