@ai-sdk/azure 3.0.129 → 3.0.131

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.
@@ -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":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iCAAiC;AAC1C;AAAA,EACE;AAAA,OAOK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;AC3BP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,IAAM,mBAMT;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACnBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,KAAAA,UAAS;;;ACVlB;AAAA,EACE,cAAAC;AAAA,EACA,aAAAC;AAAA,OAEK;AACP,SAAS,KAAAC,UAAS;;;ACLlB;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,SAAS;AAIX,IAAM,4CAA4C,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9D,YAAY,EAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,iBAAiB,EAAE,KAAK,CAAC,YAAY,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxD,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKhD,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/D,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS;AACxE;AAEO,IAAM,uCAAuC;AAAA,EAAW,MAC7D,UAAU,EAAE,aAAa,0CAA0C,CAAC,CAAC;AACvE;;;ADjCO,IAAM,iCAAiCC;AAAA,EAAW,MACvDC;AAAA,IACEC,GAAE,aAAa;AAAA;AAAA;AAAA;AAAA,MAIb,KAAKA,GAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,EAAE,SAAS;AAAA,MAC3C,GAAG,0CAA0C;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;AAMO,SAAS,iBAAiB,SAA0B;AACzD,SAAO,QAAQ,YAAY,MAAM;AACnC;;;ADXO,IAAM,gCAAN,MAAoE;AAAA,EAIzE,YACW,SACQ,QAKjB;AANS;AACQ;AALnB,SAAS,uBAAuB;AAChC,SAAS,WAAW;AAAA,EASjB;AAAA,EAEH,MAAM,WACJ,SACA,eAAqD,CAAC,GACY;AA/BtE;AAgCI,UAAM,YAAY,oBAAI,KAAK;AAC3B,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS;AAAA,MACP;AAAA,MACA,IAAI;AAAA,QACF;AAAA,UACE,OAAO,QAAQ,UAAU,WACrB,0BAA0B,QAAQ,KAAK,IACvC,QAAQ;AAAA,QACd;AAAA,QACA,EAAE,MAAM,QAAQ,UAAU;AAAA,MAC5B;AAAA,MACA,SAAS,qBAAqB,QAAQ,SAAS,CAAC;AAAA,IAClD;AACA,aAAS;AAAA,MACP;AAAA,MACA,KAAK,UAAU;AAAA,QACb,cAAc;AAAA,UACZ,SAAS;AAAA,UACT,OAAO,iBAAiB,KAAK,OAAO,IAChC,qBACA,KAAK;AAAA,UACT,cAAc;AAAA,YACZ,aAAY,kBAAa,eAAb,YAA2B;AAAA,YACvC,iBAAiB,aAAa;AAAA,UAChC;AAAA,QACF;AAAA,QACA,SAAS,aAAa;AAAA,QACtB,aAAa,aAAa;AAAA,QAC1B,YAAY,aAAa;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,OAAO,UAAU,gBAAgB,IAAI,MAAM,kBAAkB;AAAA,MACnE,KAAK,KAAK,OAAO,IAAI;AAAA,MACrB,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAAA,MAC9D;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,MACnB,uBAAuB,+BAA+B;AAAA,QACpD,aAAaC,GAAE,MAAM;AAAA,UACnBA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,SAASA,GAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAAA,UACrDA,GAAE,OAAO,EAAE,SAASA,GAAE,OAAO,EAAE,CAAC;AAAA,QAClC,CAAC;AAAA,QACD,gBAAgB,UACd,WAAW,OAAO,KAAK,MAAM,UAAU,KAAK;AAAA,MAChD,CAAC;AAAA,MACD,2BAA2B,0BAA0B,cAAc;AAAA,IACrE,CAAC;AAED,UAAM,WAAU,WAAM,YAAN,YAAiB,CAAC;AAGlC,UAAM,YAAY,IAAI;AAAA,MACpB,QAAQ;AAAA,QAAQ,YACd,OAAO,SAAS,CAAC,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC;AAAA,MACjE;AAAA,IACF;AACA,UAAM,CAAC,QAAQ,IAAI;AACnB,UAAM,mBACJ,UAAU,SAAS,KAAK,aAAa,KAAK,QAAQ,IAC9C,WACA;AAEN,WAAO;AAAA,MACL,MAAM,MAAM,gBAAgB,IAAI,YAAU,OAAO,IAAI,EAAE,KAAK,GAAG;AAAA,MAC/D,UAAU,QAAQ;AAAA,QAAQ,YACxB,OAAO,sBAAsB,QAAQ,OAAO,wBAAwB,OAChE;AAAA,UACE;AAAA,YACE,MAAM,OAAO;AAAA,YACb,aAAa,OAAO,qBAAqB;AAAA,YACzC,YACG,OAAO,qBAAqB,OAAO,wBACpC;AAAA,UACJ;AAAA,QACF,IACA,CAAC;AAAA,MACP;AAAA,MACA,UAAU;AAAA,MACV,mBACE,MAAM,wBAAwB,OAC1B,MAAM,uBAAuB,MAC7B;AAAA,MACN,UAAU,CAAC;AAAA,MACX,kBAAkB;AAAA,QAChB,OAAO,EAAE,QAAQ;AAAA,MACnB;AAAA,MACA,UAAU;AAAA,QACR;AAAA,QACA,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,CAAC,CAAC;AAAA,EACvD,sBAAsBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACzC,SAASA,GACN;AAAA,IACCA,GAAE,OAAO;AAAA,MACP,MAAMA,GAAE,OAAO;AAAA,MACf,oBAAoBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACvC,sBAAsBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACzC,QAAQA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC3B,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC5B,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC/B,OAAOA,GACJ;AAAA,QACCA,GAAE,OAAO;AAAA,UACP,MAAMA,GAAE,OAAO;AAAA,UACf,oBAAoBA,GAAE,OAAO,EAAE,QAAQ;AAAA,UACvC,sBAAsBA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC3C,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,IACb,CAAC;AAAA,EACH,EACC,QAAQ;AACb,CAAC;;;AGxJM,IAAM,UACX,OACI,YACA;;;AL8KN,SAAS,0BAA0B,SAA6B;AAC9D,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,QAAM,WAAW,IAAI;AACrB,QAAM,gBACJ,SAAS,SAAS,mBAAmB,KACrC,SAAS,SAAS,wBAAwB,KAC1C,SAAS,SAAS,8BAA8B;AAClD,QAAM,WAAW,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,kBACE,SAAS,SAAS,wBAAwB,KAC1C,SAAS,WAAW,gBAAgB;AAAA,IACtC,aAAa,iBAAiB,SAAS,YAAY,EAAE,SAAS,YAAY;AAAA,EAC5E;AACF;AAKO,SAAS,YACd,UAAuC,CAAC,GACnB;AAlNvB;AAmNE,QAAM,gBAAgB,QAAQ;AAE9B,MAAI,QAAQ,UAAU,eAAe;AACnC,UAAM,IAAI,qBAAqB;AAAA,MAC7B,UAAU;AAAA,MACV,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,CAAC,MAA2B,aAAa;AAC1D,UAAM,cAAc,gBAChB,CAAC,IACD;AAAA,MACE,CAAC,QAAQ,WAAW,8BAA8B,SAAS,GACzD,WAAW;AAAA,QACT,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa,QAAQ,WAAW,iBAAiB;AAAA,MACnD,CAAC;AAAA,IACL;AAEJ,WAAO;AAAA,MACL;AAAA,QACE,GAAG;AAAA,QACH,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,QAAmC,gBACrC,OAAO,OAAO,SAAS;AAnP7B,QAAAC;AAoPQ,UAAM,UAAU,iBAAiB,6BAAM,OAAO;AAE9C,QAAI,QAAQ,iBAAiB,MAAM;AACjC,cAAQ,gBAAgB,UAAU,MAAM,cAAc,CAAC;AAAA,IACzD;AAEA,aAAQA,MAAA,QAAQ,UAAR,OAAAA,MAAiB,WAAW,OAAO,OAAO;AAAA,MAChD,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,IACA,QAAQ;AAEZ,QAAM,kBAAkB,MACtB,YAAY;AAAA,IACV,cAAc,QAAQ;AAAA,IACtB,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa;AAAA,EACf,CAAC;AAEH,QAAM,cAAa,aAAQ,eAAR,YAAsB;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf,IAAI,0BAA0B,QAAQ,OAAO;AAE7C,QAAM,MAAM,CAAC,EAAE,MAAM,QAAQ,MAAyC;AAhRxE,QAAAA;AAiRI,UAAM,gBAAgB;AAAA,OACpBA,MAAA,QAAQ,YAAR,OAAAA,MAAmB,WAAW,gBAAgB,CAAC;AAAA,IACjD;AAEA,QAAI;AACJ,QAAI,QAAQ,wBAAwB;AAElC,gBAAU,IAAI,IAAI,GAAG,aAAa,gBAAgB,OAAO,GAAG,IAAI,EAAE;AAAA,IACpE,WAAW,CAAC,iBAAiB,wBAAwB;AAGnD,gBAAU,IAAI,IAAI,GAAG,aAAa,GAAG,IAAI,EAAE;AAAA,IAC7C,OAAO;AAEL,gBAAU,IAAI,IAAI,GAAG,aAAa,MAAM,IAAI,EAAE;AAAA,IAChD;AAEA,QACE,QAAQ,0BACP,iBAAiB,CAAC,0BAA0B,CAAC,kBAC9C;AACA,cAAQ,aAAa,IAAI,eAAe,UAAU;AAAA,IACpD;AAEA,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,QAAM,kBAAkB,CAAC,mBACvB,IAAI,wBAAwB,gBAAgB;AAAA,IAC1C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAEH,QAAM,sBAAsB,CAAC,mBAC3B,IAAI,0BAA0B,gBAAgB;AAAA,IAC5C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,yBAAyB;AAAA,IACzB,kBAAkB;AAAA;AAAA,IAElB,2BAA2B;AAAA,EAC7B,CAAC;AAEH,QAAM,wBAAwB,CAAC,YAC7B,IAAI,8BAA8B,SAAS;AAAA,IACzC,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAEH,QAAM,uBAAuB,CAAC,YAC5B,IAAI,qBAAqB,SAAS;AAAA,IAChC,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AAEH,QAAM,uBAAuB,CAAC,YAC5B,IAAI,6BAA6B,SAAS;AAAA,IACxC,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,yBAAyB;AAAA,IACzB,gBAAgB,CAAC,YAAY;AAAA,EAC/B,CAAC;AAEH,QAAM,mBAAmB,CAAC,YACxB,IAAI,iBAAiB,SAAS;AAAA,IAC5B,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAEH,QAAM,2BAA2B,CAAC,YAChC,IAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA,IAAI,yBAAyB,SAAS;AAAA,MACpC,UAAU;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,IAAI,8BAA8B,SAAS;AAAA,MACzC,KAAK,MAAG;AA7WhB,YAAAA;AA8WU,mBACEA,MAAA,qBAAqB,QAAQ,aAAa,MAA1C,OAAAA,MACA,WAAW,gBAAgB,CAAC,8BAC9B;AAAA;AAAA,MACF,SAAS,MAAM,WAAW,QAAQ;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEF,QAAM,oBAAoB,CAAC,YACzB,IAAI,kBAAkB,SAAS;AAAA,IAC7B,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAEH,QAAM,WAAW,SAAU,cAAsB;AAC/C,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,qBAAqB,YAAY;AAAA,EAC1C;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,WAAW;AACpB,WAAS,aAAa;AACtB,WAAS,YAAY;AACrB,WAAS,iBAAiB;AAC1B,WAAS,gBAAgB;AACzB,WAAS,qBAAqB;AAC9B,WAAS,QAAQ;AACjB,WAAS,aAAa;AACtB,WAAS,YAAY;AACrB,WAAS,gBAAgB;AACzB,WAAS,qBAAqB;AAC9B,WAAS,SAAS;AAClB,WAAS,QAAQ;AACjB,SAAO;AACT;AAKO,IAAM,QAAQ,YAAY;AAGjC,IAAM,0BAAN,MAA8D;AAAA,EAI5D,YACW,SACQ,QACA,QACA,QACjB;AAJS;AACQ;AACA;AACA;AAPnB,SAAS,uBAAuB;AAChC,SAAS,WAAW;AAAA,EAOjB;AAAA,EAEH,MAAM,WAAW,SAA4D;AAC3E,UAAM,EAAE,KAAK,GAAG,cAAc,IAAI,MAAM,KAAK;AAAA,MAC3C,QAAQ;AAAA,IACV;AACA,QAAI,QAAQ,UAAU;AACpB,aAAO,KAAK,OAAO,WAAW,SAAS,aAAa;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,WAAW,OAAO;AACnD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,QACR,GAAG,OAAO;AAAA,QACV,GAAG,OAAO,KAAK,aAAa,EAAE,IAAI,UAAQ;AAAA,UACxC,MAAM;AAAA,UACN,SAAS,yBAAyB,GAAG;AAAA,UACrC,SAAS;AAAA,QACX,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WACZ,iBAGA;AAvcJ;AAwcI,UAAM,UAAU,MAAM,qBAAqB;AAAA,MACzC,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MACE,wCAAS,QAAT,YAAiB,iBAAiB,KAAK,OAAO,IAAI,WAAW;AAAA,IACjE;AAAA,EACF;AACF;","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 '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\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 transcription requests (MAI-Transcribe-2), for example
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-2
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-2 requires a Microsoft Foundry (Speech) resource in a region where it is available:
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 `mai-transcribe-2`, or `speech` to
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. The AI SDK defaults to `segment` so that results include
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 by MAI-Transcribe-2.
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 or unsupported `providerOptions.azure`
1205
- keys (for example `diarization.maxSpeakers`) are rejected before the request is sent.
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-2 is a file transcription model: it accepts WAV, MP3, or FLAC files
1216
- shorter than 2 hours and smaller than 250 MB, and does not support streaming
1217
- transcription. The model is in public preview. See
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.129",
3
+ "version": "3.0.131",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -29,10 +29,10 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/deepseek": "2.0.70",
33
- "@ai-sdk/openai": "3.0.121",
32
+ "@ai-sdk/deepseek": "2.0.71",
33
+ "@ai-sdk/openai": "3.0.122",
34
34
  "@ai-sdk/provider": "3.0.18",
35
- "@ai-sdk/provider-utils": "4.0.56"
35
+ "@ai-sdk/provider-utils": "4.0.57"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "20.17.24",
@@ -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
- isMAITranscribe2,
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-2 uses the Speech API
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 OpenAI model for speech generation.
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 transcription (MAI-Transcribe-2), e.g. a
173
- * regional endpoint like `https://eastus.api.cognitive.microsoft.com`.
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 OpenAISpeechModel(modelId, {
378
- provider: 'azure.speech',
379
- url,
380
- headers: getHeaders,
381
- fetch,
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 ?? (isMAITranscribe2(this.modelId) ? 'speech' : 'openai'),
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
  }