@ai-sdk/elevenlabs 3.0.13 → 3.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +1 -1
- package/dist/index.d.ts +28 -3
- package/dist/index.js +442 -3
- package/dist/index.js.map +1 -1
- package/docs/90-elevenlabs.mdx +81 -4
- package/package.json +3 -3
- package/src/elevenlabs-config.ts +5 -1
- package/src/elevenlabs-provider.ts +8 -0
- package/src/elevenlabs-transcription-model-options.ts +17 -0
- package/src/elevenlabs-transcription-model.ts +562 -2
- package/src/elevenlabs-transcription-options.ts +1 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/elevenlabs-provider.ts","../src/elevenlabs-transcription-model.ts","../src/elevenlabs-error.ts","../src/elevenlabs-transcription-model-options.ts","../src/elevenlabs-speech-model.ts","../src/elevenlabs-speech-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type TranscriptionModelV4,\n type SpeechModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { ElevenLabsTranscriptionModel } from './elevenlabs-transcription-model';\nimport type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';\nimport { ElevenLabsSpeechModel } from './elevenlabs-speech-model';\nimport type { ElevenLabsSpeechModelId } from './elevenlabs-speech-options';\nimport { VERSION } from './version';\n\nexport interface ElevenLabsProvider extends ProviderV4 {\n (\n modelId: ElevenLabsTranscriptionModelId,\n settings?: {},\n ): {\n transcription: ElevenLabsTranscriptionModel;\n };\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: ElevenLabsTranscriptionModelId): TranscriptionModelV4;\n\n /**\n * Creates a model for speech generation.\n */\n speech(modelId: ElevenLabsSpeechModelId): SpeechModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface ElevenLabsProviderSettings {\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 ElevenLabs provider instance.\n */\nexport function createElevenLabs(\n options: ElevenLabsProviderSettings = {},\n): ElevenLabsProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'xi-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ELEVENLABS_API_KEY',\n description: 'ElevenLabs',\n }),\n ...options.headers,\n },\n `ai-sdk/elevenlabs/${VERSION}`,\n );\n\n const createTranscriptionModel = (modelId: ElevenLabsTranscriptionModelId) =>\n new ElevenLabsTranscriptionModel(modelId, {\n provider: `elevenlabs.transcription`,\n url: ({ path }) => `https://api.elevenlabs.io${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createSpeechModel = (modelId: ElevenLabsSpeechModelId) =>\n new ElevenLabsSpeechModel(modelId, {\n provider: `elevenlabs.speech`,\n url: ({ path }) => `https://api.elevenlabs.io${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: ElevenLabsTranscriptionModelId) {\n return {\n transcription: createTranscriptionModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n provider.languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n message: 'ElevenLabs does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n message: 'ElevenLabs does not provide embedding models',\n });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n message: 'ElevenLabs does not provide image models',\n });\n };\n\n return provider as ElevenLabsProvider;\n}\n\n/**\n * Default ElevenLabs provider instance.\n */\nexport const elevenLabs = createElevenLabs();\n","import type { TranscriptionModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonResponseHandler,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ElevenLabsConfig } from './elevenlabs-config';\nimport { elevenlabsFailedResponseHandler } from './elevenlabs-error';\nimport { elevenLabsTranscriptionModelOptionsSchema } from './elevenlabs-transcription-model-options';\nimport type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';\nimport type { ElevenLabsTranscriptionAPITypes } from './elevenlabs-api-types';\n\ninterface ElevenLabsTranscriptionModelConfig extends ElevenLabsConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class ElevenLabsTranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ElevenLabsTranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ElevenLabsTranscriptionModelId;\n config: ElevenLabsTranscriptionModelConfig;\n }) {\n return new ElevenLabsTranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ElevenLabsTranscriptionModelId,\n private readonly config: ElevenLabsTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n audio,\n mediaType,\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const elevenlabsOptions = await parseProviderOptions({\n provider: 'elevenlabs',\n providerOptions,\n schema: elevenLabsTranscriptionModelOptionsSchema,\n });\n\n // Create form data with base fields\n const formData = new FormData();\n const blob =\n audio instanceof Uint8Array\n ? new Blob([audio])\n : new Blob([convertBase64ToUint8Array(audio)]);\n\n formData.append('model_id', this.modelId);\n const fileExtension = mediaTypeToExtension(mediaType);\n formData.append(\n 'file',\n new File([blob], 'audio', { type: mediaType }),\n `audio.${fileExtension}`,\n );\n formData.append('diarize', 'true');\n\n // Add provider-specific options\n if (elevenlabsOptions) {\n const transcriptionModelOptions: ElevenLabsTranscriptionAPITypes = {\n language_code: elevenlabsOptions.languageCode ?? undefined,\n tag_audio_events: elevenlabsOptions.tagAudioEvents ?? undefined,\n num_speakers: elevenlabsOptions.numSpeakers ?? undefined,\n timestamps_granularity:\n elevenlabsOptions.timestampsGranularity ?? undefined,\n file_format: elevenlabsOptions.fileFormat ?? undefined,\n };\n\n if (typeof elevenlabsOptions.diarize === 'boolean') {\n formData.append('diarize', String(elevenlabsOptions.diarize));\n }\n\n for (const key in transcriptionModelOptions) {\n const value =\n transcriptionModelOptions[\n key as keyof ElevenLabsTranscriptionAPITypes\n ];\n if (value !== undefined) {\n formData.append(key, String(value));\n }\n }\n }\n\n return {\n formData,\n warnings,\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 const { formData, warnings } = await this.getArgs(options);\n\n const {\n value: response,\n responseHeaders,\n rawValue: rawResponse,\n } = await postFormDataToApi({\n url: this.config.url({\n path: '/v1/speech-to-text',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n formData,\n failedResponseHandler: elevenlabsFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n elevenlabsTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n text: response.text,\n segments:\n response.words?.map(word => ({\n text: word.text,\n startSecond: word.start ?? 0,\n endSecond: word.end ?? 0,\n })) ?? [],\n language: response.language_code,\n durationInSeconds: response.words?.at(-1)?.end ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n\nconst elevenlabsTranscriptionResponseSchema = z.object({\n language_code: z.string(),\n language_probability: z.number(),\n text: z.string(),\n words: z\n .array(\n z.object({\n text: z.string(),\n type: z.enum(['word', 'spacing', 'audio_event']),\n start: z.number().nullish(),\n end: z.number().nullish(),\n speaker_id: z.string().nullish(),\n characters: z\n .array(\n z.object({\n text: z.string(),\n start: z.number().nullish(),\n end: z.number().nullish(),\n }),\n )\n .nullish(),\n }),\n )\n .nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const elevenlabsErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type ElevenLabsErrorData = z.infer<typeof elevenlabsErrorDataSchema>;\n\nexport const elevenlabsFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: elevenlabsErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { z } from 'zod/v4';\n\n// https://elevenlabs.io/docs/api-reference/speech-to-text/convert\nexport const elevenLabsTranscriptionModelOptionsSchema = z.object({\n languageCode: z.string().nullish(),\n tagAudioEvents: z.boolean().nullish().default(true),\n numSpeakers: z.number().int().min(1).max(32).nullish(),\n timestampsGranularity: z\n .enum(['none', 'word', 'character'])\n .nullish()\n .default('word'),\n diarize: z.boolean().nullish().default(false),\n fileFormat: z.enum(['pcm_s16le_16', 'other']).nullish().default('other'),\n});\n\nexport type ElevenLabsTranscriptionModelOptions = z.infer<\n typeof elevenLabsTranscriptionModelOptionsSchema\n>;\n","import type { SpeechModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { ElevenLabsConfig } from './elevenlabs-config';\nimport { elevenlabsFailedResponseHandler } from './elevenlabs-error';\nimport { elevenLabsSpeechModelOptionsSchema } from './elevenlabs-speech-model-options';\nimport type { ElevenLabsSpeechAPITypes } from './elevenlabs-speech-api-types';\nimport type {\n ElevenLabsSpeechModelId,\n ElevenLabsSpeechVoiceId,\n} from './elevenlabs-speech-options';\n\ninterface ElevenLabsSpeechModelConfig extends ElevenLabsConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class ElevenLabsSpeechModel implements SpeechModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ElevenLabsSpeechModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ElevenLabsSpeechModelId;\n config: ElevenLabsSpeechModelConfig;\n }) {\n return new ElevenLabsSpeechModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ElevenLabsSpeechModelId,\n private readonly config: ElevenLabsSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice = '21m00Tcm4TlvDq8ikWAM',\n outputFormat = 'mp3_44100_128',\n instructions,\n language,\n speed,\n providerOptions,\n }: Parameters<SpeechModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const elevenLabsOptions = await parseProviderOptions({\n provider: 'elevenlabs',\n providerOptions,\n schema: elevenLabsSpeechModelOptionsSchema,\n });\n\n // Create request body\n const requestBody: ElevenLabsSpeechAPITypes = {\n text,\n model_id: this.modelId,\n };\n\n // Prepare query parameters\n const queryParams: Record<string, string> = {};\n\n // Map outputFormat to ElevenLabs format (as query param)\n if (outputFormat) {\n const formatMap: Record<string, string> = {\n mp3: 'mp3_44100_128',\n mp3_32: 'mp3_44100_32',\n mp3_64: 'mp3_44100_64',\n mp3_96: 'mp3_44100_96',\n mp3_128: 'mp3_44100_128',\n mp3_192: 'mp3_44100_192',\n pcm: 'pcm_44100',\n pcm_16000: 'pcm_16000',\n pcm_22050: 'pcm_22050',\n pcm_24000: 'pcm_24000',\n pcm_44100: 'pcm_44100',\n ulaw: 'ulaw_8000',\n };\n\n const mappedFormat = formatMap[outputFormat] || outputFormat;\n queryParams.output_format = mappedFormat;\n }\n\n // Add language code if provided\n if (language) {\n requestBody.language_code = language;\n }\n\n const voiceSettings: typeof requestBody.voice_settings = {};\n\n if (speed != null) {\n voiceSettings.speed = speed;\n }\n\n // Add provider-specific options - map from camelCase to snake_case\n if (elevenLabsOptions) {\n if (elevenLabsOptions.voiceSettings) {\n // Map camelCase voice settings to snake_case for API\n if (elevenLabsOptions.voiceSettings.stability != null) {\n voiceSettings.stability = elevenLabsOptions.voiceSettings.stability;\n }\n if (elevenLabsOptions.voiceSettings.similarityBoost != null) {\n voiceSettings.similarity_boost =\n elevenLabsOptions.voiceSettings.similarityBoost;\n }\n if (elevenLabsOptions.voiceSettings.style != null) {\n voiceSettings.style = elevenLabsOptions.voiceSettings.style;\n }\n if (elevenLabsOptions.voiceSettings.useSpeakerBoost != null) {\n voiceSettings.use_speaker_boost =\n elevenLabsOptions.voiceSettings.useSpeakerBoost;\n }\n }\n // Add language code from provider options if not already set\n if (elevenLabsOptions.languageCode && !requestBody.language_code) {\n requestBody.language_code = elevenLabsOptions.languageCode;\n }\n\n // Map pronunciation dictionary locators\n if (elevenLabsOptions.pronunciationDictionaryLocators) {\n requestBody.pronunciation_dictionary_locators =\n elevenLabsOptions.pronunciationDictionaryLocators.map(locator => ({\n pronunciation_dictionary_id: locator.pronunciationDictionaryId,\n ...(locator.versionId && { version_id: locator.versionId }),\n }));\n }\n\n if (elevenLabsOptions.seed != null) {\n requestBody.seed = elevenLabsOptions.seed;\n }\n if (elevenLabsOptions.previousText) {\n requestBody.previous_text = elevenLabsOptions.previousText;\n }\n if (elevenLabsOptions.nextText) {\n requestBody.next_text = elevenLabsOptions.nextText;\n }\n\n // Add previous and next request IDs\n if (elevenLabsOptions.previousRequestIds) {\n requestBody.previous_request_ids = elevenLabsOptions.previousRequestIds;\n }\n if (elevenLabsOptions.nextRequestIds) {\n requestBody.next_request_ids = elevenLabsOptions.nextRequestIds;\n }\n\n // Add text normalization options\n if (elevenLabsOptions.applyTextNormalization) {\n requestBody.apply_text_normalization =\n elevenLabsOptions.applyTextNormalization;\n }\n if (elevenLabsOptions.applyLanguageTextNormalization != null) {\n requestBody.apply_language_text_normalization =\n elevenLabsOptions.applyLanguageTextNormalization;\n }\n\n // enable_logging is a query parameter\n if (elevenLabsOptions.enableLogging != null) {\n queryParams.enable_logging = String(elevenLabsOptions.enableLogging);\n }\n }\n\n // Only add voice_settings if there are settings to add\n if (Object.keys(voiceSettings).length > 0) {\n requestBody.voice_settings = voiceSettings;\n }\n\n if (instructions) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details: `ElevenLabs speech models do not support instructions. Instructions parameter was ignored.`,\n });\n }\n\n return {\n requestBody,\n queryParams,\n warnings,\n voiceId: voice as ElevenLabsSpeechVoiceId,\n };\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, queryParams, warnings, voiceId } =\n await this.getArgs(options);\n\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: (() => {\n const baseUrl = this.config.url({\n path: `/v1/text-to-speech/${voiceId}`,\n modelId: this.modelId,\n });\n const queryString = new URLSearchParams(queryParams).toString();\n return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n })(),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: requestBody,\n failedResponseHandler: elevenlabsFailedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n","import { z } from 'zod/v4';\n\n// Schema for camelCase input from users\nexport const elevenLabsSpeechModelOptionsSchema = z.object({\n languageCode: z.string().optional(),\n voiceSettings: z\n .object({\n stability: z.number().min(0).max(1).optional(),\n similarityBoost: z.number().min(0).max(1).optional(),\n style: z.number().min(0).max(1).optional(),\n useSpeakerBoost: z.boolean().optional(),\n })\n .optional(),\n pronunciationDictionaryLocators: z\n .array(\n z.object({\n pronunciationDictionaryId: z.string(),\n versionId: z.string().optional(),\n }),\n )\n .max(3)\n .optional(),\n seed: z.number().min(0).max(4294967295).optional(),\n previousText: z.string().optional(),\n nextText: z.string().optional(),\n previousRequestIds: z.array(z.string()).max(3).optional(),\n nextRequestIds: z.array(z.string()).max(3).optional(),\n applyTextNormalization: z.enum(['auto', 'on', 'off']).optional(),\n applyLanguageTextNormalization: z.boolean().optional(),\n enableLogging: z.boolean().optional(),\n});\n\nexport type ElevenLabsSpeechModelOptions = z.infer<\n typeof elevenLabsSpeechModelOptionsSchema\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","_a","_b","z","combineHeaders","parseProviderOptions","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders"]}
|
|
1
|
+
{"version":3,"sources":["../src/elevenlabs-provider.ts","../src/elevenlabs-transcription-model.ts","../src/elevenlabs-error.ts","../src/elevenlabs-transcription-model-options.ts","../src/elevenlabs-speech-model.ts","../src/elevenlabs-speech-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type TranscriptionModelV4,\n type SpeechModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withUserAgentSuffix,\n type FetchFunction,\n type WebSocketConstructor,\n} from '@ai-sdk/provider-utils';\nimport { ElevenLabsTranscriptionModel } from './elevenlabs-transcription-model';\nimport type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';\nimport { ElevenLabsSpeechModel } from './elevenlabs-speech-model';\nimport type { ElevenLabsSpeechModelId } from './elevenlabs-speech-options';\nimport { VERSION } from './version';\n\nexport interface ElevenLabsProvider extends ProviderV4 {\n (\n modelId: ElevenLabsTranscriptionModelId,\n settings?: {},\n ): {\n transcription: ElevenLabsTranscriptionModel;\n };\n\n /**\n * Creates a model for transcription.\n */\n transcription(modelId: ElevenLabsTranscriptionModelId): TranscriptionModelV4;\n\n /**\n * Creates a model for speech generation.\n */\n speech(modelId: ElevenLabsSpeechModelId): SpeechModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport interface ElevenLabsProviderSettings {\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 * Custom WebSocket implementation. Required in runtimes whose native\n * WebSocket constructor does not support headers for realtime transcription.\n */\n webSocket?: WebSocketConstructor;\n}\n\n/**\n * Create an ElevenLabs provider instance.\n */\nexport function createElevenLabs(\n options: ElevenLabsProviderSettings = {},\n): ElevenLabsProvider {\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n 'xi-api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ELEVENLABS_API_KEY',\n description: 'ElevenLabs',\n }),\n ...options.headers,\n },\n `ai-sdk/elevenlabs/${VERSION}`,\n );\n\n const createTranscriptionModel = (modelId: ElevenLabsTranscriptionModelId) =>\n new ElevenLabsTranscriptionModel(modelId, {\n provider: `elevenlabs.transcription`,\n url: ({ path }) => `https://api.elevenlabs.io${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n webSocket: options.webSocket,\n });\n\n const createSpeechModel = (modelId: ElevenLabsSpeechModelId) =>\n new ElevenLabsSpeechModel(modelId, {\n provider: `elevenlabs.speech`,\n url: ({ path }) => `https://api.elevenlabs.io${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: ElevenLabsTranscriptionModelId) {\n return {\n transcription: createTranscriptionModel(modelId),\n };\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n\n provider.languageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n message: 'ElevenLabs does not provide language models',\n });\n };\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n message: 'ElevenLabs does not provide embedding models',\n });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n message: 'ElevenLabs does not provide image models',\n });\n };\n\n return provider as ElevenLabsProvider;\n}\n\n/**\n * Default ElevenLabs provider instance.\n */\nexport const elevenLabs = createElevenLabs();\n","import {\n InvalidArgumentError,\n UnsupportedFunctionalityError,\n type Experimental_TranscriptionModelV4StreamOptions as TranscriptionModelV4StreamOptions,\n type SharedV4Warning,\n type TranscriptionModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n convertToBase64,\n connectToWebSocket,\n createJsonResponseHandler,\n mediaTypeToExtension,\n parseProviderOptions,\n postFormDataToApi,\n safeParseJSON,\n serializeModelOptions,\n toWebSocketUrl,\n waitForWebSocketBufferDrain,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type WebSocketConnection,\n type WebSocketLike,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ElevenLabsConfig } from './elevenlabs-config';\nimport { elevenlabsFailedResponseHandler } from './elevenlabs-error';\nimport {\n elevenLabsTranscriptionModelOptionsSchema,\n type ElevenLabsTranscriptionModelOptions,\n} from './elevenlabs-transcription-model-options';\nimport type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';\nimport type { ElevenLabsTranscriptionAPITypes } from './elevenlabs-api-types';\n\ntype ElevenLabsRealtimeTranscriptionEvent = {\n message_type?: string;\n session_id?: string;\n text?: string;\n language_code?: string | null;\n words?: Array<{\n text?: string;\n start?: number;\n end?: number;\n type?: string;\n }> | null;\n error?: string;\n};\n\nconst elevenLabsRealtimeErrorTypes = new Set([\n 'auth_error',\n 'chunk_size_exceeded',\n 'commit_throttled',\n 'error',\n 'input_error',\n 'insufficient_audio_activity',\n 'queue_overflow',\n 'quota_exceeded',\n 'rate_limited',\n 'resource_exhausted',\n 'session_time_limit_exceeded',\n 'transcriber_error',\n 'unaccepted_terms',\n]);\n\nconst elevenLabsLateFinalizationErrorTypes = new Set([\n 'commit_throttled',\n 'input_error',\n 'insufficient_audio_activity',\n]);\n\nconst finalCommitGracePeriodMs = 250;\n\nfunction isRealtimeTranscriptionModelId(modelId: string): boolean {\n return modelId === 'scribe_v2_realtime';\n}\n\ninterface ElevenLabsTranscriptionModelConfig extends ElevenLabsConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class ElevenLabsTranscriptionModel implements TranscriptionModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ElevenLabsTranscriptionModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ElevenLabsTranscriptionModelId;\n config: ElevenLabsTranscriptionModelConfig;\n }) {\n return new ElevenLabsTranscriptionModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ElevenLabsTranscriptionModelId,\n private readonly config: ElevenLabsTranscriptionModelConfig,\n ) {}\n\n private async getArgs({\n audio,\n mediaType,\n providerOptions,\n }: Parameters<TranscriptionModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const elevenlabsOptions = await parseProviderOptions({\n provider: 'elevenlabs',\n providerOptions,\n schema: elevenLabsTranscriptionModelOptionsSchema,\n });\n\n if (elevenlabsOptions?.streaming != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.elevenlabs.streaming',\n details:\n 'ElevenLabs batch transcription does not support streaming options.',\n });\n }\n\n // Create form data with base fields\n const formData = new FormData();\n const blob =\n audio instanceof Uint8Array\n ? new Blob([audio])\n : new Blob([convertBase64ToUint8Array(audio)]);\n\n formData.append('model_id', this.modelId);\n const fileExtension = mediaTypeToExtension(mediaType);\n formData.append(\n 'file',\n new File([blob], 'audio', { type: mediaType }),\n `audio.${fileExtension}`,\n );\n formData.append('diarize', 'true');\n\n // Add provider-specific options\n if (elevenlabsOptions) {\n const transcriptionModelOptions: ElevenLabsTranscriptionAPITypes = {\n language_code: elevenlabsOptions.languageCode ?? undefined,\n tag_audio_events: elevenlabsOptions.tagAudioEvents ?? undefined,\n num_speakers: elevenlabsOptions.numSpeakers ?? undefined,\n timestamps_granularity:\n elevenlabsOptions.timestampsGranularity ?? undefined,\n file_format: elevenlabsOptions.fileFormat ?? undefined,\n };\n\n if (typeof elevenlabsOptions.diarize === 'boolean') {\n formData.append('diarize', String(elevenlabsOptions.diarize));\n }\n\n for (const key in transcriptionModelOptions) {\n const value =\n transcriptionModelOptions[\n key as keyof ElevenLabsTranscriptionAPITypes\n ];\n if (value !== undefined) {\n formData.append(key, String(value));\n }\n }\n }\n\n return {\n formData,\n warnings,\n };\n }\n\n async doGenerate(\n options: Parameters<TranscriptionModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<TranscriptionModelV4['doGenerate']>>> {\n if (isRealtimeTranscriptionModelId(this.modelId)) {\n throw new UnsupportedFunctionalityError({\n functionality: `non-streaming transcription with ${this.modelId}`,\n });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { formData, warnings } = await this.getArgs(options);\n\n const {\n value: response,\n responseHeaders,\n rawValue: rawResponse,\n } = await postFormDataToApi({\n url: this.config.url({\n path: '/v1/speech-to-text',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n formData,\n failedResponseHandler: elevenlabsFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n elevenlabsTranscriptionResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n text: response.text,\n segments:\n response.words?.map(word => ({\n text: word.text,\n startSecond: word.start ?? 0,\n endSecond: word.end ?? 0,\n })) ?? [],\n language: response.language_code,\n durationInSeconds: response.words?.at(-1)?.end ?? undefined,\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n\n async doStream(\n options: TranscriptionModelV4StreamOptions,\n ): Promise<\n Awaited<ReturnType<NonNullable<TranscriptionModelV4['doStream']>>>\n > {\n if (!isRealtimeTranscriptionModelId(this.modelId)) {\n throw new UnsupportedFunctionalityError({\n functionality: `streaming transcription with ${this.modelId}`,\n });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const elevenLabsOptions = await parseProviderOptions({\n provider: 'elevenlabs',\n providerOptions: options.providerOptions,\n schema: elevenLabsTranscriptionModelOptionsSchema,\n });\n const streamingOptions = elevenLabsOptions?.streaming ?? undefined;\n const warnings: SharedV4Warning[] = [];\n\n const rawElevenLabsOptions = options.providerOptions?.elevenlabs ?? {};\n for (const option of [\n 'diarize',\n 'fileFormat',\n 'numSpeakers',\n 'tagAudioEvents',\n 'timestampsGranularity',\n ]) {\n if (\n rawElevenLabsOptions[option as keyof typeof rawElevenLabsOptions] !=\n null\n ) {\n warnings.push({\n type: 'unsupported',\n feature: `providerOptions.elevenlabs.${option}`,\n details: `ElevenLabs realtime transcription does not support ${option}.`,\n });\n }\n }\n\n // ElevenLabs documents filter_background_audio as incompatible with\n // include_timestamps. Language detection is delivered on the same\n // timestamp-bearing event, so it also requires include_timestamps here.\n // https://elevenlabs.io/docs/api-reference/speech-to-text/v-1-speech-to-text-realtime\n if (\n streamingOptions?.filterBackgroundAudio === true &&\n (streamingOptions.includeTimestamps === true ||\n streamingOptions.includeLanguageDetection === true)\n ) {\n throw new InvalidArgumentError({\n argument: 'providerOptions',\n message:\n 'providerOptions.elevenlabs.streaming.filterBackgroundAudio cannot be combined with includeTimestamps or includeLanguageDetection',\n });\n }\n\n const inputFormat = getElevenLabsRealtimeAudioFormat(\n options.inputAudioFormat,\n );\n const url = buildElevenLabsRealtimeTranscriptionUrl({\n baseUrl: toWebSocketUrl(\n this.config.url({\n path: '/v1/speech-to-text/realtime',\n modelId: this.modelId,\n }),\n ),\n inputFormat: inputFormat.audioFormat,\n languageCode: elevenLabsOptions?.languageCode ?? undefined,\n modelId: this.modelId,\n streamingOptions,\n });\n\n return {\n request: { body: url.toString() },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n },\n stream: createElevenLabsRealtimeTranscriptionStream({\n abortSignal: options.abortSignal,\n audio: options.audio,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n includeLanguageDetection:\n streamingOptions?.includeLanguageDetection === true,\n includeRawChunks: options.includeRawChunks,\n includeTimestamps: streamingOptions?.includeTimestamps === true,\n language: elevenLabsOptions?.languageCode ?? undefined,\n previousText: streamingOptions?.previousText ?? undefined,\n sampleRate: inputFormat.sampleRate,\n url,\n warnings,\n webSocket: this.config.webSocket,\n }),\n };\n }\n}\n\nfunction getElevenLabsRealtimeAudioFormat(\n inputAudioFormat: TranscriptionModelV4StreamOptions['inputAudioFormat'],\n): { audioFormat: string; sampleRate: number } {\n const type = inputAudioFormat.type.toLowerCase();\n const rate = inputAudioFormat.rate;\n\n if (type === 'audio/pcmu') {\n if (rate != null && rate !== 8000) {\n throw new InvalidArgumentError({\n argument: 'inputAudioFormat',\n message: 'ElevenLabs only supports audio/pcmu at 8000 Hz',\n });\n }\n return { audioFormat: 'ulaw_8000', sampleRate: 8000 };\n }\n\n const supportedPcmRates = [8000, 16000, 22050, 24000, 44100, 48000];\n const pcmRate = rate ?? 16000;\n if (type !== 'audio/pcm' || !supportedPcmRates.includes(pcmRate)) {\n throw new InvalidArgumentError({\n argument: 'inputAudioFormat',\n message:\n 'ElevenLabs realtime transcription supports audio/pcm at 8000, 16000, 22050, 24000, 44100, or 48000 Hz, and audio/pcmu at 8000 Hz',\n });\n }\n\n return { audioFormat: `pcm_${pcmRate}`, sampleRate: pcmRate };\n}\n\nfunction buildElevenLabsRealtimeTranscriptionUrl({\n baseUrl,\n inputFormat,\n languageCode,\n modelId,\n streamingOptions,\n}: {\n baseUrl: URL;\n inputFormat: string;\n languageCode: string | undefined;\n modelId: string;\n streamingOptions:\n | NonNullable<ElevenLabsTranscriptionModelOptions['streaming']>\n | undefined;\n}): URL {\n const url = new URL(baseUrl);\n url.searchParams.set('model_id', modelId);\n url.searchParams.set('audio_format', inputFormat);\n const includeDetailedCommit =\n streamingOptions?.includeTimestamps === true ||\n streamingOptions?.includeLanguageDetection === true;\n\n const parameters = {\n commit_strategy: streamingOptions?.commitStrategy,\n enable_logging: streamingOptions?.enableLogging,\n filter_background_audio: streamingOptions?.filterBackgroundAudio,\n include_language_detection: streamingOptions?.includeLanguageDetection,\n include_timestamps: includeDetailedCommit\n ? true\n : streamingOptions?.includeTimestamps,\n language_code: languageCode,\n min_silence_duration_ms: streamingOptions?.minSilenceDurationMs,\n min_speech_duration_ms: streamingOptions?.minSpeechDurationMs,\n no_verbatim: streamingOptions?.noVerbatim,\n vad_silence_threshold_secs: streamingOptions?.vadSilenceThresholdSecs,\n vad_threshold: streamingOptions?.vadThreshold,\n };\n for (const [key, value] of Object.entries(parameters)) {\n if (value != null) {\n url.searchParams.set(key, String(value));\n }\n }\n for (const keyterm of streamingOptions?.keyterms ?? []) {\n url.searchParams.append('keyterms', keyterm);\n }\n for (const secondaryLanguage of streamingOptions?.secondaryLanguages ?? []) {\n url.searchParams.append('secondary_languages', secondaryLanguage);\n }\n\n return url;\n}\n\nfunction createElevenLabsRealtimeTranscriptionStream({\n abortSignal,\n audio,\n headers,\n includeLanguageDetection,\n includeRawChunks,\n includeTimestamps,\n language,\n previousText,\n sampleRate,\n url,\n warnings,\n webSocket,\n}: {\n abortSignal: AbortSignal | undefined;\n audio: ReadableStream<Uint8Array | string>;\n headers: Record<string, string | undefined>;\n includeLanguageDetection: boolean;\n includeRawChunks: boolean | undefined;\n includeTimestamps: boolean;\n language: string | undefined;\n previousText: string | undefined;\n sampleRate: number;\n url: URL;\n warnings: SharedV4Warning[];\n webSocket: ElevenLabsConfig['webSocket'];\n}) {\n let finished = false;\n let cleanup: (closeCode?: number) => void = () => {};\n\n return new ReadableStream({\n start: controller => {\n let audioReader:\n | ReadableStreamDefaultReader<Uint8Array | string>\n | undefined;\n let connection: WebSocketConnection | undefined;\n let detectedLanguage = language;\n let endOfInput = false;\n let finalCommitGracePeriod: ReturnType<typeof setTimeout> | undefined;\n let receivedPostInputCommit = false;\n let segmentIndex = 0;\n let sessionId: string | undefined;\n let committedEventCount = 0;\n let committedEventsAtEndOfInput = 0;\n let finalCommitEventCount: number | undefined;\n let timestampedCommitCount = 0;\n const expectDetailedCommit =\n includeTimestamps || includeLanguageDetection;\n const finalSegments: Array<{\n text: string;\n startSecond: number;\n endSecond: number;\n }> = [];\n const finalTexts: string[] = [];\n\n cleanup = (closeCode?: number) => {\n clearTimeout(finalCommitGracePeriod);\n if (audioReader != null) {\n void audioReader.cancel().catch(() => {});\n } else {\n void audio.cancel().catch(() => {});\n }\n connection?.close(closeCode);\n };\n\n const finishWithError = (error: unknown) => {\n if (finished) return;\n finished = true;\n cleanup();\n controller.error(error);\n };\n\n const finish = () => {\n if (finished) return;\n finished = true;\n controller.enqueue({\n type: 'finish',\n text: finalTexts.join(' ').trim(),\n segments: finalSegments,\n language: detectedLanguage,\n durationInSeconds: finalSegments.at(-1)?.endSecond,\n });\n controller.close();\n cleanup(1000);\n };\n\n const scheduleFinish = () => {\n clearTimeout(finalCommitGracePeriod);\n finalCommitGracePeriod = setTimeout(finish, finalCommitGracePeriodMs);\n };\n\n const sendAudio = async (socket: WebSocketLike) => {\n audioReader = audio.getReader();\n let firstChunk = true;\n try {\n while (true) {\n const { done, value } = await audioReader.read();\n if (done || finished) break;\n socket.send(\n JSON.stringify({\n message_type: 'input_audio_chunk',\n audio_base_64: convertToBase64(value),\n commit: false,\n sample_rate: sampleRate,\n ...(firstChunk && previousText != null\n ? { previous_text: previousText }\n : {}),\n }),\n );\n firstChunk = false;\n await waitForWebSocketBufferDrain(socket);\n }\n } finally {\n audioReader.releaseLock();\n audioReader = undefined;\n }\n if (!finished) {\n committedEventsAtEndOfInput = committedEventCount;\n endOfInput = true;\n socket.send(\n JSON.stringify({\n message_type: 'input_audio_chunk',\n audio_base_64: '',\n commit: true,\n sample_rate: sampleRate,\n }),\n );\n }\n };\n\n connection = connectToWebSocket({\n abortSignal,\n headers,\n onAbort: finishWithError,\n onClose: () => {\n if (finished) return;\n if (endOfInput && receivedPostInputCommit) {\n finish();\n return;\n }\n finishWithError(\n new Error(\n 'ElevenLabs realtime transcription stream closed before completion.',\n ),\n );\n },\n onMessageText: async text => {\n const parsed = await safeParseJSON({ text });\n if (!parsed.success) return;\n const raw = parsed.value as ElevenLabsRealtimeTranscriptionEvent;\n\n if (includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: raw });\n }\n\n if (\n raw.message_type != null &&\n elevenLabsRealtimeErrorTypes.has(raw.message_type)\n ) {\n if (\n endOfInput &&\n (committedEventCount > 0 || timestampedCommitCount > 0) &&\n elevenLabsLateFinalizationErrorTypes.has(raw.message_type)\n ) {\n receivedPostInputCommit = true;\n finish();\n return;\n }\n finishWithError(\n new Error(raw.error ?? 'ElevenLabs realtime transcription error'),\n );\n return;\n }\n\n switch (raw.message_type) {\n case 'session_started': {\n sessionId = raw.session_id;\n controller.enqueue({ type: 'stream-start', warnings });\n const socket = connection?.socket;\n if (socket == null) {\n finishWithError(new Error('WebSocket is not connected.'));\n break;\n }\n void sendAudio(socket).catch(finishWithError);\n break;\n }\n case 'partial_transcript': {\n controller.enqueue({\n type: 'transcript-partial',\n id: `${sessionId ?? 'session'}:${segmentIndex}`,\n text: raw.text ?? '',\n });\n break;\n }\n case 'final_transcript':\n case 'committed_transcript': {\n committedEventCount++;\n const text = (raw.text ?? '').trim();\n const id = `${sessionId ?? 'session'}:${segmentIndex}`;\n\n if (text.length > 0) {\n finalTexts.push(text);\n segmentIndex++;\n controller.enqueue({\n type: 'transcript-final',\n id,\n text,\n });\n }\n\n // When timestamps are requested, ElevenLabs follows this event\n // with committed_transcript_with_timestamps for the same commit.\n if (\n endOfInput &&\n committedEventCount > committedEventsAtEndOfInput\n ) {\n receivedPostInputCommit = true;\n finalCommitEventCount = committedEventCount;\n if (\n !expectDetailedCommit ||\n raw.message_type === 'final_transcript'\n ) {\n scheduleFinish();\n }\n }\n break;\n }\n case 'final_transcript_with_timestamps':\n case 'committed_transcript_with_timestamps': {\n const text = (raw.text ?? '').trim();\n const words = raw.words ?? [];\n const timestampedWords = words.filter(\n (word): word is typeof word & { start: number; end: number } =>\n typeof word.start === 'number' &&\n typeof word.end === 'number',\n );\n detectedLanguage = raw.language_code ?? detectedLanguage;\n\n // Normally this is paired with the preceding committed_transcript.\n // Still handle a timestamp-only server response defensively.\n if (\n finalTexts[timestampedCommitCount] == null &&\n text.length > 0\n ) {\n const id = `${sessionId ?? 'session'}:${segmentIndex++}`;\n finalTexts.push(text);\n controller.enqueue({\n type: 'transcript-final',\n id,\n text,\n ...(includeTimestamps\n ? {\n startSecond: timestampedWords[0]?.start,\n endSecond: timestampedWords.at(-1)?.end,\n }\n : {}),\n });\n }\n timestampedCommitCount++;\n if (includeTimestamps) {\n finalSegments.push(\n ...timestampedWords.map(word => ({\n text: word.text ?? '',\n startSecond: word.start,\n endSecond: word.end,\n })),\n );\n }\n\n if (\n endOfInput &&\n timestampedCommitCount > committedEventsAtEndOfInput &&\n (finalCommitEventCount == null ||\n timestampedCommitCount >= finalCommitEventCount)\n ) {\n receivedPostInputCommit = true;\n scheduleFinish();\n }\n break;\n }\n }\n },\n onProcessingError: finishWithError,\n onSocketError: () => {\n finishWithError(\n new Error(\n 'ElevenLabs realtime transcription error.' +\n (webSocket == null\n ? ' Note: the native WebSocket implementation in browsers,' +\n ' Node.js, Deno, and Bun cannot send the xi-api-key header' +\n ' required by ElevenLabs. Pass a header-capable WebSocket' +\n \" implementation (e.g. the 'ws' package) via\" +\n ' createElevenLabs({ webSocket }).'\n : ''),\n ),\n );\n },\n url,\n webSocket,\n });\n },\n\n cancel: () => {\n if (finished) return;\n finished = true;\n cleanup();\n },\n });\n}\n\nconst elevenlabsTranscriptionResponseSchema = z.object({\n language_code: z.string(),\n language_probability: z.number(),\n text: z.string(),\n words: z\n .array(\n z.object({\n text: z.string(),\n type: z.enum(['word', 'spacing', 'audio_event']),\n start: z.number().nullish(),\n end: z.number().nullish(),\n speaker_id: z.string().nullish(),\n characters: z\n .array(\n z.object({\n text: z.string(),\n start: z.number().nullish(),\n end: z.number().nullish(),\n }),\n )\n .nullish(),\n }),\n )\n .nullish(),\n});\n","import { z } from 'zod/v4';\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\n\nexport const elevenlabsErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.number(),\n }),\n});\n\nexport type ElevenLabsErrorData = z.infer<typeof elevenlabsErrorDataSchema>;\n\nexport const elevenlabsFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: elevenlabsErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import { z } from 'zod/v4';\n\n// https://elevenlabs.io/docs/api-reference/speech-to-text/convert\nexport const elevenLabsTranscriptionModelOptionsSchema = z.object({\n languageCode: z.string().nullish(),\n tagAudioEvents: z.boolean().nullish().default(true),\n numSpeakers: z.number().int().min(1).max(32).nullish(),\n timestampsGranularity: z\n .enum(['none', 'word', 'character'])\n .nullish()\n .default('word'),\n diarize: z.boolean().nullish().default(false),\n fileFormat: z.enum(['pcm_s16le_16', 'other']).nullish().default('other'),\n streaming: z\n .object({\n commitStrategy: z.enum(['manual', 'vad']).nullish(),\n enableLogging: z.boolean().nullish(),\n filterBackgroundAudio: z.boolean().nullish(),\n includeLanguageDetection: z.boolean().nullish(),\n includeTimestamps: z.boolean().nullish(),\n keyterms: z.array(z.string().max(20)).max(50).nullish(),\n minSilenceDurationMs: z.number().int().min(50).max(2000).nullish(),\n minSpeechDurationMs: z.number().int().min(50).max(2000).nullish(),\n noVerbatim: z.boolean().nullish(),\n previousText: z.string().nullish(),\n secondaryLanguages: z.array(z.string()).nullish(),\n vadSilenceThresholdSecs: z.number().min(0.3).max(3).nullish(),\n vadThreshold: z.number().min(0.1).max(0.9).nullish(),\n })\n .nullish(),\n});\n\nexport type ElevenLabsTranscriptionModelOptions = z.infer<\n typeof elevenLabsTranscriptionModelOptionsSchema\n>;\n","import type { SpeechModelV4, SharedV4Warning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { ElevenLabsConfig } from './elevenlabs-config';\nimport { elevenlabsFailedResponseHandler } from './elevenlabs-error';\nimport { elevenLabsSpeechModelOptionsSchema } from './elevenlabs-speech-model-options';\nimport type { ElevenLabsSpeechAPITypes } from './elevenlabs-speech-api-types';\nimport type {\n ElevenLabsSpeechModelId,\n ElevenLabsSpeechVoiceId,\n} from './elevenlabs-speech-options';\n\ninterface ElevenLabsSpeechModelConfig extends ElevenLabsConfig {\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class ElevenLabsSpeechModel implements SpeechModelV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: ElevenLabsSpeechModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: ElevenLabsSpeechModelId;\n config: ElevenLabsSpeechModelConfig;\n }) {\n return new ElevenLabsSpeechModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: ElevenLabsSpeechModelId,\n private readonly config: ElevenLabsSpeechModelConfig,\n ) {}\n\n private async getArgs({\n text,\n voice = '21m00Tcm4TlvDq8ikWAM',\n outputFormat = 'mp3_44100_128',\n instructions,\n language,\n speed,\n providerOptions,\n }: Parameters<SpeechModelV4['doGenerate']>[0]) {\n const warnings: SharedV4Warning[] = [];\n\n // Parse provider options\n const elevenLabsOptions = await parseProviderOptions({\n provider: 'elevenlabs',\n providerOptions,\n schema: elevenLabsSpeechModelOptionsSchema,\n });\n\n // Create request body\n const requestBody: ElevenLabsSpeechAPITypes = {\n text,\n model_id: this.modelId,\n };\n\n // Prepare query parameters\n const queryParams: Record<string, string> = {};\n\n // Map outputFormat to ElevenLabs format (as query param)\n if (outputFormat) {\n const formatMap: Record<string, string> = {\n mp3: 'mp3_44100_128',\n mp3_32: 'mp3_44100_32',\n mp3_64: 'mp3_44100_64',\n mp3_96: 'mp3_44100_96',\n mp3_128: 'mp3_44100_128',\n mp3_192: 'mp3_44100_192',\n pcm: 'pcm_44100',\n pcm_16000: 'pcm_16000',\n pcm_22050: 'pcm_22050',\n pcm_24000: 'pcm_24000',\n pcm_44100: 'pcm_44100',\n ulaw: 'ulaw_8000',\n };\n\n const mappedFormat = formatMap[outputFormat] || outputFormat;\n queryParams.output_format = mappedFormat;\n }\n\n // Add language code if provided\n if (language) {\n requestBody.language_code = language;\n }\n\n const voiceSettings: typeof requestBody.voice_settings = {};\n\n if (speed != null) {\n voiceSettings.speed = speed;\n }\n\n // Add provider-specific options - map from camelCase to snake_case\n if (elevenLabsOptions) {\n if (elevenLabsOptions.voiceSettings) {\n // Map camelCase voice settings to snake_case for API\n if (elevenLabsOptions.voiceSettings.stability != null) {\n voiceSettings.stability = elevenLabsOptions.voiceSettings.stability;\n }\n if (elevenLabsOptions.voiceSettings.similarityBoost != null) {\n voiceSettings.similarity_boost =\n elevenLabsOptions.voiceSettings.similarityBoost;\n }\n if (elevenLabsOptions.voiceSettings.style != null) {\n voiceSettings.style = elevenLabsOptions.voiceSettings.style;\n }\n if (elevenLabsOptions.voiceSettings.useSpeakerBoost != null) {\n voiceSettings.use_speaker_boost =\n elevenLabsOptions.voiceSettings.useSpeakerBoost;\n }\n }\n // Add language code from provider options if not already set\n if (elevenLabsOptions.languageCode && !requestBody.language_code) {\n requestBody.language_code = elevenLabsOptions.languageCode;\n }\n\n // Map pronunciation dictionary locators\n if (elevenLabsOptions.pronunciationDictionaryLocators) {\n requestBody.pronunciation_dictionary_locators =\n elevenLabsOptions.pronunciationDictionaryLocators.map(locator => ({\n pronunciation_dictionary_id: locator.pronunciationDictionaryId,\n ...(locator.versionId && { version_id: locator.versionId }),\n }));\n }\n\n if (elevenLabsOptions.seed != null) {\n requestBody.seed = elevenLabsOptions.seed;\n }\n if (elevenLabsOptions.previousText) {\n requestBody.previous_text = elevenLabsOptions.previousText;\n }\n if (elevenLabsOptions.nextText) {\n requestBody.next_text = elevenLabsOptions.nextText;\n }\n\n // Add previous and next request IDs\n if (elevenLabsOptions.previousRequestIds) {\n requestBody.previous_request_ids = elevenLabsOptions.previousRequestIds;\n }\n if (elevenLabsOptions.nextRequestIds) {\n requestBody.next_request_ids = elevenLabsOptions.nextRequestIds;\n }\n\n // Add text normalization options\n if (elevenLabsOptions.applyTextNormalization) {\n requestBody.apply_text_normalization =\n elevenLabsOptions.applyTextNormalization;\n }\n if (elevenLabsOptions.applyLanguageTextNormalization != null) {\n requestBody.apply_language_text_normalization =\n elevenLabsOptions.applyLanguageTextNormalization;\n }\n\n // enable_logging is a query parameter\n if (elevenLabsOptions.enableLogging != null) {\n queryParams.enable_logging = String(elevenLabsOptions.enableLogging);\n }\n }\n\n // Only add voice_settings if there are settings to add\n if (Object.keys(voiceSettings).length > 0) {\n requestBody.voice_settings = voiceSettings;\n }\n\n if (instructions) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details: `ElevenLabs speech models do not support instructions. Instructions parameter was ignored.`,\n });\n }\n\n return {\n requestBody,\n queryParams,\n warnings,\n voiceId: voice as ElevenLabsSpeechVoiceId,\n };\n }\n\n async doGenerate(\n options: Parameters<SpeechModelV4['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<SpeechModelV4['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { requestBody, queryParams, warnings, voiceId } =\n await this.getArgs(options);\n\n const {\n value: audio,\n responseHeaders,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: (() => {\n const baseUrl = this.config.url({\n path: `/v1/text-to-speech/${voiceId}`,\n modelId: this.modelId,\n });\n const queryString = new URLSearchParams(queryParams).toString();\n return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n })(),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: requestBody,\n failedResponseHandler: elevenlabsFailedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: {\n body: JSON.stringify(requestBody),\n },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawResponse,\n },\n };\n }\n}\n","import { z } from 'zod/v4';\n\n// Schema for camelCase input from users\nexport const elevenLabsSpeechModelOptionsSchema = z.object({\n languageCode: z.string().optional(),\n voiceSettings: z\n .object({\n stability: z.number().min(0).max(1).optional(),\n similarityBoost: z.number().min(0).max(1).optional(),\n style: z.number().min(0).max(1).optional(),\n useSpeakerBoost: z.boolean().optional(),\n })\n .optional(),\n pronunciationDictionaryLocators: z\n .array(\n z.object({\n pronunciationDictionaryId: z.string(),\n versionId: z.string().optional(),\n }),\n )\n .max(3)\n .optional(),\n seed: z.number().min(0).max(4294967295).optional(),\n previousText: z.string().optional(),\n nextText: z.string().optional(),\n previousRequestIds: z.array(z.string()).max(3).optional(),\n nextRequestIds: z.array(z.string()).max(3).optional(),\n applyTextNormalization: z.enum(['auto', 'on', 'off']).optional(),\n applyLanguageTextNormalization: z.boolean().optional(),\n enableLogging: z.boolean().optional(),\n});\n\nexport type ElevenLabsSpeechModelOptions = z.infer<\n typeof elevenLabsSpeechModelOptionsSchema\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","_a","_b","text","z","combineHeaders","parseProviderOptions","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","combineHeaders"]}
|
package/docs/90-elevenlabs.mdx
CHANGED
|
@@ -36,7 +36,7 @@ You can use the following optional settings to customize the ElevenLabs provider
|
|
|
36
36
|
|
|
37
37
|
- **apiKey** _string_
|
|
38
38
|
|
|
39
|
-
API key that is being sent using the `
|
|
39
|
+
API key that is being sent using the `xi-api-key` header.
|
|
40
40
|
It defaults to the `ELEVENLABS_API_KEY` environment variable.
|
|
41
41
|
|
|
42
42
|
- **headers** _Record<string,string>_
|
|
@@ -50,6 +50,12 @@ You can use the following optional settings to customize the ElevenLabs provider
|
|
|
50
50
|
You can use it as a middleware to intercept requests,
|
|
51
51
|
or to provide a custom fetch implementation for e.g. testing.
|
|
52
52
|
|
|
53
|
+
- **webSocket** _WebSocketConstructor_
|
|
54
|
+
|
|
55
|
+
Custom WebSocket implementation for realtime transcription. A
|
|
56
|
+
header-capable implementation is required in runtimes whose native WebSocket
|
|
57
|
+
constructor cannot send the `xi-api-key` authentication header.
|
|
58
|
+
|
|
53
59
|
## Speech Models
|
|
54
60
|
|
|
55
61
|
You can create models that call the [ElevenLabs speech API](https://elevenlabs.io/text-to-speech)
|
|
@@ -168,10 +174,10 @@ const result = await generateSpeech({
|
|
|
168
174
|
You can create models that call the [ElevenLabs transcription API](https://elevenlabs.io/speech-to-text)
|
|
169
175
|
using the `.transcription()` factory method.
|
|
170
176
|
|
|
171
|
-
The first argument is the model id e.g. `
|
|
177
|
+
The first argument is the model id e.g. `scribe_v2`.
|
|
172
178
|
|
|
173
179
|
```ts
|
|
174
|
-
const model = elevenLabs.transcription('
|
|
180
|
+
const model = elevenLabs.transcription('scribe_v2');
|
|
175
181
|
```
|
|
176
182
|
|
|
177
183
|
You can also pass additional provider-specific options using the `providerOptions` argument. For example, supplying the input language in ISO-639-1 (e.g. `en`) format can sometimes improve transcription performance if known beforehand.
|
|
@@ -184,7 +190,7 @@ import {
|
|
|
184
190
|
} from '@ai-sdk/elevenlabs';
|
|
185
191
|
|
|
186
192
|
const result = await transcribe({
|
|
187
|
-
model: elevenLabs.transcription('
|
|
193
|
+
model: elevenLabs.transcription('scribe_v2'),
|
|
188
194
|
audio: new Uint8Array([1, 2, 3, 4]),
|
|
189
195
|
providerOptions: {
|
|
190
196
|
elevenlabs: {
|
|
@@ -239,3 +245,74 @@ The following provider options are available:
|
|
|
239
245
|
| ------------------------ | ------------- | --------- | --------- | --------- |
|
|
240
246
|
| `scribe_v1` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
241
247
|
| `scribe_v1_experimental` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
248
|
+
| `scribe_v2` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
249
|
+
|
|
250
|
+
## Streaming Transcription Models
|
|
251
|
+
|
|
252
|
+
<Note type="warning">Streaming transcription is an experimental feature.</Note>
|
|
253
|
+
|
|
254
|
+
Scribe v2 Realtime supports live transcription through
|
|
255
|
+
`experimental_streamTranscribe`. It accepts raw PCM audio at 8, 16, 22.05, 24,
|
|
256
|
+
44.1, or 48 kHz, or 8 kHz mu-law audio.
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
import {
|
|
260
|
+
createElevenLabs,
|
|
261
|
+
type ElevenLabsProviderSettings,
|
|
262
|
+
} from '@ai-sdk/elevenlabs';
|
|
263
|
+
import { experimental_streamTranscribe as streamTranscribe } from 'ai';
|
|
264
|
+
import { WebSocket } from 'ws';
|
|
265
|
+
|
|
266
|
+
const elevenLabs = createElevenLabs({
|
|
267
|
+
webSocket: WebSocket as unknown as ElevenLabsProviderSettings['webSocket'],
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
const result = streamTranscribe({
|
|
271
|
+
model: elevenLabs.transcription('scribe_v2_realtime'),
|
|
272
|
+
audio,
|
|
273
|
+
inputAudioFormat: { type: 'audio/pcm', rate: 16000 },
|
|
274
|
+
providerOptions: {
|
|
275
|
+
elevenlabs: {
|
|
276
|
+
languageCode: 'en',
|
|
277
|
+
streaming: {
|
|
278
|
+
includeLanguageDetection: true,
|
|
279
|
+
includeTimestamps: true,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
for await (const part of result.fullStream) {
|
|
286
|
+
if (part.type === 'transcript-partial') {
|
|
287
|
+
console.log('partial:', part.text);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (part.type === 'transcript-final') {
|
|
291
|
+
console.log('final:', part.text);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
The ElevenLabs realtime endpoint authenticates with a WebSocket header. Use a
|
|
297
|
+
header-capable WebSocket implementation, such as `ws`, in runtimes whose native
|
|
298
|
+
WebSocket constructor cannot send headers.
|
|
299
|
+
|
|
300
|
+
The `streaming` provider options mirror ElevenLabs' realtime transcription
|
|
301
|
+
settings: `commitStrategy`, `enableLogging`, `filterBackgroundAudio`,
|
|
302
|
+
`includeLanguageDetection`, `includeTimestamps`, `keyterms`,
|
|
303
|
+
`minSilenceDurationMs`, `minSpeechDurationMs`, `noVerbatim`, `previousText`,
|
|
304
|
+
`secondaryLanguages`, `vadSilenceThresholdSecs`, and `vadThreshold`.
|
|
305
|
+
|
|
306
|
+
ElevenLabs delivers detected language on its timestamp-bearing committed event.
|
|
307
|
+
When `includeLanguageDetection` is enabled, the provider requests that event
|
|
308
|
+
internally, but only returns timestamp segments when `includeTimestamps` is also
|
|
309
|
+
enabled. `filterBackgroundAudio` cannot be combined with either option.
|
|
310
|
+
|
|
311
|
+
See [Transcription](/docs/ai-sdk-core/transcription) for more information about
|
|
312
|
+
streaming transcription.
|
|
313
|
+
|
|
314
|
+
### Model Capabilities
|
|
315
|
+
|
|
316
|
+
| Model | Streaming Transcription | Timestamps | Language Detection |
|
|
317
|
+
| -------------------- | ----------------------- | ------------------- | ------------------- |
|
|
318
|
+
| `scribe_v2_realtime` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/elevenlabs",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.15",
|
|
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.
|
|
33
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
32
|
+
"@ai-sdk/provider": "4.0.4",
|
|
33
|
+
"@ai-sdk/provider-utils": "5.0.14"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/node": "22.19.19",
|
package/src/elevenlabs-config.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
FetchFunction,
|
|
3
|
+
WebSocketConstructor,
|
|
4
|
+
} from '@ai-sdk/provider-utils';
|
|
2
5
|
|
|
3
6
|
export type ElevenLabsConfig = {
|
|
4
7
|
provider: string;
|
|
@@ -6,4 +9,5 @@ export type ElevenLabsConfig = {
|
|
|
6
9
|
headers?: () => Record<string, string | undefined>;
|
|
7
10
|
fetch?: FetchFunction;
|
|
8
11
|
generateId?: () => string;
|
|
12
|
+
webSocket?: WebSocketConstructor;
|
|
9
13
|
};
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
loadApiKey,
|
|
9
9
|
withUserAgentSuffix,
|
|
10
10
|
type FetchFunction,
|
|
11
|
+
type WebSocketConstructor,
|
|
11
12
|
} from '@ai-sdk/provider-utils';
|
|
12
13
|
import { ElevenLabsTranscriptionModel } from './elevenlabs-transcription-model';
|
|
13
14
|
import type { ElevenLabsTranscriptionModelId } from './elevenlabs-transcription-options';
|
|
@@ -55,6 +56,12 @@ export interface ElevenLabsProviderSettings {
|
|
|
55
56
|
* or to provide a custom fetch implementation for e.g. testing.
|
|
56
57
|
*/
|
|
57
58
|
fetch?: FetchFunction;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Custom WebSocket implementation. Required in runtimes whose native
|
|
62
|
+
* WebSocket constructor does not support headers for realtime transcription.
|
|
63
|
+
*/
|
|
64
|
+
webSocket?: WebSocketConstructor;
|
|
58
65
|
}
|
|
59
66
|
|
|
60
67
|
/**
|
|
@@ -82,6 +89,7 @@ export function createElevenLabs(
|
|
|
82
89
|
url: ({ path }) => `https://api.elevenlabs.io${path}`,
|
|
83
90
|
headers: getHeaders,
|
|
84
91
|
fetch: options.fetch,
|
|
92
|
+
webSocket: options.webSocket,
|
|
85
93
|
});
|
|
86
94
|
|
|
87
95
|
const createSpeechModel = (modelId: ElevenLabsSpeechModelId) =>
|
|
@@ -11,6 +11,23 @@ export const elevenLabsTranscriptionModelOptionsSchema = z.object({
|
|
|
11
11
|
.default('word'),
|
|
12
12
|
diarize: z.boolean().nullish().default(false),
|
|
13
13
|
fileFormat: z.enum(['pcm_s16le_16', 'other']).nullish().default('other'),
|
|
14
|
+
streaming: z
|
|
15
|
+
.object({
|
|
16
|
+
commitStrategy: z.enum(['manual', 'vad']).nullish(),
|
|
17
|
+
enableLogging: z.boolean().nullish(),
|
|
18
|
+
filterBackgroundAudio: z.boolean().nullish(),
|
|
19
|
+
includeLanguageDetection: z.boolean().nullish(),
|
|
20
|
+
includeTimestamps: z.boolean().nullish(),
|
|
21
|
+
keyterms: z.array(z.string().max(20)).max(50).nullish(),
|
|
22
|
+
minSilenceDurationMs: z.number().int().min(50).max(2000).nullish(),
|
|
23
|
+
minSpeechDurationMs: z.number().int().min(50).max(2000).nullish(),
|
|
24
|
+
noVerbatim: z.boolean().nullish(),
|
|
25
|
+
previousText: z.string().nullish(),
|
|
26
|
+
secondaryLanguages: z.array(z.string()).nullish(),
|
|
27
|
+
vadSilenceThresholdSecs: z.number().min(0.3).max(3).nullish(),
|
|
28
|
+
vadThreshold: z.number().min(0.1).max(0.9).nullish(),
|
|
29
|
+
})
|
|
30
|
+
.nullish(),
|
|
14
31
|
});
|
|
15
32
|
|
|
16
33
|
export type ElevenLabsTranscriptionModelOptions = z.infer<
|