@ai-sdk/azure 3.0.127 → 3.0.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  loadApiKey,
17
17
  loadSetting,
18
18
  normalizeHeaders,
19
+ parseProviderOptions,
19
20
  withoutTrailingSlash,
20
21
  withUserAgentSuffix
21
22
  } from "@ai-sdk/provider-utils";
@@ -36,8 +37,186 @@ var azureOpenaiTools = {
36
37
  webSearchPreview
37
38
  };
38
39
 
40
+ // src/azure-speech-transcription-model.ts
41
+ import {
42
+ combineHeaders,
43
+ convertBase64ToUint8Array,
44
+ createJsonErrorResponseHandler,
45
+ createJsonResponseHandler,
46
+ mediaTypeToExtension,
47
+ postFormDataToApi
48
+ } from "@ai-sdk/provider-utils";
49
+ import { z as z3 } from "zod/v4";
50
+
51
+ // src/azure-transcription-model-options.ts
52
+ import {
53
+ lazySchema as lazySchema2,
54
+ zodSchema as zodSchema2
55
+ } from "@ai-sdk/provider-utils";
56
+ import { z as z2 } from "zod/v4";
57
+
58
+ // src/azure-speech-transcription-model-options.ts
59
+ import {
60
+ lazySchema,
61
+ zodSchema
62
+ } from "@ai-sdk/provider-utils";
63
+ import { z } from "zod/v4";
64
+ var azureSpeechTranscriptionModelOptionsShape = () => ({
65
+ /**
66
+ * Timing granularity. Defaults to `segment` so that transcription results
67
+ * include timed segments (Azure's own default is `none`).
68
+ */
69
+ timestamps: z.enum(["word", "segment", "none"]).optional(),
70
+ /**
71
+ * `verbatim` keeps fillers and false starts, `clean` removes them.
72
+ * Azure defaults to `verbatim`.
73
+ */
74
+ transcribeStyle: z.enum(["verbatim", "clean"]).optional(),
75
+ /**
76
+ * Forces a single language, e.g. `['en']`. Omit for automatic language
77
+ * detection and code switching.
78
+ */
79
+ locales: z.array(z.string()).length(1).optional(),
80
+ /**
81
+ * Speaker diarization. Speaker IDs are available in provider metadata.
82
+ */
83
+ diarization: z.strictObject({ enabled: z.boolean() }).optional(),
84
+ /**
85
+ * Keyword biasing for names and domain terminology.
86
+ */
87
+ phraseList: z.strictObject({ phrases: z.array(z.string()) }).optional()
88
+ });
89
+ var azureSpeechTranscriptionModelOptions = lazySchema(
90
+ () => zodSchema(z.strictObject(azureSpeechTranscriptionModelOptionsShape()))
91
+ );
92
+
93
+ // src/azure-transcription-model-options.ts
94
+ var azureTranscriptionModelOptions = lazySchema2(
95
+ () => zodSchema2(
96
+ z2.strictObject({
97
+ /**
98
+ * API to use. Defaults to Speech for MAI-Transcribe-2, OpenAI otherwise.
99
+ */
100
+ api: z2.enum(["openai", "speech"]).optional(),
101
+ ...azureSpeechTranscriptionModelOptionsShape()
102
+ })
103
+ )
104
+ );
105
+ function isMAITranscribe2(modelId) {
106
+ return modelId.toLowerCase() === "mai-transcribe-2";
107
+ }
108
+
109
+ // src/azure-speech-transcription-model.ts
110
+ var AzureSpeechTranscriptionModel = class {
111
+ constructor(modelId, config) {
112
+ this.modelId = modelId;
113
+ this.config = config;
114
+ this.specificationVersion = "v3";
115
+ this.provider = "azure.transcription";
116
+ }
117
+ async doGenerate(options, azureOptions = {}) {
118
+ var _a, _b;
119
+ const timestamp = /* @__PURE__ */ new Date();
120
+ const formData = new FormData();
121
+ formData.append(
122
+ "audio",
123
+ new Blob(
124
+ [
125
+ typeof options.audio === "string" ? convertBase64ToUint8Array(options.audio) : options.audio
126
+ ],
127
+ { type: options.mediaType }
128
+ ),
129
+ `audio.${mediaTypeToExtension(options.mediaType)}`
130
+ );
131
+ formData.append(
132
+ "definition",
133
+ JSON.stringify({
134
+ enhancedMode: {
135
+ enabled: true,
136
+ model: isMAITranscribe2(this.modelId) ? "MAI-Transcribe-2" : this.modelId,
137
+ modelOptions: {
138
+ timestamps: (_a = azureOptions.timestamps) != null ? _a : "segment",
139
+ transcribeStyle: azureOptions.transcribeStyle
140
+ }
141
+ },
142
+ locales: azureOptions.locales,
143
+ diarization: azureOptions.diarization,
144
+ phraseList: azureOptions.phraseList
145
+ })
146
+ );
147
+ const { value, rawValue, responseHeaders } = await postFormDataToApi({
148
+ url: this.config.url(),
149
+ headers: combineHeaders(this.config.headers(), options.headers),
150
+ formData,
151
+ abortSignal: options.abortSignal,
152
+ fetch: this.config.fetch,
153
+ failedResponseHandler: createJsonErrorResponseHandler({
154
+ errorSchema: z3.union([
155
+ z3.object({ error: z3.object({ message: z3.string() }) }),
156
+ z3.object({ message: z3.string() })
157
+ ]),
158
+ errorToMessage: (data) => "error" in data ? data.error.message : data.message
159
+ }),
160
+ successfulResponseHandler: createJsonResponseHandler(responseSchema)
161
+ });
162
+ const phrases = (_b = value.phrases) != null ? _b : [];
163
+ const languages = new Set(
164
+ phrases.flatMap(
165
+ (phrase) => phrase.locale ? [phrase.locale.split("-")[0].toLowerCase()] : []
166
+ )
167
+ );
168
+ const [language] = languages;
169
+ const reportedLanguage = languages.size === 1 && /^[a-z]{2}$/.test(language) ? language : void 0;
170
+ return {
171
+ text: value.combinedPhrases.map((phrase) => phrase.text).join(" "),
172
+ segments: phrases.flatMap(
173
+ (phrase) => phrase.offsetMilliseconds != null && phrase.durationMilliseconds != null ? [
174
+ {
175
+ text: phrase.text,
176
+ startSecond: phrase.offsetMilliseconds / 1e3,
177
+ endSecond: (phrase.offsetMilliseconds + phrase.durationMilliseconds) / 1e3
178
+ }
179
+ ] : []
180
+ ),
181
+ language: reportedLanguage,
182
+ durationInSeconds: value.durationMilliseconds != null ? value.durationMilliseconds / 1e3 : void 0,
183
+ warnings: [],
184
+ providerMetadata: {
185
+ azure: { phrases }
186
+ },
187
+ response: {
188
+ timestamp,
189
+ modelId: this.modelId,
190
+ headers: responseHeaders,
191
+ body: rawValue
192
+ }
193
+ };
194
+ }
195
+ };
196
+ var responseSchema = z3.object({
197
+ combinedPhrases: z3.array(z3.object({ text: z3.string() })),
198
+ durationMilliseconds: z3.number().nullish(),
199
+ phrases: z3.array(
200
+ z3.object({
201
+ text: z3.string(),
202
+ offsetMilliseconds: z3.number().nullish(),
203
+ durationMilliseconds: z3.number().nullish(),
204
+ locale: z3.string().nullish(),
205
+ speaker: z3.number().nullish(),
206
+ confidence: z3.number().nullish(),
207
+ words: z3.array(
208
+ z3.object({
209
+ text: z3.string(),
210
+ offsetMilliseconds: z3.number().nullish(),
211
+ durationMilliseconds: z3.number().nullish()
212
+ })
213
+ ).nullish()
214
+ })
215
+ ).nullish()
216
+ });
217
+
39
218
  // src/version.ts
