@ai-sdk/azure 3.0.130 → 3.0.132
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 +15 -0
- package/dist/index.d.mts +20 -6
- package/dist/index.d.ts +20 -6
- package/dist/index.js +380 -74
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +384 -64
- package/dist/index.mjs.map +1 -1
- package/docs/04-azure.mdx +104 -18
- package/package.json +2 -2
- package/src/azure-openai-provider.ts +101 -19
- package/src/azure-speech-model-options.ts +33 -0
- package/src/azure-speech-speech-model-options.ts +27 -0
- package/src/azure-speech-speech-model.ts +282 -0
- package/src/azure-speech-transcription-model.ts +6 -5
- package/src/azure-transcription-model-options.ts +13 -3
- package/src/index.ts +1 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/azure-openai-provider.ts","../src/azure-openai-tools.ts","../src/azure-speech-transcription-model.ts","../src/azure-transcription-model-options.ts","../src/azure-speech-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n OpenAIChatLanguageModel,\n OpenAICompletionLanguageModel,\n OpenAIEmbeddingModel,\n OpenAIImageModel,\n OpenAIResponsesLanguageModel,\n OpenAISpeechModel,\n OpenAITranscriptionModel,\n} from '@ai-sdk/openai/internal';\nimport { DeepSeekChatLanguageModel } from '@ai-sdk/deepseek/internal';\nimport {\n InvalidArgumentError,\n type EmbeddingModelV3,\n type LanguageModelV3,\n type ProviderV3,\n type ImageModelV3,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n loadSetting,\n normalizeHeaders,\n parseProviderOptions,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { azureOpenaiTools } from './azure-openai-tools';\nimport { AzureSpeechTranscriptionModel } from './azure-speech-transcription-model';\nimport {\n azureTranscriptionModelOptions,\n isMAITranscribe2,\n} from './azure-transcription-model-options';\nimport { VERSION } from './version';\n\nexport interface AzureOpenAIProvider extends ProviderV3 {\n (deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI responses API model for text generation.\n */\n languageModel(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI chat model for text generation.\n */\n chat(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure-hosted DeepSeek chat model for text generation.\n */\n deepseek(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI responses API model for text generation.\n */\n responses(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI completion model for text generation.\n */\n completion(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI model for text embeddings.\n */\n embedding(deploymentId: string): EmbeddingModelV3;\n\n /**\n * Creates an Azure OpenAI model for text embeddings.\n */\n embeddingModel(deploymentId: string): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(deploymentId: string): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(deploymentId: string): EmbeddingModelV3;\n\n /**\n * Creates an Azure OpenAI DALL-E model for image generation.\n */\n image(deploymentId: string): ImageModelV3;\n\n /**\n * Creates an Azure OpenAI DALL-E model for image generation.\n */\n imageModel(deploymentId: string): ImageModelV3;\n\n /**\n * Creates an Azure transcription model. MAI-Transcribe-2 uses the Speech API\n * by default; other IDs use OpenAI. Override with providerOptions.azure.api.\n */\n transcription(deploymentId: string): TranscriptionModelV3;\n\n /**\n * Creates an Azure transcription model. Alias of `transcription`.\n */\n transcriptionModel(deploymentId: string): TranscriptionModelV3;\n\n /**\n * Creates an Azure OpenAI model for speech generation.\n */\n speech(deploymentId: string): SpeechModelV3;\n\n /**\n * AzureOpenAI-specific tools.\n */\n tools: typeof azureOpenaiTools;\n}\n\nexport interface AzureOpenAIProviderSettings {\n /**\n * Name of the Azure OpenAI resource. Either this or `baseURL` can be used.\n *\n * The resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/v1{path}`.\n */\n resourceName?: string;\n\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers. Either this or `resourceName` can be used.\n * When a baseURL is provided, the resourceName is ignored.\n *\n * With an unversioned Azure OpenAI baseURL, the resolved URL is `{baseURL}/v1{path}`.\n * Azure OpenAI base URLs that already end in `/openai/v1` are used as-is.\n * With a non-Azure custom gateway baseURL, the resolved URL is `{baseURL}{path}`.\n */\n baseURL?: string;\n\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * A function that returns an access token for Microsoft Entra\n * (formerly known as Azure Active Directory), which will be invoked\n * on every request.\n */\n tokenProvider?: (() => Promise<string>) | undefined;\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 api version to use. Defaults to `v1`.\n * Complete v1 base URLs are used as-is.\n */\n apiVersion?: string;\n\n /**\n * Use deployment-based URLs for specific model types. Set to true to use legacy deployment format:\n * `{baseURL}/deployments/{deploymentId}{path}?api-version={apiVersion}` instead of\n * `{baseURL}/v1{path}?api-version={apiVersion}`.\n */\n useDeploymentBasedUrls?: boolean;\n\n /**\n * URL prefix for Azure Speech transcription (MAI-Transcribe-2), e.g. a\n * regional endpoint like `https://eastus.api.cognitive.microsoft.com`.\n * Defaults to `https://{resourceName}.cognitiveservices.azure.com`.\n * Speech requests do not use `baseURL` or `apiVersion`.\n */\n speechBaseURL?: string;\n}\n\nfunction getAzureOpenAIBaseURLInfo(baseURL: string | undefined) {\n if (baseURL == null) {\n return {\n isAzureOpenAI: true,\n isFoundryProject: false,\n isVersioned: false,\n };\n }\n\n const url = new URL(baseURL);\n const hostname = url.hostname;\n const isAzureOpenAI =\n hostname.endsWith('.openai.azure.com') ||\n hostname.endsWith('.services.ai.azure.com') ||\n hostname.endsWith('.cognitiveservices.azure.com');\n const pathname = url.pathname.replace(/\\/+$/, '');\n\n return {\n isAzureOpenAI,\n isFoundryProject:\n hostname.endsWith('.services.ai.azure.com') &&\n pathname.startsWith('/api/projects/'),\n isVersioned: isAzureOpenAI && pathname.toLowerCase().endsWith('/openai/v1'),\n };\n}\n\n/**\n * Create an Azure OpenAI provider instance.\n */\nexport function createAzure(\n options: AzureOpenAIProviderSettings = {},\n): AzureOpenAIProvider {\n const tokenProvider = options.tokenProvider;\n\n if (options.apiKey && tokenProvider) {\n throw new InvalidArgumentError({\n argument: 'apiKey/tokenProvider',\n message:\n 'Both apiKey and tokenProvider were provided. Please use only one authentication method.',\n });\n }\n\n const getHeaders = (api: 'openai' | 'speech' = 'openai') => {\n const authHeaders = tokenProvider\n ? {}\n : {\n [api === 'speech' ? 'Ocp-Apim-Subscription-Key' : 'api-key']:\n loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AZURE_API_KEY',\n description: api === 'speech' ? 'Azure Speech' : 'Azure OpenAI',\n }),\n };\n\n return withUserAgentSuffix(\n {\n ...authHeaders,\n ...options.headers,\n },\n `ai-sdk/azure/${VERSION}`,\n );\n };\n\n const fetch: FetchFunction | undefined = tokenProvider\n ? async (input, init) => {\n const headers = normalizeHeaders(init?.headers);\n\n if (headers.authorization == null) {\n headers.authorization = `Bearer ${await tokenProvider()}`;\n }\n\n return (options.fetch ?? globalThis.fetch)(input, {\n ...init,\n headers,\n });\n }\n : options.fetch;\n\n const getResourceName = () =>\n loadSetting({\n settingValue: options.resourceName,\n settingName: 'resourceName',\n environmentVariableName: 'AZURE_RESOURCE_NAME',\n description: 'Azure OpenAI resource name',\n });\n\n const apiVersion = options.apiVersion ?? 'v1';\n const {\n isAzureOpenAI,\n isFoundryProject,\n isVersioned: isAzureOpenAIVersioned,\n } = getAzureOpenAIBaseURLInfo(options.baseURL);\n\n const url = ({ path, modelId }: { path: string; modelId: string }) => {\n const baseUrlPrefix = withoutTrailingSlash(\n options.baseURL ?? `https://${getResourceName()}.openai.azure.com/openai`,\n );\n\n let fullUrl: URL;\n if (options.useDeploymentBasedUrls) {\n // Use deployment-based format for compatibility with certain Azure OpenAI models\n fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path}`);\n } else if (!isAzureOpenAI || isAzureOpenAIVersioned) {\n // Custom gateways can own Azure routing and versioning themselves.\n // Complete Azure OpenAI v1 URLs also own their versioning.\n fullUrl = new URL(`${baseUrlPrefix}${path}`);\n } else {\n // Use v1 API format - no deployment ID in URL\n fullUrl = new URL(`${baseUrlPrefix}/v1${path}`);\n }\n\n if (\n options.useDeploymentBasedUrls ||\n (isAzureOpenAI && !isAzureOpenAIVersioned && !isFoundryProject)\n ) {\n fullUrl.searchParams.set('api-version', apiVersion);\n }\n\n return fullUrl.toString();\n };\n\n const createChatModel = (deploymentName: string) =>\n new OpenAIChatLanguageModel(deploymentName, {\n provider: 'azure.chat',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const createDeepSeekModel = (deploymentName: string) =>\n new DeepSeekChatLanguageModel(deploymentName, {\n provider: 'azure.deepseek',\n url,\n headers: getHeaders,\n fetch,\n supportsPenaltySampling: true,\n supportsThinking: false,\n // json_object with thinking enabled makes Azure return the JSON in reasoning_content with empty content\n supportsStructuredOutputs: true,\n });\n\n const createCompletionModel = (modelId: string) =>\n new OpenAICompletionLanguageModel(modelId, {\n provider: 'azure.completion',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const createEmbeddingModel = (modelId: string) =>\n new OpenAIEmbeddingModel(modelId, {\n provider: 'azure.embeddings',\n headers: getHeaders,\n url,\n fetch,\n });\n\n const createResponsesModel = (modelId: string) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'azure.responses',\n url,\n headers: getHeaders,\n fetch,\n explicitMessageItemType: isFoundryProject,\n fileIdPrefixes: ['assistant-'],\n });\n\n const createImageModel = (modelId: string) =>\n new OpenAIImageModel(modelId, {\n provider: 'azure.image',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const createTranscriptionModel = (modelId: string) =>\n new AzureTranscriptionModel(\n modelId,\n options,\n new OpenAITranscriptionModel(modelId, {\n provider: 'azure.transcription',\n url,\n headers: getHeaders,\n fetch,\n }),\n new AzureSpeechTranscriptionModel(modelId, {\n url: () =>\n `${\n withoutTrailingSlash(options.speechBaseURL) ??\n `https://${getResourceName()}.cognitiveservices.azure.com`\n }/speechtotext/transcriptions:transcribe?api-version=2025-10-15`,\n headers: () => getHeaders('speech'),\n fetch,\n }),\n );\n\n const createSpeechModel = (modelId: string) =>\n new OpenAISpeechModel(modelId, {\n provider: 'azure.speech',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const provider = function (deploymentId: string) {\n if (new.target) {\n throw new Error(\n 'The Azure OpenAI model function cannot be called with the new keyword.',\n );\n }\n\n return createResponsesModel(deploymentId);\n };\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createResponsesModel;\n provider.chat = createChatModel;\n provider.deepseek = createDeepSeekModel;\n provider.completion = createCompletionModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.responses = createResponsesModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.tools = azureOpenaiTools;\n return provider;\n}\n\n/**\n * Default Azure OpenAI provider instance.\n */\nexport const azure = createAzure();\n\n// Resolves the API per request: providerOptions also reach this model via Gateway.\nclass AzureTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.transcription';\n\n constructor(\n readonly modelId: string,\n private readonly config: AzureOpenAIProviderSettings,\n private readonly openai: OpenAITranscriptionModel,\n private readonly speech: AzureSpeechTranscriptionModel,\n ) {}\n\n async doGenerate(options: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const { api, ...speechOptions } = await this.getOptions(\n options.providerOptions,\n );\n if (api === 'speech') {\n return this.speech.doGenerate(options, speechOptions);\n }\n\n const result = await this.openai.doGenerate(options);\n return {\n ...result,\n warnings: [\n ...result.warnings,\n ...Object.keys(speechOptions).map(key => ({\n type: 'unsupported' as const,\n feature: `providerOptions.azure.${key}`,\n details: 'This option requires the Azure Speech API.',\n })),\n ],\n };\n }\n\n private async getOptions(\n providerOptions: Parameters<\n TranscriptionModelV3['doGenerate']\n >[0]['providerOptions'],\n ) {\n const options = await parseProviderOptions({\n provider: 'azure',\n providerOptions,\n schema: azureTranscriptionModelOptions,\n });\n return {\n ...options,\n api:\n options?.api ?? (isMAITranscribe2(this.modelId) ? 'speech' : 'openai'),\n };\n }\n}\n","import {\n codeInterpreter,\n fileSearch,\n imageGeneration,\n webSearch,\n webSearchPreview,\n} from '@ai-sdk/openai/internal';\n\nexport const azureOpenaiTools: {\n codeInterpreter: typeof codeInterpreter;\n fileSearch: typeof fileSearch;\n imageGeneration: typeof imageGeneration;\n webSearch: typeof webSearch;\n webSearchPreview: typeof webSearchPreview;\n} = {\n codeInterpreter,\n fileSearch,\n imageGeneration,\n webSearch,\n webSearchPreview,\n};\n","import type { TranscriptionModelV3 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n mediaTypeToExtension,\n postFormDataToApi,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { AzureTranscriptionProviderMetadata } from './azure-transcription-provider-metadata';\nimport type { AzureTranscriptionModelSpeechOptions } from './azure-speech-transcription-model-options';\nimport { isMAITranscribe2 } from './azure-transcription-model-options';\n\nexport class AzureSpeechTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.transcription';\n\n constructor(\n readonly modelId: string,\n private readonly config: {\n url: () => string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n },\n ) {}\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n azureOptions: AzureTranscriptionModelSpeechOptions = {},\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const timestamp = new Date();\n const formData = new FormData();\n formData.append(\n 'audio',\n new Blob(\n [\n typeof options.audio === 'string'\n ? convertBase64ToUint8Array(options.audio)\n : options.audio,\n ],\n { type: options.mediaType },\n ),\n `audio.${mediaTypeToExtension(options.mediaType)}`,\n );\n formData.append(\n 'definition',\n JSON.stringify({\n enhancedMode: {\n enabled: true,\n model: isMAITranscribe2(this.modelId)\n ? 'MAI-Transcribe-2'\n : this.modelId,\n modelOptions: {\n timestamps: azureOptions.timestamps ?? 'segment',\n transcribeStyle: azureOptions.transcribeStyle,\n },\n },\n locales: azureOptions.locales,\n diarization: azureOptions.diarization,\n phraseList: azureOptions.phraseList,\n }),\n );\n\n const { value, rawValue, responseHeaders } = await postFormDataToApi({\n url: this.config.url(),\n headers: combineHeaders(this.config.headers(), options.headers),\n formData,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.union([\n z.object({ error: z.object({ message: z.string() }) }),\n z.object({ message: z.string() }),\n ]),\n errorToMessage: data =>\n 'error' in data ? data.error.message : data.message,\n }),\n successfulResponseHandler: createJsonResponseHandler(responseSchema),\n });\n\n const phrases = value.phrases ?? [];\n // Consider every reported locale so mixed results (e.g. en + fil) are not\n // collapsed to one language; only ISO-639-1 codes are reported.\n const languages = new Set(\n phrases.flatMap(phrase =>\n phrase.locale ? [phrase.locale.split('-')[0].toLowerCase()] : [],\n ),\n );\n const [language] = languages;\n const reportedLanguage =\n languages.size === 1 && /^[a-z]{2}$/.test(language)\n ? language\n : undefined;\n\n return {\n text: value.combinedPhrases.map(phrase => phrase.text).join(' '),\n segments: phrases.flatMap(phrase =>\n phrase.offsetMilliseconds != null && phrase.durationMilliseconds != null\n ? [\n {\n text: phrase.text,\n startSecond: phrase.offsetMilliseconds / 1000,\n endSecond:\n (phrase.offsetMilliseconds + phrase.durationMilliseconds) /\n 1000,\n },\n ]\n : [],\n ),\n language: reportedLanguage,\n durationInSeconds:\n value.durationMilliseconds != null\n ? value.durationMilliseconds / 1000\n : undefined,\n warnings: [],\n providerMetadata: {\n azure: { phrases },\n } satisfies AzureTranscriptionProviderMetadata,\n response: {\n timestamp,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst responseSchema = z.object({\n combinedPhrases: z.array(z.object({ text: z.string() })),\n durationMilliseconds: z.number().nullish(),\n phrases: z\n .array(\n z.object({\n text: z.string(),\n offsetMilliseconds: z.number().nullish(),\n durationMilliseconds: z.number().nullish(),\n locale: z.string().nullish(),\n speaker: z.number().nullish(),\n confidence: z.number().nullish(),\n words: z\n .array(\n z.object({\n text: z.string(),\n offsetMilliseconds: z.number().nullish(),\n durationMilliseconds: z.number().nullish(),\n }),\n )\n .nullish(),\n }),\n )\n .nullish(),\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { azureSpeechTranscriptionModelOptionsShape } from './azure-speech-transcription-model-options';\n\nexport const azureTranscriptionModelOptions = lazySchema(() =>\n zodSchema(\n z.strictObject({\n /**\n * API to use. Defaults to Speech for MAI-Transcribe-2, OpenAI otherwise.\n */\n api: z.enum(['openai', 'speech']).optional(),\n ...azureSpeechTranscriptionModelOptionsShape(),\n }),\n ),\n);\n\nexport type AzureTranscriptionModelOptions = InferSchema<\n typeof azureTranscriptionModelOptions\n>;\n\nexport function isMAITranscribe2(modelId: string): boolean {\n return modelId.toLowerCase() === 'mai-transcribe-2';\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Strict objects reject unknown keys (e.g. `diarization.maxSpeakers`, which\n// MAI-Transcribe-2 does not support) instead of silently dropping them.\nexport const azureSpeechTranscriptionModelOptionsShape = () => ({\n /**\n * Timing granularity. Defaults to `segment` so that transcription results\n * include timed segments (Azure's own default is `none`).\n */\n timestamps: z.enum(['word', 'segment', 'none']).optional(),\n\n /**\n * `verbatim` keeps fillers and false starts, `clean` removes them.\n * Azure defaults to `verbatim`.\n */\n transcribeStyle: z.enum(['verbatim', 'clean']).optional(),\n\n /**\n * Forces a single language, e.g. `['en']`. Omit for automatic language\n * detection and code switching.\n */\n locales: z.array(z.string()).length(1).optional(),\n\n /**\n * Speaker diarization. Speaker IDs are available in provider metadata.\n */\n diarization: z.strictObject({ enabled: z.boolean() }).optional(),\n\n /**\n * Keyword biasing for names and domain terminology.\n */\n phraseList: z.strictObject({ phrases: z.array(z.string()) }).optional(),\n});\n\nexport const azureSpeechTranscriptionModelOptions = lazySchema(() =>\n zodSchema(z.strictObject(azureSpeechTranscriptionModelOptionsShape())),\n);\n\nexport type AzureTranscriptionModelSpeechOptions = InferSchema<\n typeof azureSpeechTranscriptionModelOptions\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","lazySchema","zodSchema","z","lazySchema","zodSchema","z","z","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/azure-openai-provider.ts","../src/azure-openai-tools.ts","../src/azure-speech-model-options.ts","../src/azure-speech-speech-model-options.ts","../src/azure-speech-speech-model.ts","../src/azure-speech-transcription-model.ts","../src/azure-transcription-model-options.ts","../src/azure-speech-transcription-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n OpenAIChatLanguageModel,\n OpenAICompletionLanguageModel,\n OpenAIEmbeddingModel,\n OpenAIImageModel,\n OpenAIResponsesLanguageModel,\n OpenAISpeechModel,\n OpenAITranscriptionModel,\n} from '@ai-sdk/openai/internal';\nimport { DeepSeekChatLanguageModel } from '@ai-sdk/deepseek/internal';\nimport {\n InvalidArgumentError,\n type EmbeddingModelV3,\n type LanguageModelV3,\n type ProviderV3,\n type ImageModelV3,\n type SharedV3Warning,\n type SpeechModelV3,\n type TranscriptionModelV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n loadSetting,\n normalizeHeaders,\n parseProviderOptions,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { azureOpenaiTools } from './azure-openai-tools';\nimport {\n azureSpeechModelOptions,\n getMAIVoiceModel,\n} from './azure-speech-model-options';\nimport { AzureSpeechSpeechModel } from './azure-speech-speech-model';\nimport { AzureSpeechTranscriptionModel } from './azure-speech-transcription-model';\nimport {\n azureTranscriptionModelOptions,\n getMAITranscribeModel,\n} from './azure-transcription-model-options';\nimport { VERSION } from './version';\n\nexport interface AzureOpenAIProvider extends ProviderV3 {\n (deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI responses API model for text generation.\n */\n languageModel(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI chat model for text generation.\n */\n chat(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure-hosted DeepSeek chat model for text generation.\n */\n deepseek(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI responses API model for text generation.\n */\n responses(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI completion model for text generation.\n */\n completion(deploymentId: string): LanguageModelV3;\n\n /**\n * Creates an Azure OpenAI model for text embeddings.\n */\n embedding(deploymentId: string): EmbeddingModelV3;\n\n /**\n * Creates an Azure OpenAI model for text embeddings.\n */\n embeddingModel(deploymentId: string): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embedding` instead.\n */\n textEmbedding(deploymentId: string): EmbeddingModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(deploymentId: string): EmbeddingModelV3;\n\n /**\n * Creates an Azure OpenAI DALL-E model for image generation.\n */\n image(deploymentId: string): ImageModelV3;\n\n /**\n * Creates an Azure OpenAI DALL-E model for image generation.\n */\n imageModel(deploymentId: string): ImageModelV3;\n\n /**\n * Creates an Azure transcription model. MAI-Transcribe models use the Speech\n * API by default; other IDs use OpenAI. Override with providerOptions.azure.api.\n */\n transcription(deploymentId: string): TranscriptionModelV3;\n\n /**\n * Creates an Azure transcription model. Alias of `transcription`.\n */\n transcriptionModel(deploymentId: string): TranscriptionModelV3;\n\n /**\n * Creates an Azure speech generation model. MAI-Voice models use the Speech\n * API by default; other IDs use OpenAI. Override with providerOptions.azure.api.\n */\n speech(deploymentId: string): SpeechModelV3;\n\n /**\n * Creates an Azure speech generation model. Alias of `speech`.\n */\n speechModel(deploymentId: string): SpeechModelV3;\n\n /**\n * AzureOpenAI-specific tools.\n */\n tools: typeof azureOpenaiTools;\n}\n\nexport interface AzureOpenAIProviderSettings {\n /**\n * Name of the Azure OpenAI resource. Either this or `baseURL` can be used.\n *\n * The resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/v1{path}`.\n * It must be a single DNS label (letters, digits, and hyphens).\n */\n resourceName?: string;\n\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers. Either this or `resourceName` can be used.\n * When a baseURL is provided, the resourceName is ignored.\n *\n * With an unversioned Azure OpenAI baseURL, the resolved URL is `{baseURL}/v1{path}`.\n * Azure OpenAI base URLs that already end in `/openai/v1` are used as-is.\n * With a non-Azure custom gateway baseURL, the resolved URL is `{baseURL}{path}`.\n */\n baseURL?: string;\n\n /**\n * API key for authenticating requests.\n */\n apiKey?: string;\n\n /**\n * A function that returns an access token for Microsoft Entra\n * (formerly known as Azure Active Directory), which will be invoked\n * on every request.\n */\n tokenProvider?: (() => Promise<string>) | undefined;\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 api version to use. Defaults to `v1`.\n * Complete v1 base URLs are used as-is.\n */\n apiVersion?: string;\n\n /**\n * Use deployment-based URLs for specific model types. Set to true to use legacy deployment format:\n * `{baseURL}/deployments/{deploymentId}{path}?api-version={apiVersion}` instead of\n * `{baseURL}/v1{path}?api-version={apiVersion}`.\n */\n useDeploymentBasedUrls?: boolean;\n\n /**\n * URL prefix for Azure Speech (MAI-Transcribe transcription and MAI-Voice\n * speech), e.g. a regional endpoint like\n * `https://eastus.api.cognitive.microsoft.com`.\n * Defaults to `https://{resourceName}.cognitiveservices.azure.com`.\n * Speech requests do not use `baseURL` or `apiVersion`.\n */\n speechBaseURL?: string;\n}\n\nfunction getAzureOpenAIBaseURLInfo(baseURL: string | undefined) {\n if (baseURL == null) {\n return {\n isAzureOpenAI: true,\n isFoundryProject: false,\n isVersioned: false,\n };\n }\n\n const url = new URL(baseURL);\n const hostname = url.hostname;\n const isAzureOpenAI =\n hostname.endsWith('.openai.azure.com') ||\n hostname.endsWith('.services.ai.azure.com') ||\n hostname.endsWith('.cognitiveservices.azure.com');\n const pathname = url.pathname.replace(/\\/+$/, '');\n\n return {\n isAzureOpenAI,\n isFoundryProject:\n hostname.endsWith('.services.ai.azure.com') &&\n pathname.startsWith('/api/projects/'),\n isVersioned: isAzureOpenAI && pathname.toLowerCase().endsWith('/openai/v1'),\n };\n}\n\n/**\n * Create an Azure OpenAI provider instance.\n */\nexport function createAzure(\n options: AzureOpenAIProviderSettings = {},\n): AzureOpenAIProvider {\n const tokenProvider = options.tokenProvider;\n\n if (options.apiKey && tokenProvider) {\n throw new InvalidArgumentError({\n argument: 'apiKey/tokenProvider',\n message:\n 'Both apiKey and tokenProvider were provided. Please use only one authentication method.',\n });\n }\n\n const getHeaders = (api: 'openai' | 'speech' = 'openai') => {\n const authHeaders = tokenProvider\n ? {}\n : {\n [api === 'speech' ? 'Ocp-Apim-Subscription-Key' : 'api-key']:\n loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AZURE_API_KEY',\n description: api === 'speech' ? 'Azure Speech' : 'Azure OpenAI',\n }),\n };\n\n return withUserAgentSuffix(\n {\n ...authHeaders,\n ...options.headers,\n },\n `ai-sdk/azure/${VERSION}`,\n );\n };\n\n const fetch: FetchFunction | undefined = tokenProvider\n ? async (input, init) => {\n const headers = normalizeHeaders(init?.headers);\n\n if (headers.authorization == null) {\n headers.authorization = `Bearer ${await tokenProvider()}`;\n }\n\n return (options.fetch ?? globalThis.fetch)(input, {\n ...init,\n headers,\n });\n }\n : options.fetch;\n\n const getResourceName = () => {\n const resourceName = loadSetting({\n settingValue: options.resourceName,\n settingName: 'resourceName',\n environmentVariableName: 'AZURE_RESOURCE_NAME',\n description: 'Azure OpenAI resource name',\n });\n\n // The resource name becomes part of the request host, so only a DNS label\n // is accepted (e.g. `user@internal:8080/#` would rewrite the host).\n if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(resourceName)) {\n throw new InvalidArgumentError({\n argument: 'resourceName',\n message:\n 'Invalid Azure resource name. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',\n });\n }\n\n return resourceName;\n };\n\n const apiVersion = options.apiVersion ?? 'v1';\n const {\n isAzureOpenAI,\n isFoundryProject,\n isVersioned: isAzureOpenAIVersioned,\n } = getAzureOpenAIBaseURLInfo(options.baseURL);\n\n const url = ({ path, modelId }: { path: string; modelId: string }) => {\n const baseUrlPrefix = withoutTrailingSlash(\n options.baseURL ?? `https://${getResourceName()}.openai.azure.com/openai`,\n );\n\n let fullUrl: URL;\n if (options.useDeploymentBasedUrls) {\n // Use deployment-based format for compatibility with certain Azure OpenAI models\n fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path}`);\n } else if (!isAzureOpenAI || isAzureOpenAIVersioned) {\n // Custom gateways can own Azure routing and versioning themselves.\n // Complete Azure OpenAI v1 URLs also own their versioning.\n fullUrl = new URL(`${baseUrlPrefix}${path}`);\n } else {\n // Use v1 API format - no deployment ID in URL\n fullUrl = new URL(`${baseUrlPrefix}/v1${path}`);\n }\n\n if (\n options.useDeploymentBasedUrls ||\n (isAzureOpenAI && !isAzureOpenAIVersioned && !isFoundryProject)\n ) {\n fullUrl.searchParams.set('api-version', apiVersion);\n }\n\n return fullUrl.toString();\n };\n\n const createChatModel = (deploymentName: string) =>\n new OpenAIChatLanguageModel(deploymentName, {\n provider: 'azure.chat',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const createDeepSeekModel = (deploymentName: string) =>\n new DeepSeekChatLanguageModel(deploymentName, {\n provider: 'azure.deepseek',\n url,\n headers: getHeaders,\n fetch,\n supportsPenaltySampling: true,\n supportsThinking: false,\n // json_object with thinking enabled makes Azure return the JSON in reasoning_content with empty content\n supportsStructuredOutputs: true,\n });\n\n const createCompletionModel = (modelId: string) =>\n new OpenAICompletionLanguageModel(modelId, {\n provider: 'azure.completion',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const createEmbeddingModel = (modelId: string) =>\n new OpenAIEmbeddingModel(modelId, {\n provider: 'azure.embeddings',\n headers: getHeaders,\n url,\n fetch,\n });\n\n const createResponsesModel = (modelId: string) =>\n new OpenAIResponsesLanguageModel(modelId, {\n provider: 'azure.responses',\n url,\n headers: getHeaders,\n fetch,\n explicitMessageItemType: isFoundryProject,\n fileIdPrefixes: ['assistant-'],\n });\n\n const createImageModel = (modelId: string) =>\n new OpenAIImageModel(modelId, {\n provider: 'azure.image',\n url,\n headers: getHeaders,\n fetch,\n });\n\n const speechBaseURL = () =>\n withoutTrailingSlash(options.speechBaseURL) ??\n `https://${getResourceName()}.cognitiveservices.azure.com`;\n\n const createTranscriptionModel = (modelId: string) =>\n new AzureTranscriptionModel(\n modelId,\n options,\n new OpenAITranscriptionModel(modelId, {\n provider: 'azure.transcription',\n url,\n headers: getHeaders,\n fetch,\n }),\n new AzureSpeechTranscriptionModel(modelId, {\n url: () =>\n `${speechBaseURL()}/speechtotext/transcriptions:transcribe?api-version=2025-10-15`,\n headers: () => getHeaders('speech'),\n fetch,\n }),\n );\n\n const createSpeechModel = (modelId: string) =>\n new AzureSpeechModel(\n modelId,\n new OpenAISpeechModel(modelId, {\n provider: 'azure.speech',\n url,\n headers: getHeaders,\n fetch,\n }),\n new AzureSpeechSpeechModel(modelId, {\n url: () => `${speechBaseURL()}/tts/cognitiveservices/v1`,\n headers: () => getHeaders('speech'),\n fetch,\n }),\n );\n\n const provider = function (deploymentId: string) {\n if (new.target) {\n throw new Error(\n 'The Azure OpenAI model function cannot be called with the new keyword.',\n );\n }\n\n return createResponsesModel(deploymentId);\n };\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createResponsesModel;\n provider.chat = createChatModel;\n provider.deepseek = createDeepSeekModel;\n provider.completion = createCompletionModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.textEmbedding = createEmbeddingModel;\n provider.textEmbeddingModel = createEmbeddingModel;\n provider.image = createImageModel;\n provider.imageModel = createImageModel;\n provider.responses = createResponsesModel;\n provider.transcription = createTranscriptionModel;\n provider.transcriptionModel = createTranscriptionModel;\n provider.speech = createSpeechModel;\n provider.speechModel = createSpeechModel;\n provider.tools = azureOpenaiTools;\n return provider;\n}\n\n/**\n * Default Azure OpenAI provider instance.\n */\nexport const azure = createAzure();\n\n// Resolves the API per request: providerOptions also reach this model via Gateway.\nclass AzureTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.transcription';\n\n constructor(\n readonly modelId: string,\n private readonly config: AzureOpenAIProviderSettings,\n private readonly openai: OpenAITranscriptionModel,\n private readonly speech: AzureSpeechTranscriptionModel,\n ) {}\n\n async doGenerate(options: Parameters<TranscriptionModelV3['doGenerate']>[0]) {\n const { api, ...speechOptions } = await this.getOptions(\n options.providerOptions,\n );\n if (api === 'speech') {\n return this.speech.doGenerate(options, speechOptions);\n }\n\n const result = await this.openai.doGenerate(options);\n return {\n ...result,\n warnings: [\n ...result.warnings,\n ...Object.keys(speechOptions).map(key => ({\n type: 'unsupported' as const,\n feature: `providerOptions.azure.${key}`,\n details: 'This option requires the Azure Speech API.',\n })),\n ],\n };\n }\n\n private async getOptions(\n providerOptions: Parameters<\n TranscriptionModelV3['doGenerate']\n >[0]['providerOptions'],\n ) {\n const options = await parseProviderOptions({\n provider: 'azure',\n providerOptions,\n schema: azureTranscriptionModelOptions,\n });\n return {\n ...options,\n api:\n options?.api ??\n (getMAITranscribeModel(this.modelId) ? 'speech' : 'openai'),\n };\n }\n}\n\n// Resolves the API per request: providerOptions also reach this model via Gateway.\nclass AzureSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.speech';\n\n constructor(\n readonly modelId: string,\n private readonly openai: OpenAISpeechModel,\n private readonly speech: AzureSpeechSpeechModel,\n ) {}\n\n async doGenerate(options: Parameters<SpeechModelV3['doGenerate']>[0]) {\n const { api, ...speechOptions } =\n (await parseProviderOptions({\n provider: 'azure',\n providerOptions: options.providerOptions,\n schema: azureSpeechModelOptions,\n })) ?? {};\n if (\n (api ?? (getMAIVoiceModel(this.modelId) ? 'speech' : 'openai')) ===\n 'speech'\n ) {\n return this.speech.doGenerate(options, speechOptions);\n }\n\n const result = await this.openai.doGenerate(options);\n return {\n ...result,\n warnings: [\n ...result.warnings,\n ...Object.entries(speechOptions)\n .filter(([, value]) => value !== undefined)\n .map(\n ([key]): SharedV3Warning => ({\n type: 'unsupported',\n feature: `providerOptions.azure.${key}`,\n details: 'This option requires the Azure Speech API.',\n }),\n ),\n ],\n };\n }\n}\n","import {\n codeInterpreter,\n fileSearch,\n imageGeneration,\n webSearch,\n webSearchPreview,\n} from '@ai-sdk/openai/internal';\n\nexport const azureOpenaiTools: {\n codeInterpreter: typeof codeInterpreter;\n fileSearch: typeof fileSearch;\n imageGeneration: typeof imageGeneration;\n webSearch: typeof webSearch;\n webSearchPreview: typeof webSearchPreview;\n} = {\n codeInterpreter,\n fileSearch,\n imageGeneration,\n webSearch,\n webSearchPreview,\n};\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { azureSpeechSpeechModelOptionsShape } from './azure-speech-speech-model-options';\n\nexport const azureSpeechModelOptions = lazySchema(() =>\n zodSchema(\n z.strictObject({\n /**\n * API to use. Defaults to Speech for MAI-Voice models, OpenAI otherwise.\n */\n api: z.enum(['openai', 'speech']).optional(),\n ...azureSpeechSpeechModelOptionsShape(),\n }),\n ),\n);\n\nexport type AzureSpeechModelOptions = InferSchema<\n typeof azureSpeechModelOptions\n>;\n\n// Azure voice-name suffixes by lowercase model ID.\nconst maiVoiceModels = new Map([\n ['mai-voice-2-flash', 'MAI-Voice-2-Flash'],\n ['mai-voice-2', 'MAI-Voice-2'],\n]);\n\nexport function getMAIVoiceModel(modelId: string) {\n return maiVoiceModels.get(modelId.toLowerCase());\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const azureSpeechSpeechModelOptionsShape = () => ({\n /**\n * Speaking style applied with `mstts:express-as`, e.g. `excited` or\n * `whispering`. Supported styles vary by voice.\n */\n style: z.string().min(1).optional(),\n\n /**\n * Intensity of `style`, from 0.01 to 2. Azure defaults to 1.\n */\n styleDegree: z.number().min(0.01).max(2).optional(),\n});\n\nexport const azureSpeechSpeechModelOptions = lazySchema(() =>\n zodSchema(z.strictObject(azureSpeechSpeechModelOptionsShape())),\n);\n\nexport type AzureSpeechModelSpeechOptions = InferSchema<\n typeof azureSpeechSpeechModelOptions\n>;\n","import {\n APICallError,\n type SharedV3Warning,\n type SpeechModelV3,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createBinaryResponseHandler,\n extractResponseHeaders,\n postToApi,\n safeParseJSON,\n type FetchFunction,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { getMAIVoiceModel } from './azure-speech-model-options';\nimport type { AzureSpeechModelSpeechOptions } from './azure-speech-speech-model-options';\n\nconst DEFAULT_VOICE = 'en-US-Harper';\n\n// Default voice per ISO 639-1 language; available on MAI-Voice-2 and\n// MAI-Voice-2-Flash.\nconst DEFAULT_VOICES = new Map([\n ['de', 'de-DE-Mia'],\n ['en', DEFAULT_VOICE],\n ['es', 'es-MX-Valeria'],\n ['fr', 'fr-FR-Soleil'],\n ['hi', 'hi-IN-Kavya'],\n ['hu', 'hu-HU-Lilla'],\n ['it', 'it-IT-Rosa'],\n ['ko', 'ko-KR-Haena'],\n ['nl', 'nl-NL-Fleur'],\n ['pt', 'pt-BR-Luana'],\n ['ro', 'ro-RO-Elena'],\n ['ru', 'ru-RU-Masha'],\n ['th', 'th-TH-Krit'],\n ['tr', 'tr-TR-Elif'],\n ['zh', 'zh-CN-Mei'],\n]);\nconst DEFAULT_OUTPUT_FORMAT = 'audio-24khz-160kbitrate-mono-mp3';\n\n// Shorthand formats for `outputFormat`; other X-Microsoft-OutputFormat values\n// (e.g. `audio-48khz-192kbitrate-mono-mp3`) are passed through unchanged.\nconst OUTPUT_FORMATS = new Map([\n ['mp3', DEFAULT_OUTPUT_FORMAT],\n ['opus', 'ogg-24khz-16bit-mono-opus'],\n ['pcm', 'raw-24khz-16bit-mono-pcm'],\n ['wav', 'riff-24khz-16bit-mono-pcm'],\n]);\nconst NATIVE_OUTPUT_FORMAT =\n /^(?:amr|audio|g722|ogg|raw|riff|webm)-[a-z0-9-]+$/;\n\n/**\n * Azure Speech text to speech with SSML. The model is appended to the voice\n * name, e.g. `en-US-Harper:MAI-Voice-2`.\n */\nexport class AzureSpeechSpeechModel implements SpeechModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.speech';\n\n constructor(\n readonly modelId: string,\n private readonly config: {\n url: () => string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n _internal?: { currentDate?: () => Date };\n },\n ) {}\n\n async doGenerate(\n options: Parameters<SpeechModelV3['doGenerate']>[0],\n azureOptions: AzureSpeechModelSpeechOptions = {},\n ): Promise<Awaited<ReturnType<SpeechModelV3['doGenerate']>>> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const warnings: SharedV3Warning[] = [];\n const { style, styleDegree } = azureOptions;\n\n if (options.instructions != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'instructions',\n details: 'Use providerOptions.azure.style to control speaking style.',\n });\n }\n const { voice, languageWarning } = resolveVoice(\n options.voice,\n options.language,\n );\n if (languageWarning != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'language',\n details: languageWarning,\n });\n }\n if (styleDegree != null && style == null) {\n warnings.push({\n type: 'unsupported',\n feature: 'providerOptions.azure.styleDegree',\n details: 'styleDegree requires style.',\n });\n }\n\n let outputFormat = DEFAULT_OUTPUT_FORMAT;\n if (options.outputFormat != null) {\n const format = options.outputFormat.toLowerCase();\n const shorthand = OUTPUT_FORMATS.get(format);\n if (shorthand != null) {\n outputFormat = shorthand;\n } else if (NATIVE_OUTPUT_FORMAT.test(format)) {\n outputFormat = format;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'outputFormat',\n details: `Unsupported output format: ${options.outputFormat}. Using mp3 instead.`,\n });\n }\n }\n\n const ssml = buildSsml({\n text: options.text,\n voiceName: voice.includes(':')\n ? voice\n : `${voice}:${getMAIVoiceModel(this.modelId) ?? this.modelId}`,\n locale: /^([a-z]{2,3}-[a-z]{2,4})-/i.exec(voice)?.[1],\n speed: options.speed,\n style,\n styleDegree: style != null ? styleDegree : undefined,\n });\n\n const {\n value: audio,\n responseHeaders,\n rawValue,\n } = await postToApi({\n url: this.config.url(),\n headers: combineHeaders(\n this.config.headers(),\n {\n 'Content-Type': 'application/ssml+xml',\n 'X-Microsoft-OutputFormat': outputFormat,\n },\n options.headers,\n ),\n body: { content: ssml, values: ssml },\n failedResponseHandler,\n successfulResponseHandler: createBinaryResponseHandler(),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n audio,\n warnings,\n request: { body: ssml },\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nfunction buildSsml({\n text,\n voiceName,\n locale = 'en-US',\n speed,\n style,\n styleDegree,\n}: {\n text: string;\n voiceName: string;\n locale?: string;\n speed?: number;\n style?: string;\n styleDegree?: number;\n}) {\n let content = escapeXml(text);\n if (speed != null) {\n content = `<prosody rate=\"${speed}\">${content}</prosody>`;\n }\n if (style != null) {\n const degree = styleDegree != null ? ` styledegree=\"${styleDegree}\"` : '';\n content = `<mstts:express-as style=\"${escapeXml(style)}\"${degree}>${content}</mstts:express-as>`;\n }\n return (\n `<speak version=\"1.0\" xmlns=\"http://www.w3.org/2001/10/synthesis\" ` +\n `xmlns:mstts=\"http://www.w3.org/2001/mstts\" xml:lang=\"${escapeXml(locale)}\">` +\n `<voice name=\"${escapeXml(voiceName)}\">${content}</voice></speak>`\n );\n}\n\nconst XML_ESCAPES: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n};\n\nfunction escapeXml(value: string) {\n return value.replace(/[&<>\"']/g, char => XML_ESCAPES[char]);\n}\n\n// Uses the language's default voice when no voice is set. An explicit voice\n// wins, and its locale selects the language.\nfunction resolveVoice(\n voice: string | undefined,\n language: string | undefined,\n): { voice: string; languageWarning?: string } {\n const code = language ? language.split('-')[0].toLowerCase() : undefined;\n if (voice == null) {\n if (code == null) return { voice: DEFAULT_VOICE };\n if (code === 'auto') {\n return {\n voice: DEFAULT_VOICE,\n languageWarning: `Automatic language detection is not supported. ${DEFAULT_VOICE} was used.`,\n };\n }\n const defaultVoice = DEFAULT_VOICES.get(code);\n return defaultVoice != null\n ? { voice: defaultVoice }\n : {\n voice: DEFAULT_VOICE,\n languageWarning: `No default MAI voice for language \"${language}\". ${DEFAULT_VOICE} was used.`,\n };\n }\n const voiceLanguage = /^([a-z]{2,3})-[a-z]{2,4}-/i\n .exec(voice)?.[1]\n ?.toLowerCase();\n return code != null &&\n code !== 'auto' &&\n voiceLanguage != null &&\n code !== voiceLanguage\n ? {\n voice,\n languageWarning: `The voice ${voice} selects the language. Language \"${language}\" was ignored.`,\n }\n : { voice };\n}\n\nconst errorSchema = z.object({\n error: z.object({ message: z.string() }),\n});\n\n// Azure Speech answers invalid requests (unknown voice, style, or output\n// format) with an empty 400 body.\nconst failedResponseHandler: ResponseHandler<APICallError> = async ({\n response,\n url,\n requestBodyValues,\n}) => {\n const responseHeaders = extractResponseHeaders(response);\n const responseBody = await response.text();\n const parsed = await safeParseJSON({\n text: responseBody,\n schema: errorSchema,\n });\n\n const message = parsed.success\n ? parsed.value.error.message\n : response.status === 400\n ? 'Azure Speech request failed with status 400. Check the voice name, style, and output format.'\n : `Azure Speech request failed with status ${response.status}.`;\n\n return {\n responseHeaders,\n value: new APICallError({\n message,\n url,\n requestBodyValues,\n statusCode: response.status,\n responseHeaders,\n responseBody,\n }),\n };\n};\n","import type { TranscriptionModelV3 } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertBase64ToUint8Array,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n mediaTypeToExtension,\n postFormDataToApi,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { AzureTranscriptionProviderMetadata } from './azure-transcription-provider-metadata';\nimport type { AzureTranscriptionModelSpeechOptions } from './azure-speech-transcription-model-options';\nimport { getMAITranscribeModel } from './azure-transcription-model-options';\n\nexport class AzureSpeechTranscriptionModel implements TranscriptionModelV3 {\n readonly specificationVersion = 'v3';\n readonly provider = 'azure.transcription';\n\n constructor(\n readonly modelId: string,\n private readonly config: {\n url: () => string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n },\n ) {}\n\n async doGenerate(\n options: Parameters<TranscriptionModelV3['doGenerate']>[0],\n azureOptions: AzureTranscriptionModelSpeechOptions = {},\n ): Promise<Awaited<ReturnType<TranscriptionModelV3['doGenerate']>>> {\n const timestamp = new Date();\n const maiModel = getMAITranscribeModel(this.modelId);\n const formData = new FormData();\n formData.append(\n 'audio',\n new Blob(\n [\n typeof options.audio === 'string'\n ? convertBase64ToUint8Array(options.audio)\n : options.audio,\n ],\n { type: options.mediaType },\n ),\n `audio.${mediaTypeToExtension(options.mediaType)}`,\n );\n formData.append(\n 'definition',\n JSON.stringify({\n enhancedMode: {\n enabled: true,\n model: maiModel?.name ?? this.modelId,\n modelOptions: {\n timestamps:\n azureOptions.timestamps ??\n (maiModel?.supportsTimestamps === false ? undefined : 'segment'),\n transcribeStyle: azureOptions.transcribeStyle,\n },\n },\n locales: azureOptions.locales,\n diarization: azureOptions.diarization,\n phraseList: azureOptions.phraseList,\n }),\n );\n\n const { value, rawValue, responseHeaders } = await postFormDataToApi({\n url: this.config.url(),\n headers: combineHeaders(this.config.headers(), options.headers),\n formData,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: z.union([\n z.object({ error: z.object({ message: z.string() }) }),\n z.object({ message: z.string() }),\n ]),\n errorToMessage: data =>\n 'error' in data ? data.error.message : data.message,\n }),\n successfulResponseHandler: createJsonResponseHandler(responseSchema),\n });\n\n const phrases = value.phrases ?? [];\n // Consider every reported locale so mixed results (e.g. en + fil) are not\n // collapsed to one language; only ISO-639-1 codes are reported.\n const languages = new Set(\n phrases.flatMap(phrase =>\n phrase.locale ? [phrase.locale.split('-')[0].toLowerCase()] : [],\n ),\n );\n const [language] = languages;\n const reportedLanguage =\n languages.size === 1 && /^[a-z]{2}$/.test(language)\n ? language\n : undefined;\n\n return {\n text: value.combinedPhrases.map(phrase => phrase.text).join(' '),\n segments: phrases.flatMap(phrase =>\n phrase.offsetMilliseconds != null && phrase.durationMilliseconds != null\n ? [\n {\n text: phrase.text,\n startSecond: phrase.offsetMilliseconds / 1000,\n endSecond:\n (phrase.offsetMilliseconds + phrase.durationMilliseconds) /\n 1000,\n },\n ]\n : [],\n ),\n language: reportedLanguage,\n durationInSeconds:\n value.durationMilliseconds != null\n ? value.durationMilliseconds / 1000\n : undefined,\n warnings: [],\n providerMetadata: {\n azure: { phrases },\n } satisfies AzureTranscriptionProviderMetadata,\n response: {\n timestamp,\n modelId: this.modelId,\n headers: responseHeaders,\n body: rawValue,\n },\n };\n }\n}\n\nconst responseSchema = z.object({\n combinedPhrases: z.array(z.object({ text: z.string() })),\n durationMilliseconds: z.number().nullish(),\n phrases: z\n .array(\n z.object({\n text: z.string(),\n offsetMilliseconds: z.number().nullish(),\n durationMilliseconds: z.number().nullish(),\n locale: z.string().nullish(),\n speaker: z.number().nullish(),\n confidence: z.number().nullish(),\n words: z\n .array(\n z.object({\n text: z.string(),\n offsetMilliseconds: z.number().nullish(),\n durationMilliseconds: z.number().nullish(),\n }),\n )\n .nullish(),\n }),\n )\n .nullish(),\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { azureSpeechTranscriptionModelOptionsShape } from './azure-speech-transcription-model-options';\n\nexport const azureTranscriptionModelOptions = lazySchema(() =>\n zodSchema(\n z.strictObject({\n /**\n * API to use. Defaults to Speech for MAI-Transcribe models, OpenAI otherwise.\n */\n api: z.enum(['openai', 'speech']).optional(),\n ...azureSpeechTranscriptionModelOptionsShape(),\n }),\n ),\n);\n\nexport type AzureTranscriptionModelOptions = InferSchema<\n typeof azureTranscriptionModelOptions\n>;\n\n// Azure Speech model names by lowercase model ID. MAI-Transcribe-1.5 only\n// accepts Azure's default timestamps (`none`).\nconst maiTranscribeModels = new Map([\n ['mai-transcribe-2', { name: 'MAI-Transcribe-2', supportsTimestamps: true }],\n [\n 'mai-transcribe-1.5',\n { name: 'MAI-Transcribe-1.5', supportsTimestamps: false },\n ],\n]);\n\nexport function getMAITranscribeModel(modelId: string) {\n return maiTranscribeModels.get(modelId.toLowerCase());\n}\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// Strict objects reject unknown keys (e.g. `diarization.maxSpeakers`, which\n// MAI-Transcribe-2 does not support) instead of silently dropping them.\nexport const azureSpeechTranscriptionModelOptionsShape = () => ({\n /**\n * Timing granularity. Defaults to `segment` so that transcription results\n * include timed segments (Azure's own default is `none`).\n */\n timestamps: z.enum(['word', 'segment', 'none']).optional(),\n\n /**\n * `verbatim` keeps fillers and false starts, `clean` removes them.\n * Azure defaults to `verbatim`.\n */\n transcribeStyle: z.enum(['verbatim', 'clean']).optional(),\n\n /**\n * Forces a single language, e.g. `['en']`. Omit for automatic language\n * detection and code switching.\n */\n locales: z.array(z.string()).length(1).optional(),\n\n /**\n * Speaker diarization. Speaker IDs are available in provider metadata.\n */\n diarization: z.strictObject({ enabled: z.boolean() }).optional(),\n\n /**\n * Keyword biasing for names and domain terminology.\n */\n phraseList: z.strictObject({ phrases: z.array(z.string()) }).optional(),\n});\n\nexport const azureSpeechTranscriptionModelOptions = lazySchema(() =>\n zodSchema(z.strictObject(azureSpeechTranscriptionModelOptionsShape())),\n);\n\nexport type AzureTranscriptionModelSpeechOptions = InferSchema<\n typeof azureSpeechTranscriptionModelOptions\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":["lazySchema","zodSchema","z","lazySchema","zodSchema","z","z","z","combineHeaders","z","lazySchema","zodSchema","z","lazySchema","zodSchema","z","lazySchema","zodSchema","z","combineHeaders","z","_a"]}
|
package/docs/04-azure.mdx
CHANGED
|
@@ -83,6 +83,7 @@ You can use the following optional settings to customize the OpenAI provider ins
|
|
|
83
83
|
It defaults to the `AZURE_RESOURCE_NAME` environment variable.
|
|
84
84
|
|
|
85
85
|
The resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/v1{path}`.
|
|
86
|
+
It must be a single DNS label (letters, digits, and hyphens).
|
|
86
87
|
You can use `baseURL` instead to specify the URL prefix.
|
|
87
88
|
|
|
88
89
|
- **apiKey** _string_
|
|
@@ -147,8 +148,8 @@ You can use the following optional settings to customize the OpenAI provider ins
|
|
|
147
148
|
|
|
148
149
|
- **speechBaseURL** _string_
|
|
149
150
|
|
|
150
|
-
URL prefix for Azure Speech
|
|
151
|
-
a regional endpoint such as `https://eastus.api.cognitive.microsoft.com`.
|
|
151
|
+
URL prefix for Azure Speech requests (MAI-Transcribe transcription and MAI-Voice
|
|
152
|
+
speech generation), for example a regional endpoint such as `https://eastus.api.cognitive.microsoft.com`.
|
|
152
153
|
Defaults to `https://{resourceName}.cognitiveservices.azure.com`.
|
|
153
154
|
Speech requests do not use `baseURL` or `apiVersion`.
|
|
154
155
|
|
|
@@ -1123,11 +1124,17 @@ The first argument is the model id e.g. `whisper-1`.
|
|
|
1123
1124
|
const model = azure.transcription('whisper-1');
|
|
1124
1125
|
```
|
|
1125
1126
|
|
|
1126
|
-
### MAI-Transcribe
|
|
1127
|
+
### MAI-Transcribe
|
|
1128
|
+
|
|
1129
|
+
MAI-Transcribe models are multilingual speech-to-text models from Microsoft AI, served through Azure.
|
|
1130
|
+
The following model IDs use the Azure Speech API. They are matched case-insensitively
|
|
1131
|
+
and sent to Azure under their Azure model names:
|
|
1132
|
+
|
|
1133
|
+
| Model ID | Azure model | Notes |
|
|
1134
|
+
| -------------------- | -------------------- | ------------------------------------ |
|
|
1135
|
+
| `mai-transcribe-2` | `MAI-Transcribe-2` | Supports every option below. |
|
|
1136
|
+
| `mai-transcribe-1.5` | `MAI-Transcribe-1.5` | Supports `locales` and `phraseList`. |
|
|
1127
1137
|
|
|
1128
|
-
MAI-Transcribe-2 is a multilingual speech-to-text model from Microsoft AI, served through Azure.
|
|
1129
|
-
`azure.transcription('mai-transcribe-2')` uses the Azure Speech API.
|
|
1130
|
-
The model ID is matched case-insensitively and sent to Azure as `MAI-Transcribe-2`.
|
|
1131
1138
|
All other IDs use the OpenAI API by default, including custom deployment names.
|
|
1132
1139
|
|
|
1133
1140
|
```ts
|
|
@@ -1148,7 +1155,7 @@ const result = await transcribe({
|
|
|
1148
1155
|
});
|
|
1149
1156
|
```
|
|
1150
1157
|
|
|
1151
|
-
MAI-Transcribe
|
|
1158
|
+
MAI-Transcribe models require a Microsoft Foundry (Speech) resource in a region where they are available:
|
|
1152
1159
|
`centralindia`, `eastus`, `northeurope`, `southeastasia`, `westus`, or `westus2`
|
|
1153
1160
|
(see [Speech service regions](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/regions?tabs=llmspeech)).
|
|
1154
1161
|
Resources in other regions reject the request.
|
|
@@ -1176,17 +1183,19 @@ The following options are available through `providerOptions.azure`:
|
|
|
1176
1183
|
|
|
1177
1184
|
- **api** _'openai' | 'speech'_
|
|
1178
1185
|
Overrides model-based API selection for this request.
|
|
1179
|
-
Set `openai` for an OpenAI deployment named
|
|
1186
|
+
Set `openai` for an OpenAI deployment named after one of the model IDs above, or `speech` to
|
|
1180
1187
|
send another model ID to Speech. Other Speech model IDs are sent unchanged.
|
|
1181
1188
|
|
|
1182
1189
|
- **timestamps** _'word' | 'segment' | 'none'_
|
|
1183
|
-
Timing granularity.
|
|
1184
|
-
timed segments (Azure's own default is `none`). `segment` returns one segment
|
|
1190
|
+
Timing granularity. For MAI-Transcribe-2 the AI SDK defaults to `segment` so that results
|
|
1191
|
+
include timed segments (Azure's own default is `none`). `segment` returns one segment
|
|
1185
1192
|
per sentence or speaker turn, `word` additionally returns word timing in provider
|
|
1186
1193
|
metadata, and `none` returns a single segment that spans the whole audio.
|
|
1194
|
+
MAI-Transcribe-1.5 only supports `none`, so the AI SDK does not send a default for it.
|
|
1187
1195
|
|
|
1188
1196
|
- **transcribeStyle** _'verbatim' | 'clean'_
|
|
1189
1197
|
`verbatim` keeps fillers and false starts, `clean` removes them. Defaults to `verbatim`.
|
|
1198
|
+
`clean` requires MAI-Transcribe-2.
|
|
1190
1199
|
|
|
1191
1200
|
- **locales** _string[]_
|
|
1192
1201
|
Exactly one language code, such as `['en']`. This is a strong hint; omit it for
|
|
@@ -1194,15 +1203,18 @@ The following options are available through `providerOptions.azure`:
|
|
|
1194
1203
|
|
|
1195
1204
|
- **diarization** _object_
|
|
1196
1205
|
Set `enabled` to `true` to identify speakers. Speaker IDs are returned in
|
|
1197
|
-
provider metadata. `maxSpeakers` is not supported
|
|
1206
|
+
provider metadata. Requires MAI-Transcribe-2. `maxSpeakers` is not supported.
|
|
1198
1207
|
|
|
1199
1208
|
- **phraseList** _object_
|
|
1200
1209
|
Set `phrases` to a list of names and domain terms to bias recognition toward them.
|
|
1201
1210
|
|
|
1202
1211
|
Explicit `api` takes precedence over the model ID. Existing OpenAI transcription
|
|
1203
1212
|
options remain under `providerOptions.openai`. Speech-only Azure options produce
|
|
1204
|
-
warnings when used with the OpenAI API. Unknown
|
|
1205
|
-
|
|
1213
|
+
warnings when used with the OpenAI API. Unknown `providerOptions.azure` keys
|
|
1214
|
+
(for example `diarization.maxSpeakers`) are rejected before the request is sent.
|
|
1215
|
+
Options that a model does not support, such as `timestamps: 'word'` with
|
|
1216
|
+
MAI-Transcribe-1.5, are sent unchanged, and Azure rejects the request with an
|
|
1217
|
+
error that names the option.
|
|
1206
1218
|
|
|
1207
1219
|
Results include transcript text, timed segments, duration, and an ISO-639-1
|
|
1208
1220
|
language code when the reported phrase locales identify one language. Mixed-language
|
|
@@ -1212,9 +1224,9 @@ timing are preserved in `providerMetadata.azure.phrases`; use the exported
|
|
|
1212
1224
|
`AzureTranscriptionProviderMetadata` type to access them. Phrase timing is in
|
|
1213
1225
|
milliseconds in metadata and seconds in normalized `segments`.
|
|
1214
1226
|
|
|
1215
|
-
MAI-Transcribe
|
|
1216
|
-
shorter than 2 hours and smaller than 250 MB, and
|
|
1217
|
-
transcription. The
|
|
1227
|
+
MAI-Transcribe models are file transcription models: they accept WAV, MP3, or FLAC files
|
|
1228
|
+
shorter than 2 hours and smaller than 250 MB, and do not support streaming
|
|
1229
|
+
transcription. The models are in public preview. See
|
|
1218
1230
|
[Azure's MAI-Transcribe guide](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/mai-transcribe)
|
|
1219
1231
|
for supported languages and diarization limits.
|
|
1220
1232
|
|
|
@@ -1288,12 +1300,14 @@ The following provider options are available:
|
|
|
1288
1300
|
| `gpt-4o-mini-transcribe` | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
|
|
1289
1301
|
| `gpt-4o-transcribe` | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
|
|
1290
1302
|
| `mai-transcribe-2` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
1303
|
+
| `mai-transcribe-1.5` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
|
|
1291
1304
|
|
|
1292
1305
|
## Speech Models
|
|
1293
1306
|
|
|
1294
|
-
You can create models that call the Azure OpenAI speech API using the `.speech()` factory method.
|
|
1307
|
+
You can create models that call the Azure OpenAI speech API or Azure Speech text to speech using the `.speech()` factory method.
|
|
1295
1308
|
|
|
1296
|
-
The first argument is your deployment name for the text-to-speech model (e.g., `tts-1`)
|
|
1309
|
+
The first argument is your deployment name for the text-to-speech model (e.g., `tts-1`),
|
|
1310
|
+
or a [MAI-Voice](#mai-voice) model ID.
|
|
1297
1311
|
|
|
1298
1312
|
```ts
|
|
1299
1313
|
const model = azure.speech('your-tts-deployment-name');
|
|
@@ -1352,3 +1366,75 @@ Azure OpenAI supports TTS models through deployments. The capabilities depend on
|
|
|
1352
1366
|
| `tts-1` | <Cross size={18} /> |
|
|
1353
1367
|
| `tts-1-hd` | <Cross size={18} /> |
|
|
1354
1368
|
| `gpt-4o-mini-tts` | <Check size={18} /> |
|
|
1369
|
+
|
|
1370
|
+
### MAI-Voice
|
|
1371
|
+
|
|
1372
|
+
MAI-Voice models are multilingual text-to-speech models from Microsoft AI, served through Azure.
|
|
1373
|
+
The following model IDs use the Azure Speech API:
|
|
1374
|
+
|
|
1375
|
+
| Model ID | Notes |
|
|
1376
|
+
| ------------------- | --------------------------------------------- |
|
|
1377
|
+
| `mai-voice-2-flash` | Low latency, for voice agents and assistants. |
|
|
1378
|
+
| `mai-voice-2` | Highest fidelity, for long-form narration. |
|
|
1379
|
+
|
|
1380
|
+
All other IDs use the OpenAI API by default, including custom deployment names.
|
|
1381
|
+
|
|
1382
|
+
```ts
|
|
1383
|
+
import { azure, type AzureSpeechModelOptions } from '@ai-sdk/azure';
|
|
1384
|
+
import { experimental_generateSpeech as generateSpeech } from 'ai';
|
|
1385
|
+
|
|
1386
|
+
const result = await generateSpeech({
|
|
1387
|
+
model: azure.speech('mai-voice-2-flash'),
|
|
1388
|
+
text: 'Thanks for calling! Your order shipped this morning.',
|
|
1389
|
+
voice: 'en-US-Ethan',
|
|
1390
|
+
providerOptions: {
|
|
1391
|
+
azure: { style: 'excited' } satisfies AzureSpeechModelOptions,
|
|
1392
|
+
},
|
|
1393
|
+
});
|
|
1394
|
+
```
|
|
1395
|
+
|
|
1396
|
+
MAI-Voice models require a Microsoft Foundry (Speech) resource in a region where they are available
|
|
1397
|
+
(see [Speech service regions](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/regions)).
|
|
1398
|
+
They use the same settings as [MAI-Transcribe](#mai-transcribe): `resourceName` (or `AZURE_RESOURCE_NAME`),
|
|
1399
|
+
`apiKey` (or `AZURE_API_KEY`), `tokenProvider`, and `speechBaseURL`.
|
|
1400
|
+
|
|
1401
|
+
- **voice** is a prebuilt voice ID that includes its locale, such as `en-US-Harper`
|
|
1402
|
+
(the default), `de-DE-Mia`, or `es-MX-Valeria`. The voice locale selects the language.
|
|
1403
|
+
Full Azure voice names such as `es-MX-Valeria:MAI-Voice-2` are also accepted. Available
|
|
1404
|
+
voices vary by model; see
|
|
1405
|
+
[Azure's MAI-Voice guide](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/mai-voices).
|
|
1406
|
+
- **language** picks a default voice when `voice` is not set (see the table below). Other
|
|
1407
|
+
languages and `auto` use `en-US-Harper` with a warning. When `voice` is set, its locale
|
|
1408
|
+
selects the language, and a conflicting `language` produces a warning.
|
|
1409
|
+
- **outputFormat** accepts `mp3` (default, 24 kHz), `wav`, `pcm` (headerless 24 kHz, 16-bit, mono), `opus` (Ogg),
|
|
1410
|
+
or any Azure `X-Microsoft-OutputFormat` value such as `audio-48khz-192kbitrate-mono-mp3`.
|
|
1411
|
+
Other values fall back to `mp3` with a warning. Azure labels raw formats such as `pcm` as `audio/basic`.
|
|
1412
|
+
- **speed** is a rate multiplier, for example `0.5` for half speed or `2` for double speed.
|
|
1413
|
+
- `instructions` is not supported and produces a warning.
|
|
1414
|
+
|
|
1415
|
+
| Language | Default voice | Language | Default voice |
|
|
1416
|
+
| -------- | --------------- | -------- | ------------- |
|
|
1417
|
+
| `de` | `de-DE-Mia` | `nl` | `nl-NL-Fleur` |
|
|
1418
|
+
| `en` | `en-US-Harper` | `pt` | `pt-BR-Luana` |
|
|
1419
|
+
| `es` | `es-MX-Valeria` | `ro` | `ro-RO-Elena` |
|
|
1420
|
+
| `fr` | `fr-FR-Soleil` | `ru` | `ru-RU-Masha` |
|
|
1421
|
+
| `hi` | `hi-IN-Kavya` | `th` | `th-TH-Krit` |
|
|
1422
|
+
| `hu` | `hu-HU-Lilla` | `tr` | `tr-TR-Elif` |
|
|
1423
|
+
| `it` | `it-IT-Rosa` | `zh` | `zh-CN-Mei` |
|
|
1424
|
+
| `ko` | `ko-KR-Haena` | | |
|
|
1425
|
+
|
|
1426
|
+
The following options are available through `providerOptions.azure`:
|
|
1427
|
+
|
|
1428
|
+
- **api** _'openai' | 'speech'_
|
|
1429
|
+
Overrides model-based API selection for this request.
|
|
1430
|
+
Set `openai` for an OpenAI deployment named after one of the model IDs above, or `speech` to
|
|
1431
|
+
send another model ID to Speech.
|
|
1432
|
+
|
|
1433
|
+
- **style** _string_
|
|
1434
|
+
Speaking style, such as `excited` or `whispering`. Supported styles vary by voice and model.
|
|
1435
|
+
|
|
1436
|
+
- **styleDegree** _number_
|
|
1437
|
+
Style intensity from 0.01 to 2. Azure defaults to 1. Requires `style`.
|
|
1438
|
+
|
|
1439
|
+
Text is always spoken as plain text; SSML input is not supported.
|
|
1440
|
+
The models are in public preview. AI Gateway forwards these provider options, including `azure.api`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/azure",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.132",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@ai-sdk/deepseek": "2.0.71",
|
|
33
|
-
"@ai-sdk/openai": "3.0.
|
|
33
|
+
"@ai-sdk/openai": "3.0.123",
|
|
34
34
|
"@ai-sdk/provider": "3.0.18",
|
|
35
35
|
"@ai-sdk/provider-utils": "4.0.57"
|
|
36
36
|
},
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
type LanguageModelV3,
|
|
15
15
|
type ProviderV3,
|
|
16
16
|
type ImageModelV3,
|
|
17
|
+
type SharedV3Warning,
|
|
17
18
|
type SpeechModelV3,
|
|
18
19
|
type TranscriptionModelV3,
|
|
19
20
|
} from '@ai-sdk/provider';
|
|
@@ -27,10 +28,15 @@ import {
|
|
|
27
28
|
type FetchFunction,
|
|
28
29
|
} from '@ai-sdk/provider-utils';
|
|
29
30
|
import { azureOpenaiTools } from './azure-openai-tools';
|
|
31
|
+
import {
|
|
32
|
+
azureSpeechModelOptions,
|
|
33
|
+
getMAIVoiceModel,
|
|
34
|
+
} from './azure-speech-model-options';
|
|
35
|
+
import { AzureSpeechSpeechModel } from './azure-speech-speech-model';
|
|
30
36
|
import { AzureSpeechTranscriptionModel } from './azure-speech-transcription-model';
|
|
31
37
|
import {
|
|
32
38
|
azureTranscriptionModelOptions,
|
|
33
|
-
|
|
39
|
+
getMAITranscribeModel,
|
|
34
40
|
} from './azure-transcription-model-options';
|
|
35
41
|
import { VERSION } from './version';
|
|
36
42
|
|
|
@@ -93,8 +99,8 @@ export interface AzureOpenAIProvider extends ProviderV3 {
|
|
|
93
99
|
imageModel(deploymentId: string): ImageModelV3;
|
|
94
100
|
|
|
95
101
|
/**
|
|
96
|
-
* Creates an Azure transcription model. MAI-Transcribe
|
|
97
|
-
* by default; other IDs use OpenAI. Override with providerOptions.azure.api.
|
|
102
|
+
* Creates an Azure transcription model. MAI-Transcribe models use the Speech
|
|
103
|
+
* API by default; other IDs use OpenAI. Override with providerOptions.azure.api.
|
|
98
104
|
*/
|
|
99
105
|
transcription(deploymentId: string): TranscriptionModelV3;
|
|
100
106
|
|
|
@@ -104,10 +110,16 @@ export interface AzureOpenAIProvider extends ProviderV3 {
|
|
|
104
110
|
transcriptionModel(deploymentId: string): TranscriptionModelV3;
|
|
105
111
|
|
|
106
112
|
/**
|
|
107
|
-
* Creates an Azure
|
|
113
|
+
* Creates an Azure speech generation model. MAI-Voice models use the Speech
|
|
114
|
+
* API by default; other IDs use OpenAI. Override with providerOptions.azure.api.
|
|
108
115
|
*/
|
|
109
116
|
speech(deploymentId: string): SpeechModelV3;
|
|
110
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Creates an Azure speech generation model. Alias of `speech`.
|
|
120
|
+
*/
|
|
121
|
+
speechModel(deploymentId: string): SpeechModelV3;
|
|
122
|
+
|
|
111
123
|
/**
|
|
112
124
|
* AzureOpenAI-specific tools.
|
|
113
125
|
*/
|
|
@@ -119,6 +131,7 @@ export interface AzureOpenAIProviderSettings {
|
|
|
119
131
|
* Name of the Azure OpenAI resource. Either this or `baseURL` can be used.
|
|
120
132
|
*
|
|
121
133
|
* The resource name is used in the assembled URL: `https://{resourceName}.openai.azure.com/openai/v1{path}`.
|
|
134
|
+
* It must be a single DNS label (letters, digits, and hyphens).
|
|
122
135
|
*/
|
|
123
136
|
resourceName?: string;
|
|
124
137
|
|
|
@@ -169,8 +182,9 @@ export interface AzureOpenAIProviderSettings {
|
|
|
169
182
|
useDeploymentBasedUrls?: boolean;
|
|
170
183
|
|
|
171
184
|
/**
|
|
172
|
-
* URL prefix for Azure Speech
|
|
173
|
-
* regional endpoint like
|
|
185
|
+
* URL prefix for Azure Speech (MAI-Transcribe transcription and MAI-Voice
|
|
186
|
+
* speech), e.g. a regional endpoint like
|
|
187
|
+
* `https://eastus.api.cognitive.microsoft.com`.
|
|
174
188
|
* Defaults to `https://{resourceName}.cognitiveservices.azure.com`.
|
|
175
189
|
* Speech requests do not use `baseURL` or `apiVersion`.
|
|
176
190
|
*/
|
|
@@ -255,14 +269,27 @@ export function createAzure(
|
|
|
255
269
|
}
|
|
256
270
|
: options.fetch;
|
|
257
271
|
|
|
258
|
-
const getResourceName = () =>
|
|
259
|
-
loadSetting({
|
|
272
|
+
const getResourceName = () => {
|
|
273
|
+
const resourceName = loadSetting({
|
|
260
274
|
settingValue: options.resourceName,
|
|
261
275
|
settingName: 'resourceName',
|
|
262
276
|
environmentVariableName: 'AZURE_RESOURCE_NAME',
|
|
263
277
|
description: 'Azure OpenAI resource name',
|
|
264
278
|
});
|
|
265
279
|
|
|
280
|
+
// The resource name becomes part of the request host, so only a DNS label
|
|
281
|
+
// is accepted (e.g. `user@internal:8080/#` would rewrite the host).
|
|
282
|
+
if (!/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i.test(resourceName)) {
|
|
283
|
+
throw new InvalidArgumentError({
|
|
284
|
+
argument: 'resourceName',
|
|
285
|
+
message:
|
|
286
|
+
'Invalid Azure resource name. Expected a single DNS label (letters, digits, and hyphens). Use `baseURL` for custom endpoints.',
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return resourceName;
|
|
291
|
+
};
|
|
292
|
+
|
|
266
293
|
const apiVersion = options.apiVersion ?? 'v1';
|
|
267
294
|
const {
|
|
268
295
|
isAzureOpenAI,
|
|
@@ -352,6 +379,10 @@ export function createAzure(
|
|
|
352
379
|
fetch,
|
|
353
380
|
});
|
|
354
381
|
|
|
382
|
+
const speechBaseURL = () =>
|
|
383
|
+
withoutTrailingSlash(options.speechBaseURL) ??
|
|
384
|
+
`https://${getResourceName()}.cognitiveservices.azure.com`;
|
|
385
|
+
|
|
355
386
|
const createTranscriptionModel = (modelId: string) =>
|
|
356
387
|
new AzureTranscriptionModel(
|
|
357
388
|
modelId,
|
|
@@ -364,22 +395,27 @@ export function createAzure(
|
|
|
364
395
|
}),
|
|
365
396
|
new AzureSpeechTranscriptionModel(modelId, {
|
|
366
397
|
url: () =>
|
|
367
|
-
`${
|
|
368
|
-
withoutTrailingSlash(options.speechBaseURL) ??
|
|
369
|
-
`https://${getResourceName()}.cognitiveservices.azure.com`
|
|
370
|
-
}/speechtotext/transcriptions:transcribe?api-version=2025-10-15`,
|
|
398
|
+
`${speechBaseURL()}/speechtotext/transcriptions:transcribe?api-version=2025-10-15`,
|
|
371
399
|
headers: () => getHeaders('speech'),
|
|
372
400
|
fetch,
|
|
373
401
|
}),
|
|
374
402
|
);
|
|
375
403
|
|
|
376
404
|
const createSpeechModel = (modelId: string) =>
|
|
377
|
-
new
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
405
|
+
new AzureSpeechModel(
|
|
406
|
+
modelId,
|
|
407
|
+
new OpenAISpeechModel(modelId, {
|
|
408
|
+
provider: 'azure.speech',
|
|
409
|
+
url,
|
|
410
|
+
headers: getHeaders,
|
|
411
|
+
fetch,
|
|
412
|
+
}),
|
|
413
|
+
new AzureSpeechSpeechModel(modelId, {
|
|
414
|
+
url: () => `${speechBaseURL()}/tts/cognitiveservices/v1`,
|
|
415
|
+
headers: () => getHeaders('speech'),
|
|
416
|
+
fetch,
|
|
417
|
+
}),
|
|
418
|
+
);
|
|
383
419
|
|
|
384
420
|
const provider = function (deploymentId: string) {
|
|
385
421
|
if (new.target) {
|
|
@@ -406,6 +442,7 @@ export function createAzure(
|
|
|
406
442
|
provider.transcription = createTranscriptionModel;
|
|
407
443
|
provider.transcriptionModel = createTranscriptionModel;
|
|
408
444
|
provider.speech = createSpeechModel;
|
|
445
|
+
provider.speechModel = createSpeechModel;
|
|
409
446
|
provider.tools = azureOpenaiTools;
|
|
410
447
|
return provider;
|
|
411
448
|
}
|
|
@@ -462,7 +499,52 @@ class AzureTranscriptionModel implements TranscriptionModelV3 {
|
|
|
462
499
|
return {
|
|
463
500
|
...options,
|
|
464
501
|
api:
|
|
465
|
-
options?.api ??
|
|
502
|
+
options?.api ??
|
|
503
|
+
(getMAITranscribeModel(this.modelId) ? 'speech' : 'openai'),
|
|
504
|
+
};
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Resolves the API per request: providerOptions also reach this model via Gateway.
|
|
509
|
+
class AzureSpeechModel implements SpeechModelV3 {
|
|
510
|
+
readonly specificationVersion = 'v3';
|
|
511
|
+
readonly provider = 'azure.speech';
|
|
512
|
+
|
|
513
|
+
constructor(
|
|
514
|
+
readonly modelId: string,
|
|
515
|
+
private readonly openai: OpenAISpeechModel,
|
|
516
|
+
private readonly speech: AzureSpeechSpeechModel,
|
|
517
|
+
) {}
|
|
518
|
+
|
|
519
|
+
async doGenerate(options: Parameters<SpeechModelV3['doGenerate']>[0]) {
|
|
520
|
+
const { api, ...speechOptions } =
|
|
521
|
+
(await parseProviderOptions({
|
|
522
|
+
provider: 'azure',
|
|
523
|
+
providerOptions: options.providerOptions,
|
|
524
|
+
schema: azureSpeechModelOptions,
|
|
525
|
+
})) ?? {};
|
|
526
|
+
if (
|
|
527
|
+
(api ?? (getMAIVoiceModel(this.modelId) ? 'speech' : 'openai')) ===
|
|
528
|
+
'speech'
|
|
529
|
+
) {
|
|
530
|
+
return this.speech.doGenerate(options, speechOptions);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
const result = await this.openai.doGenerate(options);
|
|
534
|
+
return {
|
|
535
|
+
...result,
|
|
536
|
+
warnings: [
|
|
537
|
+
...result.warnings,
|
|
538
|
+
...Object.entries(speechOptions)
|
|
539
|
+
.filter(([, value]) => value !== undefined)
|
|
540
|
+
.map(
|
|
541
|
+
([key]): SharedV3Warning => ({
|
|
542
|
+
type: 'unsupported',
|
|
543
|
+
feature: `providerOptions.azure.${key}`,
|
|
544
|
+
details: 'This option requires the Azure Speech API.',
|
|
545
|
+
}),
|
|
546
|
+
),
|
|
547
|
+
],
|
|
466
548
|
};
|
|
467
549
|
}
|
|
468
550
|
}
|