@ai-sdk/assemblyai 3.0.3 → 3.0.5

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/assemblyai-provider.ts","../src/assemblyai-transcription-model.ts","../src/assemblyai-error.ts","../src/assemblyai-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type TranscriptionModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AssemblyAITranscriptionModel } from './assemblyai-transcription-model';\nimport type { AssemblyAITranscriptionModelId } from './assemblyai-transcription-settings';\nimport { VERSION } from './version';\n\nexport interface AssemblyAIProvider extends ProviderV4 {\n (\n modelId: 'best',\n settings?: {},\n ): {\n transcription: AssemblyAITranscriptionModel;\n };\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: AssemblyAITranscriptionModelId): TranscriptionModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface AssemblyAIProviderSettings {\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\n * Create an AssemblyAI provider instance.\n */\nexport function createAssemblyAI(\n options: AssemblyAIProviderSettings = {},\n): AssemblyAIProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n authorization: loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ASSEMBLYAI_API_KEY',\n description: 'AssemblyAI',\n }),\n ...options.headers,\n },\n `ai-sdk/assemblyai/${VERSION}`,\n );\n\n const createTranscriptionModel = (modelId: AssemblyAITranscriptionModelId) =>\n new AssemblyAITranscriptionModel(modelId, {\n provider: `assemblyai.transcription`,\n url: ({ path }) => `https://api.assemblyai.com${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: AssemblyAITranscriptionModelId) {\n return {\n transcription: createTranscriptionModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n\n provider.languageModel = () => {\n throw new NoSuchModelError({\n modelId: 'unknown',\n modelType: 'languageModel',\n message: 'AssemblyAI does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as AssemblyAIProvider;\n}\n\n/**\n * Default AssemblyAI provider instance.\n */\nexport const assemblyai = createAssemblyAI();\n","import type { TranscriptionModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n extractResponseHeaders,\n parseProviderOptions,\n postJsonToApi,\n postToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { AssemblyAIConfig } from './assemblyai-config';\nimport { assemblyaiFailedResponseHandler } from './assemblyai-error';\nimport { assemblyaiTranscriptionModelOptionsSchema } from './assemblyai-transcription-model-options';\nimport type { AssemblyAITranscriptionModelId } from './assemblyai-transcription-settings';\nimport type { AssemblyAITranscriptionAPITypes } from './assemblyai-api-types';\n\ninterface AssemblyAITranscriptionModelConfig extends AssemblyAIConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n /**\n * The polling interval for checking transcript status in milliseconds.\n */\n pollingInterval?: number;\n}\n\nexport class AssemblyAITranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n private readonly POLLING_INTERVAL_MS = 3000;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: AssemblyAITranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AssemblyAITranscriptionModelId;\n config: AssemblyAITranscriptionModelConfig;\n }) {\n return new AssemblyAITranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: AssemblyAITranscriptionModelId,\n private readonly config: AssemblyAITranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const assemblyaiOptions = await parseProviderOptions({\n provider: 'assemblyai',\n providerOptions,\n schema: assemblyaiTranscriptionModelOptionsSchema,\n });\n\n const body: Omit<AssemblyAITranscriptionAPITypes, 'audio_url'> = {\n speech_model: this.modelId as 'best' | 'nano',\n };\n\n // Add provider-specific options\n if (assemblyaiOptions) {\n body.audio_end_at = assemblyaiOptions.audioEndAt ?? undefined;\n body.audio_start_from = assemblyaiOptions.audioStartFrom ?? undefined;\n body.auto_chapters = assemblyaiOptions.autoChapters ?? undefined;\n body.auto_highlights = assemblyaiOptions.autoHighlights ?? undefined;\n body.boost_param = (assemblyaiOptions.boostParam as never) ?? undefined;\n body.content_safety = assemblyaiOptions.contentSafety ?? undefined;\n body.content_safety_confidence =\n assemblyaiOptions.contentSafetyConfidence ?? undefined;\n body.custom_spelling =\n (assemblyaiOptions.customSpelling as never) ?? undefined;\n body.disfluencies = assemblyaiOptions.disfluencies ?? undefined;\n body.entity_detection = assemblyaiOptions.entityDetection ?? undefined;\n body.filter_profanity = assemblyaiOptions.filterProfanity ?? undefined;\n body.format_text = assemblyaiOptions.formatText ?? undefined;\n body.iab_categories = assemblyaiOptions.iabCategories ?? undefined;\n body.language_code =\n (assemblyaiOptions.languageCode as never) ?? undefined;\n body.language_confidence_threshold =\n assemblyaiOptions.languageConfidenceThreshold ?? undefined;\n body.language_detection =\n assemblyaiOptions.languageDetection ?? undefined;\n body.multichannel = assemblyaiOptions.multichannel ?? undefined;\n body.punctuate = assemblyaiOptions.punctuate ?? undefined;\n body.redact_pii = assemblyaiOptions.redactPii ?? undefined;\n body.redact_pii_audio = assemblyaiOptions.redactPiiAudio ?? undefined;\n body.redact_pii_audio_quality =\n (assemblyaiOptions.redactPiiAudioQuality as never) ?? undefined;\n body.redact_pii_policies =\n (assemblyaiOptions.redactPiiPolicies as never) ?? undefined;\n body.redact_pii_sub =\n (assemblyaiOptions.redactPiiSub as never) ?? undefined;\n body.sentiment_analysis =\n assemblyaiOptions.sentimentAnalysis ?? undefined;\n body.speaker_labels = assemblyaiOptions.speakerLabels ?? undefined;\n body.speakers_expected = assemblyaiOptions.speakersExpected ?? undefined;\n body.speech_threshold = assemblyaiOptions.speechThreshold ?? undefined;\n body.summarization = assemblyaiOptions.summarization ?? undefined;\n body.summary_model =\n (assemblyaiOptions.summaryModel as never) ?? undefined;\n body.summary_type = (assemblyaiOptions.summaryType as never) ?? undefined;\n body.webhook_auth_header_name =\n assemblyaiOptions.webhookAuthHeaderName ?? undefined;\n body.webhook_auth_header_value =\n assemblyaiOptions.webhookAuthHeaderValue ?? undefined;\n body.webhook_url = assemblyaiOptions.webhookUrl ?? undefined;\n body.word_boost = assemblyaiOptions.wordBoost ?? undefined;\n }\n\n return {\n body,\n warnings,\n };\n }\n\n /**\n * Polls the given transcript until we have a status other than `processing` or `queued`.\n *\n * @see https://www.assemblyai.com/docs/getting-started/transcribe-an-audio-file#step-33\n */\n private async waitForCompletion(\n transcriptId: string,\n headers: Record<string, string | undefined> | undefined,\n abortSignal?: AbortSignal,\n ): Promise<{\n transcript: z.infer<typeof assemblyaiTranscriptionResponseSchema>;\n responseHeaders: Record<string, string>;\n }> {\n const pollingInterval =\n this.config.pollingInterval ?? this.POLLING_INTERVAL_MS;\n\n while (true) {\n if (abortSignal?.aborted) {\n throw new Error('Transcription request was aborted');\n }\n\n const response = await fetch(\n this.config.url({\n path: `/v2/transcript/${transcriptId}`,\n modelId: this.modelId,\n }),\n {\n method: 'GET',\n headers: combineHeaders(\n this.config.headers?.(),\n headers,\n ) as HeadersInit,\n signal: abortSignal,\n },\n );\n\n if (!response.ok) {\n throw await assemblyaiFailedResponseHandler({\n response,\n url: this.config.url({\n path: `/v2/transcript/${transcriptId}`,\n modelId: this.modelId,\n }),\n requestBodyValues: {},\n });\n }\n\n const transcript = assemblyaiTranscriptionResponseSchema.parse(\n await response.json(),\n );\n\n if (transcript.status === 'completed') {\n return {\n transcript,\n responseHeaders: extractResponseHeaders(response),\n };\n }\n\n if (transcript.status === 'error') {\n throw new Error(\n `Transcription failed: ${transcript.error ?? 'Unknown error'}`,\n );\n }\n\n await new Promise(resolve => setTimeout(resolve, pollingInterval));\n }\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const { value: uploadResponse } = await postToApi({\n url: this.config.url({\n path: '/v2/upload',\n modelId: '',\n }),\n headers: {\n 'Content-Type': 'application/octet-stream',\n ...combineHeaders(this.config.headers?.(), options.headers),\n },\n body: {\n content: options.audio,\n values: options.audio,\n },\n failedResponseHandler: assemblyaiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n assemblyaiUploadResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { body, warnings } = await this.getArgs(options);\n\n const { value: submitResponse } = await postJsonToApi({\n url: this.config.url({\n path: '/v2/transcript',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: {\n ...body,\n audio_url: uploadResponse.upload_url,\n },\n failedResponseHandler: assemblyaiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n assemblyaiSubmitResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { transcript, responseHeaders } = await this.waitForCompletion(\n submitResponse.id,\n options.headers,\n options.abortSignal,\n );\n\n return {\n text: transcript.text ?? '',\n segments:\n transcript.words?.map(word => ({\n text: word.text,\n startSecond: word.start,\n endSecond: word.end,\n })) ?? [],\n language: transcript.language_code ?? undefined,\n durationInSeconds:\n transcript.audio_duration ?? transcript.words?.at(-1)?.end ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders, // Headers from final GET request\n body: transcript, // Raw response from final GET request\n },\n };\n }\n}\n\nconst assemblyaiUploadResponseSchema = z.object({\n upload_url: z.string(),\n});\n\nconst assemblyaiSubmitResponseSchema = z.object({\n id: z.string(),\n status: z.enum(['queued', 'processing', 'completed', 'error']),\n});\n\nconst assemblyaiTranscriptionResponseSchema = z.object({\n id: z.string(),\n status: z.enum(['queued', 'processing', 'completed', 'error']),\n text: z.string().nullish(),\n language_code: z.string().nullish(),\n words: z\n .array(\n z.object({\n start: z.number(),\n end: z.number(),\n text: z.string(),\n }),\n )\n .nullish(),\n audio_duration: z.number().nullish(),\n error: z.string().nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const assemblyaiErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type AssemblyAIErrorData = z.infer<typeof assemblyaiErrorDataSchema>;\n\nexport const assemblyaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: assemblyaiErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { z } from 'zod/v4';\n\n// https://www.assemblyai.com/docs/api-reference/transcripts/submit\nexport const assemblyaiTranscriptionModelOptionsSchema = z.object({\n /**\n * End time of the audio in milliseconds.\n */\n audioEndAt: z.number().int().nullish(),\n /**\n * Start time of the audio in milliseconds.\n */\n audioStartFrom: z.number().int().nullish(),\n /**\n * Whether to automatically generate chapters for the transcription.\n */\n autoChapters: z.boolean().nullish(),\n /**\n * Whether to automatically generate highlights for the transcription.\n */\n autoHighlights: z.boolean().nullish(),\n /**\n * Boost parameter for the transcription.\n * Allowed values: 'low', 'default', 'high'.\n */\n boostParam: z.string().nullish(),\n /**\n * Whether to enable content safety filtering.\n */\n contentSafety: z.boolean().nullish(),\n /**\n * Confidence threshold for content safety filtering (25-100).\n */\n contentSafetyConfidence: z.number().int().min(25).max(100).nullish(),\n /**\n * Custom spelling rules for the transcription.\n */\n customSpelling: z\n .array(\n z.object({\n from: z.array(z.string()),\n to: z.string(),\n }),\n )\n .nullish(),\n /**\n * Whether to include filler words (um, uh, etc.) in the transcription.\n */\n disfluencies: z.boolean().nullish(),\n /**\n * Whether to enable entity detection.\n */\n entityDetection: z.boolean().nullish(),\n /**\n * Whether to filter profanity from the transcription.\n */\n filterProfanity: z.boolean().nullish(),\n /**\n * Whether to format text with punctuation and capitalization.\n */\n formatText: z.boolean().nullish(),\n /**\n * Whether to enable IAB categories detection.\n */\n iabCategories: z.boolean().nullish(),\n /**\n * Language code for the transcription.\n */\n languageCode: z.union([z.literal('en'), z.string()]).nullish(),\n /**\n * Confidence threshold for language detection.\n */\n languageConfidenceThreshold: z.number().nullish(),\n /**\n * Whether to enable language detection.\n */\n languageDetection: z.boolean().nullish(),\n /**\n * Whether to process audio as multichannel.\n */\n multichannel: z.boolean().nullish(),\n /**\n * Whether to add punctuation to the transcription.\n */\n punctuate: z.boolean().nullish(),\n /**\n * Whether to redact personally identifiable information (PII).\n */\n redactPii: z.boolean().nullish(),\n /**\n * Whether to redact PII in the audio file.\n */\n redactPiiAudio: z.boolean().nullish(),\n /**\n * Audio format for PII redaction.\n */\n redactPiiAudioQuality: z.string().nullish(),\n /**\n * List of PII types to redact.\n */\n redactPiiPolicies: z.array(z.string()).nullish(),\n /**\n * Substitution method for redacted PII.\n */\n redactPiiSub: z.string().nullish(),\n /**\n * Whether to enable sentiment analysis.\n */\n sentimentAnalysis: z.boolean().nullish(),\n /**\n * Whether to identify different speakers in the audio.\n */\n speakerLabels: z.boolean().nullish(),\n /**\n * Number of speakers expected in the audio.\n */\n speakersExpected: z.number().int().nullish(),\n /**\n * Threshold for speech detection (0-1).\n */\n speechThreshold: z.number().min(0).max(1).nullish(),\n /**\n * Whether to generate a summary of the transcription.\n */\n summarization: z.boolean().nullish(),\n /**\n * Model to use for summarization.\n */\n summaryModel: z.string().nullish(),\n /**\n * Type of summary to generate.\n */\n summaryType: z.string().nullish(),\n /**\n * Name of the authentication header for webhook requests.\n */\n webhookAuthHeaderName: z.string().nullish(),\n /**\n * Value of the authentication header for webhook requests.\n */\n webhookAuthHeaderValue: z.string().nullish(),\n /**\n * URL to send webhook notifications to.\n */\n webhookUrl: z.string().nullish(),\n /**\n * List of words to boost recognition for.\n */\n wordBoost: z.array(z.string()).nullish(),\n});\n\nexport type AssemblyAITranscriptionModelOptions = z.infer<\n typeof assemblyaiTranscriptionModelOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z"]}
1
+ {"version":3,"sources":["../src/assemblyai-provider.ts","../src/assemblyai-transcription-model.ts","../src/assemblyai-error.ts","../src/assemblyai-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type TranscriptionModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AssemblyAITranscriptionModel } from './assemblyai-transcription-model';\nimport type { AssemblyAITranscriptionModelId } from './assemblyai-transcription-settings';\nimport { VERSION } from './version';\n\nexport interface AssemblyAIProvider extends ProviderV4 {\n (\n modelId: AssemblyAITranscriptionModelId,\n settings?: {},\n ): {\n transcription: AssemblyAITranscriptionModel;\n };\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: AssemblyAITranscriptionModelId): TranscriptionModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface AssemblyAIProviderSettings {\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\n * Create an AssemblyAI provider instance.\n */\nexport function createAssemblyAI(\n options: AssemblyAIProviderSettings = {},\n): AssemblyAIProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n authorization: loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ASSEMBLYAI_API_KEY',\n description: 'AssemblyAI',\n }),\n ...options.headers,\n },\n `ai-sdk/assemblyai/${VERSION}`,\n );\n\n const createTranscriptionModel = (modelId: AssemblyAITranscriptionModelId) =>\n new AssemblyAITranscriptionModel(modelId, {\n provider: `assemblyai.transcription`,\n url: ({ path }) => `https://api.assemblyai.com${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: AssemblyAITranscriptionModelId) {\n return {\n transcription: createTranscriptionModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n\n provider.languageModel = () => {\n throw new NoSuchModelError({\n modelId: 'unknown',\n modelType: 'languageModel',\n message: 'AssemblyAI does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider as AssemblyAIProvider;\n}\n\n/**\n * Default AssemblyAI provider instance.\n */\nexport const assemblyai = createAssemblyAI();\n","import type {\n TranscriptionModelV4,\n SharedV4Warning,\n SharedV4ProviderMetadata,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonResponseHandler,\n extractResponseHeaders,\n parseProviderOptions,\n postJsonToApi,\n postToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { AssemblyAIConfig } from './assemblyai-config';\nimport { assemblyaiFailedResponseHandler } from './assemblyai-error';\nimport { assemblyaiTranscriptionModelOptionsSchema } from './assemblyai-transcription-model-options';\nimport type { AssemblyAITranscriptionModelId } from './assemblyai-transcription-settings';\nimport type { AssemblyAITranscriptionAPITypes } from './assemblyai-api-types';\n\ninterface AssemblyAITranscriptionModelConfig extends AssemblyAIConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n /**\n * The polling interval for checking transcript status in milliseconds.\n */\n pollingInterval?: number;\n}\n\nexport class AssemblyAITranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n private readonly POLLING_INTERVAL_MS = 3000;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: AssemblyAITranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AssemblyAITranscriptionModelId;\n config: AssemblyAITranscriptionModelConfig;\n }) {\n return new AssemblyAITranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: AssemblyAITranscriptionModelId,\n private readonly config: AssemblyAITranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const assemblyaiOptions = await parseProviderOptions({\n provider: 'assemblyai',\n providerOptions,\n schema: assemblyaiTranscriptionModelOptionsSchema,\n });\n\n const body: Omit<AssemblyAITranscriptionAPITypes, 'audio_url'> = {};\n\n // The legacy `best` model is selected via the deprecated singular\n // `speech_model` parameter. All other models (e.g. `universal-2`,\n // `universal-3-pro`, `universal-3-5-pro`) are only accessible via the\n // `speech_models` array and are rejected by `speech_model`.\n // See https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model\n if (this.modelId === 'best') {\n body.speech_model = this.modelId as 'best';\n warnings.push({\n type: 'deprecated',\n setting: `model '${this.modelId}'`,\n message:\n \"The 'best' model is a legacy AssemblyAI model. Use 'universal-3-5-pro' instead. See documentation: https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model\",\n });\n } else {\n body.speech_models = [this.modelId];\n\n // Forward-looking nudge: universal-3-5-pro is AssemblyAI's latest\n // flagship and is set to replace universal-3-pro. Not a deprecation —\n // both models still work — so this is an informational warning only.\n if (\n this.modelId === 'universal-3-pro' ||\n this.modelId === 'universal-2'\n ) {\n const docsUrl =\n 'https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model';\n warnings.push({\n type: 'other',\n message:\n this.modelId === 'universal-3-pro'\n ? `'universal-3-5-pro' is AssemblyAI's latest flagship model and is set to replace 'universal-3-pro'. See ${docsUrl}`\n : `'universal-3-5-pro' is AssemblyAI's latest flagship model. See ${docsUrl}`,\n });\n }\n }\n\n // Add provider-specific options\n if (assemblyaiOptions) {\n body.audio_end_at = assemblyaiOptions.audioEndAt ?? undefined;\n body.audio_start_from = assemblyaiOptions.audioStartFrom ?? undefined;\n body.auto_chapters = assemblyaiOptions.autoChapters ?? undefined;\n body.auto_highlights = assemblyaiOptions.autoHighlights ?? undefined;\n body.boost_param = (assemblyaiOptions.boostParam as never) ?? undefined;\n body.content_safety = assemblyaiOptions.contentSafety ?? undefined;\n body.content_safety_confidence =\n assemblyaiOptions.contentSafetyConfidence ?? undefined;\n body.custom_spelling =\n (assemblyaiOptions.customSpelling as never) ?? undefined;\n body.disfluencies = assemblyaiOptions.disfluencies ?? undefined;\n body.entity_detection = assemblyaiOptions.entityDetection ?? undefined;\n body.filter_profanity = assemblyaiOptions.filterProfanity ?? undefined;\n body.format_text = assemblyaiOptions.formatText ?? undefined;\n body.iab_categories = assemblyaiOptions.iabCategories ?? undefined;\n body.language_code =\n (assemblyaiOptions.languageCode as never) ?? undefined;\n body.language_confidence_threshold =\n assemblyaiOptions.languageConfidenceThreshold ?? undefined;\n body.language_detection =\n assemblyaiOptions.languageDetection ?? undefined;\n body.multichannel = assemblyaiOptions.multichannel ?? undefined;\n body.punctuate = assemblyaiOptions.punctuate ?? undefined;\n body.redact_pii = assemblyaiOptions.redactPii ?? undefined;\n body.redact_pii_audio = assemblyaiOptions.redactPiiAudio ?? undefined;\n body.redact_pii_audio_quality =\n (assemblyaiOptions.redactPiiAudioQuality as never) ?? undefined;\n body.redact_pii_policies =\n (assemblyaiOptions.redactPiiPolicies as never) ?? undefined;\n body.redact_pii_sub =\n (assemblyaiOptions.redactPiiSub as never) ?? undefined;\n body.sentiment_analysis =\n assemblyaiOptions.sentimentAnalysis ?? undefined;\n body.speaker_labels = assemblyaiOptions.speakerLabels ?? undefined;\n body.speakers_expected = assemblyaiOptions.speakersExpected ?? undefined;\n body.speech_threshold = assemblyaiOptions.speechThreshold ?? undefined;\n body.summarization = assemblyaiOptions.summarization ?? undefined;\n body.summary_model =\n (assemblyaiOptions.summaryModel as never) ?? undefined;\n body.summary_type = (assemblyaiOptions.summaryType as never) ?? undefined;\n body.webhook_auth_header_name =\n assemblyaiOptions.webhookAuthHeaderName ?? undefined;\n body.webhook_auth_header_value =\n assemblyaiOptions.webhookAuthHeaderValue ?? undefined;\n body.webhook_url = assemblyaiOptions.webhookUrl ?? undefined;\n body.word_boost = assemblyaiOptions.wordBoost ?? undefined;\n body.keyterms_prompt = assemblyaiOptions.keytermsPrompt ?? undefined;\n body.prompt = assemblyaiOptions.prompt ?? undefined;\n body.temperature = assemblyaiOptions.temperature ?? undefined;\n body.remove_audio_tags = assemblyaiOptions.removeAudioTags ?? undefined;\n body.domain = assemblyaiOptions.domain ?? undefined;\n body.redact_pii_return_unredacted =\n assemblyaiOptions.redactPiiReturnUnredacted ?? undefined;\n body.redact_static_entities =\n assemblyaiOptions.redactStaticEntities ?? undefined;\n\n if (assemblyaiOptions.speakerOptions) {\n body.speaker_options = {\n min_speakers_expected:\n assemblyaiOptions.speakerOptions.minSpeakersExpected ?? undefined,\n max_speakers_expected:\n assemblyaiOptions.speakerOptions.maxSpeakersExpected ?? undefined,\n };\n }\n\n if (assemblyaiOptions.languageDetectionOptions) {\n body.language_detection_options = {\n expected_languages:\n assemblyaiOptions.languageDetectionOptions.expectedLanguages ??\n undefined,\n fallback_language:\n assemblyaiOptions.languageDetectionOptions.fallbackLanguage ??\n undefined,\n code_switching:\n assemblyaiOptions.languageDetectionOptions.codeSwitching ??\n undefined,\n code_switching_confidence_threshold:\n assemblyaiOptions.languageDetectionOptions\n .codeSwitchingConfidenceThreshold ?? undefined,\n };\n }\n\n if (assemblyaiOptions.redactPiiAudioOptions) {\n body.redact_pii_audio_options = {\n return_redacted_no_speech_audio:\n assemblyaiOptions.redactPiiAudioOptions\n .returnRedactedNoSpeechAudio ?? undefined,\n override_audio_redaction_method:\n assemblyaiOptions.redactPiiAudioOptions\n .overrideAudioRedactionMethod ?? undefined,\n };\n }\n\n const deprecatedBoostOptions: string[] = [];\n if (assemblyaiOptions.wordBoost != null) {\n deprecatedBoostOptions.push('wordBoost');\n }\n if (assemblyaiOptions.boostParam != null) {\n deprecatedBoostOptions.push('boostParam');\n }\n if (deprecatedBoostOptions.length > 0) {\n warnings.push({\n type: 'deprecated',\n setting: deprecatedBoostOptions.join(', '),\n message:\n \"'wordBoost' and 'boostParam' are deprecated and are rejected by 'universal-3-pro' / 'universal-3-5-pro' and 'slam-1'. Use 'keytermsPrompt' instead.\",\n });\n }\n\n // The following options only take effect alongside a prerequisite\n // option; without it AssemblyAI either rejects the request (400) or\n // silently ignores the option. Warn rather than mutate user input.\n if (\n (assemblyaiOptions.redactPiiReturnUnredacted != null ||\n assemblyaiOptions.redactStaticEntities != null) &&\n !assemblyaiOptions.redactPii\n ) {\n warnings.push({\n type: 'other',\n message:\n \"'redactPiiReturnUnredacted' and 'redactStaticEntities' require 'redactPii' to be enabled; AssemblyAI rejects the request otherwise.\",\n });\n }\n if (\n assemblyaiOptions.redactPiiAudioOptions != null &&\n !assemblyaiOptions.redactPiiAudio\n ) {\n warnings.push({\n type: 'other',\n message:\n \"'redactPiiAudioOptions' only applies when 'redactPiiAudio' is enabled; it is otherwise ignored.\",\n });\n }\n if (\n assemblyaiOptions.languageCode != null &&\n assemblyaiOptions.languageDetection\n ) {\n warnings.push({\n type: 'other',\n message:\n \"'languageDetection' cannot be combined with an explicit 'languageCode'; AssemblyAI rejects requests that set both.\",\n });\n }\n }\n\n return {\n body,\n warnings,\n };\n }\n\n /**\n * Polls the given transcript until we have a status other than `processing` or `queued`.\n *\n * @see https://www.assemblyai.com/docs/getting-started/transcribe-an-audio-file#step-33\n */\n private async waitForCompletion(\n transcriptId: string,\n headers: Record<string, string | undefined> | undefined,\n abortSignal?: AbortSignal,\n ): Promise<{\n transcript: z.infer<typeof assemblyaiTranscriptionResponseSchema>;\n rawTranscript: unknown;\n responseHeaders: Record<string, string>;\n }> {\n const pollingInterval =\n this.config.pollingInterval ?? this.POLLING_INTERVAL_MS;\n\n // Honor a caller-provided fetch (proxy, auth injection, tests) for the\n // polling GETs, matching the upload/submit calls that use config.fetch.\n const fetchImpl = this.config.fetch ?? globalThis.fetch;\n\n while (true) {\n if (abortSignal?.aborted) {\n throw new Error('Transcription request was aborted');\n }\n\n const response = await fetchImpl(\n this.config.url({\n path: `/v2/transcript/${transcriptId}`,\n modelId: this.modelId,\n }),\n {\n method: 'GET',\n headers: combineHeaders(\n this.config.headers?.(),\n headers,\n ) as HeadersInit,\n signal: abortSignal,\n },\n );\n\n if (!response.ok) {\n throw await assemblyaiFailedResponseHandler({\n response,\n url: this.config.url({\n path: `/v2/transcript/${transcriptId}`,\n modelId: this.modelId,\n }),\n requestBodyValues: {},\n });\n }\n\n const rawTranscript = await response.json();\n const transcript =\n assemblyaiTranscriptionResponseSchema.parse(rawTranscript);\n\n if (transcript.status === 'completed') {\n return {\n transcript,\n rawTranscript,\n responseHeaders: extractResponseHeaders(response),\n };\n }\n\n if (transcript.status === 'error') {\n throw new Error(\n `Transcription failed: ${transcript.error ?? 'Unknown error'}`,\n );\n }\n\n await new Promise(resolve => setTimeout(resolve, pollingInterval));\n }\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n\n const { value: uploadResponse } = await postToApi({\n url: this.config.url({\n path: '/v2/upload',\n modelId: '',\n }),\n headers: {\n 'Content-Type': 'application/octet-stream',\n ...combineHeaders(this.config.headers?.(), options.headers),\n },\n body: {\n content: options.audio,\n values: options.audio,\n },\n failedResponseHandler: assemblyaiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n assemblyaiUploadResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { body, warnings } = await this.getArgs(options);\n\n const { value: submitResponse } = await postJsonToApi({\n url: this.config.url({\n path: '/v2/transcript',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: {\n ...body,\n audio_url: uploadResponse.upload_url,\n },\n failedResponseHandler: assemblyaiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n assemblyaiSubmitResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const { transcript, rawTranscript, responseHeaders } =\n await this.waitForCompletion(\n submitResponse.id,\n options.headers,\n options.abortSignal,\n );\n\n // Surface diarization and audio-intelligence results that the AI SDK's\n // `segments` shape can't represent, keyed under `assemblyai`. Presence is\n // gated on the parsed transcript, but values are taken from the raw\n // response so no fields are stripped by the schema.\n //\n // NOTE: timings inside these objects (e.g. `utterances[].start`) are in\n // milliseconds, matching the AssemblyAI API — unlike the top-level\n // `segments`, whose `startSecond`/`endSecond` are in seconds.\n const raw = (rawTranscript ?? {}) as Record<string, unknown>;\n const assemblyaiMetadata: Record<string, unknown> = {};\n if (transcript.utterances != null) {\n assemblyaiMetadata.utterances = raw.utterances;\n }\n if (transcript.sentiment_analysis_results != null) {\n assemblyaiMetadata.sentimentAnalysisResults =\n raw.sentiment_analysis_results;\n }\n if (transcript.entities != null) {\n assemblyaiMetadata.entities = raw.entities;\n }\n if (transcript.content_safety_labels != null) {\n assemblyaiMetadata.contentSafetyLabels = raw.content_safety_labels;\n }\n if (transcript.iab_categories_result != null) {\n assemblyaiMetadata.iabCategoriesResult = raw.iab_categories_result;\n }\n if (transcript.auto_highlights_result != null) {\n assemblyaiMetadata.autoHighlightsResult = raw.auto_highlights_result;\n }\n\n const lastWordEndMs = transcript.words?.at(-1)?.end;\n\n return {\n text: transcript.text ?? '',\n // AssemblyAI returns word timings in milliseconds; the AI SDK reports\n // segment timings in seconds.\n segments:\n transcript.words?.map(word => ({\n text: word.text,\n startSecond: word.start / 1000,\n endSecond: word.end / 1000,\n })) ?? [],\n language: transcript.language_code ?? undefined,\n durationInSeconds:\n transcript.audio_duration ??\n (lastWordEndMs != null ? lastWordEndMs / 1000 : undefined),\n warnings,\n ...(Object.keys(assemblyaiMetadata).length > 0 && {\n providerMetadata: {\n assemblyai: assemblyaiMetadata,\n } as SharedV4ProviderMetadata,\n }),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders, // Headers from final GET request\n body: rawTranscript, // Full raw response from final GET request\n },\n };\n }\n}\n\nconst assemblyaiUploadResponseSchema = z.object({\n upload_url: z.string(),\n});\n\nconst assemblyaiSubmitResponseSchema = z.object({\n id: z.string(),\n status: z.enum(['queued', 'processing', 'completed', 'error']),\n});\n\nconst assemblyaiWordSchema = z.object({\n start: z.number(),\n end: z.number(),\n text: z.string(),\n confidence: z.number().nullish(),\n // Speaker label (e.g. 'A', 'B') when speaker diarization is enabled, else null.\n speaker: z.string().nullish(),\n channel: z.string().nullish(),\n});\n\nconst assemblyaiTranscriptionResponseSchema = z.object({\n id: z.string(),\n status: z.enum(['queued', 'processing', 'completed', 'error']),\n text: z.string().nullish(),\n language_code: z.string().nullish(),\n speech_model_used: z.string().nullish(),\n words: z.array(assemblyaiWordSchema).nullish(),\n // Speaker-diarized utterances (present when `speaker_labels` is enabled).\n utterances: z\n .array(\n z.object({\n start: z.number(),\n end: z.number(),\n text: z.string(),\n confidence: z.number().nullish(),\n speaker: z.string().nullish(),\n channel: z.string().nullish(),\n words: z.array(assemblyaiWordSchema).nullish(),\n }),\n )\n .nullish(),\n // Audio-intelligence results, present only when the matching feature is\n // enabled. Kept intentionally permissive (the full structures are also\n // available on the raw `response.body`).\n sentiment_analysis_results: z\n .array(\n z.object({\n text: z.string(),\n start: z.number().nullish(),\n end: z.number().nullish(),\n sentiment: z.string(),\n confidence: z.number().nullish(),\n speaker: z.string().nullish(),\n }),\n )\n .nullish(),\n entities: z\n .array(\n z.object({\n entity_type: z.string(),\n text: z.string(),\n start: z.number().nullish(),\n end: z.number().nullish(),\n }),\n )\n .nullish(),\n content_safety_labels: z.record(z.string(), z.any()).nullish(),\n iab_categories_result: z.record(z.string(), z.any()).nullish(),\n auto_highlights_result: z.record(z.string(), z.any()).nullish(),\n audio_duration: z.number().nullish(),\n error: z.string().nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const assemblyaiErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type AssemblyAIErrorData = z.infer<typeof assemblyaiErrorDataSchema>;\n\nexport const assemblyaiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: assemblyaiErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { z } from 'zod/v4';\n\n// https://www.assemblyai.com/docs/api-reference/transcripts/submit\nexport const assemblyaiTranscriptionModelOptionsSchema = z.object({\n /**\n * End time of the audio in milliseconds.\n */\n audioEndAt: z.number().int().nullish(),\n /**\n * Start time of the audio in milliseconds.\n */\n audioStartFrom: z.number().int().nullish(),\n /**\n * Whether to automatically generate chapters for the transcription.\n */\n autoChapters: z.boolean().nullish(),\n /**\n * Whether to automatically generate highlights for the transcription.\n */\n autoHighlights: z.boolean().nullish(),\n /**\n * Boost parameter for word boost (used with `wordBoost`).\n * Allowed values: 'low', 'default', 'high'.\n *\n * @deprecated Only applies to the deprecated `wordBoost` option. Use\n * `keytermsPrompt` instead, which works with the recommended `universal-*`\n * models.\n */\n boostParam: z.string().nullish(),\n /**\n * Whether to enable content safety filtering.\n */\n contentSafety: z.boolean().nullish(),\n /**\n * Confidence threshold for content safety filtering (25-100).\n */\n contentSafetyConfidence: z.number().int().min(25).max(100).nullish(),\n /**\n * Custom spelling rules for the transcription.\n */\n customSpelling: z\n .array(\n z.object({\n from: z.array(z.string()),\n to: z.string(),\n }),\n )\n .nullish(),\n /**\n * Whether to include filler words (um, uh, etc.) in the transcription.\n */\n disfluencies: z.boolean().nullish(),\n /**\n * Enable a domain-specific model to improve accuracy for specialized\n * terminology. Currently supports `'medical-v1'` (Medical Mode).\n */\n domain: z.string().nullish(),\n /**\n * Whether to enable entity detection.\n */\n entityDetection: z.boolean().nullish(),\n /**\n * Whether to filter profanity from the transcription.\n */\n filterProfanity: z.boolean().nullish(),\n /**\n * Whether to format text with punctuation and capitalization.\n */\n formatText: z.boolean().nullish(),\n /**\n * Whether to enable IAB categories detection.\n */\n iabCategories: z.boolean().nullish(),\n /**\n * Domain-specific keyterms to boost recognition for (max 6 words per phrase).\n * Replaces `wordBoost` for newer models: supported by `universal-3-pro` /\n * `universal-3-5-pro` and `slam-1` (and `universal-2` when metaphone is\n * enabled for the account).\n */\n keytermsPrompt: z.array(z.string()).nullish(),\n /**\n * Language code for the transcription.\n */\n languageCode: z.union([z.literal('en'), z.string()]).nullish(),\n /**\n * Confidence threshold for language detection.\n */\n languageConfidenceThreshold: z.number().nullish(),\n /**\n * Whether to enable language detection.\n */\n languageDetection: z.boolean().nullish(),\n /**\n * Options for automatic language detection.\n */\n languageDetectionOptions: z\n .object({\n /** List of languages expected in the audio file. */\n expectedLanguages: z.array(z.string()).nullish(),\n /** Fallback language if the detected language is not expected. */\n fallbackLanguage: z.string().nullish(),\n /** Whether code switching should be detected. */\n codeSwitching: z.boolean().nullish(),\n /** Confidence threshold for code switching detection (0-1). */\n codeSwitchingConfidenceThreshold: z.number().min(0).max(1).nullish(),\n })\n .nullish(),\n /**\n * Whether to process audio as multichannel.\n */\n multichannel: z.boolean().nullish(),\n /**\n * Provide natural-language context (up to 1,500 words) to steer the model.\n * Only supported by `universal-3-pro` / `universal-3-5-pro` and `slam-1`.\n */\n prompt: z.string().nullish(),\n /**\n * Whether to add punctuation to the transcription.\n */\n punctuate: z.boolean().nullish(),\n /**\n * Whether to redact personally identifiable information (PII).\n */\n redactPii: z.boolean().nullish(),\n /**\n * Whether to redact PII in the audio file.\n */\n redactPiiAudio: z.boolean().nullish(),\n /**\n * Options for PII-redacted audio files. Requires `redactPiiAudio`.\n */\n redactPiiAudioOptions: z\n .object({\n /** Return redacted audio even for files without detected speech. */\n returnRedactedNoSpeechAudio: z.boolean().nullish(),\n /** Redaction method; set to `'silence'` to replace PII with silence. */\n overrideAudioRedactionMethod: z.enum(['silence']).nullish(),\n })\n .nullish(),\n /**\n * Audio format for PII redaction.\n */\n redactPiiAudioQuality: z.string().nullish(),\n /**\n * List of PII types to redact.\n */\n redactPiiPolicies: z.array(z.string()).nullish(),\n /**\n * Return the original unredacted transcript alongside the redacted one.\n * Requires `redactPii`.\n */\n redactPiiReturnUnredacted: z.boolean().nullish(),\n /**\n * Substitution method for redacted PII.\n */\n redactPiiSub: z.string().nullish(),\n /**\n * Map of user-defined labels to exact terms to redact, e.g.\n * `{ INTERNAL_TOOL: ['Bearclaw'] }`. Applied on top of standard PII redaction\n * using `redactPiiSub`. Requires `redactPii`.\n */\n redactStaticEntities: z.record(z.string(), z.array(z.string())).nullish(),\n /**\n * Remove inline annotations from rich transcripts. `'all'` removes all inline\n * annotations; `'speaker'` removes only speaker cues. Universal-3 Pro models.\n */\n removeAudioTags: z.enum(['all', 'speaker']).nullish(),\n /**\n * Whether to enable sentiment analysis.\n */\n sentimentAnalysis: z.boolean().nullish(),\n /**\n * Whether to identify different speakers in the audio.\n */\n speakerLabels: z.boolean().nullish(),\n /**\n * Options for speaker diarization, e.g. a range of possible speakers.\n */\n speakerOptions: z\n .object({\n /** Minimum number of speakers expected in the audio file. */\n minSpeakersExpected: z.number().int().nullish(),\n /** Maximum number of speakers expected in the audio file. */\n maxSpeakersExpected: z.number().int().nullish(),\n })\n .nullish(),\n /**\n * Number of speakers expected in the audio.\n */\n speakersExpected: z.number().int().nullish(),\n /**\n * Threshold for speech detection (0-1).\n */\n speechThreshold: z.number().min(0).max(1).nullish(),\n /**\n * Whether to generate a summary of the transcription.\n */\n summarization: z.boolean().nullish(),\n /**\n * Model to use for summarization.\n */\n summaryModel: z.string().nullish(),\n /**\n * Type of summary to generate.\n */\n summaryType: z.string().nullish(),\n /**\n * Sampling temperature (0-1) controlling randomness. Universal-3 Pro models.\n */\n temperature: z.number().min(0).max(1).nullish(),\n /**\n * Name of the authentication header for webhook requests.\n */\n webhookAuthHeaderName: z.string().nullish(),\n /**\n * Value of the authentication header for webhook requests.\n */\n webhookAuthHeaderValue: z.string().nullish(),\n /**\n * URL to send webhook notifications to.\n */\n webhookUrl: z.string().nullish(),\n /**\n * List of words to boost recognition for.\n *\n * @deprecated `wordBoost` is rejected by `universal-3-pro` /\n * `universal-3-5-pro` and `slam-1` (it only works on `universal-2`/`best`).\n * Use `keytermsPrompt` instead.\n */\n wordBoost: z.array(z.string()).nullish(),\n});\n\nexport type AssemblyAITranscriptionModelOptions = z.infer<\n typeof assemblyaiTranscriptionModelOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","z"]}
@@ -5,7 +5,7 @@ description: Learn how to use the AssemblyAI provider for the AI SDK.
5
5
 
6
6
  # AssemblyAI Provider
7
7
 
8
- The [AssemblyAI](https://assemblyai.com/) provider contains language model support for the AssemblyAI transcription API.
8
+ The [AssemblyAI](https://assemblyai.com/) provider contains transcription model support for the AssemblyAI transcription API.
9
9
 
10
10
  ## Setup
11
11
 
@@ -69,12 +69,23 @@ You can use the following optional settings to customize the AssemblyAI provider
69
69
  You can create models that call the [AssemblyAI transcription API](https://www.assemblyai.com/docs/getting-started/transcribe-an-audio-file/typescript)
70
70
  using the `.transcription()` factory method.
71
71
 
72
- The first argument is the model id e.g. `best`.
72
+ The first argument is the model id, e.g. `universal-3-5-pro`.
73
73
 
74
74
  ```ts
75
- const model = assemblyai.transcription('best');
75
+ const model = assemblyai.transcription('universal-3-5-pro');
76
76
  ```
77
77
 
78
+ The `best` model is a **deprecated** legacy model, sent using AssemblyAI's
79
+ deprecated `speech_model` request parameter. It still works, but using it emits a
80
+ deprecation warning — prefer `universal-3-5-pro`. The older `nano` model has been
81
+ removed by AssemblyAI and is no longer available. All newer models are sent using
82
+ the [`speech_models`](https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model)
83
+ request parameter, which the provider selects automatically based on the model id.
84
+
85
+ `universal-3-pro` and `universal-2` are fully supported and continue to work, but
86
+ using them emits an informational warning (not a deprecation) suggesting
87
+ `universal-3-5-pro`, AssemblyAI's latest flagship model.
88
+
78
89
  You can also pass additional provider-specific options using the `providerOptions` argument. For example, supplying the `contentSafety` option will enable content safety filtering.
79
90
 
80
91
  ```ts highlight="7"
@@ -84,7 +95,7 @@ import { type AssemblyAITranscriptionModelOptions } from '@ai-sdk/assemblyai';
84
95
  import { readFile } from 'fs/promises';
85
96
 
86
97
  const result = await transcribe({
87
- model: assemblyai.transcription('best'),
98
+ model: assemblyai.transcription('universal-3-5-pro'),
88
99
  audio: await readFile('audio.mp3'),
89
100
  providerOptions: {
90
101
  assemblyai: {
@@ -118,8 +129,9 @@ The following provider options are available:
118
129
 
119
130
  - **boostParam** _enum_
120
131
 
121
- Boost parameter for the transcription.
132
+ Boost parameter for `wordBoost`.
122
133
  Allowed values: `'low'`, `'default'`, `'high'`.
134
+ **Deprecated** — only applies to the deprecated `wordBoost`; use `keytermsPrompt` instead.
123
135
  Optional.
124
136
 
125
137
  - **contentSafety** _boolean_
@@ -143,6 +155,12 @@ The following provider options are available:
143
155
  Whether to include disfluencies (um, uh, etc.) in the transcription.
144
156
  Optional.
145
157
 
158
+ - **domain** _string_
159
+
160
+ Enable a domain-specific model for specialized terminology.
161
+ Currently supports `'medical-v1'` (Medical Mode).
162
+ Optional.
163
+
146
164
  - **entityDetection** _boolean_
147
165
 
148
166
  Whether to detect entities in the transcription.
@@ -163,6 +181,13 @@ The following provider options are available:
163
181
  Whether to include IAB categories in the transcription.
164
182
  Optional.
165
183
 
184
+ - **keytermsPrompt** _array of strings_
185
+
186
+ Domain-specific keyterms to boost recognition for (max 6 words per phrase).
187
+ Replaces `wordBoost` for newer models — supported by `universal-3-pro`,
188
+ `universal-3-5-pro`, and `slam-1` (and `universal-2` when enabled).
189
+ Optional.
190
+
166
191
  - **languageCode** _string_
167
192
 
168
193
  Language code for the audio.
@@ -179,11 +204,24 @@ The following provider options are available:
179
204
  Whether to enable language detection.
180
205
  Optional.
181
206
 
207
+ - **languageDetectionOptions** _object_
208
+
209
+ Options for automatic language detection: `expectedLanguages` (array of
210
+ strings), `fallbackLanguage` (string), `codeSwitching` (boolean),
211
+ `codeSwitchingConfidenceThreshold` (number, 0-1).
212
+ Optional.
213
+
182
214
  - **multichannel** _boolean_
183
215
 
184
216
  Whether to process multiple audio channels separately.
185
217
  Optional.
186
218
 
219
+ - **prompt** _string_
220
+
221
+ Natural-language context (up to 1,500 words) to steer the model.
222
+ Only supported by `universal-3-pro`, `universal-3-5-pro`, and `slam-1`.
223
+ Optional.
224
+
187
225
  - **punctuate** _boolean_
188
226
 
189
227
  Whether to add punctuation to the transcription.
@@ -199,6 +237,12 @@ The following provider options are available:
199
237
  Whether to redact PII in the audio file.
200
238
  Optional.
201
239
 
240
+ - **redactPiiAudioOptions** _object_
241
+
242
+ Options for PII-redacted audio: `returnRedactedNoSpeechAudio` (boolean),
243
+ `overrideAudioRedactionMethod` (`'silence'`). Requires `redactPiiAudio`.
244
+ Optional.
245
+
202
246
  - **redactPiiAudioQuality** _enum_
203
247
 
204
248
  Quality of the redacted audio file.
@@ -211,12 +255,32 @@ The following provider options are available:
211
255
  Supports numerous types like `'person_name'`, `'phone_number'`, etc.
212
256
  Optional.
213
257
 
258
+ - **redactPiiReturnUnredacted** _boolean_
259
+
260
+ Return the original unredacted transcript alongside the redacted one.
261
+ Requires `redactPii`.
262
+ Optional.
263
+
214
264
  - **redactPiiSub** _enum_
215
265
 
216
266
  Substitution method for redacted PII.
217
267
  Allowed values: `'entity_name'`, `'hash'`.
218
268
  Optional.
219
269
 
270
+ - **redactStaticEntities** _object_
271
+
272
+ Map of user-defined labels to exact terms to redact, e.g.
273
+ `{ INTERNAL_TOOL: ['Bearclaw'] }`. Applied on top of standard PII redaction.
274
+ Requires `redactPii`.
275
+ Optional.
276
+
277
+ - **removeAudioTags** _enum_
278
+
279
+ Remove inline annotations from rich transcripts.
280
+ Allowed values: `'all'` (all annotations), `'speaker'` (speaker cues only).
281
+ Universal-3 Pro models.
282
+ Optional.
283
+
220
284
  - **sentimentAnalysis** _boolean_
221
285
 
222
286
  Whether to perform sentiment analysis on the transcription.
@@ -227,6 +291,12 @@ The following provider options are available:
227
291
  Whether to label different speakers in the transcription.
228
292
  Optional.
229
293
 
294
+ - **speakerOptions** _object_
295
+
296
+ Options for speaker diarization: `minSpeakersExpected` (number),
297
+ `maxSpeakersExpected` (number).
298
+ Optional.
299
+
230
300
  - **speakersExpected** _number_
231
301
 
232
302
  Expected number of speakers in the audio.
@@ -254,6 +324,12 @@ The following provider options are available:
254
324
  Allowed values: `'bullets'`, `'bullets_verbose'`, `'gist'`, `'headline'`, `'paragraph'`.
255
325
  Optional.
256
326
 
327
+ - **temperature** _number_
328
+
329
+ Sampling temperature (0-1) controlling randomness.
330
+ Universal-3 Pro models.
331
+ Optional.
332
+
257
333
  - **webhookAuthHeaderName** _string_
258
334
 
259
335
  Name of the authentication header for webhook requests.
@@ -272,11 +348,60 @@ The following provider options are available:
272
348
  - **wordBoost** _array of strings_
273
349
 
274
350
  List of words to boost in the transcription.
351
+ **Deprecated** — rejected by `universal-3-pro`, `universal-3-5-pro`, and `slam-1`
352
+ (works only on `universal-2`/`best`); use `keytermsPrompt` instead.
275
353
  Optional.
276
354
 
355
+ ### Speaker diarization and audio-intelligence results
356
+
357
+ The AI SDK's `transcribe` result exposes `text`, `segments`, `language`, and
358
+ `durationInSeconds`. AssemblyAI's richer results — speaker diarization and
359
+ audio-intelligence features — don't fit that shape, so they are surfaced in two
360
+ places:
361
+
362
+ - **`providerMetadata.assemblyai`** — structured results for the features you
363
+ enabled: `utterances` (speaker-diarized segments, when `speakerLabels` is set),
364
+ `entities`, `sentimentAnalysisResults`, `contentSafetyLabels`,
365
+ `iabCategoriesResult`, and `autoHighlightsResult`.
366
+ - **`response.body`** — the complete, raw AssemblyAI transcript response, so any
367
+ field not surfaced above (e.g. `chapters`, word-level `speaker` labels) is
368
+ still available.
369
+
370
+ Note: timings inside `providerMetadata` and `response.body` (e.g.
371
+ `utterances[].start`) are in **milliseconds**, matching the AssemblyAI API —
372
+ whereas the top-level `segments` use **seconds**.
373
+
374
+ ```ts
375
+ import { transcribe } from 'ai';
376
+ import { assemblyai } from '@ai-sdk/assemblyai';
377
+ import { readFile } from 'fs/promises';
378
+
379
+ const result = await transcribe({
380
+ model: assemblyai.transcription('universal-3-5-pro'),
381
+ audio: await readFile('audio.mp3'),
382
+ providerOptions: {
383
+ assemblyai: {
384
+ speakerLabels: true,
385
+ entityDetection: true,
386
+ },
387
+ },
388
+ });
389
+
390
+ const { utterances, entities } = result.providerMetadata?.assemblyai ?? {};
391
+ // utterances: [{ speaker: 'A', text: '…', start, end, … }, …] (start/end in ms)
392
+ ```
393
+
394
+ The following AssemblyAI features are **deprecated** by the API and not surfaced
395
+ in `providerMetadata` (their output remains on the raw `response.body` if
396
+ enabled): Summarization, Auto Chapters, and Custom Topics. Note also that some
397
+ features are language-gated (e.g. sentiment analysis is English-centric); see
398
+ AssemblyAI's documentation for per-language availability.
399
+
277
400
  ### Model Capabilities
278
401
 
279
- | Model | Transcription | Duration | Segments | Language |
280
- | ------ | ------------------- | ------------------- | ------------------- | ------------------- |
281
- | `best` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
282
- | `nano` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
402
+ | Model | Transcription | Duration | Segments | Language |
403
+ | ------------------- | ------------------- | ------------------- | ------------------- | ------------------- |
404
+ | `universal-3-5-pro` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
405
+ | `universal-3-pro` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
406
+ | `universal-2` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
407
+ | `best` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/assemblyai",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -29,8 +29,8 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/provider": "4.0.1",
33
- "@ai-sdk/provider-utils": "5.0.3"
32
+ "@ai-sdk/provider": "4.0.2",
33
+ "@ai-sdk/provider-utils": "5.0.5"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "22.19.19",
@@ -28,6 +28,7 @@ export type AssemblyAITranscriptionAPITypes = {
28
28
 
29
29
  /**
30
30
  * How much to boost specified words
31
+ * @deprecated Only used with the deprecated `word_boost`. Use `keyterms_prompt`.
31
32
  */
32
33
  boost_param?: 'low' | 'default' | 'high';
33
34
 
@@ -207,6 +208,16 @@ export type AssemblyAITranscriptionAPITypes = {
207
208
  */
208
209
  language_detection?: boolean;
209
210
 
211
+ /**
212
+ * Options for automatic language detection.
213
+ */
214
+ language_detection_options?: {
215
+ expected_languages?: string[];
216
+ fallback_language?: string;
217
+ code_switching?: boolean;
218
+ code_switching_confidence_threshold?: number;
219
+ };
220
+
210
221
  /**
211
222
  * Enable Multichannel transcription, can be true or false.
212
223
  * @default false
@@ -231,6 +242,14 @@ export type AssemblyAITranscriptionAPITypes = {
231
242
  */
232
243
  redact_pii_audio?: boolean;
233
244
 
245
+ /**
246
+ * Options for PII-redacted audio files. Requires redact_pii.
247
+ */
248
+ redact_pii_audio_options?: {
249
+ return_redacted_no_speech_audio?: boolean;
250
+ override_audio_redaction_method?: 'silence';
251
+ };
252
+
234
253
  /**
235
254
  * Controls the filetype of the audio created by redact_pii_audio. Currently supports mp3 (default) and wav.
236
255
  */
@@ -286,11 +305,23 @@ export type AssemblyAITranscriptionAPITypes = {
286
305
  | 'zodiac_sign'
287
306
  >;
288
307
 
308
+ /**
309
+ * Return the original unredacted transcript alongside the redacted one.
310
+ * Requires redact_pii.
311
+ */
312
+ redact_pii_return_unredacted?: boolean;
313
+
289
314
  /**
290
315
  * The replacement logic for detected PII, can be "entity_name" or "hash".
291
316
  */
292
317
  redact_pii_sub?: 'entity_name' | 'hash';
293
318
 
319
+ /**
320
+ * Map of user-defined labels to exact terms to redact, applied on top of
321
+ * standard PII redaction. Requires redact_pii.
322
+ */
323
+ redact_static_entities?: Record<string, string[]>;
324
+
294
325
  /**
295
326
  * Enable Sentiment Analysis, can be true or false
296
327
  * @default false
@@ -303,6 +334,14 @@ export type AssemblyAITranscriptionAPITypes = {
303
334
  */
304
335
  speaker_labels?: boolean;
305
336
 
337
+ /**
338
+ * Options for speaker diarization, e.g. a range of possible speakers.
339
+ */
340
+ speaker_options?: {
341
+ min_speakers_expected?: number;
342
+ max_speakers_expected?: number;
343
+ };
344
+
306
345
  /**
307
346
  * Tells the speaker label model how many speakers it should attempt to identify, up to 10.
308
347
  */
@@ -310,8 +349,21 @@ export type AssemblyAITranscriptionAPITypes = {
310
349
 
311
350
  /**
312
351
  * The speech model to use for the transcription.
352
+ *
353
+ * @deprecated This parameter has been replaced with `speech_models`. It only
354
+ * supports the legacy `best` model. Use `speech_models` for `universal-2`,
355
+ * `universal-3-pro`, `universal-3-5-pro`, etc.
356
+ * @see https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model
313
357
  */
314
- speech_model?: 'best' | 'nano';
358
+ speech_model?: 'best';
359
+
360
+ /**
361
+ * List of speech models in priority order, allowing the system to
362
+ * automatically route the audio to the best available option. When omitted,
363
+ * the API defaults to `['universal-3-pro', 'universal-2']`.
364
+ * @see https://www.assemblyai.com/docs/pre-recorded-audio/select-the-speech-model
365
+ */
366
+ speech_models?: string[];
315
367
 
316
368
  /**
317
369
  * Reject audio files that contain less than this fraction of speech. Valid values are in the range [0, 1] inclusive.
@@ -357,6 +409,37 @@ export type AssemblyAITranscriptionAPITypes = {
357
409
 
358
410
  /**
359
411
  * The list of custom vocabulary to boost transcription probability for
412
+ * @deprecated Rejected by `universal-3-pro` / `universal-3-5-pro` and
413
+ * `slam-1` (works only on `universal-2`/`best`). Use `keyterms_prompt`.
360
414
  */
361
415
  word_boost?: string[];
416
+
417
+ /**
418
+ * Domain-specific keyterms to boost (max 6 words per phrase). Replaces
419
+ * `word_boost` for `universal-3-pro` / `universal-3-5-pro` and `slam-1`.
420
+ */
421
+ keyterms_prompt?: string[];
422
+
423
+ /**
424
+ * Natural-language context (up to 1,500 words) to steer the model.
425
+ * Only supported by `universal-3-pro` / `universal-3-5-pro` and `slam-1`.
426
+ */
427
+ prompt?: string;
428
+
429
+ /**
430
+ * Sampling temperature (0-1) controlling randomness. Universal-3 Pro models.
431
+ */
432
+ temperature?: number;
433
+
434
+ /**
435
+ * Remove inline annotations from rich transcripts: `'all'` removes all
436
+ * annotations, `'speaker'` removes only speaker cues. Universal-3 Pro models.
437
+ */
438
+ remove_audio_tags?: 'all' | 'speaker';
439
+
440
+ /**
441
+ * Enable a domain-specific model to improve accuracy for specialized
442
+ * terminology, e.g. `'medical-v1'` for Medical Mode.
443
+ */
444
+ domain?: string;
362
445
  };
@@ -14,7 +14,7 @@ import { VERSION } from './version';
14
14
 
15
15
  export interface AssemblyAIProvider extends ProviderV4 {
16
16
  (
17
- modelId: 'best',
17
+ modelId: AssemblyAITranscriptionModelId,
18
18
  settings?: {},
19
19
  ): {
20
20
  transcription: AssemblyAITranscriptionModel;