40
- var VERSION = true ? "3.0.127" : "0.0.0-test";
219
+ var VERSION = true ? "3.0.128" : "0.0.0-test";
41
220
 
42
221
  // src/azure-openai-provider.ts
43
222
  function getAzureOpenAIBaseURLInfo(baseURL) {
@@ -67,12 +246,12 @@ function createAzure(options = {}) {
67
246
  message: "Both apiKey and tokenProvider were provided. Please use only one authentication method."
68
247
  });
69
248
  }
70
- const getHeaders = () => {
249
+ const getHeaders = (api = "openai") => {
71
250
  const authHeaders = tokenProvider ? {} : {
72
- "api-key": loadApiKey({
251
+ [api === "speech" ? "Ocp-Apim-Subscription-Key" : "api-key"]: loadApiKey({
73
252
  apiKey: options.apiKey,
74
253
  environmentVariableName: "AZURE_API_KEY",
75
- description: "Azure OpenAI"
254
+ description: api === "speech" ? "Azure Speech" : "Azure OpenAI"
76
255
  })
77
256
  };
78
257
  return withUserAgentSuffix(
@@ -166,12 +345,24 @@ function createAzure(options = {}) {
166
345
  headers: getHeaders,
167
346
  fetch
168
347
  });
169
- const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel(modelId, {
170
- provider: "azure.transcription",
171
- url,
172
- headers: getHeaders,
173
- fetch
174
- });
348
+ const createTranscriptionModel = (modelId) => new AzureTranscriptionModel(
349
+ modelId,
350
+ options,
351
+ new OpenAITranscriptionModel(modelId, {
352
+ provider: "azure.transcription",
353
+ url,
354
+ headers: getHeaders,
355
+ fetch
356
+ }),
357
+ new AzureSpeechTranscriptionModel(modelId, {
358
+ url: () => {
359
+ var _a2;
360
+ return `${(_a2 = withoutTrailingSlash(options.speechBaseURL)) != null ? _a2 : `https://${getResourceName()}.cognitiveservices.azure.com`}/speechtotext/transcriptions:transcribe?api-version=2025-10-15`;
361
+ },
362
+ headers: () => getHeaders("speech"),
363
+ fetch
364
+ })
365
+ );
175
366
  const createSpeechModel = (modelId) => new OpenAISpeechModel(modelId, {
176
367
  provider: "azure.speech",
177
368
  url,
@@ -199,11 +390,54 @@ function createAzure(options = {}) {
199
390
  provider.imageModel = createImageModel;
200
391
  provider.responses = createResponsesModel;
201
392
  provider.transcription = createTranscriptionModel;
393
+ provider.transcriptionModel = createTranscriptionModel;
202
394
  provider.speech = createSpeechModel;
203
395
  provider.tools = azureOpenaiTools;
204
396
  return provider;
205
397
  }
206
398
  var azure = createAzure();
399
+ var AzureTranscriptionModel = class {
400
+ constructor(modelId, config, openai, speech) {
401
+ this.modelId = modelId;
402
+ this.config = config;
403
+ this.openai = openai;
404
+ this.speech = speech;
405
+ this.specificationVersion = "v3";
406
+ this.provider = "azure.transcription";
407
+ }
408
+ async doGenerate(options) {
409
+ const { api, ...speechOptions } = await this.getOptions(
410
+ options.providerOptions
411
+ );
412
+ if (api === "speech") {
413
+ return this.speech.doGenerate(options, speechOptions);
414
+ }
415
+ const result = await this.openai.doGenerate(options);
416
+ return {
417
+ ...result,
418
+ warnings: [
419
+ ...result.warnings,
420
+ ...Object.keys(speechOptions).map((key) => ({
421
+ type: "unsupported",
422
+ feature: `providerOptions.azure.${key}`,
423
+ details: "This option requires the Azure Speech API."
424
+ }))
425
+ ]
426
+ };
427
+ }
428
+ async getOptions(providerOptions) {
429
+ var _a;
430
+ const options = await parseProviderOptions({
431
+ provider: "azure",
432
+ providerOptions,
433
+ schema: azureTranscriptionModelOptions
434
+ });
435
+ return {
436
+ ...options,
437
+ api: (_a = options == null ? void 0 : options.api) != null ? _a : isMAITranscribe2(this.modelId) ? "speech" : "openai"
438
+ };
439
+ }
440
+ };
207
441
  export {
208
442
  VERSION,
209
443
  azure,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/azure-openai-provider.ts","../src/azure-openai-tools.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 withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { azureOpenaiTools } from './azure-openai-tools';\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 OpenAI model for audio transcription.\n */\n transcription(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\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 = () => {\n const authHeaders = tokenProvider\n ? {}\n : {\n 'api-key': loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'AZURE_API_KEY',\n description: '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 OpenAITranscriptionModel(modelId, {\n provider: 'azure.transcription',\n url,\n headers: getHeaders,\n fetch,\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.speech = createSpeechModel;\n provider.tools = azureOpenaiTools;\n return provider;\n}\n\n/**\n * Default Azure OpenAI provider instance.\n */\nexport const azure = createAzure();\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","// 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":["_a"]}
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"]}
package/docs/04-azure.mdx CHANGED
@@ -145,6 +145,13 @@ You can use the following optional settings to customize the OpenAI provider ins
145
145
  This option is useful for compatibility with certain Azure OpenAI models or deployments
146
146
  that require the legacy endpoint format.
147
147
 
148
+ - **speechBaseURL** _string_
149
+
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`.
152
+ Defaults to `https://{resourceName}.cognitiveservices.azure.com`.
153
+ Speech requests do not use `baseURL` or `apiVersion`.
154
+
148
155
  ## Language Models
149
156
 
150
157
  The Azure OpenAI provider instance is a function that you can invoke to create a language model:
@@ -1108,7 +1115,7 @@ Azure OpenAI supports DALL-E 2 and DALL-E 3 models through deployments. The capa
1108
1115
 
1109
1116
  ## Transcription Models
1110
1117
 
1111
- You can create models that call the Azure OpenAI transcription API using the `.transcription()` factory method.
1118
+ You can create models that call the Azure OpenAI or Azure Speech transcription API using the `.transcription()` factory method.
1112
1119
 
1113
1120
  The first argument is the model id e.g. `whisper-1`.
1114
1121
 
@@ -1116,6 +1123,105 @@ The first argument is the model id e.g. `whisper-1`.
1116
1123
  const model = azure.transcription('whisper-1');
1117
1124
  ```
1118
1125
 
1126
+ ### MAI-Transcribe-2
1127
+
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
+ All other IDs use the OpenAI API by default, including custom deployment names.
1132
+
1133
+ ```ts
1134
+ import { azure, type AzureTranscriptionModelOptions } from '@ai-sdk/azure';
1135
+ import { experimental_transcribe as transcribe } from 'ai';
1136
+ import { readFile } from 'fs/promises';
1137
+
1138
+ const result = await transcribe({
1139
+ model: azure.transcription('mai-transcribe-2'),
1140
+ audio: await readFile('audio.wav'),
1141
+ providerOptions: {
1142
+ azure: {
1143
+ timestamps: 'word',
1144
+ diarization: { enabled: true },
1145
+ transcribeStyle: 'clean',
1146
+ } satisfies AzureTranscriptionModelOptions,
1147
+ },
1148
+ });
1149
+ ```
1150
+
1151
+ MAI-Transcribe-2 requires a Microsoft Foundry (Speech) resource in a region where it is available:
1152
+ `centralindia`, `eastus`, `northeurope`, `southeastasia`, `westus`, or `westus2`
1153
+ (see [Speech service regions](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/regions?tabs=llmspeech)).
1154
+ Resources in other regions reject the request.
1155
+ Set `AZURE_RESOURCE_NAME` and `AZURE_API_KEY` to that resource's name and key,
1156
+ or pass `resourceName` and `apiKey` to `createAzure`. `tokenProvider`, custom headers,
1157
+ and custom fetch are also supported. Keys are sent as `Ocp-Apim-Subscription-Key`.
1158
+
1159
+ Speech requests use `https://{resourceName}.cognitiveservices.azure.com/speechtotext/transcriptions:transcribe`
1160
+ with API version `2025-10-15`. Use `speechBaseURL` to supply a different Speech URL prefix
1161
+ (without `/speechtotext/transcriptions:transcribe`), for example a regional endpoint:
1162
+
1163
+ ```ts
1164
+ import { createAzure } from '@ai-sdk/azure';
1165
+
1166
+ const azure = createAzure({
1167
+ speechBaseURL: 'https://eastus.api.cognitive.microsoft.com',
1168
+ apiKey: process.env.AZURE_SPEECH_API_KEY,
1169
+ });
1170
+ ```
1171
+
1172
+ Speech requests do not use `baseURL`, `apiVersion`, or `useDeploymentBasedUrls`;
1173
+ those settings only apply to Azure OpenAI models.
1174
+
1175
+ The following options are available through `providerOptions.azure`:
1176
+
1177
+ - **api** _'openai' | 'speech'_
1178
+ Overrides model-based API selection for this request.
1179
+ Set `openai` for an OpenAI deployment named `mai-transcribe-2`, or `speech` to
1180
+ send another model ID to Speech. Other Speech model IDs are sent unchanged.
1181
+
1182
+ - **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
1185
+ per sentence or speaker turn, `word` additionally returns word timing in provider
1186
+ metadata, and `none` returns a single segment that spans the whole audio.
1187
+
1188
+ - **transcribeStyle** _'verbatim' | 'clean'_
1189
+ `verbatim` keeps fillers and false starts, `clean` removes them. Defaults to `verbatim`.
1190
+
1191
+ - **locales** _string[]_
1192
+ Exactly one language code, such as `['en']`. This is a strong hint; omit it for
1193
+ automatic language detection and code switching.
1194
+
1195
+ - **diarization** _object_
1196
+ Set `enabled` to `true` to identify speakers. Speaker IDs are returned in
1197
+ provider metadata. `maxSpeakers` is not supported by MAI-Transcribe-2.
1198
+
1199
+ - **phraseList** _object_
1200
+ Set `phrases` to a list of names and domain terms to bias recognition toward them.
1201
+
1202
+ Explicit `api` takes precedence over the model ID. Existing OpenAI transcription
1203
+ 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.
1206
+
1207
+ Results include transcript text, timed segments, duration, and an ISO-639-1
1208
+ language code when the reported phrase locales identify one language. Mixed-language
1209
+ results, and languages without an ISO-639-1 code such as Filipino (`fil`) or
1210
+ Cantonese (`yue`), leave `language` undefined. Speaker IDs, exact locales, and word
1211
+ timing are preserved in `providerMetadata.azure.phrases`; use the exported
1212
+ `AzureTranscriptionProviderMetadata` type to access them. Phrase timing is in
1213
+ milliseconds in metadata and seconds in normalized `segments`.
1214
+
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
1218
+ [Azure's MAI-Transcribe guide](https://learn.microsoft.com/en-us/azure/ai-services/speech-service/mai-transcribe)
1219
+ for supported languages and diarization limits.
1220
+
1221
+ AI Gateway forwards these provider options, including `azure.api`.
1222
+
1223
+ ### OpenAI transcription
1224
+
1119
1225
  <Note>
1120
1226
  If you encounter a "DeploymentNotFound" error with transcription models,
1121
1227
  try enabling deployment-based URLs:
@@ -1181,6 +1287,7 @@ The following provider options are available:
1181
1287
  | `whisper-1` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
1182
1288
  | `gpt-4o-mini-transcribe` | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
1183
1289
  | `gpt-4o-transcribe` | <Check size={18} /> | <Cross size={18} /> | <Cross size={18} /> | <Cross size={18} /> |
1290
+ | `mai-transcribe-2` | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> | <Check size={18} /> |
1184
1291
 
1185
1292
  ## Speech Models
1186
1293
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/azure",
3
- "version": "3.0.127",
3
+ "version": "3.0.128",
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.68",
33
- "@ai-sdk/openai": "3.0.119",
32
+ "@ai-sdk/deepseek": "2.0.69",
33
+ "@ai-sdk/openai": "3.0.120",
34
34
  "@ai-sdk/provider": "3.0.18",
35
- "@ai-sdk/provider-utils": "4.0.55"
35
+ "@ai-sdk/provider-utils": "4.0.56"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "20.17.24",