@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/CHANGELOG.md +10 -0
- package/dist/index.d.mts +48 -3
- package/dist/index.d.ts +48 -3
- package/dist/index.js +235 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +244 -10
- package/dist/index.mjs.map +1 -1
- package/docs/04-azure.mdx +108 -1
- package/package.json +4 -4
- package/src/azure-openai-provider.ts +100 -13
- package/src/azure-speech-transcription-model-options.ts +46 -0
- package/src/azure-speech-transcription-model.ts +155 -0
- package/src/azure-transcription-model-options.ts +27 -0
- package/src/azure-transcription-provider-metadata.ts +17 -0
- package/src/index.ts +2 -0
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.
|
|
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
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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,
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
33
|
-
"@ai-sdk/openai": "3.0.
|
|
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.
|
|
35
|
+
"@ai-sdk/provider-utils": "4.0.56"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "20.17.24",
|